From 12f050d1cd851213af7194e96e6ea73b616280f0 Mon Sep 17 00:00:00 2001 From: Kevin_Ramirez Date: Mon, 13 Jul 2026 14:27:36 -0500 Subject: [PATCH] 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) --- registros/scaf/reg_551.py | 9 ++++++++- registros/scaii/reg_551.py | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/registros/scaf/reg_551.py b/registros/scaf/reg_551.py index a2bc788..57b9491 100644 --- a/registros/scaf/reg_551.py +++ b/registros/scaf/reg_551.py @@ -45,6 +45,13 @@ class Generador551SCAF: else: 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 = { "id_factura": id_factura, "fraccion_551": str(frac_final), @@ -82,7 +89,7 @@ class Generador551SCAF: "numero_remesa_551": str(num_remesa or " "), "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), "unidad_medida_alterna_551": str(par.get("UnidadAlterna", " ")), "descripcion_ingles_551": " ", diff --git a/registros/scaii/reg_551.py b/registros/scaii/reg_551.py index e42cc38..e67a1fc 100644 --- a/registros/scaii/reg_551.py +++ b/registros/scaii/reg_551.py @@ -88,6 +88,13 @@ class Generador551SCAII: if not metodo_val: 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 = { "id_factura": id_factura, "fraccion_551": str(frac_final), @@ -125,7 +132,7 @@ class Generador551SCAII: "numero_remesa_551": str(num_remesa or " "), "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), "unidad_medida_alterna_551": str(par.get("UnidadAlterna") or " "), "descripcion_ingles_551": str(par.get("DescripcionIngles") or " ").strip()[:80],