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

1from typing import Optional, List 

2from pydantic import BaseModel, ConfigDict 

3from uuid import UUID 

4from datetime import datetime, date 

5from decimal import Decimal 

6 

7 

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 

37 

38 

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 

70 

71 model_config = ConfigDict(from_attributes=True) 

72 

73 

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 

83 

84 

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 

96 

97 model_config = ConfigDict(from_attributes=True) 

98 

99 

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 

111 

112 

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 

126 

127 model_config = ConfigDict(from_attributes=True) 

128 

129 

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 

140 

141 

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 

154 

155 model_config = ConfigDict(from_attributes=True)