diff --git a/backend/api/v1/modules/a76/invoices/docs/README.MD b/backend/api/v1/modules/a76/invoices/docs/README.MD new file mode 100644 index 00000000..a672c329 --- /dev/null +++ b/backend/api/v1/modules/a76/invoices/docs/README.MD @@ -0,0 +1,151 @@ +# Anexo76 — Documentación del Módulo de Facturas + +> **Sistema:** SCAII · Aduanasoft +> **Versión:** 1.0 · Marzo 2026 +> **Módulos documentados:** `imports/` · `exports/` + +--- + +## ¿Qué es este módulo? + +El módulo de facturas gestiona el ciclo completo de las operaciones aduaneras de una empresa maquiladora: la **entrada** de materiales al país (importaciones) y la **salida** (exportaciones). Ambos módulos están conectados a través de un ledger de inventario compartido — las importaciones crean saldos, las exportaciones los consumen. + +--- + +## Estructura de la documentación + +``` +docs/ +│ +├── README.md ← estás aquí +│ +├── exports/ +│ ├── exports_cu_comprensibles.md ← casos de uso +│ └── exports_cu_diagramas.md ← diagramas de flujo Mermaid +│ +└── imports/ + ├── imports_cu_comprensibles.md ← casos de uso + └── imports_cu_diagramas.md ← diagramas de flujo Mermaid +``` + +--- + +## Módulo de Exportaciones + +Gestiona la salida de materiales del país. Cada tipo de factura representa un escenario aduanero diferente. + +### Casos de uso + +| ID | Caso de uso | Descripción breve | Diagrama | +|----|-------------|-------------------|:--------:| +| [CU-EXP-001](./exports/exports_cu_comprensibles.md#cu-exp-001--procesar-una-factura-nodes) | Procesar NODES | Exportación sin descarga de inventario | [→](./exports/exports_cu_diagramas.md#cu-exp-001--procesar-nodes) | +| [CU-EXP-002](./exports/exports_cu_comprensibles.md#cu-exp-002--procesar-una-factura-donac) | Procesar DONAC | Donación al extranjero con descarga directa | [→](./exports/exports_cu_diagramas.md#cu-exp-002--procesar-con-descarga-de-inventario-donac) | +| [CU-EXP-003](./exports/exports_cu_comprensibles.md#cu-exp-003--procesar-una-factura-afijo) | Procesar AFIJO | Exportación con descarga e IMD opcional | [→](./exports/exports_cu_diagramas.md#cu-exp-003--procesar-afijo-con-cambio-de-régimen) | +| [CU-EXP-004](./exports/exports_cu_comprensibles.md#cu-exp-004--procesar-una-factura-scrap) | Procesar SCRAP | Exportación de desperdicio con descarga | [→](./exports/exports_cu_diagramas.md#cu-exp-004--procesar-scrap) | +| [CU-EXP-005](./exports/exports_cu_comprensibles.md#cu-exp-005--procesar-una-factura-reexp) | Procesar REEXP | Reexportación desde importaciones definitivas | [→](./exports/exports_cu_diagramas.md#cu-exp-005--procesar-reexp) | +| [CU-EXP-006](./exports/exports_cu_comprensibles.md#cu-exp-006--procesar-una-factura-vemex) | Procesar VEMEX | Venta al extranjero desde régimen especial | [→](./exports/exports_cu_diagramas.md#cu-exp-006--procesar-vemex) | +| [CU-EXP-007](./exports/exports_cu_comprensibles.md#cu-exp-007--revertir-una-factura-nodes) | Revertir NODES | Deshacer sin efectos en inventario | [→](./exports/exports_cu_diagramas.md#cu-exp-007--revertir-nodes) | +| [CU-EXP-008](./exports/exports_cu_comprensibles.md#cu-exp-008--revertir-una-factura-con-descarga-afijo-donac-scrap-reexp-vemex) | Revertir con descarga | Devolver saldos y cancelar registros del ledger | [→](./exports/exports_cu_diagramas.md#cu-exp-008--revertir-con-descarga-afijo-donac-scrap-reexp-vemex) | +| [CU-EXP-009](./exports/exports_cu_comprensibles.md#cu-exp-009--reversión-bloqueada-por-exportaciones-activas) | Reversión bloqueada por exportación | Bloqueo cuando otra exportación usa los saldos | [→](./exports/exports_cu_diagramas.md#cu-exp-009--reversión-bloqueada-por-exportaciones-activas) | +| [CU-EXP-010](./exports/exports_cu_comprensibles.md#cu-exp-010--reversión-bloqueada-por-importación-definitiva-existente) | Reversión bloqueada por IMD | Bloqueo cuando existe una IMD generada | [→](./exports/exports_cu_diagramas.md#cu-exp-010--reversión-bloqueada-por-importación-definitiva-existente) | + +### Resumen rápido por tipo + +| Tipo | Descarga inventario | Genera IMD | Requiere procedencia | +|------|:-------------------:|:----------:|:--------------------:| +| NODES | No | No | — | +| DONAC | Sí | No | — | +| AFIJO | Sí | Solo con cambio de régimen | TEM (si CR) | +| SCRAP | Sí | Solo con cambio de régimen | TEM (si CR) | +| REEXP | Sí | No | DEF obligatoria | +| VEMEX | Sí | No | DEF obligatoria | + +--- + +## Módulo de Importaciones + +Gestiona la entrada de materiales al país. Las importaciones temporales (TEM) son la base del inventario que las exportaciones consumen. + +### Casos de uso + +| ID | Caso de uso | Descripción breve | Diagrama | +|----|-------------|-------------------|:--------:| +| [CU-IMP-001](./imports/imports_cu_comprensibles.md#cu-imp-001--procesar-una-factura-tem-importación-temporal) | Procesar TEM | Entrada temporal, genera saldos de inventario | [→](./imports/imports_cu_diagramas.md#cu-imp-001--procesar-tem-importación-temporal) | +| [CU-IMP-002](./imports/imports_cu_comprensibles.md#cu-imp-002--procesar-una-factura-def-importación-definitiva) | Procesar DEF | Entrada definitiva con IVA, sin saldos | [→](./imports/imports_cu_diagramas.md#cu-imp-002--procesar-def-importación-definitiva) | +| [CU-IMP-003](./imports/imports_cu_comprensibles.md#cu-imp-003--procesar-una-factura-mex-compra-mexicana) | Procesar MEX | Compra nacional con IVA, sin saldos | [→](./imports/imports_cu_diagramas.md#cu-imp-003--procesar-mex-compra-mexicana) | +| [CU-IMP-004](./imports/imports_cu_comprensibles.md#cu-imp-004--procesar-una-factura-tem-con-regla-octava-prosec) | Procesar TEM + PROSEC | TEM con permisos de Regla Octava | [→](./imports/imports_cu_diagramas.md#cu-imp-004--procesar-tem-con-regla-octava-prosec) | +| [CU-IMP-005](./imports/imports_cu_comprensibles.md#cu-imp-005--revertir-una-factura-tem) | Revertir TEM | Anular saldos, restaurar cupos PROSEC | [→](./imports/imports_cu_diagramas.md#cu-imp-005--revertir-tem) | +| [CU-IMP-006](./imports/imports_cu_comprensibles.md#cu-imp-006--revertir-una-factura-def-o-mex) | Revertir DEF o MEX | Deshacer sin efectos en inventario | [→](./imports/imports_cu_diagramas.md#cu-imp-006--revertir-def-o-mex) | +| [CU-IMP-007](./imports/imports_cu_comprensibles.md#cu-imp-007--reversión-bloqueada-por-exportaciones-activas) | Reversión bloqueada | Bloqueo cuando exportaciones usan los saldos | [→](./imports/imports_cu_diagramas.md#cu-imp-007--reversión-bloqueada-por-exportaciones-activas) | + +### Resumen rápido por tipo + +| Tipo | Genera saldo inventario | Calcula IVA | Regla Octava | +|------|:-----------------------:|:-----------:|:------------:| +| TEM | Sí | No | Opcional | +| DEF | No | Sí | No | +| MEX | No | Sí | No | + +--- + +## Cómo se conectan importaciones y exportaciones + +``` +Importación TEM procesada + │ + │ crea movimientos ENTRADA en el ledger + │ (un registro por partida principal) + ▼ + Ledger de inventario (a24.balance_movement) + │ + │ las exportaciones consultan saldos disponibles + │ usando criterio PEPS — más antiguo primero + ▼ +Exportación procesa (DONAC, AFIJO, SCRAP, REEXP, VEMEX) + │ + │ inserta movimientos CONSUMO + │ reduce el saldo disponible + ▼ + Si se revierte la exportación → inserta RETORNO + Si se revierte la importación → inserta ANULACIÓN DE ENTRADA + El ledger nunca se borra — solo se agregan registros +``` + +**Regla de orden para reversiones:** +Siempre deben revertirse primero las exportaciones y luego la importación. El sistema lo garantiza mediante bloqueos automáticos. + +--- + +## Estados de una factura + +``` +PENDIENTE ──[Procesar]──▶ PROCESADA ──[Revertir]──▶ REVERTIDA + │ + │ si hay bloqueos activos + ▼ + BLOQUEADA (no es un estado real, + el sistema rechaza la operación + con un mensaje de error) +``` + +--- + +## Glosario + +| Término | Significado | +|---------|-------------| +| **TEM** | Importación Temporal — material que entra para ser procesado y reexportado | +| **DEF** | Importación Definitiva — material que entra pagando impuestos completos | +| **MEX** | Compra a proveedor mexicano | +| **IMD** | Importación Definitiva generada automáticamente por un cambio de régimen | +| **NODES** | Exportación sin descarga de saldos (No Descarga) | +| **AFIJO** | Exportación de material transformado, con descarga de TEM | +| **DONAC** | Donación al extranjero con descarga de inventario | +| **SCRAP** | Exportación de desperdicio o chatarra | +| **REEXP** | Reexportación de material importado definitivamente | +| **VEMEX** | Venta al extranjero desde régimen especial (IMMEX / zona franca) | +| **PEPS** | Primero en Entrar, Primero en Salir — criterio de consumo de inventario | +| **PROSEC** | Programa de Promoción Sectorial — beneficio arancelario para maquiladoras | +| **Regla Octava** | Mecanismo de la Ley Aduanera que permite importar con arancel preferencial bajo un permiso PROSEC | +| **Ledger a24** | Registro histórico de todos los movimientos de inventario — solo escritura, nunca se borra | +| **Cambio de régimen** | Conversión de material temporal a definitivo, requiere generación de IMD | \ No newline at end of file diff --git a/backend/api/v1/modules/a76/invoices/exports/docs/REPO_exports_casos_de_uso.md b/backend/api/v1/modules/a76/invoices/exports/docs/REPO_exports_casos_de_uso.md new file mode 100644 index 00000000..a497c533 --- /dev/null +++ b/backend/api/v1/modules/a76/invoices/exports/docs/REPO_exports_casos_de_uso.md @@ -0,0 +1,379 @@ +# Casos de Uso — Módulo de Exportaciones + +**Sistema:** Anexo76 · SCAII +**Módulo:** `exports/` +**Versión:** 1.0 · Marzo 2026 + +--- + +## Contexto general + +El módulo de exportaciones gestiona el ciclo completo de una factura de exportación dentro del sistema: desde que el usuario la captura hasta que queda registrada como procesada ante la aduana. También permite revertirla si hubo un error. + +Toda factura de exportación pasa por uno de dos momentos: **procesarla** (actualizarla) o **revertirla** (desactualizarla). El sistema hace cosas muy distintas dependiendo del **tipo de factura**, porque cada tipo representa un escenario aduanero diferente con reglas propias. + +--- + +## CU-EXP-001 · Procesar una factura NODES + +### Descripción + +El usuario procesa una factura de exportación de tipo **NODES**. Este tipo representa mercancía que sale del país pero que **no está vinculada a ninguna importación temporal** registrada en el sistema — puede ser producción propia, material adquirido localmente o cualquier salida sin historial de entrada temporal. + +### Por qué existe + +No toda la mercancía que exporta una maquiladora fue importada temporalmente. Las empresas también exportan lo que fabrican localmente. El sistema necesita registrar esa salida y calcular su valor en pesos y dólares sin buscar ningún saldo previo en el inventario. + +### Quién lo usa + +El usuario de captura de exportaciones, desde la pantalla de facturas de exportación, al presionar **"Actualizar Factura"**. + +### Qué necesita estar listo antes + +- La factura debe estar en estado **Pendiente** — si ya fue procesada, el sistema la rechaza. +- Debe tener al menos una partida capturada. +- Todos los campos del encabezado deben estar completos: fecha, proveedor, destinatario, tipo de cambio, moneda, agente aduanal y pedimento. +- El tipo de cambio del día debe estar registrado en el catálogo. +- Las clases y fracciones arancelarias de cada partida deben existir en el catálogo oficial. +- Cada partida principal debe tener un costo unitario mayor a cero. + +### Qué hace el sistema + +Primero valida que todos los campos obligatorios del encabezado estén correctos y que las partidas existan. Luego marca explícitamente todas las partidas como "sin descarga" para que el inventario de importaciones temporales no se vea afectado. Valida que cada fracción arancelaria esté vigente, que el tipo de cambio coincida con el catálogo y que ninguna partida tenga costo en cero. + +Después calcula los valores monetarios de cada partida multiplicando el costo unitario por la cantidad y el tipo de cambio del día, obteniendo el valor en pesos, en dólares y en moneda de cuenta. Suma todos esos valores para obtener los totales de la factura. + +Finalmente guarda los totales calculados y marca la factura como **Procesada**. + +### Qué queda guardado + +La factura queda en estado **Procesada** con sus valores monetarios calculados. El inventario de importaciones temporales no se modifica — NODES no descarga ni registra ningún movimiento en el ledger de saldos. + +### Qué puede fallar + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| La factura ya estaba procesada | La rechaza de inmediato sin ejecutar ningún paso más | +| El tipo de cambio capturado no coincide con el catálogo | Muestra el error y detiene el proceso | +| Una fracción arancelaria no existe en el catálogo oficial | Reporta qué partida tiene la fracción inválida | +| Una clase arancelaria está desactivada | Reporta qué partida tiene la clase desactivada | +| Una partida tiene costo unitario en cero | Indica qué partida no tiene precio capturado | +| Una partida tiene series activadas pero no hay series registradas | Indica qué partida le faltan series | + +--- + +## CU-EXP-002 · Procesar una factura DONAC + +### Descripción + +El usuario procesa una factura de exportación de tipo **DONAC**. Este tipo representa una **donación al extranjero** — la mercancía sale del país y descarga directamente el inventario de importaciones temporales, sin ningún trámite adicional de cambio de régimen. + +### Por qué existe + +Las empresas maquiladoras a veces donan material a organizaciones en el extranjero. La donación sigue siendo una salida de inventario: el material importado temporalmente sale del país y el sistema debe registrar que ese saldo ya no está disponible. DONAC es la vía más directa de hacerlo. + +### Quién lo usa + +El usuario de captura de exportaciones al procesar una factura marcada como tipo DONAC. + +### Qué necesita estar listo antes + +Lo mismo que NODES, más lo siguiente: + +- Cada partida que se va a descargar debe tener indicada su **factura de importación origen** (la TEM o DEF de la que proviene el material). +- Esa factura de importación debe estar procesada y tener una fecha anterior a la exportación. +- El saldo disponible en esa importación debe ser suficiente para cubrir la cantidad que se quiere exportar. +- La unidad de medida del material debe coincidir entre la importación y la exportación. + +### Qué hace el sistema + +Ejecuta las mismas validaciones que NODES (encabezado, clases, fracciones, tipo de cambio, costo unitario) pero además realiza el **descargo de inventario**. + +Para el descargo, el sistema construye una lista de todo lo que se quiere exportar y busca de qué lotes de importación proviene cada material. Aplica el criterio **PEPS** (Primero en Entrar, Primero en Salir): si hay varios lotes del mismo material de distintas fechas, consume primero el más antiguo. Verifica que el saldo alcance y distribuye las cantidades entre los lotes disponibles. + +Si todo está en orden, registra en el ledger de inventario que esos lotes fueron consumidos, actualiza los valores retornados en las partidas de importación origen y marca la factura como **Procesada**. + +### Qué queda guardado + +La factura queda **Procesada**. En el ledger de saldos quedan registrados movimientos de tipo **Consumo** por cada lote descargado. Las partidas de importación origen reflejan cuánto valor ya fue exportado. + +### Qué puede fallar + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| La factura de importación origen no está procesada | Indica qué importación debe procesarse primero | +| La fecha de la importación es posterior a la exportación | Es un error de datos — no se puede exportar antes de importar | +| No hay saldo suficiente en la importación origen | Muestra exactamente cuánto falta por partida | +| La unidad de medida no coincide entre importación y exportación | Indica qué partidas tienen incompatibilidad de unidades | + +--- + +## CU-EXP-003 · Procesar una factura AFIJO + +### Descripción + +El usuario procesa una factura de exportación de tipo **AFIJO**. Este tipo puede tener dos variantes: **con cambio de régimen** o **sin cambio de régimen**. + +En ambos casos se descarga el inventario de importaciones temporales. La diferencia es que cuando hay cambio de régimen, el sistema también genera automáticamente una **Importación Definitiva (IMD)** que ampara la conversión del material. + +### Por qué existe + +AFIJO es uno de los tipos más comunes en operaciones maquiladoras. Ocurre cuando la empresa exporta material que procesó a partir de insumos importados temporalmente. El "afijo" hace referencia a que el material fue transformado o ensamblado dentro del país antes de salir. + +Cuando además hay **cambio de régimen**, significa que una parte del material importado temporalmente no será exportado sino que se quedará en México de forma permanente — por eso el sistema genera la IMD que formaliza ese cambio ante la aduana. + +### Quién lo usa + +El usuario de captura de exportaciones. Antes de procesar, el usuario ya debe haber indicado en la factura si aplica cambio de régimen (`is_regime_change = True`). + +### Qué necesita estar listo antes + +Lo mismo que DONAC. Si aplica cambio de régimen, adicionalmente: + +- Todas las partidas deben venir de importaciones de tipo **Temporal (TEM)** — si alguna viene de una Definitiva, el sistema lo rechaza. +- No debe existir ya una Importación Definitiva generada anteriormente para esta misma factura (el sistema lo verifica para evitar duplicados). + +### Qué hace el sistema + +**Sin cambio de régimen:** igual que DONAC — descarga el inventario directamente. + +**Con cambio de régimen:** antes del descargo, verifica que todas las partidas tengan procedencia TEM. Luego genera automáticamente una nueva factura de Importación Definitiva con los mismos datos del encabezado y una copia de todas las partidas. Esta IMD queda en estado Pendiente para que el usuario la asocie después a su pedimento. Después ejecuta el descargo de inventario normalmente. + +### Qué queda guardado + +La factura de exportación queda **Procesada**. Si hubo cambio de régimen, existe una nueva factura IMD en estado **Pendiente** lista para ser tramitada. Los movimientos de consumo quedan registrados en el ledger. + +### Qué puede fallar + +Todo lo que puede fallar en DONAC, más: + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| Una partida tiene procedencia DEF en lugar de TEM (solo en cambio de régimen) | Indica qué partidas tienen la procedencia incorrecta | +| Ya existe una IMD generada para esta factura | El sistema la reutiliza sin crear un duplicado — no es un error | + +--- + +## CU-EXP-004 · Procesar una factura SCRAP + +### Descripción + +El usuario procesa una factura de exportación de tipo **SCRAP**. Representa la salida de material que se exporta como **desperdicio, chatarra o rezago** del proceso productivo. + +Su comportamiento es idéntico al de AFIJO: descarga el inventario y, si aplica, genera una Importación Definitiva por cambio de régimen. La diferencia es conceptual — no técnica: el material no fue transformado ni exportado como producto terminado, sino como subproducto o material sobrante. + +### Por qué existe + +El rezago y la chatarra son una realidad del proceso productivo maquilador. La regulación aduanera mexicana exige que estos materiales — aunque no sean el producto final — también sean reportados al salir del país. SCRAP les da un tratamiento específico diferenciado del producto terminado. + +### Quién lo usa + +El usuario de captura de exportaciones para facturas de desperdicios o rezagos. + +### Qué necesita estar listo antes + +Idéntico a AFIJO. + +### Qué hace el sistema + +Exactamente igual que AFIJO: valida, descarga inventario y, si hay cambio de régimen, genera la IMD correspondiente. + +### Qué puede fallar + +Idéntico a AFIJO. + +--- + +## CU-EXP-005 · Procesar una factura REEXP + +### Descripción + +El usuario procesa una factura de exportación de tipo **REEXP**. Representa la **reexportación** de material que en su momento entró al país como **Importación Definitiva (DEF)** — es decir, material que ya pagó impuestos al entrar y ahora se exporta nuevamente. + +### Por qué existe + +A veces las empresas importan material definitivamente, lo procesan y luego lo exportan. Como ese material entró de forma definitiva (no temporal), no aplica el régimen de maquila temporal — tiene su propio tratamiento. REEXP permite registrar esa salida correctamente, indicando que la procedencia es DEF y no TEM. + +### Quién lo usa + +El usuario de captura de exportaciones cuando el material a exportar proviene de importaciones definitivas. + +### Qué necesita estar listo antes + +Lo mismo que DONAC, con una diferencia clave: **todas las partidas deben tener procedencia DEF**. Si alguna viene de una importación temporal, el sistema la rechaza. + +### Qué hace el sistema + +Antes de iniciar el descargo, verifica que todas las partidas tengan procedencia DEF. Si alguna tiene TEM u otro tipo, detiene el proceso e indica cuál es la partida con el problema. Después ejecuta el descargo de inventario igual que DONAC. + +### Qué queda guardado + +Igual que DONAC — la factura queda Procesada y los movimientos de consumo quedan en el ledger. + +### Qué puede fallar + +Todo lo que puede fallar en DONAC, más: + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| Una partida tiene procedencia TEM en lugar de DEF | Indica qué partidas tienen la procedencia incorrecta | + +--- + +## CU-EXP-006 · Procesar una factura VEMEX + +### Descripción + +El usuario procesa una factura de exportación de tipo **VEMEX**. Representa una **venta al extranjero** bajo un régimen aduanero especial — típicamente empresas en zonas francas o con programas IMMEX que realizan ventas virtuales al exterior. + +### Por qué existe + +VEMEX tiene un tratamiento similar a REEXP: el material que se "exporta" proviene de importaciones definitivas. La distinción respecto a REEXP es de naturaleza fiscal y operativa — en VEMEX la empresa tiene un régimen especial reconocido por la aduana que le permite registrar estas operaciones de forma diferente. El sistema los separa para respetar esa distinción documental. + +### Quién lo usa + +Empresas con régimen IMMEX o en zonas francas que realizan ventas al extranjero desde México. + +### Qué necesita estar listo antes + +Igual que REEXP. A diferencia de otros tipos, VEMEX no requiere `document_type` ni `customs_broker_id` — son opcionales en este tipo de operación porque el trámite aduanero tiene características distintas. + +### Qué hace el sistema + +Idéntico a REEXP: verifica que todas las partidas tengan procedencia DEF y ejecuta el descargo de inventario. + +### Qué puede fallar + +Idéntico a REEXP. + +--- + +## CU-EXP-007 · Revertir una factura NODES + +### Descripción + +El usuario deshace el procesamiento de una factura NODES — generalmente porque hubo un error de captura o necesita modificar los datos antes de reenviarla. + +### Por qué existe + +Un sistema de control aduanero no puede simplemente borrar registros procesados. La reversión permite corregir errores de forma controlada: el sistema regresa la factura a su estado anterior sin eliminar el historial. + +### Qué hace el sistema + +Limpia todos los valores calculados (totales de la factura, valores por partida) y regresa el estado a **Revertida**. Como NODES nunca tocó el inventario, no hay ningún saldo que devolver — es la reversión más simple del módulo. + +### Qué necesita estar listo antes + +La factura debe estar en estado **Procesada**. Si no lo está, el sistema rechaza la reversión. + +### Qué queda guardado + +La factura queda en estado **Revertida**, con los totales en cero, lista para ser corregida y reprocesada. + +### Qué puede fallar + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| La factura no estaba procesada | La rechaza con un mensaje indicando que no puede revertirse | + +--- + +## CU-EXP-008 · Revertir una factura con descarga (AFIJO, DONAC, SCRAP, REEXP, VEMEX) + +### Descripción + +El usuario deshace el procesamiento de una factura que sí descargó inventario. Es la reversión más compleja del módulo porque hay que deshacer múltiples efectos: los saldos descargados, las series marcadas y los registros en el ledger de inventario. + +### Por qué existe + +Cuando una exportación descargó saldos de importaciones temporales, simplemente cambiar el estado de la factura no es suficiente. Hay que devolver formalmente ese inventario para que pueda ser utilizado por otras exportaciones futuras. El sistema lleva un registro histórico de todos los movimientos (no se borra nada) — la reversión se registra como un nuevo movimiento que neutraliza el efecto del original. + +### Qué hace el sistema paso a paso + +Primero verifica que ninguna de las partidas de esta importación esté siendo descargada activamente por otra exportación procesada. Si las hay, bloquea la reversión completamente — ver CU-EXP-009. + +Si no hay bloqueos, ejecuta cuatro acciones en orden: + +**1. Devuelve los valores a las importaciones origen.** Resta de cada partida de importación el valor que fue descargado al procesar. Si el material era temporal y la importación fue posterior al 31 de diciembre de 2014, también recalcula el IVA utilizado. + +**2. Desmarca las series.** Al procesar, las series de las partidas de importación quedaron marcadas como "ya exportadas". La reversión las desmarca para que vuelvan a estar disponibles. + +**3. Cancela los registros de descarga en el ledger.** El ledger de inventario nunca se modifica ni se borra. En su lugar, el sistema inserta nuevos movimientos de tipo **Retorno** que compensan exactamente los **Consumos** que se generaron al procesar. El saldo neto vuelve a ser el original. + +**4. Regresa la factura a Revertida.** Limpia los totales y cambia el estado. + +### Qué queda guardado + +La factura queda en estado **Revertida**. En el ledger quedan los movimientos originales de Consumo más los nuevos movimientos de Retorno que los neutralizan — el historial queda completo y auditable. Los saldos de las importaciones origen quedan como si la exportación nunca hubiera ocurrido. + +### Qué puede fallar + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| Una partida está siendo descargada por otra exportación activa | Bloquea la reversión — ver CU-EXP-009 | +| La factura no estaba procesada | La rechaza indicando que no puede revertirse | + +--- + +## CU-EXP-009 · Reversión bloqueada por exportaciones activas + +### Descripción + +El usuario intenta revertir una factura de exportación con descarga, pero el sistema detecta que alguna de las partidas de importación origen **está siendo consumida actualmente por otra exportación procesada**. El sistema bloquea completamente la reversión. + +### Por qué existe este bloqueo + +Los saldos de inventario son compartidos entre exportaciones. Si se permitiera revertir una importación mientras otra exportación sigue activa sobre esos mismos saldos, el inventario quedaría en un estado inconsistente — con más saldo del que debería haber. El bloqueo garantiza que siempre se deshagan las exportaciones en orden inverso al que fueron procesadas. + +### Qué hace el sistema + +Recorre cada partida de la importación origen. Por cada una, busca si existe algún registro de descarga activo (con estado **Aplicado**) vinculado a una factura de exportación que sigue procesada. Si encuentra aunque sea uno, detiene todo el proceso y muestra un mensaje por cada exportación activa que está usando esos saldos, indicando exactamente qué factura y qué línea están involucradas. + +### Cómo lo resuelve el usuario + +Debe ir a cada factura de exportación indicada en el error y revertirla primero. Una vez que todas las exportaciones que consumían esos saldos estén revertidas, puede revertir la importación sin problemas. + +### Qué queda guardado + +Nada — el sistema no modifica ningún dato cuando bloquea la reversión. Todo queda exactamente igual que antes de intentar la operación. + +--- + +## CU-EXP-010 · Reversión bloqueada por Importación Definitiva existente + +### Descripción + +El usuario intenta revertir una factura de exportación AFIJO o SCRAP con cambio de régimen, pero el sistema detecta que **ya existe una Importación Definitiva (IMD) generada** a partir de esa exportación. El sistema bloquea la reversión. + +### Por qué existe este bloqueo + +La Importación Definitiva es un documento fiscal independiente con validez propia ante la aduana. Si se revierte la exportación sin eliminar primero la IMD, ese documento queda "flotando" sin ningún respaldo — una exportación que ya no existe lo generó. Eso crea una inconsistencia en los registros fiscales. + +### Qué hace el sistema + +Busca si existe en la base de datos una factura de tipo IMD cuyo número de factura coincida con el de la exportación que se quiere revertir. Si la encuentra, bloquea la reversión y le indica al usuario exactamente cuál es la IMD que debe eliminar primero, con su número de referencia. + +### Cómo lo resuelve el usuario + +Debe desactualizar y eliminar la Importación Definitiva indicada. Después puede revertir la exportación sin problema. + +### Qué queda guardado + +Nada — el sistema no modifica ningún dato cuando bloquea la reversión. + +--- + +## Resumen de los diez casos + +| # | Caso de uso | Tipo | Descarga inventario | Genera IMD | +|---|-------------|------|:-------------------:|:----------:| +| CU-EXP-001 | Procesar NODES | Proceso | No | No | +| CU-EXP-002 | Procesar DONAC | Proceso | Sí | No | +| CU-EXP-003 | Procesar AFIJO | Proceso | Sí | Solo si hay cambio de régimen | +| CU-EXP-004 | Procesar SCRAP | Proceso | Sí | Solo si hay cambio de régimen | +| CU-EXP-005 | Procesar REEXP | Proceso | Sí (solo desde DEF) | No | +| CU-EXP-006 | Procesar VEMEX | Proceso | Sí (solo desde DEF) | No | +| CU-EXP-007 | Revertir NODES | Reversión | No aplica | No | +| CU-EXP-008 | Revertir con descarga | Reversión | Devuelve saldos | No | +| CU-EXP-009 | Reversión bloqueada por exportación activa | Bloqueo | No (bloqueado) | No | +| CU-EXP-010 | Reversión bloqueada por IMD existente | Bloqueo | No (bloqueado) | No | diff --git a/backend/api/v1/modules/a76/invoices/exports/docs/REPO_exports_diagramas.md b/backend/api/v1/modules/a76/invoices/exports/docs/REPO_exports_diagramas.md new file mode 100644 index 00000000..e61eb882 --- /dev/null +++ b/backend/api/v1/modules/a76/invoices/exports/docs/REPO_exports_diagramas.md @@ -0,0 +1,269 @@ +# 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 × Cantidad × 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 +``` diff --git a/backend/api/v1/modules/a76/invoices/imports/docs/REPO_imports_casos_de_uso.md b/backend/api/v1/modules/a76/invoices/imports/docs/REPO_imports_casos_de_uso.md new file mode 100644 index 00000000..eb9d4b75 --- /dev/null +++ b/backend/api/v1/modules/a76/invoices/imports/docs/REPO_imports_casos_de_uso.md @@ -0,0 +1,315 @@ +# Casos de Uso — Módulo de Importaciones + +**Sistema:** Anexo76 · SCAII +**Módulo:** `imports/` +**Versión:** 1.0 · Marzo 2026 + +--- + +## Contexto general + +El módulo de importaciones gestiona el ciclo completo de una factura de importación dentro del sistema: desde que el usuario la captura hasta que queda registrada como procesada. También permite revertirla si hubo un error. + +La importación es el punto de partida de todo el inventario de materiales. Cuando una empresa maquiladora importa insumos, el sistema registra cuánto entró, con qué valor y bajo qué régimen. Ese registro es lo que después permite a las exportaciones descargar saldos. Sin importaciones procesadas, no hay inventario que exportar. + +Toda factura de importación pasa por uno de dos momentos: **procesarla** (actualizarla) o **revertirla** (desactualizarla). + +--- + +## Los tipos de factura de importación + +Cada tipo representa un escenario aduanero diferente con reglas y efectos distintos sobre el inventario: + +| Tipo | ¿Qué representa en la práctica? | ¿Genera saldo de inventario? | ¿Calcula IVA por partida? | +|------|--------------------------------|:----------------------------:|:-------------------------:| +| **TEM** | Material que entra al país temporalmente para ser procesado y exportado | Sí | No | +| **DEF** | Material que entra al país de forma definitiva, pagando impuestos completos | No | Sí | +| **MEX** | Compra de material a proveedores mexicanos | No | Sí | + +La distinción más importante del módulo: **solo las importaciones temporales (TEM) generan saldo de inventario**. Las definitivas y las compras mexicanas simplemente registran la entrada y calculan el IVA, pero no alimentan el ledger que las exportaciones van a consumir. + +--- + +## CU-IMP-001 · Procesar una factura TEM (Importación Temporal) + +### Descripción + +El usuario procesa una factura de importación temporal. El material registrado en esta factura entra al país sin pagar impuestos definitivos, bajo el compromiso de que será exportado después de ser transformado o ensamblado. + +### Por qué existe + +El régimen de importación temporal es el corazón de la operación maquiladora. Las empresas necesitan registrar exactamente qué entró, cuánto y con qué valor, porque ese registro es el inventario del que después se nutren las exportaciones. Sin este caso de uso, no existirían los saldos que el módulo de exportaciones descarga. + +### Quién lo usa + +El usuario de captura de importaciones, al presionar **"Actualizar Factura"** en una factura de tipo TEM. + +### Qué necesita estar listo antes + +- La factura debe estar en estado **Pendiente**. +- Debe tener al menos una partida capturada. +- Todos los campos del encabezado deben estar completos: fecha, proveedor, destinatario, agente aduanal, tipo de cambio, moneda y pedimento. +- El tipo de cambio del día debe estar registrado en el catálogo — a diferencia de exportaciones, aquí es obligatorio que exista; si no existe, el sistema lanza un error (no solo una advertencia). +- Las clases y fracciones arancelarias de cada partida deben ser válidas. +- Cada partida principal debe tener costo unitario mayor a cero. +- Si la empresa tiene programa PROSEC y alguna partida usa Regla Octava, el permiso correspondiente debe estar activo y con cupo disponible. + +### Qué hace el sistema + +Primero valida los campos del encabezado y carga las partidas. Luego verifica que las clases y fracciones arancelarias sean correctas, que el tipo de cambio coincida con el catálogo y que los pesos declarados cuadren con las cantidades. + +Después calcula los valores monetarios de cada partida: costo unitario en pesos, en dólares y en moneda de cuenta, usando el tipo de cambio del día. Para TEM **no se calcula IVA** — ese cálculo solo aplica a DEF y MEX. + +Por cada partida también valida que la unidad de medida tenga una equivalencia con la unidad de aduana mexicana, para poder registrar la cantidad correcta ante la autoridad aduanera. + +Si la empresa tiene programa PROSEC y alguna partida tiene permiso de Regla Octava, el sistema verifica que ese permiso exista, que esté vigente, que la fracción arancelaria coincida y que haya cupo suficiente. Si todo está bien, descuenta ese cupo del permiso. + +Finalmente calcula los totales de la factura, agrega los incrementables (flete, seguro, embalaje) y genera en el ledger de inventario **un registro de entrada por cada partida principal**. Esos registros son los saldos que las exportaciones futuras van a consumir. + +### Qué queda guardado + +La factura queda en estado **Procesada** con sus totales calculados. En el ledger de saldos quedan registrados **movimientos de entrada** por cada partida, listos para ser consumidos por exportaciones. Si había Regla Octava, los cupos del permiso quedan descontados y el saldo queda registrado en la tabla de saldos PROSEC. + +### Qué puede fallar + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| La factura ya estaba procesada | La rechaza de inmediato | +| El tipo de cambio del día no está en el catálogo | Error — a diferencia de exportaciones, aquí no es opcional | +| El tipo de cambio capturado difiere del catálogo | Error indicando la diferencia | +| Una fracción arancelaria no existe en el catálogo oficial | Reporta qué partida tiene la fracción inválida | +| Una clase arancelaria está desactivada | Reporta qué partida está afectada | +| Un número de parte está desactivado | Reporta qué partida está afectada | +| La cantidad y el peso neto no coinciden (en partidas KGS o LBS) | Indica qué partida tiene la diferencia | +| Una partida tiene costo en cero | Indica qué partida no tiene precio | +| La partida tiene series activadas pero no hay series registradas | Indica qué partida le faltan series | +| La partida usa Regla Octava pero la empresa no tiene PROSEC | Rechaza el uso del permiso | +| El permiso de Regla Octava no existe o está vencido | Indica qué permiso tiene el problema | +| El cupo del permiso de Regla Octava ya está agotado | Indica que no hay cupo disponible | +| La unidad de medida no tiene equivalencia con la unidad de aduana | Indica qué partida tiene el problema de unidades | + +--- + +## CU-IMP-002 · Procesar una factura DEF (Importación Definitiva) + +### Descripción + +El usuario procesa una factura de importación definitiva. El material entra al país pagando todos los impuestos correspondientes — es una compra permanente, no temporal. + +### Por qué existe + +No todos los materiales que usan las maquiladoras entran al país de forma temporal. Algunos insumos, herramientas o componentes se adquieren de forma definitiva. El sistema necesita registrar esa entrada, calcular el IVA que corresponde y dejar constancia del valor total de la importación para efectos contables y aduaneros. + +### Quién lo usa + +El usuario de captura de importaciones para facturas de importación definitiva. + +### Qué necesita estar listo antes + +Igual que TEM, con la diferencia de que el `iva_factor` debe estar configurado en la factura para que el sistema pueda calcular el IVA por partida. + +### Qué hace el sistema + +Ejecuta las mismas validaciones que TEM (encabezado, clases, fracciones, tipo de cambio, pesos, costo unitario, series, UMA). La diferencia está en el cálculo de valores: para DEF el sistema calcula **subtotal + IVA = total** por cada partida, en pesos, dólares y moneda de cuenta. El IVA se calcula como porcentaje del valor de cada partida. + +Al terminar, actualiza los totales del encabezado incluyendo los totales de IVA. + +**La diferencia crítica con TEM:** no genera ningún movimiento en el ledger de inventario. La importación definitiva no alimenta los saldos que las exportaciones consumen — ese material llegó para quedarse en México, no para ser reexportado bajo régimen temporal. + +### Qué queda guardado + +La factura queda **Procesada** con sus valores y totales de IVA calculados. El ledger de inventario no se modifica. + +### Qué puede fallar + +Las mismas situaciones que TEM, excepto lo relacionado con Regla Octava (que no aplica para DEF). + +--- + +## CU-IMP-003 · Procesar una factura MEX (Compra Mexicana) + +### Descripción + +El usuario procesa una factura de compra a un proveedor mexicano. El material proviene de dentro del país — no hay una importación aduanera real — pero el sistema igualmente registra la entrada y calcula el IVA correspondiente. + +### Por qué existe + +Las maquiladoras también compran materiales a proveedores locales mexicanos. Aunque no hay un trámite aduanero formal, la empresa igualmente necesita registrar ese costo, el IVA pagado y el valor de lo que adquirió, por razones contables y de control interno. + +### Quién lo usa + +El usuario de captura de importaciones para facturas de compras nacionales. + +### Qué necesita estar listo antes + +Igual que DEF. A diferencia de otros tipos, MEX no requiere `document_type` — al ser una compra nacional no hay régimen aduanero que declarar. + +### Qué hace el sistema + +Idéntico a DEF: valida el encabezado, calcula valores con IVA por partida y actualiza totales. No genera saldos en el ledger. + +### Qué queda guardado + +Igual que DEF — la factura queda **Procesada** con valores e IVA calculados, sin movimientos en el ledger de inventario. + +### Qué puede fallar + +Las mismas situaciones que DEF. + +--- + +## CU-IMP-004 · Procesar una factura TEM con Regla Octava (PROSEC) + +### Descripción + +Es una variante del caso TEM. Ocurre cuando la empresa tiene un **programa PROSEC** activo y alguna o todas sus partidas están amparadas bajo un **permiso de Regla Octava**, que le permite importar ciertos materiales con arancel preferencial. + +### Por qué existe + +La Regla Octava es un beneficio arancelario del gobierno mexicano para empresas del sector productivo. Las empresas PROSEC pueden importar materias primas con aranceles reducidos, pero a cambio deben consumir esos materiales dentro de cuotas autorizadas. El sistema lleva la cuenta de cuánto cupo ha sido usado y cuánto queda disponible por permiso. + +### Quién lo usa + +Empresas con programa PROSEC activo, al procesar facturas TEM donde alguna partida tiene un permiso de Regla Octava capturado. + +### Qué necesita estar listo antes + +Todo lo de TEM, más: + +- La empresa debe tener `prosec = True` en su configuración. +- El permiso de Regla Octava debe existir en el catálogo, estar vigente (dentro de las fechas del permiso) y tener cupo disponible. +- La fracción arancelaria de la partida debe coincidir con la fracción registrada en el permiso — o debe existir en el historial de fracciones anteriores si el permiso es previo a mayo de 2010. +- El país de origen de la partida debe estar registrado dentro del permiso. +- La unidad de medida del permiso debe ser compatible con la de la partida. + +### Qué hace el sistema + +Igual que TEM en todo, más un bloque adicional de validación y descuento de cupos: + +Para cada partida con permiso de Regla Octava, el sistema arma dos listas: una con lo que se quiere importar (cantidades y valores por permiso y línea) y otra con el cupo disponible por permiso. Luego cruza ambas listas para verificar que el cupo alcance. Si alcanza, descuenta ese cupo del permiso y registra en la tabla de saldos PROSEC cuánto se consumió de cada permiso por factura. + +### Qué queda guardado + +Igual que TEM, más: el cupo del permiso de Regla Octava queda reducido en la cantidad importada, y existe un registro en la tabla de saldos PROSEC vinculando esta factura con el permiso utilizado. Ese registro es el que se elimina si la factura se revierte. + +### Qué puede fallar + +Todo lo de TEM, más las situaciones específicas de Regla Octava descritas en ese caso. + +--- + +## CU-IMP-005 · Revertir una factura TEM + +### Descripción + +El usuario deshace el procesamiento de una factura de importación temporal — porque hubo un error de captura, los datos cambiaron, o necesita corregirla. + +### Por qué existe + +Una factura TEM procesada tiene efectos en el inventario: generó saldos que las exportaciones pueden estar usando. Revertirla no es solo cambiar un estado — hay que deshacer todos esos efectos de forma controlada para que el inventario quede consistente. + +### Qué hace el sistema + +Primero verifica que ninguna exportación activa esté consumiendo los saldos de esta importación. Si las hay, bloquea completamente la reversión — ver CU-IMP-007. + +Si no hay bloqueos, ejecuta cuatro acciones en orden: + +**1. Revierte los cupos de Regla Octava.** Si la factura usó permisos PROSEC, devuelve el cupo consumido a cada permiso y elimina los registros de saldo PROSEC que se habían creado al procesar. + +**2. Reinicia los totales del encabezado.** Pone todos los valores financieros en cero (cantidad, peso, valor en pesos, en dólares, IVA, incrementables) y regresa la factura a estado **Pendiente**. + +**3. Reinicia los contadores de cada partida.** Limpia los valores de retorno y de IVA utilizado que se habían calculado en las partidas. + +**4. Anula los saldos en el ledger de inventario.** El ledger nunca se borra. En su lugar, el sistema inserta nuevos movimientos de tipo **Anulación de Entrada** que compensan exactamente las **Entradas** originales. El saldo neto de cada lote queda en cero — las exportaciones ya no pueden consumirlo. + +### Qué necesita estar listo antes + +La factura debe estar en estado **Procesada**. Si no lo está, el sistema rechaza la reversión. + +### Qué queda guardado + +La factura queda en estado **Pendiente** con todos los valores en cero. En el ledger quedan los movimientos originales de Entrada más los nuevos de Anulación que los neutralizan — el historial queda completo y auditable. Si había Regla Octava, los cupos quedan restaurados y los registros de saldo PROSEC quedan eliminados. + +### Qué puede fallar + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| Una partida está siendo descargada por una exportación activa | Bloquea toda la reversión — ver CU-IMP-007 | +| La factura no estaba procesada | La rechaza indicando que no puede revertirse | +| Error al actualizar el permiso de Regla Octava | Registra el error como no bloqueante y continúa — la reversión avanza de todas formas | + +--- + +## CU-IMP-006 · Revertir una factura DEF o MEX + +### Descripción + +El usuario deshace el procesamiento de una factura de importación definitiva o de una compra mexicana. + +### Por qué existe + +Aunque DEF y MEX no generan saldos de inventario, sí tienen totales calculados y estado procesado que pueden necesitar corrección. La reversión les permite volver a estado pendiente para ser corregidas. + +### Qué hace el sistema + +Es la más simple de las reversiones de importación porque DEF y MEX nunca generaron saldos en el ledger. El sistema verifica que no haya exportaciones activas usando esa importación (por consistencia, aunque en la práctica DEF y MEX no alimentan el ledger que exportaciones consume), reinicia los totales del encabezado a cero y regresa la factura a **Pendiente**. + +No hay cupos de Regla Octava que restaurar ni entradas de ledger que anular. + +### Qué queda guardado + +La factura queda en estado **Pendiente** con todos los valores en cero, lista para ser corregida y reprocesada. + +### Qué puede fallar + +| Situación | Qué hace el sistema | +|-----------|---------------------| +| La factura no estaba procesada | La rechaza indicando que no puede revertirse | + +--- + +## CU-IMP-007 · Reversión bloqueada por exportaciones activas + +### Descripción + +El usuario intenta revertir una factura de importación TEM, pero el sistema detecta que alguna de sus partidas está siendo **consumida actualmente por una exportación que sigue procesada**. El sistema bloquea completamente la reversión. + +### Por qué existe este bloqueo + +Los saldos de inventario de una importación temporal pueden estar siendo usados por varias exportaciones al mismo tiempo. Si se permitiera revertir la importación mientras esas exportaciones siguen activas, el inventario quedaría en un estado imposible: habría exportaciones que dicen haber consumido saldos de una importación que ya no existe. El bloqueo garantiza que el orden sea siempre el correcto: primero se deshacen las exportaciones y luego la importación. + +### Qué hace el sistema + +Recorre cada partida de la factura. Por cada una, busca si existe algún registro de descarga activo vinculado a una exportación procesada. Si encuentra aunque sea uno, detiene todo el proceso y muestra un mensaje por cada exportación activa involucrada, indicando exactamente qué factura de exportación y qué línea está usando el saldo. + +### Cómo lo resuelve el usuario + +Debe ir a cada factura de exportación indicada en el mensaje de error y revertirla primero. Una vez que todas las exportaciones que consumían esos saldos estén revertidas, puede revertir la importación sin problemas. + +### Qué queda guardado + +Nada — el sistema no modifica ningún dato cuando bloquea la reversión. Todo queda exactamente igual que antes del intento. + +--- + +## Resumen de los siete casos + +| # | Caso de uso | Tipo | Genera saldo inventario | Calcula IVA | Regla Octava | +|---|-------------|------|:-----------------------:|:-----------:|:------------:| +| CU-IMP-001 | Procesar TEM | Proceso | Sí | No | Opcional | +| CU-IMP-002 | Procesar DEF | Proceso | No | Sí | No | +| CU-IMP-003 | Procesar MEX | Proceso | No | Sí | No | +| CU-IMP-004 | Procesar TEM con PROSEC | Proceso | Sí | No | Sí — descuenta cupo | +| CU-IMP-005 | Revertir TEM | Reversión | Anula saldos | No | Restaura cupo | +| CU-IMP-006 | Revertir DEF o MEX | Reversión | No aplica | No | No | +| CU-IMP-007 | Reversión bloqueada por exportaciones activas | Bloqueo | No (bloqueado) | No | No | + +--- + +## Relación con el módulo de exportaciones + +Las importaciones y exportaciones están directamente conectadas a través del ledger de inventario: + +Una factura TEM procesada **crea** saldos. Esos saldos son los que las exportaciones AFIJO, DONAC, SCRAP, REEXP y VEMEX **consumen** al procesarse. Si una exportación consume saldos de una TEM y después esa TEM necesita revertirse, primero hay que revertir la exportación — de ahí viene el bloqueo del CU-IMP-007. + +Las facturas DEF y MEX no participan en este ciclo desde el lado de la importación, pero sí pueden ser el origen del material en una exportación de tipo REEXP o VEMEX, donde la procedencia requerida es justamente DEF. diff --git a/backend/api/v1/modules/a76/invoices/imports/docs/REPO_imports_diagramas.md b/backend/api/v1/modules/a76/invoices/imports/docs/REPO_imports_diagramas.md new file mode 100644 index 00000000..57af3fda --- /dev/null +++ b/backend/api/v1/modules/a76/invoices/imports/docs/REPO_imports_diagramas.md @@ -0,0 +1,222 @@ +# Diagramas de Flujo — Casos de Uso Importaciones + +> Cada diagrama corresponde a un caso de uso en [`imports_cu_comprensibles.md`](./imports_cu_comprensibles.md). +> Formato: Mermaid — compatible con Notion, GitHub y VSCode. +> **Cómo usar en Notion:** bloque `/code` → lenguaje `mermaid` → pegar el contenido. + +--- + +## CU-IMP-001 · Procesar TEM (Importación Temporal) + +```mermaid +flowchart TD + START([Usuario presiona\nActualizar Factura - TEM]) --> CHK1{¿La factura\nestá Pendiente?} + CHK1 -- No --> E1([❌ Error\nYa fue procesada]) + CHK1 -- Sí --> V1[Validar encabezado\nfecha · proveedor · destinatario\nTC · moneda · pedimento] + V1 --> TC{¿Existe el TC\ndel día en el catálogo?} + TC -- No --> E2([❌ Error\nTC obligatorio para TEM\nno es opcional como en exports]) + TC -- Sí --> TC2{¿TC de la factura\n== TC del catálogo?} + TC2 -- No --> E3([❌ Error\nTipo de cambio\nno coincide]) + TC2 -- Sí --> V2[Validar clases · fracciones\nnúmeros de parte · Regla 3.1.21\nrevisión física si aplica] + V2 --> V3{¿Errores en\nclases o fracciones?} + V3 -- Sí --> E4([❌ Error\nClase o fracción inválida]) + V3 -- No --> V4[Validar pesos por partida\nKGS o LBS según configuración] + V4 --> CALC[Calcular valores sin IVA\nCosto × Cantidad × TC\npesos · dólares · moneda cuenta] + CALC --> VL[Validar por cada partida\ncosto > 0 · clase activa\nparte activa · series · UMA] + VL --> VL2{¿Errores en\npartidas?} + VL2 -- Sí --> E5([❌ Error\nCosto cero · clase desactivada\nparte desactivada · series faltantes]) + VL2 -- No --> OCT{¿Alguna partida\ntiene permiso PROSEC?} + OCT -- Sí --> OCTVAL[Validar permisos\nde Regla Octava\nver CU-IMP-004] + OCT -- No --> TOTALS + OCTVAL --> OCTCHK{¿Permisos\nválidos y con cupo?} + OCTCHK -- No --> E6([❌ Error\nPermiso vencido\no cupo agotado]) + OCTCHK -- Sí --> TOTALS[Calcular totales de la factura\nsumar IVA si fecha ≥ 2014-12-31\nagregar incrementables] + TOTALS --> LEDGER[Generar entrada en el ledger\nun movimiento ENTRADA por partida principal\nbase del inventario futuro] + LEDGER --> FIN([✅ Factura PROCESADA\nSaldos de inventario creados\nListos para ser exportados]) + + 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 + style E6 fill:#C55A11,color:#fff,rx:16 +``` + +--- + +## CU-IMP-002 · Procesar DEF (Importación Definitiva) + +```mermaid +flowchart TD + START([Usuario presiona\nActualizar Factura - DEF]) --> V1[Validaciones de encabezado\nigual que TEM] + V1 --> CALC[Calcular valores CON IVA\nSubtotal + IVA = Total\npor cada partida\nen pesos · dólares · moneda cuenta] + CALC --> VL[Validar partidas\ncosto · clase · parte · series · UMA] + VL --> CHK{¿Errores?} + CHK -- Sí --> E1([❌ Error\nCorregir partidas]) + CHK -- No --> TOTALS[Calcular totales incluyendo\ntotales de IVA] + TOTALS --> NOTE[No se generan saldos\nen el ledger de inventario\neste material llegó para\nquedarse en México] + NOTE --> FIN([✅ Factura PROCESADA\nSin movimientos 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 NOTE fill:#FFF3E0,rx:8 +``` + +--- + +## CU-IMP-003 · Procesar MEX (Compra Mexicana) + +```mermaid +flowchart TD + START([Usuario presiona\nActualizar Factura - MEX]) --> NOTE[Compra a proveedor mexicano\nNo hay trámite aduanero real\ndocument_type no es obligatorio] + NOTE --> V1[Validaciones de encabezado\nigual que DEF] + V1 --> CALC[Calcular valores CON IVA\nidéntico a DEF] + CALC --> TOTALS[Calcular totales con IVA] + TOTALS --> FIN([✅ Factura PROCESADA\nSin movimientos en inventario]) + + style FIN fill:#1D6B3C,color:#fff,rx:16 + style START fill:#1F4E79,color:#fff,rx:16 + style NOTE fill:#FFF3E0,rx:8 +``` + +--- + +## CU-IMP-004 · Procesar TEM con Regla Octava (PROSEC) + +```mermaid +flowchart TD + START([Partida con permiso\nde Regla Octava detectada]) --> PROSEC{¿La empresa\ntiene PROSEC activo?} + PROSEC -- No --> E1([❌ Error\nNo se puede usar Regla Octava\nsin programa PROSEC]) + PROSEC -- Sí --> P1[Buscar el permiso\nen el catálogo] + P1 --> P2{¿Permiso\nexiste?} + P2 -- No --> E2([❌ Error\nPermiso no dado de alta]) + P2 -- Sí --> P3{¿Fecha de la factura\ndentro del rango\ndel permiso?} + P3 -- No --> E3([❌ Error\nFecha fuera del\nrango del permiso]) + P3 -- Sí --> P4{¿Fracción de la partida\ncoincide con la del permiso?} + P4 -- No --> P4B{¿Permiso anterior\na mayo 2010 y fracción\nen historial?} + P4B -- No --> E4([❌ Error\nFracción no corresponde\nal permiso]) + P4B -- Sí --> P5 + P4 -- Sí --> P5{¿Cupo del permiso\n> 0?} + P5 -- No --> E5([❌ Error\nCupo agotado]) + P5 -- Sí --> P6{¿País de origen\nen el permiso?} + P6 -- No --> E6([❌ Error\nPaís de origen no\nampara el permiso]) + P6 -- Sí --> P7[Calcular cantidad y valor\na descontar del cupo\ncon equivalencia de unidades si aplica] + P7 --> P8[Verificar que el cupo\nalcance para todas\nlas partidas del lote] + P8 --> P9{¿Cupo\nsuficiente?} + P9 -- No --> E7([❌ Error\nCupo insuficiente para\ncubrir la importación]) + P9 -- Sí --> SAVE[Descontar cupo del permiso\nRegistrar saldo PROSEC\nvinculado a esta factura] + SAVE --> FIN([✅ Permisos PROSEC descontados\nContinúa con flujo TEM normal\nver CU-IMP-001]) + + style FIN fill:#1D6B3C,color:#fff,rx:16 + style START fill:#2E75B6,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 + style E6 fill:#C55A11,color:#fff,rx:16 + style E7 fill:#C55A11,color:#fff,rx:16 +``` + +--- + +## CU-IMP-005 · Revertir TEM + +```mermaid +flowchart TD + START([Usuario presiona\nDesactualizar Factura - TEM]) --> CHK1{¿La factura\nestá Procesada?} + CHK1 -- No --> E1([❌ Error\nNo se puede revertir]) + CHK1 -- Sí --> BLOCK[Verificar si alguna partida\nestá siendo consumida por\nuna exportación activa] + BLOCK --> CHK2{¿Hay exportaciones\nactivas usando\nestos saldos?} + CHK2 -- Sí --> E2([❌ Bloqueado\nver CU-IMP-007\nRevertir exportaciones primero]) + CHK2 -- No --> R1[1 · Revertir Regla Octava si aplica\nDevolver cupos a los permisos\nEliminar registros de saldo PROSEC] + R1 --> R2[2 · Reiniciar totales del encabezado\ntodos los valores a cero\nstatus a Pendiente] + R2 --> R3[3 · Reiniciar contadores\nde cada partida a cero] + R3 --> R4[4 · Anular saldos en el ledger\ninsertar movimientos ANULACIÓN DE ENTRADA\nque neutralizan las ENTRADAS originales] + R4 --> FIN([✅ Factura REVERTIDA\nInventario neutralizado\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-IMP-006 · Revertir DEF o MEX + +```mermaid +flowchart TD + START([Usuario presiona\nDesactualizar Factura - DEF o MEX]) --> CHK1{¿La factura\nestá Procesada?} + CHK1 -- No --> E1([❌ Error\nNo se puede revertir]) + CHK1 -- Sí --> NOTE[DEF y MEX nunca generaron\nsaldos en el ledger\nni cupos de Regla Octava] + NOTE --> CLEAN[Reiniciar todos los valores\ndel encabezado a cero\nstatus a Pendiente] + CLEAN --> FIN([✅ Factura REVERTIDA\nSin efectos adicionales]) + + 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 NOTE fill:#FFF3E0,rx:8 +``` + +--- + +## CU-IMP-007 · Reversión bloqueada por exportaciones activas + +```mermaid +flowchart TD + START([Usuario intenta\nDesactualizar Factura TEM]) --> SCAN[Recorrer cada partida\nde la factura] + 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-IMP-005]) + CHK -- Sí --> MSG[Mostrar un mensaje por cada\nexportación activa involucrada\nfactura · línea · cantidad descargada] + 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 +``` + +--- + +## Visión general — todos los tipos de importación + +```mermaid +flowchart LR + subgraph PROCESAR ["⬆️ PROCESAR"] + TEM[TEM\nGenera saldos PEPS\nsin IVA] + TEMO[TEM + PROSEC\nGenera saldos\ndescuenta cupo RO] + DEF[DEF\nSin saldos\ncon IVA] + MEX[MEX\nSin saldos\ncon IVA] + end + + subgraph REVERTIR ["⬇️ REVERTIR"] + RTEM[Revertir TEM\nAnula saldos · restaura cupo\nledger ANULACIÓN] + RDEF[Revertir DEF o MEX\nSolo limpia totales] + end + + subgraph BLOQUEOS ["🚫 BLOQUEOS"] + BEXP[Bloqueada por\nexportaciones activas\nque usan los saldos] + end + + subgraph RELACION ["🔗 Relación con Exports"] + EXP[Exportaciones AFIJO\nDONAC · SCRAP · REEXP · VEMEX\nconsumen saldos generados por TEM] + end + + TEM -->|crea saldos| EXP + TEMO -->|crea saldos| EXP + TEM --> RTEM + TEMO --> RTEM + DEF --> RDEF + MEX --> RDEF + RTEM --> BEXP + EXP -->|si está activa bloquea| BEXP + + style PROCESAR fill:#E2EFDA,rx:8 + style REVERTIR fill:#DEEAF1,rx:8 + style BLOQUEOS fill:#FCE4D6,rx:8 + style RELACION fill:#EAE3F0,rx:8 +```