Добавлены новые статусы для агентских и партнерских транзакций, а также реализованы функции для автоматического подтверждения транзакций. Обновлены модели и API для управления настройками автоподтверждения и утверждения транзакций. Улучшены комментарии для ясности кода.
This commit is contained in:
parent
8c6fadb180
commit
8a8b111f40
@ -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
107
main.py
@ -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}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user