Ficheros Carrefour (MAPFRE)
Carrefour es un canal cuya cartera de pólizas y recibos se entrega al carrier MAPFRE en forma de ficheros planos (XML y de ancho fijo) intercambiados por SFTP. A diferencia de Phoenix o AMA —que emiten por risk item a través del orquestador— Carrefour tiene un pipeline propio bajo carrefour-payments: los ficheros se generan a partir de las órdenes y se despachan de forma programada.
Esta página describe cómo funciona el pipeline; el catálogo de ficheros está en Familias de ficheros.
Pipeline de extremo a extremo
orders (INSERT)
│ trigger AFTER INSERT
▼
POST /api/integrations/carrefour-payments/order ── genera un "register" por cada slug aplicable
▼
temp_carriers_orders (status = pending)
│ cron horario por canal (carrefour_dispatch)
▼
POST /api/integrations/carrefour-payments/dispatch ── consolida los pending del slug
▼
CarrefourAdapter (SFTP) ── send / receive
▼
integration_emissions (SUCCESS/FAILED) + temp_carriers_orders (status = sent)
1. Generación (disparada por la orden)
Un trigger AFTER INSERT ON orders publica (vía net.http_post, post-commit) hacia POST /api/integrations/carrefour-payments/order. El handler:
- Carga el contexto:
auth_configde la filaintegrations, elrisk_item, laordery eltimezonedel canal. - Resuelve qué reports aplican al canal recorriendo
auth_config.<bloque>.channels[]porid_channel. - Por cada slug aplicable (p. ej.
EIAC_POLIZAS_NP,RIC_DAILY,PAYMENTS_DAILY), tras pasar sus puertas (es alta / es cancelación / etc.), construye elregister—la línea o el fragmento XML ya formateado— y lo persiste entemp_carriers_ordersconstatus = pending.
2. Persistencia: temp_carriers_orders
Es la tabla de trabajo entre la generación y el despacho. Guarda el register ya listo por (order_id, integration_slug), su status (pending → sent → failed) y una columna date en wall-clock del timezone del canal (no UTC), que el despacho usa para las ventanas diarias.
Un índice único (order_id, integration_slug) evita duplicados, salvo para los slugs que representan varios movimientos sobre la misma orden (EIAC_RECIBOS_MO, OPEN_SYSTEMS, OPEN_SYSTEMS_V2), donde se permiten varias filas.
3. Consolidación y despacho (cron por canal)
Un cron horario (carrefour_dispatch, pg_cron, uno por canal Carrefour) lee send_time y read_time de la config del canal (en su timezone) y, cuando coincide la hora, dispara POST /dispatch con la operación send o read. El dispatch:
- Consolida las filas
pendingdel slug (para los EIAC diarios, acotando por la ventana de 24 h segúndate). - Arma el fichero: concatena los
registerpara los formatos de texto; para EIAC envuelve los fragmentos en la cabecera XML. - Lo sube a un bucket y lo envía por SFTP.
- El nombre del fichero se resuelve con tokens de fecha (
{YYYY},{MM},{DD},{MMYYYY}) desde la plantilla configurada.
4. SFTP (envío y recepción)
El CarrefourAdapter (registrado bajo el slug SFTP) implementa dos operaciones:
send: sube el fichero alremote_pathdel SFTP de Carrefour.receive: baja ficheros de respuesta desderemote_path_iny los procesa.
Las credenciales SFTP (host, puerto, usuario, contraseña, remote_path, remote_path_in) viven por canal en auth_config.
5. Registro del despacho
Cada despacho se registra en integration_emissions (provider = 'SFTP', SUCCESS/FAILED, external_id = nombre del fichero). Las filas despachadas con éxito pasan a status = 'sent' con su sent_at.
Configuración (auth_config)
La fila integrations correspondiente guarda, por familia, un bloque con:
reports[]— un report por slug, con su plantilla de nombre de fichero, periodicidad y parámetros propios de la familia (p. ej. laclasede EIAC).channels[]— por canal (id_channel): credenciales SFTP,send_time/read_timey los mapeos que cada familia necesita.
La periodicidad de un report (daily / monthly, con schedule_day y skip_weekends) determina la fecha de cierre que se estampa en el fichero.
Multi-tenant y seguridad
- Todo el pipeline está scopeado por
channel_id(la tablatemp_carriers_orderslo lleva como FK). - El timezone del canal gobierna las ventanas de consolidación y las fechas de cierre.
- Los endpoints de generación y despacho solo aceptan service-role (Bearer).
temp_carriers_orderstiene RLS sin policies: solo el service-role escribe.
Dónde está en el repo
- Generación por orden:
apps/next/src/app/api/integrations/carrefour-payments/order/route.ts - Consolidación y despacho:
apps/next/src/app/api/integrations/carrefour-payments/dispatch/route.ts - Adaptador SFTP:
apps/next/src/integrations/adapters/sftp/carrefour/ - Builders por familia:
apps/next/src/integrations/carrefour-eiac/,carrefour-mic/, ycarrefour-payments/ric.utils.ts