214 lines
5.9 KiB
Python
214 lines
5.9 KiB
Python
from typing import List, Optional, Dict
|
|
from pydantic import BaseModel, Field, confloat, constr
|
|
|
|
|
|
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 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 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 Error(BaseModel):
|
|
error_id: Optional[str] = None
|
|
code: int
|
|
text: str
|
|
type: Optional[str] = None
|
|
|
|
|
|
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
|
|
sum: Optional[SumNumberTwoFormat] = None
|
|
|
|
|
|
class CorrectionInfo(BaseModel):
|
|
type: str
|
|
base_date: str
|
|
base_number: str
|
|
|
|
|
|
class Payment(BaseModel):
|
|
type: int
|
|
sum: SumNumberTwoFormat
|
|
|
|
|
|
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 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 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 DocModel(BaseModel):
|
|
uuid: str
|
|
timestamp: str
|
|
group_code: str
|
|
daemon_code: str
|
|
device_code: str
|
|
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 SellModel(BaseModel):
|
|
external_id: constr(max_length=128)
|
|
receipt: Receipt
|
|
service: Optional[Service] = None
|
|
timestamp: str
|
|
|
|
|
|
class CorrectionModel(BaseModel):
|
|
timestamp: str
|
|
external_id: constr(max_length=128)
|
|
service: Optional[Service] = None
|
|
correction: Correction
|
|
|
|
|
|
class SellBaseModel(BaseModel):
|
|
|
|
def parse(self, db_dict_list):
|
|
sell_list = []
|
|
for db_dict in db_dict_list:
|
|
receipt = db_dict.get('reciept')
|
|
sell = db_dict.get('sell')
|
|
vats = db_dict.get('vats')
|
|
payments = db_dict.get('payments')
|
|
items = db_dict.get('items')
|
|
company = db_dict.get('company')
|
|
client = db_dict.get('client')
|
|
payments_model = [Payment(**payment) for payment in payments]
|
|
items_model = [Item(**item) for item in items]
|
|
#vats_model = [Vat(**vat) for vat in vats]
|
|
|
|
receipt['client'] = ClientItem(
|
|
**client if client.get('phone') != None else {'email': 'test@test.ru'})
|
|
#receipt['vats'] = vats_model if len(vats_model) > 0 else None
|
|
|
|
receipt['items'] = items_model
|
|
receipt['vats'] = None
|
|
receipt['payments'] = payments_model
|
|
receipt['company'] = Company(**company)
|
|
receipt_model = Receipt(**receipt)
|
|
sell['receipt'] = receipt_model
|
|
sell['timestamp'] = sell['timestamp'].strftime(
|
|
'%d.%m.%Y %H:%M:%S')
|
|
sellmodel = SellModel(**sell)
|
|
sell_list.append(sellmodel)
|
|
return sell_list
|