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-genericosirve 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-transtiene temporalmente dos patrones conviviendo (legacy + Strategy) - Las variables individuales de las legacy (
rows,rowsEnvia,rowsXcargo) coexisten con eltablaEstadoMap - La migración de las legacy queda como deuda técnica hasta que el equipo la priorice
Neutrales¶
- El
TransportadoraFactorycentraliza 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