Добавлены новые статусы для агентских и партнерских транзакций, а также реализованы функции для автоматического подтверждения транзакций. Обновлены модели и API для управления настройками автоподтверждения и утверждения транзакций. Улучшены комментарии для ясности кода.

This commit is contained in:
Redsandyg 2025-06-07 12:25:17 +03:00
parent 8c6fadb180
commit 8a8b111f40
2 changed files with 109 additions and 2 deletions

View File

@ -204,9 +204,9 @@ def fill_db():
session.refresh(balance) session.refresh(balance)
# 5.3 AgentTransactions and PartnerTransactions # 5.3 AgentTransactions and PartnerTransactions
AGENT_TRANSACTION_STATUSES = ['waiting', 'process', 'done', 'reject', 'error'] AGENT_TRANSACTION_STATUSES = ['waiting', 'process', 'done', 'reject', 'error', 'new']
PARTNER_TRANSACTION_TYPES = ['deposit', 'agent_payout', 'service_fee'] PARTNER_TRANSACTION_TYPES = ['deposit', 'agent_payout', 'service_fee']
PARTNER_TRANSACTION_STATUSES = ['process', 'done', 'error'] PARTNER_TRANSACTION_STATUSES = ['process', 'done', 'error', 'new']
for tg_agent in tg_agents: for tg_agent in tg_agents:
# Генерируем несколько групп транзакций для каждого агента # Генерируем несколько групп транзакций для каждого агента

107
main.py
View File

@ -26,6 +26,7 @@ class Company(SQLModel, table=True):
key: str = Field(index=True, unique=True) key: str = Field(index=True, unique=True)
create_dttm: datetime = Field(default_factory=datetime.utcnow) create_dttm: datetime = Field(default_factory=datetime.utcnow)
update_dttm: datetime = Field(default_factory=datetime.utcnow) update_dttm: datetime = Field(default_factory=datetime.utcnow)
auto_approve_transactions: bool = Field(default=False) # Новое поле для автоподтверждения
class TgAgent(SQLModel, table=True): class TgAgent(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True) id: Optional[int] = Field(default=None, primary_key=True)
@ -124,6 +125,7 @@ class TransactionStatus(str, Enum): # Определяем Enum для стат
DONE = 'done' DONE = 'done'
REJECT = 'reject' REJECT = 'reject'
ERROR = 'error' ERROR = 'error'
NEW = 'new' # Новый статус
# Новая модель ответа для агентских транзакций с именем агента # Новая модель ответа для агентских транзакций с именем агента
@ -719,3 +721,108 @@ def get_account_agent_transactions(
) )
return agent_transactions_response return agent_transactions_response
# Модель запроса для POST /account/auto-approve
class AutoApproveSettingsRequest(BaseModel):
auto_approve: bool
apply_to_current: Optional[bool] = False
@app.get("/account/auto-approve", tags=["bff"])
def get_auto_approve_settings(
current_account: Account = Depends(get_current_account),
db: Session = Depends(get_db)
):
"""
Возвращает текущую настройку автоматического подтверждения для компании пользователя.
"""
company = db.exec(select(Company).where(Company.id == current_account.company_id)).first()
if not company:
raise HTTPException(status_code=404, detail="Компания не найдена")
return {"auto_approve_transactions": company.auto_approve_transactions}
@app.post("/account/auto-approve", tags=["bff"])
def update_auto_approve_settings(
req: AutoApproveSettingsRequest,
current_account: Account = Depends(get_current_account),
db: Session = Depends(get_db)
):
"""
Обновляет настройку автоматического подтверждения для компании пользователя.
При необходимости переводит транзакции из 'waiting' в 'new'.
"""
company = db.exec(select(Company).where(Company.id == current_account.company_id)).first()
if not company:
raise HTTPException(status_code=404, detail="Компания не найдена")
company.auto_approve_transactions = req.auto_approve
company.update_dttm = datetime.utcnow()
db.add(company)
if req.apply_to_current and req.auto_approve: # Применяем только если авто-аппрув включается и запрошено применение к текущим
# Находим все агентские транзакции компании в статусе 'waiting'
agent_transactions_to_update = db.exec(
select(AgentTransaction)
.join(TgAgent)
.where(TgAgent.company_id == company.id)
.where(AgentTransaction.status == TransactionStatus.WAITING)
).all()
for agent_trans in agent_transactions_to_update:
agent_trans.status = TransactionStatus.NEW
agent_trans.update_dttm = datetime.utcnow()
db.add(agent_trans)
# Находим соответствующие партнерские транзакции и обновляем их статус
partner_transactions_to_update = db.exec(
select(PartnerTransaction)
.where(PartnerTransaction.agent_transaction_id == agent_trans.id) # Используем связь по ID
.where(PartnerTransaction.status == TransactionStatus.PROCESS) # Предполагаем, что связанные партнерские транзакции в статусе PROCESS
).all()
for partner_trans in partner_transactions_to_update:
partner_trans.status = TransactionStatus.NEW
partner_trans.update_dttm = datetime.utcnow()
db.add(partner_trans)
db.commit()
db.refresh(company)
return {"msg": "Настройка автоматического подтверждения обновлена", "auto_approve_transactions": company.auto_approve_transactions}
# Модель запроса для POST /account/approve-transactions
class ApproveTransactionsRequest(BaseModel):
transaction_ids: List[uuid.UUID]
@app.post("/account/approve-transactions", tags=["bff"])
def approve_agent_transactions(
req: ApproveTransactionsRequest,
current_account: Account = Depends(get_current_account),
db: Session = Depends(get_db)
):
"""
Утверждение выбранных агентских транзакций для компании текущего пользователя.
Переводит транзакции из статуса 'waiting' в 'new'.
"""
company_id = current_account.company_id
approved_count = 0
if not req.transaction_ids:
return {"msg": "Нет транзакций для утверждения", "approved_count": 0}
# Find transactions belonging to the company and with specified IDs and statuses
transactions_to_approve = db.exec(
select(AgentTransaction)
.join(TgAgent)
.where(TgAgent.company_id == company_id)
.where(AgentTransaction.transaction_group.in_(req.transaction_ids))
.where(AgentTransaction.status == TransactionStatus.WAITING) # Утверждаем только транзакции в статусе 'waiting'
).all()
for agent_trans in transactions_to_approve:
agent_trans.status = TransactionStatus.NEW # Переводим в статус 'new'
agent_trans.update_dttm = datetime.utcnow()
db.add(agent_trans)
approved_count += 1
db.commit()
return {"msg": f"Переведено в статус NEW {approved_count} транзакций", "approved_count": approved_count}