fiscalapi 4.0.462__tar.gz → 4.0.468__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {fiscalapi-4.0.462/fiscalapi.egg-info → fiscalapi-4.0.468}/PKG-INFO +1 -1
  2. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/fiscalapi_models.py +5 -4
  3. {fiscalapi-4.0.462 → fiscalapi-4.0.468/fiscalapi.egg-info}/PKG-INFO +1 -1
  4. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/setup.py +1 -1
  5. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_cycle_contract.py +30 -1
  6. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/LICENSE.txt +0 -0
  7. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/MANIFEST.in +0 -0
  8. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/README.md +0 -0
  9. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/__init__.py +0 -0
  10. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/__init__.py +0 -0
  11. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/carta_porte_models.py +0 -0
  12. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/comercio_exterior_models.py +0 -0
  13. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/common_models.py +0 -0
  14. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/manifest_models.py +0 -0
  15. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/sat_validation_models.py +0 -0
  16. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/ticket_models.py +0 -0
  17. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/models/webhook_models.py +0 -0
  18. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/py.typed +0 -0
  19. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/__init__.py +0 -0
  20. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/api_key_service.py +0 -0
  21. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/base_service.py +0 -0
  22. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/catalog_service.py +0 -0
  23. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/download_catalog_service.py +0 -0
  24. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/download_request_service.py +0 -0
  25. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/download_rule_service.py +0 -0
  26. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/employee_service.py +0 -0
  27. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/employer_service.py +0 -0
  28. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/fiscalapi_client.py +0 -0
  29. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/invoice_service.py +0 -0
  30. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/manifest_service.py +0 -0
  31. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/people_service.py +0 -0
  32. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/product_service.py +0 -0
  33. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/sat_validation_service.py +0 -0
  34. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/stamp_service.py +0 -0
  35. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/tax_file_service.py +0 -0
  36. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/services/ticket_service.py +0 -0
  37. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi/webhooks.py +0 -0
  38. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi.egg-info/SOURCES.txt +0 -0
  39. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi.egg-info/dependency_links.txt +0 -0
  40. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi.egg-info/requires.txt +0 -0
  41. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/fiscalapi.egg-info/top_level.txt +0 -0
  42. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/pyproject.toml +0 -0
  43. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/setup.cfg +0 -0
  44. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_error_trace_identifier.py +0 -0
  45. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_idempotency_key.py +0 -0
  46. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_invoice_item_ticket_id.py +0 -0
  47. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_response_tolerance.py +0 -0
  48. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_ticket_service.py +0 -0
  49. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_webhook_back_interop.py +0 -0
  50. {fiscalapi-4.0.462 → fiscalapi-4.0.468}/tests/test_webhook_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiscalapi
3
- Version: 4.0.462
3
+ Version: 4.0.468
4
4
  Summary: Genera facturas CFDI válidas ante el SAT consumiendo el API de https://www.fiscalapi.com
5
5
  Home-page: https://www.fiscalapi.com
6
6
  Author: Fiscalapi
@@ -363,10 +363,10 @@ class InvoicePayment(BaseDto):
363
363
  currency_code: str = Field(default="MXN", alias="currencyCode", description="Código de la moneda utilizada en el pago: una clave del catálogo c_Moneda del SAT, en mayúsculas, distinta de XXX.")
364
364
  exchange_rate: Optional[Decimal] = Field(default=Decimal("1"), alias="exchangeRate", description="Tipo de cambio FIX conforme a la moneda registrada en la factura. Si la moneda es MXN, el tipo de cambio debe ser 1..")
365
365
  amount: Decimal = Field(default=..., description="Monto del pago.")
366
- source_bank_tin: str = Field(default=..., alias="sourceBankTin", description="RFC del banco origen. (Rfc del banco emisor del pago)")
367
- source_bank_account: str = Field(default=..., alias="sourceBankAccount", description="Cuenta bancaria origen. (Cuenta bancaria del banco emisor del pago)")
368
- target_bank_tin: str = Field(default=..., alias="targetBankTin", description="RFC del banco destino. (Rfc del banco receptor del pago)")
369
- target_bank_account: str = Field(default=..., alias="targetBankAccount", description="Cuenta bancaria destino (Cuenta bancaria del banco receptor del pago)")
366
+ source_bank_tin: Optional[str] = Field(default=None, alias="sourceBankTin", description="RFC del banco origen. (Rfc del banco emisor del pago)")
367
+ source_bank_account: Optional[str] = Field(default=None, alias="sourceBankAccount", description="Cuenta bancaria origen. (Cuenta bancaria del banco emisor del pago)")
368
+ target_bank_tin: Optional[str] = Field(default=None, alias="targetBankTin", description="RFC del banco destino. (Rfc del banco receptor del pago)")
369
+ target_bank_account: Optional[str] = Field(default=None, alias="targetBankAccount", description="Cuenta bancaria destino (Cuenta bancaria del banco receptor del pago)")
370
370
  paid_invoices: list[PaidInvoice] = Field(default=..., alias="paidInvoices", description="Facturas pagadas con el pago recibido.")
