import re from typing import List from pydantic import field_validator from schemas.base import BaseSchema from .enums import NotificationChannel from datetime import datetime as dt from datetime import date phone_regexp = re.compile(r'^((\+7)([0-9]){10})$') class CreateBillingRequestValue(BaseSchema): name: str = "" unit: str = "Руб" vat: str = "None" price: int amount: int = 1 class CreateBillRequestItems(BaseSchema): values: List[CreateBillingRequestValue] class CreateBillRequestSchema(BaseSchema): listener_transaction_id: int payer_name: str payer_inn: str payer_phone: str | None items: CreateBillRequestItems @field_validator("payer_phone", mode="before") def payer_phone_validator(cls, phone: str) -> str: if phone is None: return None if not phone.startswith("+"): phone = f"+{phone}" if phone_regexp.match(phone): return phone return None class DeleteBillRequestSchema(BaseSchema): listener_transaction_id: int class DeleteBillResponseSchema(BaseSchema): ok: bool class NotifyReceivedBillRequestSchema(BaseSchema): listener_transaction_id: int channel: NotificationChannel received: bool class CreateBillingResponseSchema(BaseSchema): ok: bool class NotifyReceivedBillResponseSchema(BaseSchema): ok: bool class BillPaymentInfo(BaseSchema): pdf_url: str due_date: date payment_amount: int invoice_number: str @field_validator('due_date', mode='plain') def serialize_due_date(value: str) -> date: date = dt.strptime(value, '%Y-%m-%d').date() return date class BillPaymentStatus(BaseSchema): payed: bool class BillStatusUpdateRequest(BaseSchema): listener_transaction_id: int channel: NotificationChannel info: BillPaymentInfo | BillPaymentStatus