Saltar a contenido

Implementacion de patrón Strategy para transportadoras en módulo de facturas

Autor: Iker Acevedo

Fecha: 2026-03-19

Estado: Produccion


Contexto

El módulo facturas-trans gestiona las los pagos realizados a las diferentes transportadoras. Al momento de esta decisión existían 3 transportadoras implementadas (Interrapidisimo, Envia, X-Cargo) y se requería agregar Servientrega.

El patrón de implementación existente duplicaba el mismo flujo (fetch → descomprimir → sanitizar → mostrar → exportar → importar) para cada transportadora, con variables y métodos individuales por cada una. Agregar Servientrega con el mismo patrón implicaba ~200 líneas duplicadas adicionales y un componente de importación de ~550 líneas.

Restricciones: - No se puede refactorizar el codigo hasta que se inicie el proyecto dentro del modulo. - Servientrega debía entregarse en el ciclo actual, sin afectar al actual - Las transportadoras futuras deben poder agregarse con el mínimo impacto posible


Opciones consideradas

Opción A — Continuar con el patrón legacy (duplicación)

Agregar Servientrega igual que las 3 transportadoras existentes: variables propias, métodos propios, componente de importación propio.

Pros: - Sin curva de aprendizaje para el equipo - Consistente con lo que ya existe

Contras: - ~200 líneas duplicadas por transportadora nueva - Un componente de importación de ~550 líneas por cada una - Un bug en el batch insert hay que corregirlo en N componentes - Con 6-8 transportadoras el componente supera las 2000 línea - Se vuelve inmantenible para la empresa un componente tan pesado y muy dificil de actualizar o mejorar


Opción B — Patrón Strategy solo para transportadoras nuevas con proyecto de refactorizar actuales

Implementar Servientrega con Strategy sin modificar las 3 existentes. Las transportadoras legacy coexisten con las nuevas hasta que el equipo evalúe la migración.

Pros: - Cero riesgo sobre código existente en producción - Servientrega sirve como referencia y validación del patrón - Transportadoras futuras siguen el flujo de Servientrega - La migración de las legacy queda como decisión separada del equipo

Contras: - Coexisten dos patrones en el mismo componente temporalmente - Un dev nuevo debe entender ambos estilos


Decisión

Se eligió: Opción N

Razón principal: Permitía entregar Servientrega con buenas prácticas sin poner en riesgo las 3 transportadoras que ya funcionan en producción. Servientrega actúa como prueba del patrón. Si el equipo valida la arquitectura, la migración de las legacy es un proceso seguro y evaluado.


Consecuencias

Positivas

  • Agregar una transportadora nueva requiere: 1 clase nueva + 1 línea en el factory + copiar bloque HTML
  • app-importacion-facturas-generico sirve para todas las transportadoras nuevas sin duplicación
  • Un solo lugar para corregir bugs en la lógica de importación
  • Contrato claro: cualquier dev sabe exactamente qué implementar para agregar una transportadora

Negativas / Compromisos

  • El componente facturas-trans tiene temporalmente dos patrones conviviendo (legacy + Strategy)
  • Las variables individuales de las legacy (rows, rowsEnvia, rowsXcargo) coexisten con el tablaEstadoMap
  • La migración de las legacy queda como deuda técnica hasta que el equipo la priorice

Neutrales

  • El TransportadoraFactory centraliza la creación de estrategias pero no es obligatorio usarlo directamente en el template

Implementación

Módulo / Repo Impacto
SitioLogiGho — facturas-trans Nuevos archivos en strategies/transportadoras/. Métodos genéricos agregados al componente. Sección Servientrega en el HTML.
SitioLogiGho — components Nuevo componente importacion-facturas-generico que reemplaza el patrón de un componente por transportadora

Archivos creados: - strategies/transportadoras/transportadora.strategy.ts - strategies/transportadoras/transportadora.factory.ts - strategies/transportadoras/servientrega.strategy.ts - components/importacion-facturas-generico/

Actualización 2026-10-02 (Yadilton Torres): se agregó el campo opcional columnasOpcionales?: string[] a TransportadoraStrategy. Permite que cada strategy declare qué columnas de su columnMapping no son obligatorias en el Excel, sin modificar el componente genérico. Si la strategy no lo define (caso D2E), todas sus columnas son obligatorias. ServientregaStrategy lo usa para CODIGOCENTROCOSTO y NOMBRECENTROCOSTO. Ver Importación Facturas Genérico.


Estado futuro

Esta decisión se revisará si: - El equipo aprueba migrar las transportadoras legacy (Interrapidisimo, Envia, X-Cargo) al patrón Strategy - Se agrega una transportadora que requiera un flujo radicalmente diferente al cubierto por la interfaz actual - La interfaz TransportadoraStrategy crece con campos que no aplican a todas las transportadoras — en ese caso evaluar separar en dos interfaces: TransportadoraDisplayStrategy e TransportadoraImportStrategy