Coverage for modules\customs\schemas.py: 100%
131 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 typing import Optional, List
2from pydantic import BaseModel, ConfigDict
3from uuid import UUID
4from datetime import datetime, date
5from decimal import Decimal
8# ── Customs Entry ──────────────────────────────────────────────────────────────
9class CustomsEntryIn(BaseModel):
10 entry_number: str
11 entry_type: str
12 status: str = "DRAFT"
13 client_name: str
14 client_reference: Optional[str] = None
15 bl_number: Optional[str] = None
16 container_number: Optional[str] = None
17 vessel_name: Optional[str] = None
18 voyage_number: Optional[str] = None
19 port_of_loading: Optional[str] = None
20 port_of_discharge: Optional[str] = None
21 eta: Optional[date] = None
22 goods_description: Optional[str] = None
23 hs_code: Optional[str] = None
24 number_of_packages: int = 0
25 gross_weight_kg: Decimal = Decimal("0.00")
26 fob_value: Decimal = Decimal("0.00")
27 freight_cost: Decimal = Decimal("0.00")
28 insurance_cost: Decimal = Decimal("0.00")
29 cif_value: Decimal = Decimal("0.00")
30 duty_amount: Decimal = Decimal("0.00")
31 vat_amount: Decimal = Decimal("0.00")
32 entry_date: Optional[date] = None
33 clearance_date: Optional[date] = None
34 due_date: Optional[date] = None
35 assigned_broker: Optional[str] = None
36 notes: Optional[str] = None
39class CustomsEntryOut(BaseModel):
40 id: UUID
41 entry_number: str
42 entry_type: str
43 status: str
44 client_name: str
45 client_reference: Optional[str] = None
46 bl_number: Optional[str] = None
47 container_number: Optional[str] = None
48 vessel_name: Optional[str] = None
49 voyage_number: Optional[str] = None
50 port_of_loading: Optional[str] = None
51 port_of_discharge: Optional[str] = None
52 eta: Optional[date] = None
53 goods_description: Optional[str] = None
54 hs_code: Optional[str] = None
55 number_of_packages: int
56 gross_weight_kg: Decimal
57 fob_value: Decimal
58 freight_cost: Decimal
59 insurance_cost: Decimal
60 cif_value: Decimal
61 duty_amount: Decimal
62 vat_amount: Decimal
63 entry_date: Optional[date] = None
64 clearance_date: Optional[date] = None
65 due_date: Optional[date] = None
66 assigned_broker: Optional[str] = None
67 notes: Optional[str] = None
68 created_at: datetime
69 updated_at: datetime
71 model_config = ConfigDict(from_attributes=True)
74# ── Compliance Document ────────────────────────────────────────────────────────
75class ComplianceDocumentIn(BaseModel):
76 entry_id: UUID
77 document_type: str
78 document_number: Optional[str] = None
79 issue_date: Optional[date] = None
80 expiry_date: Optional[date] = None
81 file_url: Optional[str] = None
82 notes: Optional[str] = None
85class ComplianceDocumentOut(BaseModel):
86 id: UUID
87 entry_id: UUID
88 document_type: str
89 document_number: Optional[str] = None
90 issue_date: Optional[date] = None
91 expiry_date: Optional[date] = None
92 file_url: Optional[str] = None
93 notes: Optional[str] = None
94 created_at: datetime
95 updated_at: datetime
97 model_config = ConfigDict(from_attributes=True)
100# ── Duty Rate ──────────────────────────────────────────────────────────────────
101class DutyRateIn(BaseModel):
102 hs_code: str
103 description: Optional[str] = None
104 duty_rate_percent: Decimal = Decimal("0.00")
105 vat_rate_percent: Decimal = Decimal("0.00")
106 additional_duty_percent: Decimal = Decimal("0.00")
107 country_of_origin: Optional[str] = None
108 effective_from: Optional[date] = None
109 effective_to: Optional[date] = None
110 is_active: bool = True
113class DutyRateOut(BaseModel):
114 id: UUID
115 hs_code: str
116 description: Optional[str] = None
117 duty_rate_percent: Decimal
118 vat_rate_percent: Decimal
119 additional_duty_percent: Decimal
120 country_of_origin: Optional[str] = None
121 effective_from: Optional[date] = None
122 effective_to: Optional[date] = None
123 is_active: bool
124 created_at: datetime
125 updated_at: datetime
127 model_config = ConfigDict(from_attributes=True)
130# ── Broker License ─────────────────────────────────────────────────────────────
131class BrokerLicenseIn(BaseModel):
132 broker_name: str
133 license_number: str
134 issuing_authority: str
135 license_type: Optional[str] = None
136 issue_date: date
137 expiry_date: date
138 is_active: bool = True
139 notes: Optional[str] = None
142class BrokerLicenseOut(BaseModel):
143 id: UUID
144 broker_name: str
145 license_number: str
146 issuing_authority: str
147 license_type: Optional[str] = None
148 issue_date: date
149 expiry_date: date
150 is_active: bool
151 notes: Optional[str] = None
152 created_at: datetime
153 updated_at: datetime
155 model_config = ConfigDict(from_attributes=True)