from common.extensions import db class BusinessEventLog(db.Model): __bind_key__ = 'public' __table_args__ = {'schema': 'public'} id = db.Column(db.Integer, primary_key=True) timestamp = db.Column(db.DateTime, nullable=False) event_type = db.Column(db.String(50), nullable=False) tenant_id = db.Column(db.Integer, nullable=False) trace_id = db.Column(db.String(50), nullable=False) span_id = db.Column(db.String(50)) span_name = db.Column(db.String(255)) parent_span_id = db.Column(db.String(50)) document_version_id = db.Column(db.Integer) document_version_file_size = db.Column(db.Float) specialist_id = db.Column(db.Integer) specialist_type = db.Column(db.String(50)) specialist_type_version = db.Column(db.String(20)) chat_session_id = db.Column(db.String(50)) interaction_id = db.Column(db.Integer) environment = db.Column(db.String(20)) llm_metrics_total_tokens = db.Column(db.Integer) llm_metrics_prompt_tokens = db.Column(db.Integer) llm_metrics_completion_tokens = db.Column(db.Integer) llm_metrics_total_time = db.Column(db.Float) llm_metrics_nr_of_pages = db.Column(db.Integer) llm_metrics_call_count = db.Column(db.Integer) llm_interaction_type = db.Column(db.String(20)) message = db.Column(db.Text) license_usage_id = db.Column(db.Integer, db.ForeignKey('public.license_usage.id'), nullable=True) license_usage = db.relationship('LicenseUsage', backref='events') class License(db.Model): __bind_key__ = 'public' __table_args__ = {'schema': 'public'} id = db.Column(db.Integer, primary_key=True) tenant_id = db.Column(db.Integer, db.ForeignKey('public.tenant.id'), nullable=False) tier_id = db.Column(db.Integer, db.ForeignKey('public.license_tier.id'),nullable=False) # 'small', 'medium', 'custom' start_date = db.Column(db.Date, nullable=False) end_date = db.Column(db.Date, nullable=True) currency = db.Column(db.String(20), nullable=False) yearly_payment = db.Column(db.Boolean, nullable=False, default=False) basic_fee = db.Column(db.Float, nullable=False) max_storage_mb = db.Column(db.Integer, nullable=False) additional_storage_price = db.Column(db.Float, nullable=False) additional_storage_bucket = db.Column(db.Integer, nullable=False) included_embedding_mb = db.Column(db.Integer, nullable=False) additional_embedding_price = db.Column(db.Numeric(10, 4), nullable=False) additional_embedding_bucket = db.Column(db.Integer, nullable=False) included_interaction_tokens = db.Column(db.Integer, nullable=False) additional_interaction_token_price = db.Column(db.Numeric(10, 4), nullable=False) additional_interaction_bucket = db.Column(db.Integer, nullable=False) overage_embedding = db.Column(db.Float, nullable=False, default=0) overage_interaction = db.Column(db.Float, nullable=False, default=0) # Versioning Information created_at = db.Column(db.DateTime, nullable=True, server_default=db.func.now()) created_by = db.Column(db.Integer, db.ForeignKey('public.user.id'), nullable=True) updated_at = db.Column(db.DateTime, nullable=True, server_default=db.func.now(), onupdate=db.func.now()) updated_by = db.Column(db.Integer, db.ForeignKey('public.user.id'), nullable=True) tenant = db.relationship('Tenant', back_populates='licenses') license_tier = db.relationship('LicenseTier', back_populates='licenses') usages = db.relationship('LicenseUsage', order_by='LicenseUsage.period_start_date', back_populates='license') class LicenseTier(db.Model): __bind_key__ = 'public' __table_args__ = {'schema': 'public'} id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) version = db.Column(db.String(50), nullable=False) start_date = db.Column(db.Date, nullable=False) end_date = db.Column(db.Date, nullable=True) basic_fee_d = db.Column(db.Float, nullable=True) basic_fee_e = db.Column(db.Float, nullable=True) max_storage_mb = db.Column(db.Integer, nullable=False) additional_storage_price_d = db.Column(db.Numeric(10, 4), nullable=False) additional_storage_price_e = db.Column(db.Numeric(10, 4), nullable=False) additional_storage_bucket = db.Column(db.Integer, nullable=False) included_embedding_mb = db.Column(db.Integer, nullable=False) additional_embedding_price_d = db.Column(db.Numeric(10, 4), nullable=False) additional_embedding_price_e = db.Column(db.Numeric(10, 4), nullable=False) additional_embedding_bucket = db.Column(db.Integer, nullable=False) included_interaction_tokens = db.Column(db.Integer, nullable=False) additional_interaction_token_price_d = db.Column(db.Numeric(10, 4), nullable=False) additional_interaction_token_price_e = db.Column(db.Numeric(10, 4), nullable=False) additional_interaction_bucket = db.Column(db.Integer, nullable=False) standard_overage_embedding = db.Column(db.Float, nullable=False, default=0) standard_overage_interaction = db.Column(db.Float, nullable=False, default=0) # Versioning Information created_at = db.Column(db.DateTime, nullable=True, server_default=db.func.now()) created_by = db.Column(db.Integer, db.ForeignKey('public.user.id'), nullable=True) updated_at = db.Column(db.DateTime, nullable=True, server_default=db.func.now(), onupdate=db.func.now()) updated_by = db.Column(db.Integer, db.ForeignKey('public.user.id'), nullable=True) licenses = db.relationship('License', back_populates='license_tier') partner_services = db.relationship('PartnerServiceLicenseTier', back_populates='license_tier') class PartnerServiceLicenseTier(db.Model): __bind_key__ = 'public' __table_args__ = {'schema': 'public'} partner_service_id = db.Column(db.Integer, db.ForeignKey('public.partner_service.id'), primary_key=True, nullable=False) license_tier_id = db.Column(db.Integer, db.ForeignKey('public.license_tier.id'), primary_key=True, nullable=False) # Versioning Information created_at = db.Column(db.DateTime, nullable=True, server_default=db.func.now()) created_by = db.Column(db.Integer, db.ForeignKey('public.user.id'), nullable=True) updated_at = db.Column(db.DateTime, nullable=True, server_default=db.func.now(), onupdate=db.func.now()) updated_by = db.Column(db.Integer, db.ForeignKey('public.user.id'), nullable=True) license_tier = db.relationship('LicenseTier', back_populates='partner_services') partner_service = db.relationship('PartnerService', back_populates='license_tiers') class LicenseUsage(db.Model): __bind_key__ = 'public' __table_args__ = {'schema': 'public'} id = db.Column(db.Integer, primary_key=True) license_id = db.Column(db.Integer, db.ForeignKey('public.license.id'), nullable=False) tenant_id = db.Column(db.Integer, db.ForeignKey('public.tenant.id'), nullable=False) storage_mb_used = db.Column(db.Float, default=0) embedding_mb_used = db.Column(db.Float, default=0) embedding_prompt_tokens_used = db.Column(db.Integer, default=0) embedding_completion_tokens_used = db.Column(db.Integer, default=0) embedding_total_tokens_used = db.Column(db.Integer, default=0) interaction_prompt_tokens_used = db.Column(db.Integer, default=0) interaction_completion_tokens_used = db.Column(db.Integer, default=0) interaction_total_tokens_used = db.Column(db.Integer, default=0) period_start_date = db.Column(db.Date, nullable=False) period_end_date = db.Column(db.Date, nullable=False) license = db.relationship('License', back_populates='usages')