from ast import Try from typing import List, Optional, Dict from pydantic import BaseModel, Field, confloat, constr from sqlalchemy.sql.sqltypes import Boolean, DateTime from sqlalchemy.sql.sqltypes import DateTime class SumNumberTwoFormat(BaseModel): __root__: Optional[confloat(ge=0.0, le=100000000.0)]#, multiple_of=0.01)] class NumberPrice(BaseModel): __root__: confloat(ge=0.0, le=42949673.0)#, multiple_of=0.01) class PhoneNumber(BaseModel): __root__: constr(regex=r'^([^\s\\]{0,17}|\+[^\s\\]{1,18})$') class NumberTwoFormat(BaseModel): __root__: confloat(ge=0.0, le=100000000.0)#, multiple_of=0.01) class NumberThreeFormat(BaseModel): __root__: confloat(ge=0.0, le=100000.0, multiple_of=0.001) class Service(BaseModel): callback_url: Optional[constr(max_length=256)] = None class Warnings(BaseModel): callback_url: str = None class PayingAgent(BaseModel): operation: Optional[str] = None phones: Optional[List[PhoneNumber]] = None class SupplierInfo(BaseModel): phones: Optional[List[PhoneNumber]] = None name: Optional[str] = None inn: Optional[str] = None class Config: orm_mode = True class ReceivePaymentsOperator(BaseModel): phones: Optional[List[PhoneNumber]] = None class MoneyTransferOperator(BaseModel): phones: Optional[List[PhoneNumber]] = None name: Optional[str] = None address: Optional[str] = None inn: Optional[constr(regex=r'(^[0-9]{10}$)|(^[0-9]{12}$)')] = None class Company(BaseModel): email: Optional[constr(max_length=64)] = None sno: Optional[str] = None inn: constr(max_length=12) payment_address: constr(max_length=256) class Config: orm_mode = True class ClientItem(BaseModel): email: constr(max_length=64) = None phone: Optional[constr(max_length=64)] = None class AdditionalUserProps(BaseModel): name: constr(max_length=64) value: constr(max_length=256) class AgentInfo(BaseModel): type: Optional[str] = None paying_agent: Optional[PayingAgent] = None receive_payments_operator: Optional[ReceivePaymentsOperator] = None money_transfer_operator: Optional[MoneyTransferOperator] = None class Config: orm_mode = True class Error(BaseModel): error_id: Optional[str] = None code: int text: str type: Optional[str] = None class Config: orm_mode = True class Payload(BaseModel): fiscal_receipt_number: int shift_number: int receipt_datetime: str total: float fn_number: str ecr_registration_number: str fiscal_document_number: int fiscal_document_attribute: int fns_site: str class Vat(BaseModel): type: Optional[str] = None class Config: orm_mode = True class CorrectionInfo(BaseModel): type: str base_date: str base_number: str class Payment(BaseModel): type: int sum: SumNumberTwoFormat class Config: orm_mode = True class Item(BaseModel): name: str price: NumberPrice quantity: NumberThreeFormat sum: SumNumberTwoFormat measurement_unit: Optional[constr(max_length=16)] = None payment_method: Optional[str] = None payment_object: Optional[str] = None nomenclature_code: Optional[str] = None vat: Optional[Vat] = None agent_info: Optional[AgentInfo] = None supplier_info: Optional[SupplierInfo] = None user_data: Optional[constr(max_length=64)] = None excise: Optional[confloat(ge=0.0)] = None country_code: Optional[constr( regex=r'^[0-9]*$', min_length=1, max_length=3)] = None declaration_number: Optional[constr(min_length=1, max_length=32)] = None class Config: orm_mode = True class Receipt(BaseModel): client: ClientItem company: Company agent_info: Optional[AgentInfo] = None supplier_info: Optional[SupplierInfo] = None items: List[Item] = Field(..., min_items=1) payments: List[Payment] = Field(..., max_items=10, min_items=1) vats: Optional[List[Vat]] = Field(None, max_items=6, min_items=1) total: NumberTwoFormat additional_check_props: Optional[constr(max_length=16)] = None cashier: Optional[constr(max_length=64)] = None additional_user_props: Optional[AdditionalUserProps] = None class Config: orm_mode = True class Correction(BaseModel): company: Company cashier: Optional[constr(max_length=64)] = None correction_info: CorrectionInfo payments: List[int] = Field(..., max_items=10, min_items=1) vats: List[Vat] = Field(..., max_items=6, min_items=1) class Config: orm_mode = True class Doc(BaseModel): uuid: Optional[str] = None timestamp: str group_code:Optional[str] = None daemon_code: Optional[str] = None device_code: Optional[str] = None external_id: Optional[str] = None callback_url: Optional[str] = None status: Optional[str] = None error: Error = None warnings: Optional[Warnings] = None payload: Payload = None class Config: orm_mode = True class Sell(BaseModel): external_id: constr(max_length=128) receipt: Receipt service: Optional[Service] = None timestamp: str = None class Config: arbitrary_types_allowed = True class AtolSell(BaseModel): uuid: str timestamp: str status: Optional[str] = None error: Error = None external_id: Optional[str] = None class Config: orm_mode = True class SellCreate(Sell): is_refund: bool class SellShow(SellCreate): id: int class Correction(BaseModel): timestamp: str external_id: constr(max_length=128) service: Optional[Service] = None