diff --git a/external/billing/billing_client.py b/external/billing/billing_client.py index 3dbf904..24887bf 100644 --- a/external/billing/billing_client.py +++ b/external/billing/billing_client.py @@ -21,6 +21,11 @@ class BillingClient: response = await self._method('POST', '/create', json=json_data) return CreateBillingResponseSchema.model_validate(response) + async def delete(self, request: DeleteBillRequestSchema) -> DeleteBillResponseSchema: + method = f'/delete/{request.listener_transaction_id}' + response = await self._method('POST', method) + return DeleteBillResponseSchema.model_validate(response) + async def notify_received(self, request: NotifyReceivedBillRequestSchema) -> NotifyReceivedBillResponseSchema: json_data = request.model_dump() response = await self._method('POST', '/notify-received', json=json_data) diff --git a/external/billing/schemas.py b/external/billing/schemas.py index 5283ab9..f0d5107 100644 --- a/external/billing/schemas.py +++ b/external/billing/schemas.py @@ -45,6 +45,14 @@ class CreateBillRequestSchema(BaseSchema): return None +class DeleteBillRequestSchema(BaseSchema): + listener_transaction_id: int + + +class DeleteBillResponseSchema(BaseSchema): + ok: bool + + class NotifyReceivedBillRequestSchema(BaseSchema): listener_transaction_id: int channel: NotificationChannel diff --git a/routers/billing.py b/routers/billing.py index 07e4830..61a3309 100644 --- a/routers/billing.py +++ b/routers/billing.py @@ -37,6 +37,17 @@ async def create_deal_bill( user: CurrentUserDependency ): return await BillingService(session).create_deal_billing(user, request) +@billing_router.post( + '/cancel-deal-bill', + operation_id='cancel_deal_bill', + response_model=CancelDealBillResponse +) +async def create_deal_bill( + session: SessionDependency, + request: CancelDealBillRequest, + user: CurrentUserDependency +): + return await BillingService(session).cancel_deal_billing(user, request) @billing_router.get( diff --git a/schemas/billing.py b/schemas/billing.py index ba42174..42c428e 100644 --- a/schemas/billing.py +++ b/schemas/billing.py @@ -16,9 +16,17 @@ class CreateDealBillRequest(BaseSchema): deal_id: int +class CancelDealBillRequest(BaseSchema): + deal_id: int + + class CreateDealBillResponse(OkMessageSchema): pass +class CancelDealBillResponse(OkMessageSchema): + pass + + class GetDealBillById(BaseSchema): deal_bill: DealBillRequestSchema diff --git a/services/billing.py b/services/billing.py index 9ec71d2..20c19a9 100644 --- a/services/billing.py +++ b/services/billing.py @@ -7,7 +7,8 @@ from starlette import status import backend.config from external.billing import BillingClient, CreateBillingRequestValue, CreateBillRequestSchema, CreateBillRequestItems, \ - BillStatusUpdateRequest, NotificationChannel, NotifyReceivedBillRequestSchema, BillPaymentInfo + BillStatusUpdateRequest, NotificationChannel, NotifyReceivedBillRequestSchema, BillPaymentInfo, \ + DeleteBillRequestSchema from models import DealBillRequest, Deal from schemas.billing import * from services.base import BaseService @@ -116,3 +117,18 @@ class BillingService(BaseService): if not deal_bill: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail='Deal bill was not found') return GetDealBillById(deal_bill=DealBillRequestSchema.model_validate(deal_bill)) + + async def cancel_deal_billing(self, user, request: CancelDealBillRequest) -> CancelDealBillResponse: + try: + deal_bill = await self._get_deal_bill_by_id(request.deal_id) + if not deal_bill: + return CancelDealBillResponse(ok=False, message='Заявка не найдена') + billing_client = BillingClient(backend.config.BILLING_API_KEY) + response = await billing_client.delete(DeleteBillRequestSchema(listener_transaction_id=request.deal_id)) + if not response.ok: + return CancelDealBillResponse(ok=False, message='Ошибка') + await self.session.delete(deal_bill) + await self.session.commit() + return CancelDealBillResponse(ok=True, message='Заявка успешно отозвана') + except Exception as e: + return CancelDealBillResponse(ok=False, message=str(e))