py-vucem 0.1.0__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.
- py_vucem-0.1.0/.gitignore +32 -0
- py_vucem-0.1.0/PKG-INFO +410 -0
- py_vucem-0.1.0/README.md +395 -0
- py_vucem-0.1.0/docs/Diccionario_de_datos_MV_2025.pdf +0 -0
- py_vucem-0.1.0/docs/Guia_Manifestacion_de_Valor (2).docx +0 -0
- py_vucem-0.1.0/docs/Manual_de_usuario _Consulta_de_solicitud_de_Manifiesto_de_valor.pdf +0 -0
- py_vucem-0.1.0/docs/Manual_de_usuario_Registro_de_solicitud_de_Manifestacion_de_Valor_Feb26.pdf +0 -0
- py_vucem-0.1.0/docs/Modificacion_COVE.zip +0 -0
- py_vucem-0.1.0/docs/Preguntas_Frecuentes_Formato_E2_Manifestacion_de_Valor_07_05_2026.pdf +0 -0
- py_vucem-0.1.0/docs/vucem008761~1.zip +0 -0
- py_vucem-0.1.0/docs/vucem156161~1 (1).zip +0 -0
- py_vucem-0.1.0/docs/vucem156881~1 (1).zip +0 -0
- py_vucem-0.1.0/ejemplos/cargar_documentos_6003095.py +309 -0
- py_vucem-0.1.0/ejemplos/consultar_mv_530488.py +112 -0
- py_vucem-0.1.0/ejemplos/crear_pedimento_6003095.py +204 -0
- py_vucem-0.1.0/ejemplos/enviar_mv_6003095.py +237 -0
- py_vucem-0.1.0/pyproject.toml +36 -0
- py_vucem-0.1.0/scripts/diagnostico_tc.py +59 -0
- py_vucem-0.1.0/scripts/preview_mv.py +223 -0
- py_vucem-0.1.0/scripts/ver_tipos_documento.py +44 -0
- py_vucem-0.1.0/src/py_vucem/__init__.py +5 -0
- py_vucem-0.1.0/src/py_vucem/client.py +316 -0
- py_vucem-0.1.0/src/py_vucem/exceptions.py +7 -0
- py_vucem-0.1.0/src/py_vucem/models/__init__.py +4 -0
- py_vucem-0.1.0/src/py_vucem/models/mv_builder.py +295 -0
- py_vucem-0.1.0/src/py_vucem/models/mv_catalogos.json +84 -0
- py_vucem-0.1.0/src/py_vucem/models/mv_mapper.py +250 -0
- py_vucem-0.1.0/src/py_vucem/models/mv_modelo.json +110 -0
- py_vucem-0.1.0/src/py_vucem/models/mv_modelo.xml +136 -0
- py_vucem-0.1.0/src/py_vucem/models/mv_modelo_cuerpo.xml +120 -0
- py_vucem-0.1.0/src/py_vucem/models/mv_xml.py +456 -0
- py_vucem-0.1.0/src/py_vucem/services/__init__.py +6 -0
- py_vucem-0.1.0/src/py_vucem/services/cove_consulta.py +84 -0
- py_vucem-0.1.0/src/py_vucem/services/digitalizar_documento.py +213 -0
- py_vucem-0.1.0/src/py_vucem/services/manifestacion_service.py +763 -0
- py_vucem-0.1.0/src/py_vucem/services/pedimentos_service.py +213 -0
- py_vucem-0.1.0/src/py_vucem/tipos_documento.py +124 -0
- py_vucem-0.1.0/src/py_vucem/utils/__init__.py +120 -0
- py_vucem-0.1.0/src/py_vucem/utils/banxico.py +209 -0
- py_vucem-0.1.0/src/py_vucem/utils.py +93 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/DigitalizarDocumento.xsd +110 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/DigitalizarDocumentoService.wsdl +87 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/mv/ConsultaManifestacionService.wsdl +87 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/mv/ConsultaManifestacionService.xsd +165 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/mv/IngresoManifestacionService.wsdl +96 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/mv/IngresoManifestacionService.xsd +306 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarEstadoPedimentosService.wsdl +56 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarEstadoPedimentosService.xsd +138 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPartida.wsdl +56 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPartida.xsd +46 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPedimentoCompleto.wsdl +56 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPedimentoCompleto.xsd +915 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarRemesasService.wsdl +57 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarRemesasService.xsd +65 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ListarPedimentosService.wsdl +57 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ListarPedimentosService.xsd +125 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/comunes.xsd +439 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/unidaddemedida.xsd +32 -0
- py_vucem-0.1.0/src/py_vucem/wsdl/respuesta.xsd +116 -0
- py_vucem-0.1.0/tests/fixtures/prueba.pdf +0 -0
- py_vucem-0.1.0/tests/test_cove_consulta.py +77 -0
- py_vucem-0.1.0/tests/test_digitalizar_documento.py +132 -0
- py_vucem-0.1.0/tests/test_manifestacion.py +424 -0
- py_vucem-0.1.0/tests/test_pedimentos.py +247 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Entorno virtual
|
|
2
|
+
venv/
|
|
3
|
+
.venv/
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.pyc
|
|
6
|
+
*.pyo
|
|
7
|
+
*.egg-info/
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
.eggs/
|
|
11
|
+
|
|
12
|
+
# IDE
|
|
13
|
+
.vscode/
|
|
14
|
+
.idea/
|
|
15
|
+
*.swp
|
|
16
|
+
|
|
17
|
+
# Certificados y llaves privadas (NUNCA subir al repositorio)
|
|
18
|
+
tests/fixtures/*.cer
|
|
19
|
+
tests/fixtures/*.key
|
|
20
|
+
tests/fixtures/*.pem
|
|
21
|
+
|
|
22
|
+
# XMLs generados con firma real y datos de operaciones reales
|
|
23
|
+
ejemplos/*.xml
|
|
24
|
+
ejemplos/*.pdf
|
|
25
|
+
ejemplos/docs_6003095/
|
|
26
|
+
|
|
27
|
+
# JSONs con datos de pedimentos reales
|
|
28
|
+
ejemplos/pedimento_*.json
|
|
29
|
+
|
|
30
|
+
# Archivos temporales
|
|
31
|
+
*.log
|
|
32
|
+
.env
|
py_vucem-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: py-vucem
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Cliente en Python para la Ventanilla Única de Comercio Exterior Mexicano (VUCEM)
|
|
5
|
+
Project-URL: Homepage, https://github.com/pesatto/py_vucem
|
|
6
|
+
Author-email: Fernando Ruiz <fernando.ruiz@pesatto.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Requires-Python: >=3.9
|
|
12
|
+
Requires-Dist: cryptography>=42.0.0
|
|
13
|
+
Requires-Dist: zeep>=4.2.1
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
|
|
16
|
+
# py-vucem
|
|
17
|
+
|
|
18
|
+
Cliente Python para la **Ventanilla Única de Comercio Exterior Mexicano (VUCEM)**. Permite registrar Manifestaciones de Valor Electrónicas (MVE), digitalizar documentos, consultar pedimentos y descargar acuses, todo mediante los servicios SOAP oficiales de VUCEM firmados con e.firma (FIEL).
|
|
19
|
+
|
|
20
|
+
## Requisitos
|
|
21
|
+
|
|
22
|
+
- Python 3.9+
|
|
23
|
+
- e.firma (FIEL) vigente de la empresa importadora (archivos `.cer` y `.key`)
|
|
24
|
+
- Clave de acceso a servicios web de VUCEM (`claveWS`)
|
|
25
|
+
- Token de Banxico SIE (opcional, para tipo de cambio automático)
|
|
26
|
+
|
|
27
|
+
## Instalación
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install py-vucem
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
O en modo desarrollo:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
git clone https://github.com/pesatto/py_vucem
|
|
37
|
+
cd py_vucem
|
|
38
|
+
pip install -e .
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Configuración inicial
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
from py_vucem import VucemClient
|
|
45
|
+
|
|
46
|
+
client = VucemClient(
|
|
47
|
+
cer_path="ruta/a/fiel.cer", # e.firma de la empresa (NO el CSD de facturación)
|
|
48
|
+
key_path="ruta/a/fiel.key",
|
|
49
|
+
password="tu-password-fiel",
|
|
50
|
+
clave_ws="tu-clave-ws-vucem",
|
|
51
|
+
rfc="TU_RFC",
|
|
52
|
+
)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
> **Importante:** VUCEM requiere la **e.firma (FIEL)** de la empresa, no el CSD. Son archivos diferentes.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Servicios disponibles
|
|
60
|
+
|
|
61
|
+
### 1. Manifestación de Valor Electrónica (MVE)
|
|
62
|
+
|
|
63
|
+
La MVE documenta el valor declarado de las mercancías importadas (Art. 59-A Ley Aduanera).
|
|
64
|
+
|
|
65
|
+
#### Construir y enviar una MVE
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from py_vucem import VucemClient
|
|
69
|
+
from py_vucem.models.mv_builder import ManifestacionValor
|
|
70
|
+
from py_vucem.utils.banxico import BanxicoClient
|
|
71
|
+
|
|
72
|
+
banxico = BanxicoClient("tu-token-banxico")
|
|
73
|
+
|
|
74
|
+
client = VucemClient(
|
|
75
|
+
cer_path="fiel.cer",
|
|
76
|
+
key_path="fiel.key",
|
|
77
|
+
password="password",
|
|
78
|
+
clave_ws="clave_ws",
|
|
79
|
+
rfc="PME241011C34",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Construir el modelo
|
|
83
|
+
mv = ManifestacionValor("PME241011C34", banxico=banxico)
|
|
84
|
+
|
|
85
|
+
# Personas autorizadas a consultar la MV (agente aduanal)
|
|
86
|
+
mv.agregar_consulta("LWO041215F90", "TIPFIG.AGE")
|
|
87
|
+
|
|
88
|
+
# eDocuments relacionados (COVEs digitalizados en VUCEM)
|
|
89
|
+
mv.agregar_documento("03602601109K2")
|
|
90
|
+
mv.agregar_documento("0170261DD0RU6")
|
|
91
|
+
|
|
92
|
+
# Pedimento aduanal
|
|
93
|
+
mv.agregar_pedimento(pedimento="6003095", patente="3977", aduana="160")
|
|
94
|
+
|
|
95
|
+
# Factura / COVE
|
|
96
|
+
factura = mv.nueva_factura(
|
|
97
|
+
cove="COVE2680TJDY6",
|
|
98
|
+
incoterm="TIPINC.FOB",
|
|
99
|
+
vinculacion=False,
|
|
100
|
+
metodo="VALADU.VTM",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Pagos realizados (TC se consulta automáticamente de Banxico)
|
|
104
|
+
factura.agregar_pago(
|
|
105
|
+
fecha="2026-02-03", total=21328.00,
|
|
106
|
+
forma="FORPAG.TE", moneda="USD",
|
|
107
|
+
)
|
|
108
|
+
factura.agregar_pago(
|
|
109
|
+
fecha="2026-03-11", total=47613.00,
|
|
110
|
+
forma="FORPAG.TE", moneda="USD",
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Incrementables al valor en aduana (fletes, seguros, etc.)
|
|
114
|
+
factura.agregar_incrementable(
|
|
115
|
+
tipo="INCRE.GS", fecha="2026-03-21",
|
|
116
|
+
total=1800.00, moneda="USD",
|
|
117
|
+
cargo_importador=True,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Enviar a VUCEM
|
|
121
|
+
resultado = client.registrar_manifestacion_desde_modelo(mv.to_dict())
|
|
122
|
+
print(resultado["numeroOperacion"]) # ej. 530502
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### Tipos de cambio
|
|
126
|
+
|
|
127
|
+
Si no configuras `BanxicoClient`, debes proporcionar `tc=` en cada pago:
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
mv = ManifestacionValor("PME241011C34") # sin banxico
|
|
131
|
+
|
|
132
|
+
factura.agregar_pago(
|
|
133
|
+
fecha="2026-02-03", total=21328.00,
|
|
134
|
+
forma="FORPAG.TE", moneda="USD",
|
|
135
|
+
tc=20.1234, # obligatorio sin BanxicoClient
|
|
136
|
+
)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Con `BanxicoClient`, el TC FIX oficial se consulta automáticamente por fecha y moneda. Si proporcionas `tc=` junto con `BanxicoClient`, valida que tu TC no difiera más del 1% del oficial.
|
|
140
|
+
|
|
141
|
+
#### Tipos de pago disponibles
|
|
142
|
+
|
|
143
|
+
| Método | Descripción |
|
|
144
|
+
|--------|-------------|
|
|
145
|
+
| `agregar_pago()` | Precio ya pagado |
|
|
146
|
+
| `agregar_por_pagar()` | Precio pendiente de pago (crédito) |
|
|
147
|
+
| `agregar_compenso()` | Pago por compensación (intercambio de bienes/servicios) |
|
|
148
|
+
| `agregar_incrementable()` | Fletes, seguros, cargos incrementables al valor |
|
|
149
|
+
| `agregar_decrementable()` | Descuentos, devoluciones, conceptos decrementables |
|
|
150
|
+
|
|
151
|
+
#### Previsualizar el XML antes de enviar
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
xml = client.generar_xml_mv(mv.to_dict(), con_firma=True)
|
|
155
|
+
print(xml)
|
|
156
|
+
|
|
157
|
+
# Validar contra el XSD de VUCEM
|
|
158
|
+
errores = client.validar_xml_mv(xml)
|
|
159
|
+
if not errores:
|
|
160
|
+
resultado = client.registrar_manifestacion_desde_modelo(mv.to_dict())
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### Consultar una MVE registrada
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
# Por número de operación
|
|
167
|
+
data = client.consultar_manifestacion(numero_operacion=530502)
|
|
168
|
+
|
|
169
|
+
# Por número de MV (MNVA...)
|
|
170
|
+
data = client.consultar_manifestacion(edocument="MNVA2600GAO73")
|
|
171
|
+
|
|
172
|
+
print(data["estatus"]) # "Aceptado"
|
|
173
|
+
print(data["eDocument"]) # "MNVA2600GAO73"
|
|
174
|
+
print(data["fechaRegistro"]) # "2026-06-29T..."
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
### 2. Digitalización de documentos
|
|
180
|
+
|
|
181
|
+
Convierte documentos PDF en eDocuments registrados en VUCEM (facturas, listas de empaque, certificados, etc.).
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
# Ver catálogo de tipos de documento disponibles
|
|
185
|
+
tipos = client.consultar_tipos_documento()
|
|
186
|
+
|
|
187
|
+
# Digitalizar un PDF
|
|
188
|
+
with open("factura.pdf", "rb") as f:
|
|
189
|
+
pdf_bytes = f.read()
|
|
190
|
+
|
|
191
|
+
resultado = client.digitalizar_documento(
|
|
192
|
+
correo="contacto@empresa.com",
|
|
193
|
+
id_tipo_documento="1", # 1 = Factura comercial
|
|
194
|
+
nombre_documento="Factura ST2601016",
|
|
195
|
+
archivo_bytes=pdf_bytes,
|
|
196
|
+
rfc_consulta="PME241011C34", # RFC autorizado a consultar
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
print(resultado["eDocument"]) # ej. "03602601109K2"
|
|
200
|
+
print(resultado["numeroOperacion"])
|
|
201
|
+
|
|
202
|
+
# Consultar el estatus de la digitalización
|
|
203
|
+
estatus = client.consultar_estatus_digitalizacion(resultado["numeroOperacion"])
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
> El PDF debe pesar menos de 3 MB y ser un PDF válido (no escaneado como imagen sin OCR).
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### 3. Consulta de COVEs
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
# Consultar un COVE por su eDocument
|
|
214
|
+
cove = client.consultar_cove("COVE2680TJDY6")
|
|
215
|
+
print(cove)
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
### 4. Consulta de pedimentos
|
|
221
|
+
|
|
222
|
+
```python
|
|
223
|
+
# Listar pedimentos por aduana y fecha
|
|
224
|
+
pedimentos = client.listar_pedimentos(
|
|
225
|
+
aduana="160",
|
|
226
|
+
patente=3977,
|
|
227
|
+
fecha_inicio=date(2026, 1, 1),
|
|
228
|
+
fecha_fin=date(2026, 6, 30),
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# Consultar estado de un pedimento
|
|
232
|
+
estado = client.consultar_estado_pedimentos(
|
|
233
|
+
aduana=160, patente=3977,
|
|
234
|
+
pedimento=6003095,
|
|
235
|
+
numero_operacion=530502,
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# Detalle completo del pedimento
|
|
239
|
+
detalle = client.consultar_pedimento_completo(
|
|
240
|
+
aduana="160", patente=3977, pedimento=6003095,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
# Consultar una partida específica
|
|
244
|
+
partida = client.consultar_partida(
|
|
245
|
+
aduana="160", patente=3977, pedimento=6003095,
|
|
246
|
+
numero_operacion=530502, numero_partida=1,
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
# Consultar remesas
|
|
250
|
+
remesas = client.consultar_remesas(
|
|
251
|
+
aduana=160, patente=3977,
|
|
252
|
+
pedimento=6003095,
|
|
253
|
+
numero_operacion=530502,
|
|
254
|
+
)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
### 5. Descarga de acuses
|
|
260
|
+
|
|
261
|
+
```python
|
|
262
|
+
# Acuse de un eDocument digitalizado (número numérico)
|
|
263
|
+
resultado = client.descargar_acuse("03602601109K2")
|
|
264
|
+
|
|
265
|
+
if resultado.get("pdf"):
|
|
266
|
+
with open("acuse.pdf", "wb") as f:
|
|
267
|
+
f.write(resultado["pdf"])
|
|
268
|
+
|
|
269
|
+
# Acuse de un COVE
|
|
270
|
+
resultado = client.descargar_acuse("COVE2680TJDY6", es_cove=True)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
> El servicio de acuses (`ConsultaAcusesServiceWS`) soporta eDocuments con formato numérico y COVEs. Los números MVE (MNVA...) no son compatibles con este servicio.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Banco de México — Tipo de cambio
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
from py_vucem.utils.banxico import BanxicoClient
|
|
281
|
+
|
|
282
|
+
banxico = BanxicoClient("tu-token")
|
|
283
|
+
|
|
284
|
+
# TC FIX para una fecha específica
|
|
285
|
+
tc = banxico.tc("USD", "2026-02-03")
|
|
286
|
+
# Decimal('20.1234')
|
|
287
|
+
|
|
288
|
+
# Monedas soportadas
|
|
289
|
+
# USD, EUR, GBP, JPY, CAD, CHF, CNY
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
Token gratuito en: `https://www.banxico.org.mx/SieAPIRest/service/v1/token`
|
|
293
|
+
|
|
294
|
+
El TC FIX de Banxico es el mismo que usa el SAT para convertir montos en moneda extranjera en pedimentos y MVE (Art. 20 Ley Aduanera).
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Claves de catálogos VUCEM
|
|
299
|
+
|
|
300
|
+
### Incoterms (`incoterm`)
|
|
301
|
+
| Clave | Descripción |
|
|
302
|
+
|-------|-------------|
|
|
303
|
+
| `TIPINC.FOB` | Free on Board |
|
|
304
|
+
| `TIPINC.CIF` | Cost, Insurance and Freight |
|
|
305
|
+
| `TIPINC.CFR` | Cost and Freight |
|
|
306
|
+
| `TIPINC.EXW` | Ex Works |
|
|
307
|
+
| `TIPINC.DAP` | Delivered at Place |
|
|
308
|
+
|
|
309
|
+
### Formas de pago (`forma`)
|
|
310
|
+
| Clave | Descripción |
|
|
311
|
+
|-------|-------------|
|
|
312
|
+
| `FORPAG.TE` | Transferencia electrónica |
|
|
313
|
+
| `FORPAG.CH` | Cheque |
|
|
314
|
+
| `FORPAG.EF` | Efectivo |
|
|
315
|
+
| `FORPAG.OT` | Otro (requiere `especifique=`) |
|
|
316
|
+
|
|
317
|
+
### Incrementables (`tipo`)
|
|
318
|
+
| Clave | Descripción |
|
|
319
|
+
|-------|-------------|
|
|
320
|
+
| `INCRE.GS` | Gastos de envío / flete |
|
|
321
|
+
| `INCRE.SE` | Seguro |
|
|
322
|
+
| `INCRE.CA` | Cargos de carga |
|
|
323
|
+
| `INCRE.OT` | Otros incrementables |
|
|
324
|
+
|
|
325
|
+
### Métodos de valoración (`metodo`)
|
|
326
|
+
| Clave | Descripción |
|
|
327
|
+
|-------|-------------|
|
|
328
|
+
| `VALADU.VTM` | Valor de transacción de mercancías (default) |
|
|
329
|
+
| `VALADU.VTI` | Valor de transacción de mercancías idénticas |
|
|
330
|
+
| `VALADU.VTS` | Valor de transacción de mercancías similares |
|
|
331
|
+
| `VALADU.VD` | Valor deductivo |
|
|
332
|
+
| `VALADU.VR` | Valor reconstruido |
|
|
333
|
+
| `VALADU.VU` | Valor en última instancia |
|
|
334
|
+
|
|
335
|
+
### Tipo de figura (`figura` en `agregar_consulta`)
|
|
336
|
+
| Clave | Descripción |
|
|
337
|
+
|-------|-------------|
|
|
338
|
+
| `TIPFIG.AGE` | Agente aduanal |
|
|
339
|
+
| `TIPFIG.REP` | Representante legal |
|
|
340
|
+
| `TIPFIG.IMP` | Importador |
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Scripts de ejemplo
|
|
345
|
+
|
|
346
|
+
Los scripts en `ejemplos/` muestran flujos completos listos para ejecutar:
|
|
347
|
+
|
|
348
|
+
| Script | Descripción |
|
|
349
|
+
|--------|-------------|
|
|
350
|
+
| `ejemplos/enviar_mv_6003095.py` | Construye, valida y envía una MVE completa |
|
|
351
|
+
| `ejemplos/consultar_mv_530488.py` | Consulta el estatus de una MVE y descarga el acuse PDF |
|
|
352
|
+
| `ejemplos/cargar_documentos_6003095.py` | Digitaliza documentos PDF en VUCEM |
|
|
353
|
+
| `ejemplos/crear_pedimento_6003095.py` | Construye el modelo de MVE en JSON para revisión |
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
cd py_vucem
|
|
357
|
+
.\venv\Scripts\python.exe ejemplos\enviar_mv_6003095.py
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Notas técnicas
|
|
363
|
+
|
|
364
|
+
### Conectividad con VUCEM
|
|
365
|
+
|
|
366
|
+
Los servicios de VUCEM requieren configuración SSL especial (certificados legacy, TLS 1.0/1.1). La librería maneja esto internamente mediante `LegacyVucemAdapter` — no es necesaria ninguna configuración adicional.
|
|
367
|
+
|
|
368
|
+
### WSDL remoto vs local
|
|
369
|
+
|
|
370
|
+
La librería usa WSDLs remotos cuando el servidor los sirve correctamente. Para servicios donde el XSD remoto devuelve 404 (como `ConsultaManifestacionService`), usa WSDLs locales empaquetados solo para validación, mientras la comunicación sigue siendo contra el endpoint en producción.
|
|
371
|
+
|
|
372
|
+
### Cadena original y firma
|
|
373
|
+
|
|
374
|
+
La cadena original de la MVE usa el mismo formato numérico que el XML (máximo 3 decimales redondeados, sin ceros finales), garantizando que la firma electrónica sea válida. Este formato es equivalente al `formatVucemNumber()` de la implementación PHP de referencia de VUCEM.
|
|
375
|
+
|
|
376
|
+
### Prerequisito para acuses de MVE
|
|
377
|
+
|
|
378
|
+
El acuse de una MVE solo se genera cuando el COVE referenciado existe y está validado en VUCEM. El COVE debe ser registrado por el agente aduanal **antes** de presentar la MVE.
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Estructura del proyecto
|
|
383
|
+
|
|
384
|
+
```
|
|
385
|
+
py_vucem/
|
|
386
|
+
├── src/py_vucem/
|
|
387
|
+
│ ├── client.py # VucemClient — punto de entrada principal
|
|
388
|
+
│ ├── models/
|
|
389
|
+
│ │ ├── mv_builder.py # ManifestacionValor y Factura (API fluida)
|
|
390
|
+
│ │ ├── mv_mapper.py # Convierte modelo a estructura interna
|
|
391
|
+
│ │ └── mv_xml.py # Generador de XML SOAP firmado
|
|
392
|
+
│ ├── services/
|
|
393
|
+
│ │ ├── manifestacion_service.py # Registro, consulta y acuses de MVE
|
|
394
|
+
│ │ ├── digitalizar_documento.py # Digitalización de PDFs
|
|
395
|
+
│ │ ├── pedimentos_service.py # Consulta de pedimentos aduaneros
|
|
396
|
+
│ │ └── cove_consulta.py # Consulta de COVEs
|
|
397
|
+
│ └── utils/
|
|
398
|
+
│ ├── __init__.py # FielHandler, LegacyVucemAdapter
|
|
399
|
+
│ └── banxico.py # BanxicoClient — TC FIX oficial
|
|
400
|
+
├── ejemplos/ # Scripts listos para ejecutar
|
|
401
|
+
├── tests/ # Pruebas unitarias
|
|
402
|
+
│ └── fixtures/ # Certificados de prueba
|
|
403
|
+
└── wsdl/ # WSDLs locales de respaldo
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
---
|
|
407
|
+
|
|
408
|
+
## Licencia
|
|
409
|
+
|
|
410
|
+
MIT © Fernando Ruiz — [Pesatto México](https://pesatto.com)
|