# Diagramas de Flujo — Casos de Uso Exportaciones

> Cada diagrama corresponde a un caso de uso en [`exports_cu_comprensibles.md`](./exports_cu_comprensibles.md).
> Formato: Mermaid — compatible con Notion, GitHub y VSCode.
> **Cómo usar en Notion:** bloque `/code` → lenguaje `mermaid` → pegar el contenido.

---

## CU-EXP-001 · Procesar NODES

```mermaid
flowchart TD
    START([Usuario presiona\nActualizar Factura]) --> CHK1{¿La factura\nestá Pendiente?}
    CHK1 -- No --> E1([❌ Error\nYa fue procesada])
    CHK1 -- Sí --> V1[Validar encabezado\nfecha · proveedor · destinatario\ntipo de cambio · pedimento]
    V1 --> V2{¿Hay errores\nen el encabezado?}
    V2 -- Sí --> E2([❌ Error\nCampo obligatorio faltante])
    V2 -- No --> V3[Verificar clases y fracciones\narancelarias en catálogo oficial]
    V3 --> V4{¿Alguna clase\no fracción inválida?}
    V4 -- Sí --> E3([❌ Error\nClase o fracción no existe])
    V4 -- No --> V5[Validar tipo de cambio\ncontra el catálogo del día]
    V5 --> V6{¿TC de la factura\n== TC del catálogo?}
    V6 -- No --> E4([❌ Error\nTipo de cambio incorrecto])
    V6 -- Sí --> V7[Marcar todas las partidas\ncomo sin descarga]
    V7 --> V8[Calcular valores por partida\nCosto x Cantidad x TC\nen pesos · dólares · moneda cuenta]
    V8 --> V9[Validar costo unitario · series · pesos]
    V9 --> V10{¿Hay errores\nen partidas?}
    V10 -- Sí --> E5([❌ Error\nCosto en cero o series faltantes])
    V10 -- No --> V11[Calcular totales de la factura\ncantidad · peso · valor MN · ME]
    V11 --> FIN([✅ Factura PROCESADA\nSin cambios en inventario])

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style E1 fill:#C55A11,color:#fff,rx:16
    style E2 fill:#C55A11,color:#fff,rx:16
    style E3 fill:#C55A11,color:#fff,rx:16
    style E4 fill:#C55A11,color:#fff,rx:16
    style E5 fill:#C55A11,color:#fff,rx:16
```

---

## CU-EXP-002 · Procesar con descarga de inventario (DONAC)

```mermaid
flowchart TD
    START([Usuario presiona\nActualizar Factura - DONAC]) --> VALID[Validaciones de encabezado\nclases · fracciones · TC · costos]
    VALID --> ERR{¿Errores de\nvalidación?}
    ERR -- Sí --> E1([❌ Error\nCorregir antes de continuar])
    ERR -- No --> DC1[Construir lista de descarga\n¿Qué se quiere exportar\ny de qué importación viene?]
    DC1 --> DC2[Buscar importaciones origen\nVerificar que estén procesadas\ny con fecha anterior a la exportación]
    DC2 --> DC3{¿Importación origen\nválida y procesada?}
    DC3 -- No --> E2([❌ Error\nImportación no encontrada\no no procesada])
    DC3 -- Sí --> DC4[Calcular saldos disponibles\ncon criterio PEPS\nmás antiguo primero]
    DC4 --> DC5{¿Hay saldo\nsuficiente?}
    DC5 -- No --> E3([❌ Error\nSaldo insuficiente en\nla importación origen])
    DC5 -- Sí --> DC6[Distribuir cantidades\nentre lotes disponibles]
    DC6 --> DC7[Verificación final\n¿Todo lo que se quiere exportar\nquedó cubierto?]
    DC7 --> DC8{¿Alguna partida\nsin cubrir?}
    DC8 -- Sí --> E4([❌ Error\nSaldo insuficiente\nen verificación final])
    DC8 -- No --> SAVE[Registrar la descarga\nen el ledger de inventario\nmovimiento CONSUMO por lote]
    SAVE --> UPD[Actualizar valores retornados\nen las importaciones origen]
    UPD --> FIN([✅ Factura PROCESADA\nSaldos de inventario reducidos])

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style E1 fill:#C55A11,color:#fff,rx:16
    style E2 fill:#C55A11,color:#fff,rx:16
    style E3 fill:#C55A11,color:#fff,rx:16
    style E4 fill:#C55A11,color:#fff,rx:16
```

---

## CU-EXP-003 · Procesar AFIJO con cambio de régimen

