fix: enviar linea_scaii_551 como entero o null, no string

El API valida linea_scaii_551 como Optional[int] y rechazaba la partida
con 422 (int_parsing) porque se enviaba un espacio " " cuando el LOTE
estaba vacio. Ahora se convierte el LOTE a int; si viene vacio o no es
numerico se envia null, que el API acepta.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-13 14:27:36 -05:00
parent db75d2b97a
commit 12f050d1cd
2 changed files with 16 additions and 2 deletions

View File

@@ -45,6 +45,13 @@ class Generador551SCAF:
else: else:
um_comercial_num = map_um_num.get(oma_raw, oma_raw) um_comercial_num = map_um_num.get(oma_raw, oma_raw)
# linea_scaii_551 es entero opcional (llave de cruce con WINSAAI); sale del LOTE.
# Si el LOTE viene vacio o no es numerico -> None (el API lo acepta como null).
try:
linea_scaii = int(str(par.get("Lote")).strip())
except (ValueError, TypeError):
linea_scaii = None
registro = { registro = {
"id_factura": id_factura, "id_factura": id_factura,
"fraccion_551": str(frac_final), "fraccion_551": str(frac_final),
@@ -82,7 +89,7 @@ class Generador551SCAF:
"numero_remesa_551": str(num_remesa or " "), "numero_remesa_551": str(num_remesa or " "),
"numero_partida_remesa_551": str(num_partida_remesa), "numero_partida_remesa_551": str(num_partida_remesa),
"linea_scaii_551": str(par.get("Lote") or " "), # Lote de la tabla de partidas (impo/expo/def/temp) "linea_scaii_551": linea_scaii, # Entero (o null) desde LOTE de la tabla de partidas
"cantidad_alterna_551": float(par.get("CantidadAlterna") or 0), "cantidad_alterna_551": float(par.get("CantidadAlterna") or 0),
"unidad_medida_alterna_551": str(par.get("UnidadAlterna", " ")), "unidad_medida_alterna_551": str(par.get("UnidadAlterna", " ")),
"descripcion_ingles_551": " ", "descripcion_ingles_551": " ",

View File

@@ -88,6 +88,13 @@ class Generador551SCAII:
if not metodo_val: if not metodo_val:
metodo_val = str(met_val) if met_val else "" metodo_val = str(met_val) if met_val else ""
# linea_scaii_551 es entero opcional (llave de cruce con WINSAAI); sale del LOTE.
# Si el LOTE viene vacio o no es numerico -> None (el API lo acepta como null).
try:
linea_scaii = int(str(par.get("Lote")).strip())
except (ValueError, TypeError):
linea_scaii = None
registro = { registro = {
"id_factura": id_factura, "id_factura": id_factura,
"fraccion_551": str(frac_final), "fraccion_551": str(frac_final),
@@ -125,7 +132,7 @@ class Generador551SCAII:
"numero_remesa_551": str(num_remesa or " "), "numero_remesa_551": str(num_remesa or " "),
"numero_partida_remesa_551": str(par.get("Linea") or num_partida_remesa), "numero_partida_remesa_551": str(par.get("Linea") or num_partida_remesa),
"linea_scaii_551": str(par.get("Lote") or " "), # Lote de la tabla de partidas (impo/expo/def/temp) "linea_scaii_551": linea_scaii, # Entero (o null) desde LOTE de la tabla de partidas
"cantidad_alterna_551": float(par.get("CantidadAlterna") or 0), "cantidad_alterna_551": float(par.get("CantidadAlterna") or 0),
"unidad_medida_alterna_551": str(par.get("UnidadAlterna") or " "), "unidad_medida_alterna_551": str(par.get("UnidadAlterna") or " "),
"descripcion_ingles_551": str(par.get("DescripcionIngles") or " ").strip()[:80], "descripcion_ingles_551": str(par.get("DescripcionIngles") or " ").strip()[:80],