You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 3fb368e
Browse filesBrowse the repository at this point in the historyBrowse files
v4.0.417 comercio exterior y manifiestos verificados end-to-end
Alinea la version con el API (4.0.417) y deja los dos endpoints validados
contra el API real, no solo por construccion de modelos.
Verificacion end-to-end:
- Timbrados los 18 escenarios de comercio exterior (9 por valores y 9 por
referencias) y firmada la carta manifiesto. Sin CCE122 ni CFDI40179: la
escala decimal sobrevive intacta a la serializacion.
Ejemplos de comercio exterior:
- La fecha de emision se toma al vuelo con datetime.now(). Antes estaba fija
en una fecha literal, lo que hacia que los ejemplos fallaran con CCE121 en
cuanto pasaban 72 horas. El resto de los ejemplos del repo ya usaba
datetime.now(); esto los alinea.
- tipo_cambio documenta que debe ser el valor del DOF para la fecha de
emision y que el propio error del PAC informa el esperado.
- Normalizada la indentacion del bloque __main__.
Person:
- sat_cfdi_use usaba el alias "cfdiUse" y nunca se poblaba; el API expone el
catalogo expandido como "satCfdiUse".
- Agregados manifest_status_id y manifest_status, que reflejan el resultado
de firmar la carta manifiesto.
- capital_regime marcado como deprecado: el API no expone esa propiedad.
- InvoiceRecipient.foreign_country_code marcado como deprecado en favor de
country_id, que es el campo que el API acepta.
Deuda tecnica:
- Retirados los 49 json_encoders de los modelos. Estan deprecados en Pydantic
v2 y eran redundantes: send_request serializa con model_dump(mode="json"),
que ya rinde Decimal como cadena y datetime como ISO-8601. Comprobado que
los payloads quedan byte a byte identicos en los 18 escenarios.
- Purgadas de examples.py una api key y un tenant reales que estaban
commiteados en bloques cURL comentados; quedan los placeholders.
La llave sigue expuesta en el historial: hay que rotarla.
Documentacion:
- README con secciones de uso de comercio exterior y firma de manifiesto,
ambas ejecutadas y timbradas antes de documentarlas, mas el indice completo
de ejemplos.
- CLAUDE.md documenta manifest_service.py, los modulos de modelos por
complemento y el criterio de escala decimal que exige el SAT.
-**sat_validation_models.py** - SAT validation models and the `SatValidationTypeIds` / `SatValidationStatusIds` id enums
74
79
75
80
**Key Pattern - Field Aliasing:** Models use Pydantic `Field(alias="...")` for API JSON field mapping. When serializing, use `by_alias=True` and `exclude_none=True`.
El complemento se envía en `Invoice.complement.comercio_exterior`. Puede combinarse con carta porte en el mismo comprobante.
406
+
407
+
> **Escala decimal:** el SAT valida la cantidad de decimales de varios campos. Construye siempre los montos con `Decimal("...")` a partir de una cadena con la escala exacta (`Decimal("0.160000")`, no `Decimal(0.16)`): el SDK preserva los ceros finales al serializar. Una escala incorrecta produce rechazos `CFDI40179` (en `taxRate`) o `CCE122` (en `valorDolares`).
408
+
409
+
> **Tipo de cambio:**`tipo_cambio_usd` debe ser el publicado en el DOF para la fecha de emisión, y la fecha del comprobante no puede exceder 72 horas al momento del timbrado. Si no coinciden, el PAC responde `CCE121` e indica el valor esperado.
0 commit comments