```mermaid
flowchart TD
    START([Usuario presiona\nActualizar Factura - AFIJO]) --> CR{¿Tiene cambio\nde régimen?}

    CR -- No --> DISC[Ir a descarga\nde inventario normal]
    DISC --> FIN_DISC([Ver CU-EXP-002\nflujo de descarga])

    CR -- Sí --> PROC[Verificar procedencia\nde todas las partidas]
    PROC --> CHK{¿Todas las\npartidas son TEM?}
    CHK -- No --> E1([❌ Error\nAlguna partida tiene\nprocedencia DEF u otra])
    CHK -- Sí --> GEN{¿Se debe generar\nImportación Definitiva?}
    GEN -- No --> DISC2[Ir a descarga normal]
    GEN -- Sí --> IMD{¿Ya existe una IMD\npara esta factura?}
    IMD -- Sí --> REUSE[Reutilizar la IMD existente\nno se crea duplicado]
    IMD -- No --> CREATE[Generar nueva factura IMD\ncon los mismos datos del encabezado\ny copia de todas las partidas\nestado: Pendiente]
    REUSE --> DISC3[Descarga de inventario\nver CU-EXP-002]
    CREATE --> DISC3
    DISC2 --> DISC3
    DISC3 --> FIN([✅ Factura PROCESADA\nIMD generada en estado Pendiente\nSaldos de inventario reducidos])

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style E1 fill:#C55A11,color:#fff,rx:16
    style FIN_DISC fill:#2E75B6,color:#fff,rx:16
    style DISC2 fill:#BDD7EE,rx:8
    style DISC3 fill:#BDD7EE,rx:8
```

---

## CU-EXP-004 · Procesar SCRAP

```mermaid
flowchart TD
    START([Usuario presiona\nActualizar Factura - SCRAP]) --> NOTE[Comportamiento idéntico a AFIJO\nSolo cambia la naturaleza del material:\nmaterial exportado como desperdicio o chatarra]
    NOTE --> CR{¿Tiene cambio\nde régimen?}
    CR -- No --> DISC[Descarga de inventario\nver CU-EXP-002]
    CR -- Sí --> AFIJO[Flujo completo\nver CU-EXP-003\nVerifica TEM · Genera IMD · Descarga]
    DISC --> FIN([✅ Factura PROCESADA])
    AFIJO --> FIN

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style AFIJO fill:#BDD7EE,rx:8
    style DISC fill:#BDD7EE,rx:8
```

---

## CU-EXP-005 · Procesar REEXP

```mermaid
flowchart TD
    START([Usuario presiona\nActualizar Factura - REEXP]) --> PROC[Verificar procedencia\nde todas las partidas]
    PROC --> CHK{¿Todas las\npartidas son DEF?}
    CHK -- No --> E1([❌ Error\nAlguna partida tiene\nprocedencia TEM u otra\nREEXP requiere procedencia DEF])
    CHK -- Sí --> DISC[Descarga de inventario\nver CU-EXP-002\nSaldos de importaciones DEF]
    DISC --> FIN([✅ Factura PROCESADA\nSaldos de importaciones DEF reducidos])

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style E1 fill:#C55A11,color:#fff,rx:16
    style DISC fill:#BDD7EE,rx:8
```

---

## CU-EXP-006 · Procesar VEMEX

```mermaid
flowchart TD
    START([Usuario presiona\nActualizar Factura - VEMEX]) --> NOTE[Empresa con régimen especial\nIMMEX o zona franca\nVenta virtual al extranjero]
    NOTE --> PROC[Verificar procedencia\nde todas las partidas]
    PROC --> CHK{¿Todas las\npartidas son DEF?}
    CHK -- No --> E1([❌ Error\nVEMEX requiere procedencia DEF\nigual que REEXP])
    CHK -- Sí --> DISC[Descarga de inventario\nver CU-EXP-002]
    DISC --> FIN([✅ Factura PROCESADA\nNo requiere document_type\nni agente aduanal])

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style E1 fill:#C55A11,color:#fff,rx:16
    style DISC fill:#BDD7EE,rx:8
```

---

## CU-EXP-007 · Revertir NODES

```mermaid
flowchart TD
    START([Usuario presiona\nDesactualizar Factura - NODES]) --> CHK{¿La factura\nestá Procesada?}
    CHK -- No --> E1([❌ Error\nNo se puede revertir\nlo que no fue procesado])
    CHK -- Sí --> CLEAN[Limpiar todos los valores calculados\ntotales MN · ME · cantidad · peso]
    CLEAN --> STATUS[Regresar factura a estado\nRevertida]
    STATUS --> FIN([✅ Factura REVERTIDA\nSin efectos en inventario\nNODES nunca tocó el ledger])

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style E1 fill:#C55A11,color:#fff,rx:16
```

