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.
- {fiscalapi-4.0.360/fiscalapi.egg-info → fiscalapi-4.0.384}/PKG-INFO +2 -2
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/README.md +1 -1
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/__init__.py +50 -2
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/models/__init__.py +49 -2
- fiscalapi-4.0.384/fiscalapi/models/carta_porte_models.py +356 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/models/fiscalapi_models.py +2 -7
- {fiscalapi-4.0.360 → fiscalapi-4.0.384/fiscalapi.egg-info}/PKG-INFO +2 -2
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/SOURCES.txt +1 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/setup.py +1 -1
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/LICENSE.txt +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/MANIFEST.in +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/models/common_models.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/py.typed +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/__init__.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/api_key_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/base_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/catalog_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/download_catalog_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/download_request_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/download_rule_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/employee_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/employer_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/fiscalapi_client.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/invoice_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/people_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/product_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/stamp_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi/services/tax_file_service.py +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/dependency_links.txt +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/requires.txt +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/fiscalapi.egg-info/top_level.txt +0 -0
- {fiscalapi-4.0.360 → fiscalapi-4.0.384}/pyproject.toml +0 -0
- {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.
|
|
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
|
[](https://badge.fury.io/py/fiscalapi)
|
|
42
42
|
[](https://github.com/FiscalAPI/fiscalapi-python/blob/main/LICENSE.txt)
|
|
43
43
|
|
|
44
|
-
**SDK oficial de
|
|
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
|
[](https://badge.fury.io/py/fiscalapi)
|
|
4
4
|
[](https://github.com/FiscalAPI/fiscalapi-python/blob/main/LICENSE.txt)
|
|
5
5
|
|
|
6
|
-
**SDK oficial de
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
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.
|
|
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
|
[](https://badge.fury.io/py/fiscalapi)
|
|
42
42
|
[](https://github.com/FiscalAPI/fiscalapi-python/blob/main/LICENSE.txt)
|
|
43
43
|
|
|
44
|
-
**SDK oficial de
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|