Обновлен эндпоинт создания продажи в integration_api.py: добавлена проверка на наличие ref и promocode, улучшена логика поиска реферальных ссылок и проверка их принадлежности компании. Модель SaleCreateRequest обновлена для поддержки опционального поля promocode.
This commit is contained in:
parent
d113ae4adb
commit
4f366680bf
@ -189,7 +189,7 @@ async def withdraw_funds(
|
|||||||
@app.post("/sale", tags=["integration"], response_model=SaleCreateResponse)
|
@app.post("/sale", tags=["integration"], response_model=SaleCreateResponse)
|
||||||
async def create_sale(
|
async def create_sale(
|
||||||
req: SaleCreateRequest,
|
req: SaleCreateRequest,
|
||||||
company: Company = Depends(get_current_company_from_jwt), # Используем новую зависимость
|
company: Company = Depends(get_current_company_from_jwt),
|
||||||
db: Session = Depends(get_integration_db)
|
db: Session = Depends(get_integration_db)
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
@ -198,24 +198,33 @@ async def create_sale(
|
|||||||
# Устанавливаем уровень изоляции для текущей транзакции
|
# Устанавливаем уровень изоляции для текущей транзакции
|
||||||
db.connection(execution_options={'isolation_level': 'SERIALIZABLE'})
|
db.connection(execution_options={'isolation_level': 'SERIALIZABLE'})
|
||||||
|
|
||||||
# 1. Найти Ref по `ref` и `company.id`
|
# Проверка входных данных
|
||||||
# Сначала находим TgAgent, связанный с компанией, затем Ref
|
if not req.ref and not req.promocode:
|
||||||
|
raise HTTPException(status_code=400, detail="Необходимо передать либо ref, либо promocode")
|
||||||
|
|
||||||
|
# 1. Найти Ref по ref и/или promocode
|
||||||
|
referral = None
|
||||||
tg_agent = db.exec(
|
if req.ref and req.promocode:
|
||||||
select(TgAgent)
|
referral_by_ref = db.exec(select(Ref).where(Ref.ref == req.ref)).first()
|
||||||
.join(Ref)
|
referral_by_code = db.exec(select(Ref).where(Ref.promocode == req.promocode)).first()
|
||||||
.where(TgAgent.company_id == company.id)
|
if not referral_by_ref or not referral_by_code:
|
||||||
.where(Ref.ref == req.ref)
|
raise HTTPException(status_code=404, detail="Реферальная ссылка или промокод не найдены")
|
||||||
).first()
|
if referral_by_ref.id != referral_by_code.id:
|
||||||
|
raise HTTPException(status_code=400, detail="ref и promocode не соответствуют одной ссылке")
|
||||||
if not tg_agent:
|
referral = referral_by_ref
|
||||||
raise HTTPException(status_code=404, detail="Реферальная ссылка не найдена или не принадлежит данной компании")
|
elif req.ref:
|
||||||
|
referral = db.exec(select(Ref).where(Ref.ref == req.ref)).first()
|
||||||
referral = db.exec(select(Ref).where(Ref.ref == req.ref).where(Ref.tg_agent_id == tg_agent.id)).first()
|
|
||||||
if not referral:
|
if not referral:
|
||||||
raise HTTPException(status_code=404, detail="Реферальная ссылка не найдена")
|
raise HTTPException(status_code=404, detail="Реферальная ссылка не найдена")
|
||||||
|
elif req.promocode:
|
||||||
|
referral = db.exec(select(Ref).where(Ref.promocode == req.promocode)).first()
|
||||||
|
if not referral:
|
||||||
|
raise HTTPException(status_code=404, detail="Промокод не найден")
|
||||||
|
|
||||||
|
# Проверяем, что реф действительно принадлежит компании
|
||||||
|
tg_agent = db.exec(select(TgAgent).where(TgAgent.id == referral.tg_agent_id, TgAgent.company_id == company.id)).first()
|
||||||
|
if not tg_agent:
|
||||||
|
raise HTTPException(status_code=404, detail="Реферальная ссылка не принадлежит данной компании")
|
||||||
|
|
||||||
# 2. Проверить, что sale_id уникален для данной компании
|
# 2. Проверить, что sale_id уникален для данной компании
|
||||||
existing_sale = db.exec(
|
existing_sale = db.exec(
|
||||||
@ -223,7 +232,6 @@ async def create_sale(
|
|||||||
.where(Sale.company_id == company.id)
|
.where(Sale.company_id == company.id)
|
||||||
.where(Sale.sale_id == req.sale_id)
|
.where(Sale.sale_id == req.sale_id)
|
||||||
).first()
|
).first()
|
||||||
|
|
||||||
if existing_sale:
|
if existing_sale:
|
||||||
raise HTTPException(status_code=400, detail="Продажа с таким sale_id уже существует для данной компании")
|
raise HTTPException(status_code=400, detail="Продажа с таким sale_id уже существует для данной компании")
|
||||||
|
|
||||||
@ -231,12 +239,9 @@ async def create_sale(
|
|||||||
crediting_amount = req.cost * (company.agent_commission / 100.0)
|
crediting_amount = req.cost * (company.agent_commission / 100.0)
|
||||||
|
|
||||||
# 4. Проверить и обновить AgentBalance и CompanyBalance
|
# 4. Проверить и обновить AgentBalance и CompanyBalance
|
||||||
# AgentBalance
|
|
||||||
agent_balance = db.exec(select(AgentBalance).where(AgentBalance.tg_agent_id == tg_agent.id)).first()
|
agent_balance = db.exec(select(AgentBalance).where(AgentBalance.tg_agent_id == tg_agent.id)).first()
|
||||||
if not agent_balance:
|
if not agent_balance:
|
||||||
raise HTTPException(status_code=404, detail="Баланс агента не найден")
|
raise HTTPException(status_code=404, detail="Баланс агента не найден")
|
||||||
|
|
||||||
# CompanyBalance
|
|
||||||
company_balance = db.exec(select(CompanyBalance).where(CompanyBalance.company_id == company.id)).first()
|
company_balance = db.exec(select(CompanyBalance).where(CompanyBalance.company_id == company.id)).first()
|
||||||
if not company_balance:
|
if not company_balance:
|
||||||
raise HTTPException(status_code=404, detail="Баланс компании не найден")
|
raise HTTPException(status_code=404, detail="Баланс компании не найден")
|
||||||
@ -251,9 +256,8 @@ async def create_sale(
|
|||||||
sale_dttm=datetime.utcnow()
|
sale_dttm=datetime.utcnow()
|
||||||
)
|
)
|
||||||
db.add(new_sale)
|
db.add(new_sale)
|
||||||
|
|
||||||
# Создать AgentTransaction
|
# Создать AgentTransaction
|
||||||
agent_transaction_status = TransactionStatus.DONE # auto_approve_transactions отвечает только за апрув агентских транзакций на вывод
|
agent_transaction_status = TransactionStatus.DONE
|
||||||
agent_transaction = AgentTransaction(
|
agent_transaction = AgentTransaction(
|
||||||
tg_agent_id=tg_agent.id,
|
tg_agent_id=tg_agent.id,
|
||||||
amount=crediting_amount,
|
amount=crediting_amount,
|
||||||
@ -261,7 +265,6 @@ async def create_sale(
|
|||||||
transaction_group=uuid.uuid4()
|
transaction_group=uuid.uuid4()
|
||||||
)
|
)
|
||||||
db.add(agent_transaction)
|
db.add(agent_transaction)
|
||||||
|
|
||||||
# Обновление балансов для продаж - всегда в замороженный/ожидающий баланс
|
# Обновление балансов для продаж - всегда в замороженный/ожидающий баланс
|
||||||
agent_balance.frozen_balance += crediting_amount
|
agent_balance.frozen_balance += crediting_amount
|
||||||
company_balance.pending_balance -= crediting_amount
|
company_balance.pending_balance -= crediting_amount
|
||||||
|
|||||||
@ -16,7 +16,8 @@ class IntegrationTokenResponse(BaseModel):
|
|||||||
|
|
||||||
# Models for /sale endpoint
|
# Models for /sale endpoint
|
||||||
class SaleCreateRequest(BaseModel):
|
class SaleCreateRequest(BaseModel):
|
||||||
ref: str
|
ref: Optional[str] = None
|
||||||
|
promocode: Optional[str] = None
|
||||||
sale_id: str
|
sale_id: str
|
||||||
cost: float
|
cost: float
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user