---

## CU-EXP-008 · Revertir con descarga (AFIJO, DONAC, SCRAP, REEXP, VEMEX)

```mermaid
flowchart TD
    START([Usuario presiona\nDesactualizar Factura]) --> CHK1{¿La factura\nestá Procesada?}
    CHK1 -- No --> E1([❌ Error\nNo está procesada])
    CHK1 -- Sí --> BLOCK[Verificar si alguna partida\nestá siendo usada por\nuna exportación activa]
    BLOCK --> CHK2{¿Hay exportaciones\nactivas usando\nestos saldos?}
    CHK2 -- Sí --> E2([❌ Bloqueado\nver CU-EXP-009\nRevertir exportaciones primero])
    CHK2 -- No --> R1[1 · Devolver valores\na las importaciones origen\nrestar value_returned y recalcular IVA si aplica]
    R1 --> R2[2 · Desmarcar series\nlas series de importación vuelven a estar\ndisponibles para futuras exportaciones]
    R2 --> R3[3 · Cancelar registros de descarga\ninsertar movimientos RETORNO en el ledger\nel historial queda intacto]
    R3 --> R4[4 · Regresar factura a Revertida\nlimpiar totales]
    R4 --> FIN([✅ Factura REVERTIDA\nInventario restaurado\nHistorial completo y auditable])

    style FIN fill:#1D6B3C,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
    style E1 fill:#C55A11,color:#fff,rx:16
    style E2 fill:#C55A11,color:#fff,rx:16
```

---

## CU-EXP-009 · Reversión bloqueada por exportaciones activas

```mermaid
flowchart TD
    START([Usuario intenta\nDesactualizar Factura]) --> SCAN[Recorrer cada partida\nde la importación origen]
    SCAN --> FIND[Buscar registros de descarga\ncon estado APLICADO\nvinculados a exportaciones procesadas]
    FIND --> CHK{¿Hay descargas\nactivas?}
    CHK -- No --> OK([Reversión permitida\ncontinúa con CU-EXP-008])
    CHK -- Sí --> MSG[Mostrar mensaje de error\npor cada exportación activa\nindicando número de factura y línea]
    MSG --> BLOCK([❌ Reversión BLOQUEADA\nEl usuario debe revertir primero\ncada exportación indicada])

    style OK fill:#1D6B3C,color:#fff,rx:16
    style BLOCK fill:#C55A11,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
```

---

## CU-EXP-010 · Reversión bloqueada por Importación Definitiva existente

```mermaid
flowchart TD
    START([Usuario intenta\nDesactualizar Factura AFIJO o SCRAP\ncon cambio de régimen]) --> SEARCH[Buscar en la base de datos\nuna factura IMD con el mismo\nnúmero que la exportación]
    SEARCH --> CHK{¿Existe\nuna IMD vinculada?}
    CHK -- No --> OK([Reversión permitida\ncontinúa con CU-EXP-008])
    CHK -- Sí --> MSG[Mostrar mensaje de error\ncon el número de la IMD\nque debe eliminarse primero]
    MSG --> BLOCK([❌ Reversión BLOQUEADA\nEliminar la IMD indicada\nluego intentar de nuevo])

    style OK fill:#1D6B3C,color:#fff,rx:16
    style BLOCK fill:#C55A11,color:#fff,rx:16
    style START fill:#1F4E79,color:#fff,rx:16
```

---

## Visión general — todos los tipos de exportación

```mermaid
flowchart LR
    subgraph PROCESAR ["⬆️ PROCESAR"]
        NODES[NODES\nSin descarga]
        DONAC[DONAC\nDescarga directa]
        AFIJO[AFIJO\nDescarga + IMD opcional]
        SCRAP[SCRAP\nDescarga + IMD opcional]
        REEXP[REEXP\nProcedencia DEF]
        VEMEX[VEMEX\nProcedencia DEF]
    end

    subgraph REVERTIR ["⬇️ REVERTIR"]
        RNODES[Revertir NODES\nSolo limpia valores]
        RDESC[Revertir con descarga\nDevuelve saldos + cancela ledger]
    end

    subgraph BLOQUEOS ["🚫 BLOQUEOS"]
        BEXP[Bloqueada por\nexportación activa]
        BIMD[Bloqueada por\nIMD existente]
    end

    NODES --> RNODES
    DONAC & AFIJO & SCRAP & REEXP & VEMEX --> RDESC
    RDESC --> BEXP
    AFIJO & SCRAP --> BIMD

    style PROCESAR fill:#E2EFDA,rx:8
    style REVERTIR fill:#DEEAF1,rx:8
    style BLOQUEOS fill:#FCE4D6,rx:8
```
