Autor: Iker Acevedo¶
Fecha creación: 2026-09-16 Estado: preprod Tipo: servicio
TransportadoraActivaService¶
Estado compartido de la transportadora seleccionada en el Hub — provisto a nivel del componente CostosTransportadoraComponent (no providedIn: 'root'), así que cada vez que se entra al módulo arranca limpio. Las 5 pestañas leen de este servicio en vez de recibir la data por @Input() en cascada.
Usa Angular Signals para reactividad (configuracion, trayectos, tarifas, excepciones, tiendas, cargando) — sin RxJS, salvo en las llamadas HTTP en sí, que siguen siendo Observables/Promises como el resto del CRUD genérico de la plataforma.
Mapeo camelCase (TS) ↔ PascalCase (Mongo)¶
Las colecciones reales guardan sus campos en PascalCase (IdTransportadora, MotorLiquidacion...) — la convención de todo LogighoDB. El resto del front usa camelCase en todos sus modelos. En vez de contaminar cada componente con nombres PascalCase, la conversión pasa una sola vez, acá, en el borde donde se habla con Mongo — los componentes nunca ven un campo en PascalCase.
Cuatro pares de funciones puras hacen la conversión: configuracionAMongo/configuracionDesdeMongo, trayectoAMongo/trayectoDesdeMongo, tarifaAMongo/tarifaDesdeMongo.
Acciones principales¶
| Método | Qué hace |
|---|---|
seleccionar(card) |
Guarda la transportadora activa y dispara 5 cargas en paralelo (Promise.all): configuración, trayectos, tarifas, auditoría, catálogo de tiendas |
actualizarConfiguracion(config) |
Upsert por _id en ConfiguracionLiquidacionTransportadora, y refresca el signal con lo que confirmó Mongo |
guardarTrayecto / eliminarTrayecto |
Upsert / delete en TrayectosTransportadora |
marcarComoDefecto(codigo) |
Actualiza ConfiguracionTransportadora.trayectoPorDefecto — no toca el documento del trayecto (ver comentario en el código: mezclar "es default" ahí duplicaría la fuente de verdad) |
guardarTarifa / eliminarTarifa |
Upsert / delete en TarifasTransportadoraTienda |
Catálogo de tiendas: cacheado, no por transportadora¶
cargarCatalogoTiendas() no vuelve a pedir el catálogo si ya hay tiendas cargadas (if (this.tiendas().length > 0) return) — el catálogo de tiendas activas no depende de qué transportadora esté seleccionada, así que no tiene sentido repetir la consulta al cambiar de tab o de transportadora dentro de la misma sesión del componente.
Un detalle no obvio: el identificador de un documento de Tienda es el campo corto Id, no IdTienda — ese nombre más largo se usa como llave foránea en otras colecciones (por ejemplo TarifasTransportadoraTienda.IdTienda), pero el documento de Tienda en sí lo guarda como Id. Confirmado contra administracion/tiendas/tiendas.component.ts, que ya lee y escribe esa colección en producción.
Computed values útiles¶
esMotorDinamico—truesiconfiguracion().motorLiquidacion === Dinamica.usaTablaIncrementos—truesi la política de peso esTablaIncrementosConTope; condiciona qué columnas se muestran en Tarifas por Tienda.topeKilos— el tope configurado, o5por defecto si todavía no hay configuración cargada.
Historial de cambios¶
| Fecha | Autor | Cambio |
|---|---|---|
| 2026-09-16 | Iker Acevedo | Documentación inicial del servicio. |