Coverage for modules\logistics\schemas.py: 100%
282 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-06 17:01 +0800
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-06 17:01 +0800
1from pydantic import BaseModel, EmailStr, Field
2from typing import Optional, List
3from datetime import date, datetime
4from uuid import UUID
7# ── Warehouse ──────────────────────────────────────────────────────────────────
8class WarehouseIn(BaseModel):
9 name: str
10 warehouse_type: str = 'STORAGE'
11 address: str = ''
12 city: str = ''
13 country: str = ''
14 contact_name: str = ''
15 contact_phone: str = ''
16 contact_email: str = ''
17 capacity_cubic_meters: Optional[float] = None
18 capacity_tons: Optional[float] = None
19 is_active: bool = True
20 notes: str = ''
23class WarehouseOut(BaseModel):
24 id: UUID
25 name: str
26 warehouse_type: str
27 address: str
28 city: str
29 country: str
30 contact_name: str
31 contact_phone: str
32 contact_email: str
33 capacity_cubic_meters: Optional[float]
34 capacity_tons: Optional[float]
35 is_active: bool
36 notes: str
37 created_at: datetime
39 class Config:
40 from_attributes = True
43# ── Warehouse Receipt ────────────────────────────────────────────────────────────
44class WarehouseReceiptIn(BaseModel):
45 receipt_number: str
46 warehouse_id: Optional[UUID] = None
47 client_name: str
48 client_reference: str = ''
49 receipt_date: date
50 arrival_date: Optional[date] = None
51 release_date: Optional[date] = None
52 status: str = 'PENDING'
53 goods_description: str = ''
54 number_of_packages: int = 0
55 gross_weight_kg: Optional[float] = None
56 volume_cubic_meters: Optional[float] = None
57 storage_days: int = 0
58 handling_fee: float = 0
59 storage_fee: float = 0
60 total_fee: float = 0
61 notes: str = ''
64class WarehouseReceiptOut(BaseModel):
65 id: UUID
66 receipt_number: str
67 warehouse_id: Optional[UUID]
68 client_name: str
69 client_reference: str
70 receipt_date: date
71 arrival_date: Optional[date]
72 release_date: Optional[date]
73 status: str
74 goods_description: str
75 number_of_packages: int
76 gross_weight_kg: Optional[float]
77 volume_cubic_meters: Optional[float]
78 storage_days: int
79 handling_fee: float
80 storage_fee: float
81 total_fee: float
82 notes: str
83 created_at: datetime
85 class Config:
86 from_attributes = True
89# ── Shipping Quote ────────────────────────────────────────────────────────────
90class ShippingQuoteIn(BaseModel):
91 quote_number: str
92 client_name: str
93 client_email: str = ''
94 client_phone: str = ''
95 shipment_type: str
96 origin: str
97 destination: str
98 cargo_description: str = ''
99 weight_kg: Optional[float] = None
100 volume_cbm: Optional[float] = None
101 number_of_packages: int = 0
102 estimated_departure: Optional[date] = None
103 estimated_arrival: Optional[date] = None
104 currency: str = 'USD'
105 freight_cost: Optional[float] = None
106 insurance_cost: Optional[float] = None
107 other_charges: float = 0
108 total_amount: Optional[float] = None
109 valid_until: Optional[date] = None
110 status: str = 'DRAFT'
111 notes: str = ''
114class ShippingQuoteOut(BaseModel):
115 id: UUID
116 quote_number: str
117 client_name: str
118 client_email: str
119 client_phone: str
120 shipment_type: str
121 origin: str
122 destination: str
123 cargo_description: str
124 weight_kg: Optional[float]
125 volume_cbm: Optional[float]
126 number_of_packages: int
127 estimated_departure: Optional[date]
128 estimated_arrival: Optional[date]
129 currency: str
130 freight_cost: Optional[float]
131 insurance_cost: Optional[float]
132 other_charges: float
133 total_amount: Optional[float]
134 valid_until: Optional[date]
135 status: str
136 notes: str
137 created_at: datetime
139 class Config:
140 from_attributes = True
143# ── Freight Quote ─────────────────────────────────────────────────────────────
144class FreightQuoteIn(BaseModel):
145 quote_number: str
146 client_name: str
147 client_email: str = ''
148 carrier: str = ''
149 service_type: str
150 origin_port: str
151 destination_port: str
152 vessel_name: str = ''
153 voyage_number: str = ''
154 etd: Optional[date] = None
155 eta: Optional[date] = None
156 container_type: str = ''
157 number_of_containers: int = 0
158 cargo_description: str = ''
159 weight_kg: Optional[float] = None
160 volume_cbm: Optional[float] = None
161 currency: str = 'USD'
162 ocean_freight: Optional[float] = None
163 thc_origin: float = 0
164 thc_destination: float = 0
165 clearance_cost: float = 0
166 delivery_cost: float = 0
167 total_quote: Optional[float] = None
168 valid_until: Optional[date] = None
169 status: str = 'DRAFT'
170 notes: str = ''
173class FreightQuoteOut(BaseModel):
174 id: UUID
175 quote_number: str
176 client_name: str
177 client_email: str
178 carrier: str
179 service_type: str
180 origin_port: str
181 destination_port: str
182 vessel_name: str
183 voyage_number: str
184 etd: Optional[date]
185 eta: Optional[date]
186 container_type: str
187 number_of_containers: int
188 cargo_description: str
189 weight_kg: Optional[float]
190 volume_cbm: Optional[float]
191 currency: str
192 ocean_freight: Optional[float]
193 thc_origin: float
194 thc_destination: float
195 clearance_cost: float
196 delivery_cost: float
197 total_quote: Optional[float]
198 valid_until: Optional[date]
199 status: str
200 notes: str
201 created_at: datetime
203 class Config:
204 from_attributes = True
207# ── Transportation Rate ─────────────────────────────────────────────────────────
208class TransportationRateIn(BaseModel):
209 rate_name: str
210 rate_type: str
211 mode: str
212 origin: str
213 destination: str
214 carrier: str = ''
215 transit_days: int = 0
216 currency: str = 'USD'
217 rate_value: float
218 minimum_charge: Optional[float] = None
219 fuel_surcharge: float = 0
220 effective_from: date
221 effective_to: Optional[date] = None
222 is_active: bool = True
223 notes: str = ''
226class TransportationRateOut(BaseModel):
227 id: UUID
228 rate_name: str
229 rate_type: str
230 mode: str
231 origin: str
232 destination: str
233 carrier: str
234 transit_days: int
235 currency: str
236 rate_value: float
237 minimum_charge: Optional[float]
238 fuel_surcharge: float
239 effective_from: date
240 effective_to: Optional[date]
241 is_active: bool
242 notes: str
243 created_at: datetime
245 class Config:
246 from_attributes = True
249# ── Booking ────────────────────────────────────────────────────────────────────
250class BookingIn(BaseModel):
251 booking_number: str
252 booking_type: str
253 client_name: str
254 client_email: str = ''
255 client_phone: str = ''
256 origin: str
257 destination: str
258 booking_date: date
259 scheduled_date: Optional[date] = None
260 completed_date: Optional[date] = None
261 status: str = 'PENDING'
262 cargo_description: str = ''
263 weight_kg: Optional[float] = None
264 volume_cbm: Optional[float] = None
265 number_of_packages: int = 0
266 vessel_name: str = ''
267 voyage_number: str = ''
268 container_number: str = ''
269 seal_number: str = ''
270 total_amount: Optional[float] = None
271 notes: str = ''
274class BookingOut(BaseModel):
275 id: UUID
276 booking_number: str
277 booking_type: str
278 client_name: str
279 client_email: str
280 client_phone: str
281 origin: str
282 destination: str
283 booking_date: date
284 scheduled_date: Optional[date]
285 completed_date: Optional[date]
286 status: str
287 cargo_description: str
288 weight_kg: Optional[float]
289 volume_cbm: Optional[float]
290 number_of_packages: int
291 vessel_name: str
292 voyage_number: str
293 container_number: str
294 seal_number: str
295 total_amount: Optional[float]
296 notes: str
297 created_at: datetime
299 class Config:
300 from_attributes = True
303# ── Tracking Event ─────────────────────────────────────────────────────────────
304class TrackingEventIn(BaseModel):
305 booking_id: Optional[UUID] = None
306 shipment_reference: str
307 event_type: str
308 location: str
309 event_date: datetime
310 description: str = ''
313class TrackingEventOut(BaseModel):
314 id: UUID
315 booking_id: Optional[UUID]
316 shipment_reference: str
317 event_type: str
318 location: str
319 event_date: datetime
320 description: str
321 created_at: datetime
323 class Config:
324 from_attributes = True