42 lines
1.7 KiB
Python
42 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from decimal import Decimal
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from src.application.abstractions.repositories.i_payment_repository import IPaymentRepository
|
|
from src.application.contracts import ILogger
|
|
from src.application.domain.enums import PaymentStatus
|
|
from src.infrastructure.database.models.payment import Payment
|
|
|
|
|
|
class PaymentRepository(IPaymentRepository):
|
|
def __init__(self,session: AsyncSession,logger: ILogger):
|
|
self._session=session
|
|
self._logger=logger
|
|
|
|
|
|
async def create_completed(self,*,user_id:str,order_id:str,itpay_payment_id:str,itpay_paid_amount:str|None,transaction_id:str|None,paid_at:str|None,expired_date:str|None) -> Payment:
|
|
stmt=select(Payment).where(Payment.order_id==order_id)
|
|
existing=await self._session.scalar(stmt)
|
|
if existing is not None:
|
|
return existing
|
|
paid_at_dt=datetime.fromisoformat(paid_at.replace('Z','+00:00')) if paid_at else None
|
|
expired_dt=datetime.fromisoformat(expired_date.replace('Z','+00:00')) if expired_date else None
|
|
paid_amount_dec=Decimal(str(itpay_paid_amount)) if itpay_paid_amount is not None else None
|
|
model=Payment(
|
|
user_id=user_id,
|
|
order_id=order_id,
|
|
status=PaymentStatus.PENDING,
|
|
receipt_cloudekassir_link=None,
|
|
itpay_payment_id=itpay_payment_id,
|
|
itpay_paid_amount=paid_amount_dec,
|
|
transaction_id=transaction_id,
|
|
paid_at=paid_at_dt,
|
|
expired_date=expired_dt,
|
|
)
|
|
self._session.add(model)
|
|
await self._session.flush()
|
|
return model
|
|
|