371
371
 
372
372
  model_config = ConfigDict(populate_by_name=True)
@@ -404,6 +404,7 @@ class PaymentComplement(BaseDto):
404
404
  source_bank_account: Optional[str] = Field(default=None, alias="sourceBankAccount", description="Cuenta bancaria origen.")
405
405
  target_bank_tin: Optional[str] = Field(default=None, alias="targetBankTin", description="RFC del banco destino.")
406
406
  target_bank_account: Optional[str] = Field(default=None, alias="targetBankAccount", description="Cuenta bancaria destino.")
407
+ foreign_bank_name: Optional[str] = Field(default=None, alias="foreignBankName", description="Nombre del banco ordenante extranjero. Obligatorio cuando source_bank_tin es XEXX010101000.")
407
408
  paid_invoices: Optional[list["PaidInvoice"]] = Field(default=None, alias="paidInvoices", description="Facturas pagadas.")
408
409
 
409
410
  model_config = ConfigDict(populate_by_name=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiscalapi
3
- Version: 4.0.462
3
+ Version: 4.0.468
4
4
  Summary: Genera facturas CFDI válidas ante el SAT consumiendo el API de https://www.fiscalapi.com
5
5
  Home-page: https://www.fiscalapi.com
6
6
  Author: Fiscalapi
@@ -2,7 +2,7 @@
2
2
  import os
3
3
  from setuptools import setup, find_packages
4
4
 
5
- VERSION = "4.0.462"
5
+ VERSION = "4.0.468"
6
6
 
7
7
  DESCRIPTION = "Genera facturas CFDI válidas ante el SAT consumiendo el API de https://www.fiscalapi.com"
8
8
 
@@ -25,7 +25,7 @@ from fiscalapi import (
25
25
  TaxCredential,
26
26
  TaxFile,
27
27
  )
28
- from fiscalapi.models.fiscalapi_models import ItemTax, LocalTax, PaidInvoiceTax
28
+ from fiscalapi.models.fiscalapi_models import ItemTax, LocalTax, PaidInvoiceTax, PaymentComplement
29
29
 
30
30
  BASE_URL = "https://sdk-tests.fiscalapi.invalid/api/v4"
31
31
  PERSON_ID = "4b1c2d3e-0000-4000-8000-000000000002"
@@ -189,3 +189,32 @@ def test_invoice_payment_accepts_any_currency_code_and_defaults_to_mxn():
189
189
 
190
190
  assert InvoicePayment(currency_code="CAD", **common).model_dump(by_alias=True)["currencyCode"] == "CAD"
191
191
  assert InvoicePayment(**common).currency_code == "MXN"
192
+
193
+
194
+ BANK_KEYS = ("sourceBankTin", "sourceBankAccount", "targetBankTin", "targetBankAccount")
195
+
196
+
197
+ def test_invoice_payment_bank_fields_are_optional_and_sent_as_given():
198
+ common = dict(payment_date="2026-10-08T10:00:00", amount=Decimal("100"), paid_invoices=[])
199
+ bank = dict(
200
+ source_bank_tin="BSM970519DU8",
201
+ source_bank_account="1234567891012131",
202
+ target_bank_tin="BBA830831LJ2",
203
+ target_bank_account="1234567890",
204
+ )
205
+
206
+ cash = InvoicePayment(payment_form_code="01", **common).model_dump(by_alias=True, exclude_none=True)
207
+ card = InvoicePayment(payment_form_code="28", **common, **bank).model_dump(by_alias=True, exclude_none=True)
208
+
209
+ assert not set(BANK_KEYS) & cash.keys()
210
+ assert [card[key] for key in BANK_KEYS] == list(bank.values())
211
+
212
+
213
+ def test_payment_complement_sends_foreign_bank_name_only_when_given():
214
+ common = dict(payment_date="2026-10-08T10:00:00", payment_form_code="03", amount=Decimal("100"))
215
+
216
+ foreign = PaymentComplement(source_bank_tin="XEXX010101000", foreign_bank_name="BANK OF TOKY", **common)
217
+ national = PaymentComplement(source_bank_tin="BSM970519DU8", **common)
218
+
219
+ assert foreign.model_dump(by_alias=True, exclude_none=True)["foreignBankName"] == "BANK OF TOKY"
220
+ assert "foreignBankName" not in national.model_dump(by_alias=True, exclude_none=True)
File without changes
File without changes
File without changes
File without changes
File without changes