Saltar a contenido

Autor: Iker Acevedo

Fecha creación: 2026-09-16

Estado: preprod

Validación

Tres clases, cada una en LiquidacionDinamica/Dominio/Servicios/, que deciden si una guía puede avanzar por el pipeline — y si no puede, por qué exactamente. Ninguna hace I/O: reciben los datos ya cargados (pedido, configuración, tarifas, trayectos) y devuelven una decisión.


ClasificadorTipoLiquidacion

Port de DepurarLiquidacionUseCase.cs:76-87: Entrega si hay Fecha Entrega y el estado está en la lista EstadosEntregaLegacy (Entregada, Digitalizada, Archivada, Pagada); Devolución si hay Fecha Devolución. Si ninguna de las dos aplica, devuelve null.

Esa última parte es la diferencia real frente a Legacy: Legacy, sin fecha de ninguno de los dos tipos, sigue de largo y persiste una liquidación en cero para esa guía. El motor Dinámico corta ahí — una guía sin tipo determinado no se liquida, queda en auditoría (MotivoNoLiquidacion.TipoNoDeterminado).

No decide qué bloques de cálculo corren después de clasificar — eso son dos ramas independientes tanto en el legacy como en el orquestador del motor Dinámico.

ValidadorTrayecto

Valida el trayecto crudo del pedido contra la lista blanca de trayectos activos de la transportadora (TrayectosTransportadora). Si no es válido, intenta caer al TrayectoPorDefecto configurado en ConfiguracionTransportadora — y solo si ese default también está en la lista blanca. Si ninguno de los dos sirve, la guía va a auditoría (MotivoNoLiquidacion.TrayectoSinResolver).

Diferencia frente a Legacy: Legacy, ante un trayecto no reconocido, cae en silencio a FleteNacionalMetropolitano — sin dejar rastro de que pasó. ValidadorTrayecto lo hace explícito y auditable.

ResolvedorTarifa

Busca la tarifa que aplica a un pedido, siempre por IdTienda — nunca por nombre de tienda, a propósito, para no heredar los bugs de matching por texto que arrastra el legacy (ver la cascada de FirstOrDefault en Motor Legacy). Si la tienda no tiene tarifa propia para ese tipo de liquidación (o el pedido no trae tienda), cae a la tarifa Genérica de la transportadora. Si tampoco hay Genérica, la guía va a auditoría (MotivoNoLiquidacion.TarifaNoEncontrada).


Catálogo de MotivoNoLiquidacion (9 motivos)

Motivos reales que produce Motor Dinámico. El front, en versión 1, inventó motivos extra (sobrepeso_sin_regla). Se corrigió — ahora coinciden 1:1 backend ↔ frontend.

Motivo Cuándo pasa ¿Se corrige configurando algo?
TrayectoSinResolver Trayecto no reconocido y sin default configurado Sí — pestaña Trayectos
TarifaNoEncontrada No hay tarifa de tienda ni genérica Sí — pestaña Tarifas
ConfiguracionTransportadoraAusente La transportadora no tiene ningún documento de configuración Sí — pestaña Configuración General
MotorDeshabilitado MotorLiquidacion = Deshabilitado Sí — pestaña Configuración General
TipoNoDeterminado Sin Fecha Entrega ni Fecha Devolución No — problema del dato del pedido, no de configuración
DatoPedidoInvalido El pedido trae un dato inválido o incompleto No
ErrorCalculo Excepción durante el cálculo No
PersistenciaFallida El cálculo se hizo bien pero no se pudo guardar No
AdicionalNoPersistido Un costo adicional (marketing/referido) no se pudo guardar No

Esta tabla y sus textos legibles viven espejados en el front — ver MOTIVO_NO_LIQUIDACION_TEXTO.


Historial de cambios

Fecha Autor Cambio
2026-09-16 Iker Acevedo Documentación inicial de las 3 validaciones y el catálogo de motivos de no-liquidación.