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

1from pydantic import BaseModel, EmailStr, Field 

2from typing import Optional, List 

3from datetime import date, datetime 

4from uuid import UUID 

5 

6 

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 = '' 

21 

22 

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 

38 

39 class Config: 

40 from_attributes = True 

41 

42 

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 = '' 

62 

63 

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 

84 

85 class Config: 

86 from_attributes = True 

87 

88 

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 = '' 

112 

113 

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 

138 

139 class Config: 

140 from_attributes = True 

141 

142 

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 = '' 

171 

172 

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 

202 

203 class Config: 

204 from_attributes = True 

205 

206 

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 = '' 

224 

225 

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 

244 

245 class Config: 

246 from_attributes = True 

247 

248 

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 = '' 

272 

273 

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 

298 

299 class Config: 

300 from_attributes = True 

301 

302 

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 = '' 

311 

312 

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 

322 

323 class Config: 

324 from_attributes = True