Coverage for modules\erp\schemas.py: 100%
173 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:25 +0800
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:25 +0800
1from typing import Optional, List
2from pydantic import BaseModel, ConfigDict, EmailStr
3from uuid import UUID
4from datetime import datetime, date
5from decimal import Decimal
7class AccountIn(BaseModel):
8 code: str
9 name: str
10 type: str # ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE
11 currency: Optional[str] = 'PHP'
13class AccountOut(BaseModel):
14 id: UUID
15 code: str
16 name: str
17 type: str
18 currency: str
19 is_active: bool
20 balance: Decimal = Decimal('0.00')
22 model_config = ConfigDict(from_attributes=True)
24class ProductIn(BaseModel):
25 sku: str
26 name: str
27 description: Optional[str] = None
28 category: Optional[str] = None
29 cost_price: Decimal = Decimal('0.00')
30 selling_price: Decimal = Decimal('0.00')
31 tax_rate: Decimal = Decimal('0.00')
32 unit_of_measure: Optional[str] = 'pcs'
33 reorder_level: Optional[int] = 10
35class ProductOut(BaseModel):
36 id: UUID
37 sku: str
38 name: str
39 description: Optional[str] = None
40 category: Optional[str] = None
41 cost_price: Decimal
42 selling_price: Decimal
43 tax_rate: Decimal
44 unit_of_measure: str
45 is_active: bool
46 current_stock: Decimal
47 reorder_level: int
48 created_at: datetime
49 updated_at: datetime
51 model_config = ConfigDict(from_attributes=True)
53class StockMoveIn(BaseModel):
54 product_id: UUID
55 source_warehouse_id: Optional[UUID] = None
56 dest_warehouse_id: Optional[UUID] = None
57 quantity: Decimal
58 unit_cost: Decimal = Decimal('0.00')
59 move_type: str # INCOMING, OUTGOING, INTERNAL_TRANSFER, ADJUSTMENT
60 reference_doc: Optional[str] = None
62class StockMoveOut(BaseModel):
63 id: UUID
64 product_id: UUID
65 product_name: str
66 product_sku: str
67 source_warehouse_name: Optional[str] = None
68 dest_warehouse_name: Optional[str] = None
69 quantity: Decimal
70 unit_cost: Decimal
71 move_type: str
72 reference_doc: Optional[str] = None
73 created_at: datetime
75 model_config = ConfigDict(from_attributes=True)
77class InvoiceLineIn(BaseModel):
78 product_id: Optional[UUID] = None
79 description: str
80 quantity: Decimal
81 unit_price: Decimal
82 tax_rate: Decimal = Decimal('0.00')
84class InvoiceLineOut(BaseModel):
85 id: UUID
86 product_id: Optional[UUID] = None
87 description: str
88 quantity: Decimal
89 unit_price: Decimal
90 tax_rate: Decimal
91 subtotal: Decimal
92 tax_amount: Decimal
93 total: Decimal
95 model_config = ConfigDict(from_attributes=True)
97class InvoiceIn(BaseModel):
98 customer_name: str
99 customer_email: Optional[EmailStr] = None
100 deal_id: Optional[UUID] = None
101 issue_date: Optional[date] = None
102 due_date: date
103 currency: Optional[str] = 'PHP'
104 notes: Optional[str] = None
105 terms: Optional[str] = None
106 lines: List[InvoiceLineIn]
108class InvoiceOut(BaseModel):
109 id: UUID
110 invoice_number: str
111 customer_name: str
112 customer_email: Optional[str] = None
113 deal_id: Optional[UUID] = None
114 issue_date: date
115 due_date: date
116 status: str
117 currency: str
118 subtotal: Decimal
119 tax_total: Decimal
120 total_amount: Decimal
121 amount_paid: Decimal
122 balance_due: Decimal
123 notes: Optional[str] = None
124 terms: Optional[str] = None
125 lines: List[InvoiceLineOut]
126 created_at: datetime
127 updated_at: datetime
129 model_config = ConfigDict(from_attributes=True)
131class InvoicePaymentIn(BaseModel):
132 amount: Decimal
133 payment_method: Optional[str] = 'BANK_TRANSFER'
136class ShipmentIn(BaseModel):
137 customer_name: str
138 customer_email: Optional[EmailStr] = None
139 shipment_type: str = 'IMPORT'
140 status: str = 'DRAFT'
141 origin: str
142 destination: str
143 carrier: Optional[str] = None
144 tracking_number: Optional[str] = None
145 bill_of_lading: Optional[str] = None
146 customs_entry_number: Optional[str] = None
147 estimated_arrival: Optional[date] = None
148 declared_value: Decimal = Decimal('0.00')
149 duty_amount: Decimal = Decimal('0.00')
150 freight_amount: Decimal = Decimal('0.00')
151 currency: Optional[str] = 'PHP'
152 notes: Optional[str] = None
155class ShipmentUpdateIn(BaseModel):
156 customer_name: Optional[str] = None
157 customer_email: Optional[EmailStr] = None
158 shipment_type: Optional[str] = None
159 status: Optional[str] = None
160 origin: Optional[str] = None
161 destination: Optional[str] = None
162 carrier: Optional[str] = None
163 tracking_number: Optional[str] = None
164 bill_of_lading: Optional[str] = None
165 customs_entry_number: Optional[str] = None
166 estimated_arrival: Optional[date] = None
167 declared_value: Optional[Decimal] = None
168 duty_amount: Optional[Decimal] = None
169 freight_amount: Optional[Decimal] = None
170 currency: Optional[str] = None
171 notes: Optional[str] = None
174class ShipmentOut(BaseModel):
175 id: UUID
176 reference_number: str
177 customer_name: str
178 customer_email: Optional[str] = None
179 shipment_type: str
180 status: str
181 origin: str
182 destination: str
183 carrier: Optional[str] = None
184 tracking_number: Optional[str] = None
185 bill_of_lading: Optional[str] = None
186 customs_entry_number: Optional[str] = None
187 estimated_arrival: Optional[date] = None
188 declared_value: Decimal
189 duty_amount: Decimal
190 freight_amount: Decimal
191 currency: str
192 notes: Optional[str] = None
193 created_at: datetime
194 updated_at: datetime
196 model_config = ConfigDict(from_attributes=True)