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.
Files changed (64) hide show
  1. py_vucem-0.1.0/.gitignore +32 -0
  2. py_vucem-0.1.0/PKG-INFO +410 -0
  3. py_vucem-0.1.0/README.md +395 -0
  4. py_vucem-0.1.0/docs/Diccionario_de_datos_MV_2025.pdf +0 -0
  5. py_vucem-0.1.0/docs/Guia_Manifestacion_de_Valor (2).docx +0 -0
  6. py_vucem-0.1.0/docs/Manual_de_usuario _Consulta_de_solicitud_de_Manifiesto_de_valor.pdf +0 -0
  7. py_vucem-0.1.0/docs/Manual_de_usuario_Registro_de_solicitud_de_Manifestacion_de_Valor_Feb26.pdf +0 -0
  8. py_vucem-0.1.0/docs/Modificacion_COVE.zip +0 -0
  9. py_vucem-0.1.0/docs/Preguntas_Frecuentes_Formato_E2_Manifestacion_de_Valor_07_05_2026.pdf +0 -0
  10. py_vucem-0.1.0/docs/vucem008761~1.zip +0 -0
  11. py_vucem-0.1.0/docs/vucem156161~1 (1).zip +0 -0
  12. py_vucem-0.1.0/docs/vucem156881~1 (1).zip +0 -0
  13. py_vucem-0.1.0/ejemplos/cargar_documentos_6003095.py +309 -0
  14. py_vucem-0.1.0/ejemplos/consultar_mv_530488.py +112 -0
  15. py_vucem-0.1.0/ejemplos/crear_pedimento_6003095.py +204 -0
  16. py_vucem-0.1.0/ejemplos/enviar_mv_6003095.py +237 -0
  17. py_vucem-0.1.0/pyproject.toml +36 -0
  18. py_vucem-0.1.0/scripts/diagnostico_tc.py +59 -0
  19. py_vucem-0.1.0/scripts/preview_mv.py +223 -0
  20. py_vucem-0.1.0/scripts/ver_tipos_documento.py +44 -0
  21. py_vucem-0.1.0/src/py_vucem/__init__.py +5 -0
  22. py_vucem-0.1.0/src/py_vucem/client.py +316 -0
  23. py_vucem-0.1.0/src/py_vucem/exceptions.py +7 -0
  24. py_vucem-0.1.0/src/py_vucem/models/__init__.py +4 -0
  25. py_vucem-0.1.0/src/py_vucem/models/mv_builder.py +295 -0
  26. py_vucem-0.1.0/src/py_vucem/models/mv_catalogos.json +84 -0
  27. py_vucem-0.1.0/src/py_vucem/models/mv_mapper.py +250 -0
  28. py_vucem-0.1.0/src/py_vucem/models/mv_modelo.json +110 -0
  29. py_vucem-0.1.0/src/py_vucem/models/mv_modelo.xml +136 -0
  30. py_vucem-0.1.0/src/py_vucem/models/mv_modelo_cuerpo.xml +120 -0
  31. py_vucem-0.1.0/src/py_vucem/models/mv_xml.py +456 -0
  32. py_vucem-0.1.0/src/py_vucem/services/__init__.py +6 -0
  33. py_vucem-0.1.0/src/py_vucem/services/cove_consulta.py +84 -0
  34. py_vucem-0.1.0/src/py_vucem/services/digitalizar_documento.py +213 -0
  35. py_vucem-0.1.0/src/py_vucem/services/manifestacion_service.py +763 -0
  36. py_vucem-0.1.0/src/py_vucem/services/pedimentos_service.py +213 -0
  37. py_vucem-0.1.0/src/py_vucem/tipos_documento.py +124 -0
  38. py_vucem-0.1.0/src/py_vucem/utils/__init__.py +120 -0
  39. py_vucem-0.1.0/src/py_vucem/utils/banxico.py +209 -0
  40. py_vucem-0.1.0/src/py_vucem/utils.py +93 -0
  41. py_vucem-0.1.0/src/py_vucem/wsdl/DigitalizarDocumento.xsd +110 -0
  42. py_vucem-0.1.0/src/py_vucem/wsdl/DigitalizarDocumentoService.wsdl +87 -0
  43. py_vucem-0.1.0/src/py_vucem/wsdl/mv/ConsultaManifestacionService.wsdl +87 -0
  44. py_vucem-0.1.0/src/py_vucem/wsdl/mv/ConsultaManifestacionService.xsd +165 -0
  45. py_vucem-0.1.0/src/py_vucem/wsdl/mv/IngresoManifestacionService.wsdl +96 -0
  46. py_vucem-0.1.0/src/py_vucem/wsdl/mv/IngresoManifestacionService.xsd +306 -0
  47. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarEstadoPedimentosService.wsdl +56 -0
  48. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarEstadoPedimentosService.xsd +138 -0
  49. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPartida.wsdl +56 -0
  50. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPartida.xsd +46 -0
  51. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPedimentoCompleto.wsdl +56 -0
  52. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarPedimentoCompleto.xsd +915 -0
  53. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarRemesasService.wsdl +57 -0
  54. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ConsultarRemesasService.xsd +65 -0
  55. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ListarPedimentosService.wsdl +57 -0
  56. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/ListarPedimentosService.xsd +125 -0
  57. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/comunes.xsd +439 -0
  58. py_vucem-0.1.0/src/py_vucem/wsdl/pedimentos/unidaddemedida.xsd +32 -0
  59. py_vucem-0.1.0/src/py_vucem/wsdl/respuesta.xsd +116 -0
  60. py_vucem-0.1.0/tests/fixtures/prueba.pdf +0 -0
  61. py_vucem-0.1.0/tests/test_cove_consulta.py +77 -0
  62. py_vucem-0.1.0/tests/test_digitalizar_documento.py +132 -0
  63. py_vucem-0.1.0/tests/test_manifestacion.py +424 -0
  64. 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
@@ -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)