111 lines
5.0 KiB
Python
111 lines
5.0 KiB
Python
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 # процент комиссии, который взымается за пользование сервисом
|
|
agent_commission: float = Field(default=0.0) # процент от продаж, который начисляется агенту
|
|
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")
|
|
|
|
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)
|
|
|
|
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
|
|
create_dttm: datetime = Field(default_factory=datetime.utcnow)
|
|
update_dttm: datetime = Field(default_factory=datetime.utcnow)
|
|
|
|
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
|
|
company_id: int = Field(foreign_key="company.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)
|
|
|
|
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)
|
|
create_dttm: datetime = Field(default_factory=datetime.utcnow)
|
|
update_dttm: datetime = Field(default_factory=datetime.utcnow)
|
|
|
|
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)
|
|
|
|
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)
|
|
|
|
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)
|
|
|
|
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)
|
|
|
|
# Новая модель для интеграционных токенов
|
|
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") |