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

1from typing import Optional, List 

2from pydantic import BaseModel, ConfigDict, EmailStr 

3from uuid import UUID 

4from datetime import datetime, date 

5from decimal import Decimal 

6 

7class AccountIn(BaseModel): 

8 code: str 

9 name: str 

10 type: str # ASSET, LIABILITY, EQUITY, REVENUE, EXPENSE 

11 currency: Optional[str] = 'PHP' 

12 

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

21 

22 model_config = ConfigDict(from_attributes=True) 

23 

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 

34 

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 

50 

51 model_config = ConfigDict(from_attributes=True) 

52 

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 

61 

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 

74 

75 model_config = ConfigDict(from_attributes=True) 

76 

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

83 

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 

94 

95 model_config = ConfigDict(from_attributes=True) 

96 

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] 

107 

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 

128 

129 model_config = ConfigDict(from_attributes=True) 

130 

131class InvoicePaymentIn(BaseModel): 

132 amount: Decimal 

133 payment_method: Optional[str] = 'BANK_TRANSFER' 

134 

135 

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 

153 

154 

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 

172 

173 

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 

195 

196 model_config = ConfigDict(from_attributes=True)