from typing import Optional, List from datetime import datetime import uuid from sqlmodel import SQLModel, Field, Relationship from sqlalchemy import Column, String class Company(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) name: str commission: float # процент комиссии, который взымается за пользование сервисом key: str = Field(index=True, unique=True) create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) auto_approve_transactions: bool = Field(default=False) # Отвечает за автоматическое одобрение агентских транзакций на вывод. integration_tokens: List["IntegrationToken"] = Relationship(back_populates="company") tg_agents: List["TgAgent"] = Relationship(back_populates="company") sales: List["Sale"] = Relationship(back_populates="company") partner_transactions: List["PartnerTransaction"] = Relationship(back_populates="company") company_balance: Optional["CompanyBalance"] = Relationship(back_populates="company") accounts: List["Account"] = Relationship(back_populates="company") sale_categories: List["SaleCategory"] = Relationship(back_populates="company") class TgAgent(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) tg_id: int = Field(index=True, unique=True) chat_id: Optional[int] = None phone: Optional[str] = None name: Optional[str] = None login: Optional[str] = None hash: Optional[str] = None company_id: int = Field(foreign_key="company.id") create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) company: "Company" = Relationship(back_populates="tg_agents") refs: List["Ref"] = Relationship(back_populates="tg_agent") agent_transactions: List["AgentTransaction"] = Relationship(back_populates="tg_agent") agent_balance: Optional["AgentBalance"] = Relationship(back_populates="tg_agent") class Ref(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) tg_agent_id: int = Field(foreign_key="tgagent.id") ref: str description: Optional[str] = None promocode: str = Field(index=True, unique=True, max_length=8) create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) tg_agent: "TgAgent" = Relationship(back_populates="refs") sales: List["Sale"] = Relationship(back_populates="ref_obj") class SaleCategory(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) category: str description: Optional[str] = None perc: float # процент начисления партнеру company_id: int = Field(foreign_key="company.id") create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) company: "Company" = Relationship(back_populates="sale_categories") sales: List["Sale"] = Relationship(back_populates="sale_category") class Sale(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) cost: float crediting: float # сколько начислено за продажу ref: int = Field(foreign_key="ref.id") sale_id: str group_sale_id: str # новое поле для группировки продаж company_id: int = Field(foreign_key="company.id") category: int = Field(foreign_key="salecategory.id") # новая ссылка на категорию sale_dttm: datetime = Field(default_factory=datetime.utcnow) create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) ref_obj: "Ref" = Relationship(back_populates="sales") company: "Company" = Relationship(back_populates="sales") sale_category: "SaleCategory" = Relationship(back_populates="sales") class AgentTransaction(SQLModel, table=True): __tablename__ = "agent_transactions" id: Optional[int] = Field(default=None, primary_key=True) tg_agent_id: int = Field(foreign_key="tgagent.id") amount: float status: str transaction_group: uuid.UUID = Field(default_factory=uuid.uuid4, unique=True) create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) tg_agent: "TgAgent" = Relationship(back_populates="agent_transactions") partner_transactions: List["PartnerTransaction"] = Relationship(back_populates="agent_transaction") class PartnerTransaction(SQLModel, table=True): __tablename__ = "partner_transactions" id: Optional[int] = Field(default=None, primary_key=True) company_id: int = Field(foreign_key="company.id") type: str amount: float status: str transaction_group: uuid.UUID agent_transaction_id: Optional[int] = Field(default=None, foreign_key="agent_transactions.id") create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) company: "Company" = Relationship(back_populates="partner_transactions") agent_transaction: Optional["AgentTransaction"] = Relationship(back_populates="partner_transactions") class CompanyBalance(SQLModel, table=True): __tablename__ = "company_balances" id: Optional[int] = Field(default=None, primary_key=True) company_id: int = Field(foreign_key="company.id", unique=True) available_balance: float = Field(default=0.0) pending_balance: float = Field(default=0.0) updated_dttm: datetime = Field(default_factory=datetime.utcnow) company: "Company" = Relationship(back_populates="company_balance") class AgentBalance(SQLModel, table=True): __tablename__ = "agent_balances" id: Optional[int] = Field(default=None, primary_key=True) tg_agent_id: int = Field(foreign_key="tgagent.id", unique=True) available_balance: float = Field(default=0.0) frozen_balance: float = Field(default=0.0) updated_dttm: datetime = Field(default_factory=datetime.utcnow) tg_agent: "TgAgent" = Relationship(back_populates="agent_balance") class Account(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) login: str = Field(index=True, unique=True) password_hash: str firstName: Optional[str] = None surname: Optional[str] = None phone: Optional[str] = None email: Optional[str] = None company_id: int = Field(foreign_key="company.id") create_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow) company: "Company" = Relationship(back_populates="accounts") # Новая модель для интеграционных токенов class IntegrationToken(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) description: str token_hash: str = Field(sa_column=Column(String, unique=True, index=True)) masked_token: str = Field(sa_column=Column(String)) company_id: int = Field(foreign_key="company.id") create_dttm: datetime = Field(default_factory=datetime.utcnow, nullable=False) update_dttm: datetime = Field(default_factory=datetime.utcnow, nullable=False) use_dttm: Optional[datetime] = None company: "Company" = Relationship(back_populates="integration_tokens")