Skip to content

Commit a1cc88f

Browse files
committed
invcome invoice created
1 parent 1d29ca6 commit a1cc88f

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

fiscalapi/models/fiscalapi_models.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class InvoiceRecipient(BaseDto):
120120
legal_name: Optional[str] = Field(default=None, alias="legalName", description="Razón social del receptor sin regimen de capital.")
121121
tax_regime_code: Optional[str] = Field(default=None, alias="taxRegimeCode", description="Código del régimen fiscal del receptor.")
122122
cfdi_use_code: Optional[str] = Field(default=None, alias="cfdiUseCode", description="Código del uso CFDI.")
123+
zip_code: Optional[str] = Field(default=None, alias="zipCode", description="Código postal del receptor. Debe coincidir con el código postal de su constancia de residencia fiscal.")
123124
email: Optional[str] = Field(default=None, description="Correo electrónico del receptor.")
124125

125126
class ItemTax(BaseDto):
@@ -128,6 +129,11 @@ class ItemTax(BaseDto):
128129
tax_type_code: str = Field(..., alias="taxTypeCode", description="Tipo de factor.")
129130
tax_rate: Decimal = Field(..., alias="taxRate", description="Tasa del impuesto.")
130131
tax_flag_code: Optional[Literal["T", "R"]] = Field(default=None, alias="taxFlagCode", description="Código que indica la naturaleza del impuesto. (T)raslado o (R)etención.")
132+
133+
model_config = ConfigDict(
134+
populate_by_name=True,
135+
json_encoders={Decimal: str}
136+
)
131137

132138

133139
class InvoiceItem(BaseDto):
@@ -143,6 +149,11 @@ class InvoiceItem(BaseDto):
143149
item_sku: Optional[str] = Field(default=None, alias="itemSku", description="SKU o clave del sistema externo.")
144150
item_taxes: Optional[List[ItemTax]] = Field(default=None, alias="itemTaxes", description="Impuestos aplicables al producto o servicio.")
145151

152+
model_config = ConfigDict(
153+
populate_by_name=True,
154+
json_encoders={Decimal: str}
155+
)
156+
146157
class GlobalInformation(BaseDto):
147158
"""Modelo para la información global de la factura global."""
148159
periodicity_code: str = Field(..., alias="periodicityCode", description="Código SAT de la periodicidad de la factura global.")

fiscalapi/services/invoice_service.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,24 @@ def get_list(self, page_number: int, page_size: int) -> ApiResponse[PagedList[In
1414
def get_by_id(self, invoice_id: int, details: bool = False) -> ApiResponse[Invoice]:
1515
endpoint = f"invoices/{invoice_id}"
1616
return self.send_request("GET", endpoint, Invoice, details=details)
17+
18+
# create invoice
19+
def create(self, invoice: Invoice) -> ApiResponse[Invoice]:
20+
if invoice is None:
21+
raise ValueError("request_model cannot be null")
22+
23+
endpoint = self._get_endpoint_by_type(invoice.type_code)
24+
return self.send_request("POST", endpoint, Invoice, payload=invoice)
25+
26+
27+
# helper method to determine the endpoint based on invoice type
28+
def _get_endpoint_by_type(self, type_code: str) -> str:
29+
if type_code == "I":
30+
return "invoices/income"
31+
elif type_code == "E":
32+
return "invoices/credit-note"
33+
elif type_code == "P":
34+
return "invoices/payment"
35+
else:
36+
raise ValueError(f"Unsupported invoice type: {type_code}")
1737

0 commit comments

Comments
 (0)