103 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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 | str
 | 
						||
    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 | str
 | 
						||
 | 
						||
 | 
						||
class DeleteBillResponseSchema(BaseSchema):
 | 
						||
    ok: bool
 | 
						||
 | 
						||
 | 
						||
class NotifyReceivedBillRequestSchema(BaseSchema):
 | 
						||
    listener_transaction_id: int | str
 | 
						||
    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 | str
 | 
						||
    channel: NotificationChannel
 | 
						||
    info: BillPaymentInfo | BillPaymentStatus
 | 
						||
 | 
						||
 | 
						||
class ServiceBillingDocumentPdf(BaseSchema):
 | 
						||
    name: str = ""
 | 
						||
    price: int
 | 
						||
    quantity: int
 | 
						||
 | 
						||
 | 
						||
class ProductBillingDocumentPdf(BaseSchema):
 | 
						||
    article: str = ""
 | 
						||
    size: str = ""
 | 
						||
    price: int
 | 
						||
    quantity: int
 |