fiscalapi 4.0.360__tar.gz → 4.0.384__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 (33) hide show
  1. {fiscalapi-4.0.360/fiscalapi.egg-info → fiscalapi-4.0.384}/PKG-INFO +2 -2
  2. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/README.md +1 -1
  3. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/__init__.py +50 -2
  4. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/models/__init__.py +49 -2
  5. fiscalapi-4.0.384/fiscalapi/models/carta_porte_models.py +356 -0
  6. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/models/fiscalapi_models.py +2 -7
  7. {fiscalapi-4.0.360 → fiscalapi-4.0.384/fiscalapi.egg-info}/PKG-INFO +2 -2
  8. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/SOURCES.txt +1 -0
  9. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/setup.py +1 -1
  10. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/LICENSE.txt +0 -0
  11. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/MANIFEST.in +0 -0
  12. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/models/common_models.py +0 -0
  13. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/py.typed +0 -0
  14. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/__init__.py +0 -0
  15. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/api_key_service.py +0 -0
  16. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/base_service.py +0 -0
  17. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/catalog_service.py +0 -0
  18. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/download_catalog_service.py +0 -0
  19. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/download_request_service.py +0 -0
  20. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/download_rule_service.py +0 -0
  21. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/employee_service.py +0 -0
  22. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/employer_service.py +0 -0
  23. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/fiscalapi_client.py +0 -0
  24. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/invoice_service.py +0 -0
  25. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/people_service.py +0 -0
  26. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/product_service.py +0 -0
  27. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/stamp_service.py +0 -0
  28. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/tax_file_service.py +0 -0
  29. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/dependency_links.txt +0 -0
  30. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/requires.txt +0 -0
  31. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/top_level.txt +0 -0
  32. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/pyproject.toml +0 -0
  33. {fiscalapi-4.0.360 → fiscalapi-4.0.384}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiscalapi
