Files
SCAII_Sync_Client/registros/scaf/reg_501.py
Kevin_Ramirez fd31777337 fix: reg_501 tolera NULL en Destino y CLAVETRANSFER (#2)
preparar_json del 501 reventaba (TypeError/AttributeError) cuando
OPCIONDESTINO o CLAVETRANSFER venian NULL: get(k, "") no protege porque
un NULL de BD llega como None y el default no aplica. Pasa con pedimentos
que baja SCAII_Sync (dejan esos campos en NULL); WinDev los llenaba. Se
usa "or ''" en SCAII y SCAF.

Ademas, el hilo de sincronizacion tragaba la excepcion con print (invisible
en el exe windowed), por lo que parecia un cuelgue. Ahora se registra en
el log con traza (log.error exc_info).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Reviewed-on: #2
Co-authored-by: Kevin_Ramirez <kramirez@aduanasoft.com.mx>
Co-committed-by: Kevin_Ramirez <kramirez@aduanasoft.com.mx>
2026-08-03 16:54:59 +00:00

63 lines
3.2 KiB
Python

from typing import Dict, Any
class Generador501SCAF:
@staticmethod
def preparar_json(datos_pedi: Dict[str, Any], totales: Dict[str, float],
datos_cliente: Dict[str, Any], total_trailers: int) -> Dict[str, Any]:
"""
Lógica específica para SCAF (Registro 501).
"""
# Lógica de Destino/Zona (SCAF a veces usa códigos distintos, pero el if parece igual)
# OJO: usar "or ''" y no get(k, ''), porque un NULL de BD llega como None y el default no aplica
destino = datos_pedi.get("OPCIONDESTINO") or ""
codigo_destino = "9" if "Interior" in destino else "7" if any(x in destino for x in ["Región", "Franja"]) else ""
clave_transfer = (datos_cliente.get("CLAVETRANSFER") or "").strip() if datos_cliente else ""
# Construcción del Registro 501 SCAF
registro = {
"tipo_operacion_501": datos_pedi.get("Tipo"),
"clave_documento_501": datos_pedi.get("Clave"),
"numero_pedimento_501": (datos_pedi.get("Pedimento") or "")[8:15],
"codigo_importador_exportador_501": clave_transfer if clave_transfer else " ",
"monto_fletes_501": totales["flete"],
"monto_seguros_501": totales["seguros"],
"costo_embalajes_501": totales["embalajes"],
"cargos_incrementables_501": totales["otros_incrementa"],
"cargos_deducibles_501": 0,
"peso_total_bruto_501": totales["peso_bruto"],
"total_bultos_501": totales["bultos"],
"metodo_transporte_entrada_501": datos_pedi.get("TransE"),
"metodo_transporte_arribo_501": datos_pedi.get("TransA"),
"metodo_transporte_salida_501": datos_pedi.get("TransS"),
"codigo_destino_zona_501": codigo_destino,
"numero_referencia_501": "",
"moneda_costos_incrementables_501": "ME",
"codigo_aduana_despacho_501": datos_pedi.get("Aduana"),
"numero_patente_501": (datos_pedi.get("Pedimento") or "")[3:7],
"origenPedimento": 1,
"total_vehiculos_501": total_trailers,
"rfc_importador_exportador_501": " ",
"curp_importador_exportador_501": " ",
"nombre_completo_importador_exportador_501": " ",
"calle_direccion_importador_exportador_501": " ",
"numero_exterior_direccion_importador_exportador_501": " ",
"numero_interior_direccion_importador_exportador_501": " ",
"colonia_direccion_importador_exportador_501": " ",
"localidad_direccion_importador_exportador_501": " ",
"municipio_direccion_importador_exportador_501": " ",
"estado_direccion_importador_exportador_501": " ",
"pais_direccion_importador_exportador_501": " ",
"codigo_postal_direccion_importador_exportador_501": " ",
"monto_fletes_decrementables_501": 0,
"monto_seguros_decrementables_501": 0,
"monto_carga_decrementables_501": 0,
"monto_descarga_decrementables_501": 0,
"monto_otros_decrementables_501": 0,
"MarcaBulto1_501": "S/M", # SCAF usa S/M mayormente
"MarcaBulto2_501": "S/N"
}
return registro