# Alerta temprana: Zarpe sin DEX cargado

**Comando:** `php artisan command:zarpesinDex`
**Archivo:** [app/Console/Commands/Zarpe_sinDexCommand.php](app/Console/Commands/Zarpe_sinDexCommand.php)

## Para qué sirve

Cuando una operación de exportación ya zarpó, el DEX (Declaración de Exportación) debería estar cargado en Central.
Este comando revisa, sucursal por sucursal, todas las operaciones de exportación que ya tienen fecha de zarpe y
detecta cuáles **todavía no tienen el DEX cargado**. Con esas operaciones arma un Excel y lo envía por correo como
**alerta temprana** al analista responsable, para que cargue el documento lo antes posible.

Si una operación ya tiene su DEX cargado, no aparece en el reporte.

## Cómo funciona, paso a paso

El proceso se repite para cada sucursal de la lista (`CG`, `BV`, `BQ`, `SM`, `BG`, `MD`):

1. **Busca las operaciones con zarpe en Websimex.**
   Consulta en el ERP (conexión `websimex`, solo lectura) las operaciones de exportación (`TIPO_REGIMEN = 'E'`) que
   no están anuladas, que tienen fecha de zarpe desde el **2026-01-01** y cuyo analista operativo pertenece a la
   sucursal que se está procesando. De cada operación toma:
   - número de DO
   - importador
   - analista y sucursal del analista
   - fecha de zarpe
   - proceso

2. **Revisa cuáles ya tienen el DEX cargado.**
   Con la lista de números de DO obtenida, consulta la tabla `asercolg_bitacora.documentos_aws` (modelo
   `App\Models\DocumentosAws`, conexión `cti`), que es donde se registran los documentos subidos a Central.
   Busca los DO que tienen cargado el documento **tipo 38 (DEX)** y que **no han sido eliminados**, es decir, sin
   fecha ni usuario de eliminación.
   La consulta se hace por bloques de 1.000 DO, así que es una sola consulta por bloque y no una por cada operación.

3. **Deja solo las operaciones sin DEX.**
   De la lista de Websimex se quitan las operaciones que ya tienen el DEX. Quedan las que:
   - tienen otros documentos cargados, pero no el DEX, o
   - no tienen ningún documento cargado.

4. **Genera el Excel y lo envía.**
   Arma un Excel con estas columnas:

   | Columna | Contenido |
   |---|---|
   | NRO DO | Número de la operación |
   | IMPORTADOR | Cliente de la operación |
   | FECHA ZARPE | Fecha de zarpe registrada en Websimex |
   | ANALISTA | Analista operativo a cargo |
   | SUCURSAL ANALISTA | Sucursal del analista |
   | PROCESO | Proceso de la operación |
   | DEX | Siempre dice **FALTA CARGAR** |

   Lo envía por correo (`AsercolMailing`) a la dirección configurada para esa sucursal, con el asunto
   *"ALERTA TEMPRANA - Reporte de Pedidos con Zarpe sin Dex Cargados en Fase 1 - {sucursal}"*. Después borra el
   archivo temporal del servidor.

## Fuentes de datos

| Base / conexión | Tabla | Para qué se usa |
|---|---|---|
| Websimex (`websimex`) | `estados_do` | Operaciones, estado de anulación y régimen |
| Websimex (`websimex`) | `exportaciones` | Fecha de zarpe |
| Websimex (`websimex`) | `importadores` | Nombre del importador |
| Websimex (`websimex`) | `comex.empleados` | Analista operativo y su sucursal |
| Websimex (`websimex`) | `procesos` | Nombre del proceso |
| Central (`cti`) | `asercolg_bitacora.documentos_aws` | Documentos cargados; se busca el tipo 38 (DEX) |

El comando **solo lee** información; no modifica ninguna base de datos.

## Configuración

Todo se ajusta dentro del archivo del comando:

| Qué | Dónde | Valor actual |
|---|---|---|
| Sucursales que se procesan | `$sucursal` | `CG, BV, BQ, SM, BG, MD` |
| Correo destino por sucursal | `$direcciones` (en `handle()`) | `CG, BV, BQ, SM` → npiedrahita@asercol.com |
| Fecha de corte del zarpe | consulta de Websimex (`'2026-01-01'`) y `$fecha_inicial` | 2026-01-01 |
| Días en que corre | `$diasSemana` | Todos los días |
| Tipo de documento que se busca | `dosConDexCargado()` | 38 (DEX) |

## Observaciones a tener en cuenta

- **Sucursales sin correo configurado:** la lista `$sucursal` incluye `BG` y `MD`, pero `$direcciones` solo tiene
  correo para `CG`, `BV`, `BQ` y `SM`. Al llegar a `BG`, el comando falla por no encontrar la dirección y tampoco
  procesa `MD`. Antes de ponerlo en producción hay que agregar los correos de esas sucursales o quitarlas de la lista.
- **La fecha de corte está en dos lugares:** en `$fecha_inicial`, que se usa en el nombre del reporte y en el texto
  del correo, y escrita directamente en la consulta de Websimex. Si se cambia una, hay que cambiar la otra.
- **Correo aunque no haya pendientes:** si una sucursal no tiene operaciones sin DEX, igual se envía el correo con
  el Excel vacío.
- **No está programado:** el comando no aparece en `app/Console/Kernel.php`, así que hoy solo corre si se ejecuta
  a mano.