3
- Version: 4.0.360
3
+ Version: 4.0.384
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
@@ -41,7 +41,7 @@ Dynamic: summary
41
41
  [![PyPI version](https://badge.fury.io/py/fiscalapi.svg?cachebuster=1)](https://badge.fury.io/py/fiscalapi)
42
42
  [![License: MPL-2.0](https://img.shields.io/badge/License-MPL_2.0-blue.svg)](https://github.com/FiscalAPI/fiscalapi-python/blob/main/LICENSE.txt)
43
43
 
44
- **SDK oficial de FiscalAPI para Python**, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Facturar sin dolor ahora es posible!
44
+ **SDK oficial de https://fiscalapi.com para Python**, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Facturar sin dolor ahora es posible!
45
45
 
46
46
 
47
47
  ## 📋 Facturación CFDI 4.0
@@ -3,7 +3,7 @@
3
3
  [![PyPI version](https://badge.fury.io/py/fiscalapi.svg?cachebuster=1)](https://badge.fury.io/py/fiscalapi)
4
4
  [![License: MPL-2.0](https://img.shields.io/badge/License-MPL_2.0-blue.svg)](https://github.com/FiscalAPI/fiscalapi-python/blob/main/LICENSE.txt)
5
5
 
6
- **SDK oficial de FiscalAPI para Python**, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Facturar sin dolor ahora es posible!
6
+ **SDK oficial de https://fiscalapi.com para Python**, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Facturar sin dolor ahora es posible!
7
7
 
8
8
 
9
9
  ## 📋 Facturación CFDI 4.0
@@ -21,6 +21,32 @@ from .models.common_models import (
21
21
  ValidationFailure,
22
22
  )
23
23
 
24
+ # Modelos de Carta Porte
25
+ from .models.carta_porte_models import (
26
+ UbicacionDomicilio,
27
+ TipoFiguraDomicilio,
28
+ RegimenAduanero,
29
+ Ubicacion,
30
+ DocumentoAduanero,
31
+ GuiaIdentificacion,
32
+ CantidadTransporta,
33
+ DetalleMercancia,
34
+ Mercancia,
35
+ Remolque,
36
+ Autotransporte,
37
+ RemolqueCCP,
38
+ ContenedorMaritimo,
39
+ TransporteMaritimo,
40
+ TransporteAereo,
41
+ DerechoDePaso,
42
+ CarroContenedor,
43
+ Carro,
44
+ TransporteFerroviario,
45
+ ParteTransporte,
46
+ TipoFigura,
47
+ CartaPorteComplement,
48
+ )
49
+
24
50
  # Modelos de dominio
25
51
  from .models.fiscalapi_models import (
26
52
  # Product models
@@ -65,7 +91,7 @@ from .models.fiscalapi_models import (
65
91
  PayrollDeduction,
66
92
  PayrollDisability,
67
93
  PayrollComplement,
68
- LadingComplement,
94
+ CartaPorteComplement,
69
95
  InvoiceComplement,
70
96
  # Invoice models
71
97
  InvoiceResponse,
@@ -169,8 +195,30 @@ __all__ = [
169
195
  "PayrollDeduction",
170
196
  "PayrollDisability",
171
197
  "PayrollComplement",
172
- "LadingComplement",
198
+ "CartaPorteComplement",
173
199
  "InvoiceComplement",
200
+ # Carta Porte models
201
+ "UbicacionDomicilio",
202
+ "TipoFiguraDomicilio",
203
+ "RegimenAduanero",
204
+ "Ubicacion",
205
+ "DocumentoAduanero",
206
+ "CantidadTransporta",
207
+ "DetalleMercancia",
208
+ "Mercancia",
209
+ "Remolque",
210
+ "Autotransporte",
211
+ "RemolqueCCP",
212
+ "ContenedorMaritimo",
213
+ "TransporteMaritimo",
214
+ "TransporteAereo",
215
+ "DerechoDePaso",
216
+ "CarroContenedor",
217
+ "Carro",
218
+ "TransporteFerroviario",
219
+ "ParteTransporte",
220
+ "TipoFigura",
221
+ "CartaPorteComplement",
174
222
  # Invoice models
175
223
  "InvoiceResponse",
176
224
  "Invoice",
@@ -8,6 +8,31 @@ from .common_models import (
8
8
  PagedList,
9
9
  ValidationFailure,
10
10
  )
11
+ from .carta_porte_models import (
12
+ # Carta Porte models
13
+ UbicacionDomicilio,
14
+ TipoFiguraDomicilio,
15
+ RegimenAduanero,
16
+ Ubicacion,
17
+ DocumentoAduanero,
18
+ GuiaIdentificacion,
19
+ CantidadTransporta,
20
+ DetalleMercancia,
21
+ Mercancia,
22
+ Remolque,
23
+ Autotransporte,
24
+ RemolqueCCP,
25
+ ContenedorMaritimo,
26
+ TransporteMaritimo,
27
+ TransporteAereo,
28
+ DerechoDePaso,
29
+ CarroContenedor,
30
+ Carro,
31
+ TransporteFerroviario,
32
+ ParteTransporte,
33
+ TipoFigura,
34
+ CartaPorteComplement,
35
+ )
11
36
  from .fiscalapi_models import (
12
37
  # Product models
13
38
  ProductTax,
@@ -51,7 +76,7 @@ from .fiscalapi_models import (
51
76
  PayrollDeduction,
52
77
  PayrollDisability,
53
78
  PayrollComplement,
54
- LadingComplement,
79
+ CartaPorteComplement,
55
80
  InvoiceComplement,
56
81
  # Invoice models
57
82
  InvoiceResponse,
@@ -90,6 +115,28 @@ from .fiscalapi_models import (
90
115
  __all__ = [
91
116
  # common_models
92
117
  "ApiResponse",
118
+ # Carta Porte models
119
+ "UbicacionDomicilio",
120
+ "TipoFiguraDomicilio",
121
+ "RegimenAduanero",
122
+ "Ubicacion",
123
+ "DocumentoAduanero",
124
+ "CantidadTransporta",
125
+ "DetalleMercancia",
126
+ "Mercancia",
127
+ "Remolque",
128
+ "Autotransporte",
129
+ "RemolqueCCP",
130
+ "ContenedorMaritimo",
131
+ "TransporteMaritimo",
132
+ "TransporteAereo",
133
+ "DerechoDePaso",
134
+ "CarroContenedor",
135
+ "Carro",
136
+ "TransporteFerroviario",
137
+ "ParteTransporte",
138
+ "TipoFigura",
139
+ "CartaPorteComplement",
93
140
  "BaseDto",
94
141
  "CatalogDto",
95
142
  "FiscalApiSettings",
@@ -137,7 +184,7 @@ __all__ = [
137
184
  "PayrollDeduction",
138
185
  "PayrollDisability",
139
186
  "PayrollComplement",
140
- "LadingComplement",
187
+ "CartaPorteComplement",
141
188
  "InvoiceComplement",
142
189
  # Invoice models
143
190
  "InvoiceResponse",
@@ -0,0 +1,356 @@
1
+ """Modelos de Carta Porte (Bill of Lading) para complemento de factura CFDI 4.0."""
2
+
3
+ from datetime import datetime
4
+ from decimal import Decimal
5
+ from typing import Optional
6
+
7
+ from pydantic import BaseModel, ConfigDict, Field
8
+
9
+
10
+ # ===== Domicilio =====
11
+
12
+ class UbicacionDomicilio(BaseModel):
13
+ """Domicilio de una ubicación de origen o destino."""
14
+ calle: Optional[str] = Field(default=None, alias="calle")
15
+ numero_exterior: Optional[str] = Field(default=None, alias="numeroExterior")
16
+ numero_interior: Optional[str] = Field(default=None, alias="numeroInterior")
17
+ colonia_id: Optional[str] = Field(default=None, alias="coloniaId")
18
+ localidad_id: Optional[str] = Field(default=None, alias="localidadId")
19
+ referencia: Optional[str] = Field(default=None, alias="referencia")
20
+ municipio_id: Optional[str] = Field(default=None, alias="municipioId")
21
+ estado_id: str = Field(default=..., alias="estadoId")
22
+ pais_id: str = Field(default=..., alias="paisId")
23
+ codigo_postal_id: str = Field(default=..., alias="codigoPostalId")
24
+
25
+ model_config = ConfigDict(populate_by_name=True)
26
+
27
+
28
+ class TipoFiguraDomicilio(BaseModel):
29
+ """Domicilio de una figura de transporte."""
30
+ calle: Optional[str] = Field(default=None, alias="calle")
31
+ numero_exterior: Optional[str] = Field(default=None, alias="numeroExterior")
32
+ numero_interior: Optional[str] = Field(default=None, alias="numeroInterior")
33
+ colonia_id: Optional[str] = Field(default=None, alias="coloniaId")
34
+ localidad_id: Optional[str] = Field(default=None, alias="localidadId")
35
+ referencia: Optional[str] = Field(default=None, alias="referencia")
36
+ municipio_id: Optional[str] = Field(default=None, alias="municipioId")
37
+ estado_id: str = Field(default=..., alias="estadoId")
38
+ pais_id: str = Field(default=..., alias="paisId")
39
+ codigo_postal_id: str = Field(default=..., alias="codigoPostalId")
40
+
41
+ model_config = ConfigDict(populate_by_name=True)
42
+
43
+
44
+ # ===== Regimen Aduanero =====
45
+
46
+ class RegimenAduanero(BaseModel):
47
+ """Régimen aduanero aplicable al transporte internacional."""
48
+ regimen_aduanero_id: str = Field(default=..., alias="regimenAduaneroId")
49
+
50
+ model_config = ConfigDict(populate_by_name=True)
51
+
52
+
53
+ # ===== Ubicacion =====
54
+
55
+ class Ubicacion(BaseModel):
56
+ """Ubicación de origen o destino de la mercancía."""
57
+ tipo_ubicacion: str = Field(default=..., alias="tipoUbicacion")
58
+ id_ubicacion: Optional[str] = Field(default=None, alias="idUbicacion")
59
+ rfc_remitente_destinatario: str = Field(default=..., alias="rfcRemitenteDestinatario")
60
+ num_reg_id_trib: Optional[str] = Field(default=None, alias="numRegIdTrib")
61
+ residencia_fiscal_id: Optional[str] = Field(default=None, alias="residenciaFiscalId")
62
+ nombre_remitente_destinatario: Optional[str] = Field(default=None, alias="nombreRemitenteDestinatario")
63
+ num_estacion_id: Optional[str] = Field(default=None, alias="numEstacionId")
64
+ nombre_estacion: Optional[str] = Field(default=None, alias="nombreEstacion")
65
+ navegacion_trafico_id: Optional[str] = Field(default=None, alias="navegacionTraficoId")
66
+ tipo_estacion_id: Optional[str] = Field(default=None, alias="tipoEstacionId")
67
+ fecha_hora_salida_llegada: datetime = Field(default=..., alias="fechaHoraSalidaLlegada")
68
+ distancia_recorrida: Optional[Decimal] = Field(default=None, alias="distanciaRecorrida")
69
+ domicilio: Optional[UbicacionDomicilio] = Field(default=None, alias="domicilio")
70
+
71
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str, datetime: lambda v: v.isoformat()})
72
+
73
+
74
+ # ===== Mercancia =====
75
+
76
+ class DocumentoAduanero(BaseModel):
77
+ """Documento aduanero asociado a una mercancía."""
78
+ tipo_documento_id: str = Field(default=..., alias="tipoDocumentoId")
79
+ num_pedimento: Optional[str] = Field(default=None, alias="numPedimento")
80
+ ident_doc_aduanero: Optional[str] = Field(default=None, alias="identDocAduanero")
81
+ rfc_impo: Optional[str] = Field(default=None, alias="rfcImpo")
82
+
83
+ model_config = ConfigDict(populate_by_name=True)
84
+
85
+
86
+ class GuiaIdentificacion(BaseModel):
87
+ """Guía de identificación asociada a una mercancía."""
88
+ numero_guia_identificacion: str = Field(default=..., alias="numeroGuiaIdentificacion")
89
+ descrip_guia_identificacion: str = Field(default=..., alias="descripGuiaIdentificacion")
90
+ peso_guia_identificacion: Decimal = Field(default=..., alias="pesoGuiaIdentificacion")
91
+
92
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
93
+
94
+
95
+ class CantidadTransporta(BaseModel):
96
+ """Cantidad transportada entre ubicaciones."""
97
+ cantidad: Decimal = Field(default=..., alias="cantidad")
98
+ id_origen: str = Field(default=..., alias="idOrigen")
99
+ id_destino: str = Field(default=..., alias="idDestino")
100
+ cves_transporte_id: Optional[str] = Field(default=None, alias="cvesTransporteId")
101
+
102
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
103
+
104
+
105
+ class DetalleMercancia(BaseModel):
106
+ """Detalle adicional de la mercancía transportada."""
107
+ unidad_peso_merc_id: str = Field(default=..., alias="unidadPesoMercId")
108
+ peso_bruto: Decimal = Field(default=..., alias="pesoBruto")
109
+ peso_neto: Decimal = Field(default=..., alias="pesoNeto")
110
+ peso_tara: Decimal = Field(default=..., alias="pesoTara")
111
+ num_piezas: Optional[int] = Field(default=None, alias="numPiezas")
112
+
113
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
114
+
115
+
116
+ class Mercancia(BaseModel):
117
+ """Mercancía transportada en la carta porte."""
118
+ bienes_transp_id: str = Field(default=..., alias="bienesTranspId")
119
+ clave_stcc_id: Optional[str] = Field(default=None, alias="claveSTCCId")
120
+ descripcion: str = Field(default=..., alias="descripcion")
121
+ cantidad: Decimal = Field(default=..., alias="cantidad")
122
+ clave_unidad_id: str = Field(default=..., alias="claveUnidadId")
123
+ unidad: Optional[str] = Field(default=None, alias="unidad")
124
+ dimensiones: Optional[str] = Field(default=None, alias="dimensiones")
125
+ material_peligroso_id: Optional[str] = Field(default=None, alias="materialPeligrosoId")
126
+ cve_material_peligroso_id: Optional[str] = Field(default=None, alias="cveMaterialPeligrosoId")
127
+ embalaje_id: Optional[str] = Field(default=None, alias="embalajeId")
128
+ descrip_embalaje: Optional[str] = Field(default=None, alias="descripEmbalaje")
129
+ sector_cofepris_id: Optional[str] = Field(default=None, alias="sectorCOFEPRISId")
130
+ nombre_ingrediente_activo: Optional[str] = Field(default=None, alias="nombreIngredienteActivo")
131
+ nom_quimico: Optional[str] = Field(default=None, alias="nomQuimico")
132
+ denominacion_generica_prod: Optional[str] = Field(default=None, alias="denominacionGenericaProd")
133
+ denominacion_distintiva_prod: Optional[str] = Field(default=None, alias="denominacionDistintivaProd")
134
+ fabricante: Optional[str] = Field(default=None, alias="fabricante")
135
+ fecha_caducidad: Optional[datetime] = Field(default=None, alias="fechaCaducidad")
136
+ lote_medicamento: Optional[str] = Field(default=None, alias="loteMedicamento")
137
+ forma_farmaceutica_id: Optional[str] = Field(default=None, alias="formaFarmaceuticaId")
138
+ condiciones_esp_transp_id: Optional[str] = Field(default=None, alias="condicionesEspTranspId")
139
+ registro_sanitario_folio_autorizacion: Optional[str] = Field(default=None, alias="registroSanitarioFolioAutorizacion")
140
+ permiso_importacion: Optional[str] = Field(default=None, alias="permisoImportacion")
141
+ folio_impo_vucem: Optional[str] = Field(default=None, alias="folioImpoVUCEM")
142
+ num_cas: Optional[str] = Field(default=None, alias="numCAS")
143
+ razon_social_emp_imp: Optional[str] = Field(default=None, alias="razonSocialEmpImp")
144
+ num_reg_san_plag_cofepris: Optional[str] = Field(default=None, alias="numRegSanPlagCOFEPRIS")
145
+ datos_fabricante: Optional[str] = Field(default=None, alias="datosFabricante")
146
+ datos_formulador: Optional[str] = Field(default=None, alias="datosFormulador")
147
+ datos_maquilador: Optional[str] = Field(default=None, alias="datosMaquilador")
148
+ uso_autorizado: Optional[str] = Field(default=None, alias="usoAutorizado")
149
+ peso_en_kg: Decimal = Field(default=..., alias="pesoEnKg")
150
+ valor_mercancia: Optional[Decimal] = Field(default=None, alias="valorMercancia")
151
+ moneda_id: Optional[str] = Field(default=None, alias="monedaId")
152
+ fraccion_arancelaria_id: Optional[str] = Field(default=None, alias="fraccionArancelariaId")
153
+ uuid_comercio_ext: Optional[str] = Field(default=None, alias="uuidComercioExt")
154
+ tipo_materia_id: Optional[str] = Field(default=None, alias="tipoMateriaId")
155
+ descripcion_materia: Optional[str] = Field(default=None, alias="descripcionMateria")
156
+ documentacion_aduanera: Optional[list[DocumentoAduanero]] = Field(default=None, alias="documentacionAduanera")
157
+ guias_identificacion: Optional[list[GuiaIdentificacion]] = Field(default=None, alias="guiasIdentificacion")
158
+ cantidad_transporta: Optional[list[CantidadTransporta]] = Field(default=None, alias="cantidadTransporta")
159
+ detalle_mercancia: Optional[DetalleMercancia] = Field(default=None, alias="detalleMercancia")
160
+
161
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str, datetime: lambda v: v.isoformat()})
162
+
163
+
164
+ # ===== Autotransporte =====
165
+
166
+ class Remolque(BaseModel):
167
+ """Remolque del autotransporte."""
168
+ sub_tipo_rem_id: str = Field(default=..., alias="subTipoRemId")
169
+ placa: str = Field(default=..., alias="placa")
170
+
171
+ model_config = ConfigDict(populate_by_name=True)
172
+
173
+
174
+ class Autotransporte(BaseModel):
175
+ """Datos del autotransporte federal."""
176
+ perm_sct_id: str = Field(default=..., alias="permSCTId")
177
+ num_permiso_sct: str = Field(default=..., alias="numPermisoSCT")
178
+ config_vehicular_id: str = Field(default=..., alias="configVehicularId")
179
+ peso_bruto_vehicular: Decimal = Field(default=..., alias="pesoBrutoVehicular")
180
+ placa_vm: str = Field(default=..., alias="placaVM")
181
+ anio_modelo_vm: int = Field(default=..., alias="anioModeloVM")
182
+ asegura_resp_civil: str = Field(default=..., alias="aseguraRespCivil")
183
+ poliza_resp_civil: str = Field(default=..., alias="polizaRespCivil")
184
+ asegura_med_ambiente: Optional[str] = Field(default=None, alias="aseguraMedAmbiente")
185
+ poliza_med_ambiente: Optional[str] = Field(default=None, alias="polizaMedAmbiente")
186
+ asegura_carga: Optional[str] = Field(default=None, alias="aseguraCarga")
187
+ poliza_carga: Optional[str] = Field(default=None, alias="polizaCarga")
188
+ prima_seguro: Optional[Decimal] = Field(default=None, alias="primaSeguro")
189
+ remolques: Optional[list[Remolque]] = Field(default=None, alias="remolques")
190
+
191
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
192
+
193
+
194
+ # ===== Transporte Maritimo =====
195
+
196
+ class RemolqueCCP(BaseModel):
197
+ """Remolque del contenedor marítimo."""
198
+ sub_tipo_rem_ccp_id: str = Field(default=..., alias="subTipoRemCCPId")
199
+ placa_ccp: str = Field(default=..., alias="placaCCP")
200
+
201
+ model_config = ConfigDict(populate_by_name=True)
202
+
203
+
204
+ class ContenedorMaritimo(BaseModel):
205
+ """Contenedor para transporte marítimo."""
206
+ tipo_contenedor_id: str = Field(default=..., alias="tipoContenedorId")
207
+ matricula_contenedor: Optional[str] = Field(default=None, alias="matriculaContenedor")
208
+ num_precinto: Optional[str] = Field(default=None, alias="numPrecinto")
209
+ id_ccp_relacionado: Optional[str] = Field(default=None, alias="idCCPRelacionado")
210
+ placa_vm_ccp: Optional[str] = Field(default=None, alias="placaVMCCP")
211
+ fecha_certificacion_ccp: Optional[datetime] = Field(default=None, alias="fechaCertificacionCCP")
212
+ remolques_ccp: Optional[list[RemolqueCCP]] = Field(default=None, alias="remolquesCCP")
213
+
214
+ model_config = ConfigDict(populate_by_name=True, json_encoders={datetime: lambda v: v.isoformat()})
215
+
216
+
217
+ class TransporteMaritimo(BaseModel):
218
+ """Datos del transporte marítimo."""
219
+ perm_sct_id: Optional[str] = Field(default=None, alias="permSCTId")
220
+ num_permiso_sct: Optional[str] = Field(default=None, alias="numPermisoSCT")
221
+ nombre_aseg: Optional[str] = Field(default=None, alias="nombreAseg")
222
+ num_poliza_seguro: Optional[str] = Field(default=None, alias="numPolizaSeguro")
223
+ tipo_embarcacion_id: str = Field(default=..., alias="tipoEmbarcacionId")
224
+ matricula: str = Field(default=..., alias="matricula")
225
+ numero_omi: str = Field(default=..., alias="numeroOMI")
226
+ anio_embarcacion: Optional[int] = Field(default=None, alias="anioEmbarcacion")
227
+ nombre_embarc: Optional[str] = Field(default=None, alias="nombreEmbarc")
228
+ nacionalidad_embarc_id: str = Field(default=..., alias="nacionalidadEmbarcId")
229
+ unidades_de_arq_bruto: Decimal = Field(default=..., alias="unidadesDeArqBruto")
230
+ tipo_carga_id: str = Field(default=..., alias="tipoCargaId")
231
+ eslora: Optional[Decimal] = Field(default=None, alias="eslora")
232
+ manga: Optional[Decimal] = Field(default=None, alias="manga")
233
+ calado: Optional[Decimal] = Field(default=None, alias="calado")
234
+ puntal: Optional[Decimal] = Field(default=None, alias="puntal")
235
+ linea_naviera: Optional[str] = Field(default=None, alias="lineaNaviera")
236
+ nombre_agente_naviero: str = Field(default=..., alias="nombreAgenteNaviero")
237
+ num_autorizacion_naviero_id: str = Field(default=..., alias="numAutorizacionNavieroId")
238
+ num_viaje: Optional[str] = Field(default=None, alias="numViaje")
239
+ num_conoc_embarc: Optional[str] = Field(default=None, alias="numConocEmbarc")
240
+ permiso_temp_navegacion: Optional[str] = Field(default=None, alias="permisoTempNavegacion")
241
+ contenedores: Optional[list[ContenedorMaritimo]] = Field(default=None, alias="contenedores")
242
+
243
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
244
+
245
+
246
+ # ===== Transporte Aereo =====
247
+
248
+ class TransporteAereo(BaseModel):
249
+ """Datos del transporte aéreo."""
250
+ perm_sct_id: str = Field(default=..., alias="permSCTId")
251
+ num_permiso_sct: str = Field(default=..., alias="numPermisoSCT")
252
+ matricula_aeronave: Optional[str] = Field(default=None, alias="matriculaAeronave")
253
+ nombre_aseg: Optional[str] = Field(default=None, alias="nombreAseg")
254
+ num_poliza_seguro: Optional[str] = Field(default=None, alias="numPolizaSeguro")
255
+ numero_guia: str = Field(default=..., alias="numeroGuia")
256
+ lugar_contrato: Optional[str] = Field(default=None, alias="lugarContrato")
257
+ codigo_transportista_id: str = Field(default=..., alias="codigoTransportistaId")
258
+ rfc_embarcador: Optional[str] = Field(default=None, alias="rfcEmbarcador")
259
+ num_reg_id_trib_embarc: Optional[str] = Field(default=None, alias="numRegIdTribEmbarc")
260
+ residencia_fiscal_embarc_id: Optional[str] = Field(default=None, alias="residenciaFiscalEmbarcId")
261
+ nombre_embarcador: Optional[str] = Field(default=None, alias="nombreEmbarcador")
262
+
263
+ model_config = ConfigDict(populate_by_name=True)
264
+
265
+
266
+ # ===== Transporte Ferroviario =====
267
+
268
+ class DerechoDePaso(BaseModel):
269
+ """Derecho de paso del transporte ferroviario."""
270
+ tipo_derecho_de_paso_id: str = Field(default=..., alias="tipoDerechoDePasoId")
271
+ kilometraje_pagado: Decimal = Field(default=..., alias="kilometrajePagado")
272
+
273
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
274
+
275
+
276
+ class CarroContenedor(BaseModel):
277
+ """Contenedor para transporte ferroviario."""
278
+ tipo_contenedor_id: str = Field(default=..., alias="tipoContenedorId")
279
+ peso_contenedor_vacio: Decimal = Field(default=..., alias="pesoContenedorVacio")
280
+ peso_neto_mercancia: Decimal = Field(default=..., alias="pesoNetoMercancia")
281
+
282
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
283
+
284
+
285
+ class Carro(BaseModel):
286
+ """Carro del transporte ferroviario."""
287
+ tipo_carro_id: str = Field(default=..., alias="tipoCarroId")
288
+ matricula_carro: str = Field(default=..., alias="matriculaCarro")
289
+ guia_carro: str = Field(default=..., alias="guiaCarro")
290
+ toneladas_netas_carro: Decimal = Field(default=..., alias="toneladasNetasCarro")
291
+ contenedores: Optional[list[CarroContenedor]] = Field(default=None, alias="contenedores")
292
+
293
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
294
+
295
+
296
+ class TransporteFerroviario(BaseModel):
297
+ """Datos del transporte ferroviario."""
298
+ tipo_de_servicio_id: str = Field(default=..., alias="tipoDeServicioId")
299
+ tipo_de_trafico_id: str = Field(default=..., alias="tipoDeTraficoId")
300
+ nombre_aseg: Optional[str] = Field(default=None, alias="nombreAseg")
301
+ num_poliza_seguro: Optional[str] = Field(default=None, alias="numPolizaSeguro")
302
+ derechos_de_paso: Optional[list[DerechoDePaso]] = Field(default=None, alias="derechosDePaso")
303
+ carros: list[Carro] = Field(default_factory=list, alias="carros")
304
+
305
+ model_config = ConfigDict(populate_by_name=True)
306
+
307
+
308
+ # ===== Tipo Figura =====
309
+
310
+ class ParteTransporte(BaseModel):
311
+ """Parte de transporte asociada a una figura."""
312
+ parte_transporte_id: str = Field(default=..., alias="parteTransporteId")
313
+
314
+ model_config = ConfigDict(populate_by_name=True)
315
+
316
+
317
+ class TipoFigura(BaseModel):
318
+ """Figura de transporte (operador, propietario, arrendatario, notificado)."""
319
+ tipo_figura_id: str = Field(default=..., alias="tipoFiguraId")
320
+ rfc_figura: Optional[str] = Field(default=None, alias="rfcFigura")
321
+ num_licencia: Optional[str] = Field(default=None, alias="numLicencia")
322
+ nombre_figura: str = Field(default=..., alias="nombreFigura")
323
+ num_reg_id_trib_figura: Optional[str] = Field(default=None, alias="numRegIdTribFigura")
324
+ residencia_fiscal_figura_id: Optional[str] = Field(default=None, alias="residenciaFiscalFiguraId")
325
+ partes_transporte: Optional[list[ParteTransporte]] = Field(default=None, alias="partesTransporte")
326
+ domicilio: Optional[TipoFiguraDomicilio] = Field(default=None, alias="domicilio")
327
+
328
+ model_config = ConfigDict(populate_by_name=True)
329
+
330
+
331
+ # ===== Carta Porte =====
332
+
333
+ class CartaPorteComplement(BaseModel):
334
+ """Complemento Carta Porte para transporte de mercancías."""
335
+ transp_internac_id: str = Field(default=..., alias="transpInternacId")
336
+ entrada_salida_merc_id: Optional[str] = Field(default=None, alias="entradaSalidaMercId")
337
+ pais_origen_destino_id: Optional[str] = Field(default=None, alias="paisOrigenDestinoId")
338
+ via_entrada_salida_id: Optional[str] = Field(default=None, alias="viaEntradaSalidaId")
339
+ total_dist_rec: Optional[Decimal] = Field(default=None, alias="totalDistRec")
340
+ peso_neto_total: Optional[Decimal] = Field(default=None, alias="pesoNetoTotal")
341
+ cargo_por_tasacion: Optional[Decimal] = Field(default=None, alias="cargoPorTasacion")
342
+ registro_istmo_id: Optional[str] = Field(default=None, alias="registroISTMOId")
343
+ ubicacion_polo_origen_id: Optional[str] = Field(default=None, alias="ubicacionPoloOrigenId")
344
+ ubicacion_polo_destino_id: Optional[str] = Field(default=None, alias="ubicacionPoloDestinoId")
345
+ unidad_peso_id: str = Field(default=..., alias="unidadPesoId")
346
+ logistica_inversa_recoleccion_devolucion_id: Optional[str] = Field(default=None, alias="logisticaInversaRecoleccionDevolucionId")
347
+ regimen_aduaneros: Optional[list[RegimenAduanero]] = Field(default=None, alias="regimenAduaneros")
348
+ ubicaciones: list[Ubicacion] = Field(default_factory=list, alias="ubicaciones")
349
+ mercancias: list[Mercancia] = Field(default_factory=list, alias="mercancias")
350
+ autotransporte: Optional[Autotransporte] = Field(default=None, alias="autotransporte")
351
+ transporte_maritimo: Optional[TransporteMaritimo] = Field(default=None, alias="transporteMaritimo")
352
+ transporte_aereo: Optional[TransporteAereo] = Field(default=None, alias="transporteAereo")
353
+ transporte_ferroviario: Optional[TransporteFerroviario] = Field(default=None, alias="transporteFerroviario")
354
+ tipos_figura: Optional[list[TipoFigura]] = Field(default=None, alias="tiposFigura")
355
+
356
+ model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
@@ -1,6 +1,7 @@
1
1
  from decimal import Decimal
2
2
  from pydantic import BaseModel, ConfigDict, EmailStr, Field
3
3
  from fiscalapi.models.common_models import BaseDto, CatalogDto
4
+ from fiscalapi.models.carta_porte_models import CartaPorteComplement
4
5
  from typing import Literal, Optional
5
6
  from datetime import datetime
6
7
 
@@ -521,19 +522,13 @@ class PayrollComplement(BaseDto):
521
522
  model_config = ConfigDict(populate_by_name=True, json_encoders={Decimal: str})
522
523
 
523
524
 
524
- class LadingComplement(BaseDto):
525
- """Modelo para el complemento de carta porte."""
526
- # Placeholder for carta porte fields - to be expanded as needed
527
-
528
- model_config = ConfigDict(populate_by_name=True)
529
-
530
525
 
531
526
  class InvoiceComplement(BaseDto):
532
527
  """Modelo contenedor de complementos de factura."""
533
528
  local_taxes: Optional[LocalTaxesComplement] = Field(default=None, alias="localTaxes", description="Complemento de impuestos locales.")
534
529
  payment: Optional[PaymentComplement] = Field(default=None, alias="payment", description="Complemento de pago.")
535
530
  payroll: Optional[PayrollComplement] = Field(default=None, alias="payroll", description="Complemento de nómina.")
536
- lading: Optional[LadingComplement] = Field(default=None, alias="lading", description="Complemento de carta porte.")
531
+ carta_porte: Optional[CartaPorteComplement] = Field(default=None, alias="cartaPorte", description="Complemento carta porte.")
537
532
 
538
533
  model_config = ConfigDict(populate_by_name=True)
539
534
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiscalapi
3
- Version: 4.0.360
3
+ Version: 4.0.384
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
@@ -41,7 +41,7 @@ Dynamic: summary
41
41
  [![PyPI version](https://badge.fury.io/py/fiscalapi.svg?cachebuster=1)](https://badge.fury.io/py/fiscalapi)
42
42
  [![License: MPL-2.0](https://img.shields.io/badge/License-MPL_2.0-blue.svg)](https://github.com/FiscalAPI/fiscalapi-python/blob/main/LICENSE.txt)
43
43
 
44
- **SDK oficial de FiscalAPI para Python**, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Facturar sin dolor ahora es posible!
44
+ **SDK oficial de https://fiscalapi.com para Python**, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Facturar sin dolor ahora es posible!
45
45
 
46
46
 
47
47
  ## 📋 Facturación CFDI 4.0
@@ -11,6 +11,7 @@ fiscalapi.egg-info/dependency_links.txt
11
11
  fiscalapi.egg-info/requires.txt
12
12
  fiscalapi.egg-info/top_level.txt
13
13
  fiscalapi/models/__init__.py
14
+ fiscalapi/models/carta_porte_models.py
14
15
  fiscalapi/models/common_models.py
15
16
  fiscalapi/models/fiscalapi_models.py
16
17
  fiscalapi/services/__init__.py
@@ -2,7 +2,7 @@
2
2
  import os
3
3
  from setuptools import setup, find_packages
4
4
 
5
- VERSION = "4.0.360"
5
+ VERSION = "4.0.384"
6
6
 
7
7
  DESCRIPTION = "Genera facturas CFDI válidas ante el SAT consumiendo el API de https://www.fiscalapi.com"
8
8
 
File without changes
File without changes
File without changes
File without changes