Plan de Pruebas — Módulo de Tesorería y Bancos

---

Conceptos clave antes de empezar

┌──────────────────────┬────────────────────────────────────────────────────────────────────────────────────┐
│ Término              │ Qué es en la práctica                                                              │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cuenta de tesorería  │ Una cuenta bancaria, caja chica, billetera o fondo fijo registrada en el sistema   │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Movimiento           │ Un ingreso o egreso registrado en una cuenta. Tiene estado: Borrador → Confirmado  │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Borrador             │ Movimiento guardado pero NO impacta el saldo todavía                               │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Confirmado           │ Movimiento aprobado — impacta el saldo y genera asiento contable automático        │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Anulado              │ Movimiento confirmado que se revirtió — el saldo y el asiento se revierten         │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Categoría            │ Clasificación del movimiento (ej: Depósito bancario, Pago impuesto, Gasto bancario)│
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cuenta contable      │ Cuenta del plan contable asignada a una cuenta de tesorería o categoría            │
│                      │ — necesaria para que se generen asientos automáticos                               │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Umbral de aprobación │ Monto límite — movimientos que lo superen requieren aprobación de supervisor       │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Extracto             │ Vista cronológica de una cuenta con saldo acumulado línea a línea                  │
└──────────────────────┴────────────────────────────────────────────────────────────────────────────────────┘

---

Flujo obligatorio antes de cualquier prueba

1. Configurar cuentas → 2. (Opcional) Mapear cuentas contables → 3. Registrar movimientos → 4. Confirmar → 5. Revisar saldos

Para la integración contable es necesario además:
- Tener el módulo Contabilidad activo
- Tener un plan de cuentas cargado
- Tener un ejercicio/período abierto para la fecha del movimiento
- Asignar cuenta contable a la cuenta de tesorería Y a la categoría del movimiento

---

FASE 1 — Cuentas y Movimientos Básicos

---

PRUEBA 1.1 — Crear una Cuenta Bancaria

Dónde: Configuración → Tesorería y Bancos → Cuentas de Tesorería

Pasos:

1. Hacer clic en "Nueva Cuenta"
2. Completar:
   - Nombre: Cuenta Corriente Itaú
   - Tipo: Cuenta Corriente
   - Moneda: PYG
   - Saldo inicial: 5.000.000
   - Banco: Itaú (buscar con el selector — tiene campo de búsqueda)
   - Número de cuenta: 001-123456-7
   - Saldo mínimo de alerta: 500.000
3. Guardar

Resultado esperado:

- La tarjeta aparece en la grilla con saldo "Gs. 5.000.000" en verde
- El tipo muestra "Cta. Corriente"
- El switch está activado (cuenta activa)

Resultado negativo (si falla):

- Toast rojo con descripción del error
- El dialog permanece abierto

---

PRUEBA 1.2 — Crear una Caja Chica

Dónde: Configuración → Tesorería y Bancos → Cuentas de Tesorería

Pasos:

1. Hacer clic en "Nueva Cuenta"
2. Completar:
   - Nombre: Caja Chica Oficina
   - Tipo: Caja Chica
   - Moneda: PYG
   - Saldo inicial: 800.000
   - Saldo mínimo de alerta: 100.000
   (No aparecen campos de banco para este tipo — verificar que estén ocultos)
3. Guardar

Resultado esperado:

- Tarjeta creada con tipo "Caja Chica"
- El formulario no mostró campos de banco ni número de cuenta

---

PRUEBA 1.3 — Verificar pantalla de Tesorería con cuentas

Dónde: Tesorería → tab Cuentas y Saldos

Resultado esperado:

- Las dos cuentas creadas aparecen como tarjetas
- La barra superior muestra el total consolidado en PYG (Gs. 5.800.000)
- Cada tarjeta tiene botones "+ Ingreso" y "+ Egreso"
- No aparece la pantalla de onboarding (pasos 1-2-3) — fue reemplazada por las tarjetas

---

PRUEBA 1.4 — Registrar un Ingreso y Confirmar

Dónde: Tesorería → tab Cuentas y Saldos → tarjeta "Cuenta Corriente Itaú"

Pasos:

1. Hacer clic en "+ Ingreso" en la tarjeta de Cuenta Corriente Itaú
2. Completar:
   - Fecha: hoy
   - Monto: 2.000.000  (usar el input con formato — aparece "Gs. 2.000.000")
   - Descripción: Cobro factura cliente X
   - Categoría: Ingreso Otro / monto: 2.000.000
3. Hacer clic en "Guardar y Confirmar"

Resultado esperado:

- El movimiento se crea y confirma de inmediato
- El saldo de "Cuenta Corriente Itaú" pasa de Gs. 5.000.000 a Gs. 7.000.000
- Toast verde de confirmación

Verificar en tab Movimientos:

- Aparece el movimiento con estado "Confirmado" (chip verde)
- Monto: Gs. 2.000.000, tipo: INGRESO

---

PRUEBA 1.5 — Registrar un Egreso como Borrador

Dónde: Tesorería → tab Cuentas y Saldos → tarjeta "Caja Chica Oficina"

Pasos:

1. Hacer clic en "+ Egreso" en la tarjeta de Caja Chica
2. Completar:
   - Monto: 150.000
   - Descripción: Compra materiales de limpieza
   - Categoría: Egreso Otro / monto: 150.000
3. Hacer clic en "Guardar como borrador"

Resultado esperado:

- El saldo de "Caja Chica Oficina" NO cambia (sigue en Gs. 800.000)
  (los borradores no afectan saldo)
- En tab Movimientos aparece con estado "Borrador" (chip gris)

---

PRUEBA 1.6 — Confirmar un Borrador desde Movimientos

Dónde: Tesorería → tab Movimientos

Pasos:

1. Localizar el movimiento en estado "Borrador"
2. Hacer clic en "Confirmar" (botón de acción)

Resultado esperado:

- El chip cambia de "Borrador" a "Confirmado"
- El saldo de "Caja Chica Oficina" pasa de Gs. 800.000 a Gs. 650.000

---

PRUEBA 1.7 — Alerta de saldo mínimo

Dónde: Tesorería → tab Cuentas y Saldos

Condición: saldo de Caja Chica (650.000) está por encima del mínimo (100.000) — no debería alertar.

Pasos:

1. Registrar un egreso de 600.000 en Caja Chica y confirmar (saldo queda en 50.000)

Resultado esperado:

- La tarjeta de "Caja Chica Oficina" muestra borde rojo
- Badge de advertencia: "Saldo bajo el mínimo (Gs. 100.000)"

---

PRUEBA 1.8 — Anular un movimiento confirmado

Dónde: Tesorería → tab Movimientos

Pasos:

1. Localizar cualquier movimiento en estado "Confirmado"
2. Hacer clic en "Anular"
3. Ingresar motivo: "Registrado en cuenta equivocada"
4. Confirmar

Resultado esperado:

- El chip del movimiento cambia a "Anulado" (chip rojo)
- El saldo de la cuenta se revierte al valor anterior
- El motivo queda registrado en el detalle del movimiento

---

PRUEBA 1.9 — Vista Extracto (saldo acumulado línea a línea)

Dónde: Tesorería → tab Movimientos → toggle "Extracto"

Pasos:

1. Hacer clic en el toggle "Extracto" (esquina superior derecha del tab Movimientos)
2. Seleccionar cuenta: Cuenta Corriente Itaú
3. Dejar el rango de fechas predeterminado (primer día del mes hasta hoy)

Resultado esperado:

- Aparece la barra con: Saldo apertura / Cantidad de movimientos / Saldo cierre
- La tabla muestra una fila por movimiento confirmado en orden cronológico
- Las columnas son: Fecha | Descripción | Categorías | Ingreso | Egreso | Saldo
- La columna "Saldo" muestra el saldo acumulado luego de cada movimiento (verde si positivo, rojo si negativo)
- Los egresos aparecen en rojo en la columna "Egreso" con la columna "Ingreso" vacía, y viceversa
- El saldo de la última fila coincide con el "Saldo cierre" de la barra superior
- Cambiar el rango de fechas recalcula todo automáticamente

Resultado negativo (si falla):

- Si no hay movimientos confirmados en el período: mensaje "Sin movimientos confirmados en el período seleccionado"
- Si la cuenta no tiene movimientos: extracto vacío, Saldo apertura = Saldo cierre = saldo inicial

---

FASE 1.B — Integración Contable (requiere módulo Contabilidad activo)

Prerequisitos:
- Plan de cuentas cargado (ver Plan de Pruebas Contabilidad — PRUEBA 1.1)
- Ejercicio y período abierto para la fecha de hoy (ver Plan de Pruebas Contabilidad — PRUEBA 2)
- La cuenta "Cuenta Corriente Itaú" debe tener asignada una cuenta contable

---

PRUEBA 1.B.1 — Asignar cuenta contable a cuenta de tesorería

Dónde: Configuración → Tesorería y Bancos → Cuentas de Tesorería

Pasos:

1. Editar la cuenta "Cuenta Corriente Itaú"
2. En el campo "Cuenta contable" (Autocomplete con buscador), buscar "Banco" y seleccionar
   la cuenta que corresponde (ej: 1.1.1.002 Banco Itaú)
3. Guardar

Resultado esperado:

- La cuenta queda guardada con la cuenta contable asignada

---

PRUEBA 1.B.2 — Asignar cuenta contable a categoría de movimiento

Dónde: Configuración → Tesorería y Bancos → Categorías de Movimiento

Pasos:

1. Crear una categoría nueva:
   - Nombre: Cobro de cliente
   - Tipo: Ingreso
   - Cuenta contable: buscar y seleccionar "Clientes" (ej: 1.1.2.001)
2. Guardar

Resultado esperado:

- La categoría aparece en la tabla
- La columna "Cuenta contable" muestra el código y nombre asignado (no "Sin mapear")

---

PRUEBA 1.B.3 — Confirmar movimiento y verificar asiento contable

Dónde: Tesorería (registrar) + Contabilidad → tab Asientos (verificar)

Pasos:

1. Registrar un ingreso en "Cuenta Corriente Itaú":
   - Monto: 1.000.000
   - Categoría: "Cobro de cliente" (la creada en 1.B.2)
2. Hacer clic en "Guardar y Confirmar"
3. Ir a Contabilidad → tab Asientos
4. Buscar el asiento recién generado (debería aparecer con glosa "Ingreso tesorería — Cobro de cliente")

Resultado esperado en Asientos:

- Aparece un asiento en estado CONFIRMADO
- DEBE: 1.1.1.002 Banco Itaú → Gs. 1.000.000
- HABER: 1.1.2.001 Clientes → Gs. 1.000.000
- DEBE = HABER (asiento cuadrado)

Resultado si la empresa NO tiene módulo Contabilidad activo:

- El movimiento se confirma normalmente
- No aparece ningún asiento — el sistema lo omite en silencio

---

PRUEBA 1.B.4 — Anular movimiento y verificar reversión contable

Dónde: Tesorería → Movimientos → anular el confirmado de la prueba anterior

Pasos:

1. Anular el movimiento confirmado en la prueba 1.B.3
2. Ir a Contabilidad → tab Asientos
3. Buscar el asiento de reversión

Resultado esperado:

- El asiento original queda en estado ANULADO (o aparece un asiento espejo)
- El asiento de reversión invierte el DEBE y HABER:
  - DEBE: 1.1.2.001 Clientes → Gs. 1.000.000
  - HABER: 1.1.1.002 Banco Itaú → Gs. 1.000.000

---

PRUEBA 1.B.5 — Mapear cuenta contable a categoría del sistema

Dónde: Configuración → Tesorería y Bancos → Categorías de Movimiento

Contexto: Las categorías "del sistema" (marcadas con chip "Sistema") vienen predefinidas para todas
las empresas — no se pueden editar. Para que generen asientos, cada empresa debe asignarles
su propia cuenta contable a través del ícono de enlace (🔗).

Pasos:

1. En la tabla de Categorías de Movimiento, localizar una categoría con chip "Sistema"
   (ej: "Depósito bancario")
2. Hacer clic en el ícono 🔗 (enlace) de la columna "Acciones"
3. En el diálogo que aparece, buscar y seleccionar la cuenta contable correspondiente
   (ej: 1.1.1.002 Banco Itaú)
4. Guardar
5. Verificar que la columna "Cuenta contable" de esa categoría ahora muestra el código asignado

Resultado esperado:

- El mapeo queda guardado solo para esta empresa
- Otra empresa que use la misma categoría del sistema no ve este mapeo
- Al confirmar un movimiento con esa categoría, se genera el asiento con la cuenta asignada

Para quitar el mapeo:
1. Abrir nuevamente el diálogo 🔗 de la categoría
2. Hacer clic en "X" para limpiar el Autocomplete
3. Guardar — la columna vuelve a mostrar "Sin mapear"

---

FASE 1.C — Cuentas en Moneda Extranjera (no-PYG)

---

Conceptos clave de cuentas en moneda extranjera

┌──────────────────────┬────────────────────────────────────────────────────────────────────────────────────┐
│ Término              │ Qué es en la práctica                                                              │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cuenta USD / BRL     │ Cuenta bancaria denominada en moneda extranjera — el saldo se guarda en esa moneda │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Saldo en moneda propia│ La cuenta USD muestra "USD 1.200,00" — NO se convierte a PYG en la tarjeta       │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Total consolidado    │ La barra de totales del dashboard separa por moneda: PYG | USD | BRL               │
│                      │ No hay conversión cruzada — evita distorsiones por tipo de cambio                  │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Movimiento en USD    │ El monto se ingresa y almacena en USD — el input muestra formato con decimales     │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Transferencia ↔ PYG  │ Requiere tipo de cambio obligatorio — ver FASE 3 para el flujo completo            │
└──────────────────────┴────────────────────────────────────────────────────────────────────────────────────┘

---

PRUEBA 1.C.1 — Crear una cuenta bancaria en USD

Dónde: Configuración → Tesorería y Bancos → Cuentas de Tesorería

Pasos:

1. Hacer clic en "Nueva Cuenta"
2. Completar:
   - Nombre: Cuenta USD Itaú
   - Tipo: Cuenta Corriente
   - Moneda: USD
   - Saldo inicial: 1.200,00
   - Banco: Itaú
   - Número de cuenta: 001-USD-99887
3. Guardar

Resultado esperado:

- La tarjeta aparece en el dashboard con saldo "USD 1.200,00" (formato con decimales, NO Gs.)
- El tipo de moneda es claramente visible en la tarjeta (badge o etiqueta "USD")

---

PRUEBA 1.C.2 — Dashboard: totales separados por moneda

Dónde: Tesorería y Bancos → tab Cuentas y Saldos

Condición: tener al menos una cuenta PYG y la cuenta USD creada en 1.C.1.

Resultado esperado:

- La barra de totales NO muestra un único total convertido
- Muestra secciones separadas por moneda:
  - PYG: Gs. X.XXX.XXX (suma de todas las cuentas PYG activas)
  - USD: USD X.XXX,XX (suma de todas las cuentas USD activas)
- Las cuentas PYG y USD aparecen en tarjetas diferenciadas — el saldo de cada una se muestra en su propia moneda

---

PRUEBA 1.C.3 — Registrar un ingreso en una cuenta USD

Dónde: Tesorería y Bancos → tab Cuentas y Saldos → tarjeta "Cuenta USD Itaú" → "+ Ingreso"

Pasos:

1. Hacer clic en "+ Ingreso" en la tarjeta de la cuenta USD
2. Completar:
   - Fecha: hoy
   - Monto: 500,00 (el campo debería mostrar formato USD con 2 decimales — "USD 500,00")
   - Descripción: Cobro exportación cliente EE.UU.
   - Categoría: Ingreso Otro
3. Guardar y Confirmar

Resultado esperado — Tesorería:

- El saldo de "Cuenta USD Itaú" pasa de USD 1.200,00 a USD 1.700,00
- En tab Movimientos aparece el movimiento con monto "USD 500,00" (no en PYG)
- El total USD en el dashboard se actualiza a la nueva suma

Resultado esperado — Contabilidad (si módulo activo, cuenta contable mapeada y período abierto):

- En Contabilidad → tab Asientos aparece un asiento CONFIRMADO asociado al movimiento
- El asiento debe cuadrar: DEBE = HABER

Comportamiento actual del asiento en moneda extranjera:

⚠️ Limitación conocida — implementación actual es Opción A:

  El método `integrarMovimientoTesoreria` usa `det.monto` directamente sin conversión de moneda.
  El asiento se genera con el valor en USD tal cual (no convertido a PYG):

    DEBE: Cuenta USD Itaú (cuenta contable) → 500,00   ← valor en USD, no en PYG
    HABER: Ingreso Otro (cuenta contable)   → 500,00   ← ídem

  Esto es técnicamente incorrecto para contabilidad paraguaya, donde todos los asientos deben
  registrarse en PYG (moneda funcional). El efecto práctico es que los reportes contables
  (Estado de Resultados, Balance) sumarán USD 500 como si fueran Gs. 500 — distorsión contable.

  El comportamiento correcto (pendiente de implementar):
    Al confirmar un movimiento en cuenta no-PYG, consultar el tipo de cambio vigente para esa fecha
    y multiplicar antes de generar las líneas del asiento:
      monto_pyg = det.monto × tipo_cambio_del_dia
    DEBE: Cuenta USD Itaú → Gs. 3.750.000  (= USD 500 × 7.500)
    HABER: Ingreso Otro   → Gs. 3.750.000

  Mientras no esté implementado: si la empresa tiene cuentas en moneda extranjera,
  se recomienda NO asignar cuenta contable a esas cuentas hasta que la conversión esté lista,
  para evitar generar asientos con montos incorrectos en PYG.

---

PRUEBA 1.C.4 — Registrar un egreso en una cuenta USD

Dónde: Tesorería y Bancos → tab Cuentas y Saldos → tarjeta "Cuenta USD Itaú" → "+ Egreso"

Pasos:

1. Hacer clic en "+ Egreso" en la tarjeta
2. Completar:
   - Monto: 200,00
   - Descripción: Pago hosting servidor
   - Categoría: Egreso Otro
3. Guardar y Confirmar

Resultado esperado:

- El saldo de "Cuenta USD Itaú" pasa de USD 1.700,00 a USD 1.500,00
- El movimiento aparece en tab Movimientos con monto "USD 200,00" y tipo EGRESO

---

PRUEBA 1.C.5 — Extracto de una cuenta USD

Dónde: Tesorería → tab Movimientos → toggle "Extracto" → seleccionar "Cuenta USD Itaú"

Resultado esperado:

- Todas las columnas de monto muestran el valor en USD (no en PYG)
- El saldo acumulado evoluciona en USD
- Saldo apertura: USD 1.200,00
- Después del ingreso (500,00): USD 1.700,00
- Después del egreso (200,00): USD 1.500,00
- Saldo cierre coincide con el saldo actual de la tarjeta

---

PRUEBA 1.C.6 — Filtrar movimientos por cuenta no-PYG en Vista Global

Dónde: Tesorería → tab Movimientos → Vista Global → filtro Cuenta

Pasos:

1. En el filtro "Cuenta", seleccionar "Cuenta USD Itaú"

Resultado esperado:

- Solo aparecen movimientos de esa cuenta
- Los montos se muestran en USD
- La columna "Monto" muestra "USD 500,00" y "USD 200,00" — no convertidos a PYG

---

FASE 2 — Cheques

---

Conceptos clave de cheques

┌──────────────────────┬────────────────────────────────────────────────────────────────────────────────────┐
│ Término              │ Qué es en la práctica                                                              │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cheque recibido      │ Lo entrega un cliente. Va a "En cartera" hasta que lo depositás en el banco        │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cheque emitido       │ Lo emitís vos a un proveedor. Va a "En cartera" hasta que el banco lo debita       │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Depositar            │ Acreditás un cheque recibido → genera un ingreso en la cuenta bancaria             │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Debitar              │ El banco descuenta un cheque emitido → genera un egreso en la cuenta bancaria      │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Rechazado            │ El banco rechazó el cheque (fondos insuficientes, firma incorrecta, etc.)          │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Devuelto             │ Un cheque recibido fue devuelto al emisor antes de depositarse                     │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Anulado              │ Un cheque emitido fue anulado antes de que el banco lo descuente                   │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Al día               │ `fecha_vencimiento` ≤ hoy (o sin fecha) → entra directo como "En cartera"          │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Diferido (posfech.)  │ `fecha_vencimiento` > hoy → entra como "Diferido" hasta llegar a la fecha          │
└──────────────────────┴────────────────────────────────────────────────────────────────────────────────────┘

Estados posibles:
  DIFERIDO → EN_CARTERA → DEPOSITADO (recibido) / DEBITADO (emitido) / RECHAZADO / DEVUELTO (rec.) / ANULADO (emit.)

Origen del cheque en el sistema:
  - Registro manual desde tab Cheques (legacy)
  - Como medio de pago en Recibo Multi-Factura (módulo Cobros) — crea el cheque + el ingreso
    en tesorería + el asiento del recibo en una sola operación. Ver PRUEBA 2.8.

Cuándo se genera asiento contable:

  Solo al DEPOSITAR (cheque recibido) o DEBITAR (cheque emitido).
  Las demás transiciones (rechazar, devolver, anular) NO generan asiento.

  Para que el asiento se genere, se deben cumplir TODAS estas condiciones:
  1. La empresa tiene el módulo Contabilidad activo
  2. Existe un período contable ABIERTO para la fecha del depósito/débito
  3. La cuenta de tesorería tiene asignada una cuenta contable
  4. La categoría "Cheque Depositado" o "Cheque Debitado" tiene cuenta contable mapeada
     (Configuración → Categorías de Movimiento → ícono 🔗)

  Si alguna condición falla: el movimiento se crea igual, el saldo se actualiza,
  pero no se genera asiento. Ver logs del servidor para diagnóstico.

---

PRUEBA 2.1 — Registrar un cheque recibido

Dónde: Tesorería y Bancos → tab Cheques → toggle "Recibidos" → "Registrar cheque"

Pasos:

1. Hacer clic en "Registrar cheque"
2. Completar:
   - Número de cheque: 001-12345678
   - Banco emisor: Banco Continental
   - Emisor / Titular: Juan Pérez (cliente)
   - Monto: 2.000.000
   - Fecha de emisión: hoy
   - Fecha de vencimiento: dentro de 30 días
   - Referencia: Cobro factura 001-001-000042
3. Guardar

Resultado esperado:

- Aparece una card con el cheque en estado "En cartera" (chip amarillo)
- La card muestra: banco, número, titular, monto en verde (ingreso)
- La barra de resumen actualiza "Total en cartera"
- Si la fecha de vencimiento es ≤ 3 días: aparece badge de alerta naranja en la card y banner de aviso

---

PRUEBA 2.2 — Depositar un cheque recibido

Dónde: Tesorería y Bancos → tab Cheques → card del cheque → "Depositar"

Prerequisito para que se genere asiento:
- La cuenta de tesorería debe tener asignada una cuenta contable (ej: 1.1.1.001 Banco BNF)
- La categoría del sistema "Cheque Depositado" debe tener cuenta contable mapeada
  (Configuración → Categorías de Movimiento → ícono 🔗 en "Cheque Depositado")

Pasos:

1. Hacer clic en "Depositar" en la card del cheque creado en 2.1
2. Seleccionar cuenta: BNF Cuenta Corriente
3. (Opcional) Ingresar referencia: Boleta depósito 89045
4. Confirmar

Resultado esperado:

- El chip cambia a "Depositado" (verde)
- Los botones de acción desaparecen (ya no es "En cartera")
- En tab Movimientos aparece automáticamente un movimiento CONFIRMADO:
  - Tipo: INGRESO
  - Categoría: Cheque Depositado
  - Monto: Gs. 2.000.000
  - Estado: Confirmado
- El saldo de "BNF Cuenta Corriente" aumenta en Gs. 2.000.000

Resultado esperado en Contabilidad → Asientos (si módulo activo y cuentas mapeadas):

- Aparece un asiento CONFIRMADO con glosa "Ingreso tesorería — Depósito cheque Nº 001-12345678"
- DEBE: cuenta de tesorería (ej: 1.1.1.001 Banco BNF) → Gs. 2.000.000
- HABER: cuenta de "Cheque Depositado" (ej: 1.1.2.001 Clientes) → Gs. 2.000.000
- Si alguna cuenta no está mapeada: el movimiento se confirma igual pero no genera asiento
  (ver logs del servidor para diagnóstico)

---

PRUEBA 2.3 — Cheque recibido rechazado

Dónde: Tesorería y Bancos → tab Cheques → Registrar otro cheque → "Rechazar"

Pasos:

1. Registrar un segundo cheque recibido (Nº 001-99999999, Gs. 500.000)
2. En la card, hacer clic en "Rechazar"
3. Ingresar motivo: "Fondos insuficientes"
4. Confirmar

Resultado esperado:

- El chip cambia a "Rechazado" (rojo)
- No se genera ningún movimiento (el cheque nunca ingresó al banco)
- El motivo queda visible en la card

---

PRUEBA 2.4 — Registrar y debitar un cheque emitido

Dónde: Tesorería y Bancos → tab Cheques → toggle "Emitidos" → "Registrar cheque"

Prerequisito para que se genere asiento:
- La cuenta de tesorería debe tener asignada una cuenta contable
- La categoría del sistema "Cheque Debitado" debe tener cuenta contable mapeada
  (Configuración → Categorías de Movimiento → ícono 🔗 en "Cheque Debitado")

Pasos:

1. Cambiar toggle a "Emitidos"
2. Registrar cheque:
   - Número: 002-00000123
   - Banco emisor: BNF
   - Beneficiario: Proveedor S.A.
   - Monto: 3.000.000
   - Fecha de vencimiento: dentro de 15 días
3. Guardar
4. En la card, hacer clic en "Debitar"
5. Seleccionar cuenta: BNF Cuenta Corriente
6. Confirmar

Resultado esperado:

- El chip cambia a "Debitado" (verde)
- En tab Movimientos aparece un movimiento CONFIRMADO:
  - Tipo: EGRESO
  - Categoría: Cheque Debitado
  - Monto: Gs. 3.000.000
- El saldo de "BNF Cuenta Corriente" disminuye en Gs. 3.000.000

Resultado esperado en Contabilidad → Asientos (si módulo activo y cuentas mapeadas):

- Aparece un asiento CONFIRMADO con glosa "Egreso tesorería — Débito cheque Nº 002-00000123"
- DEBE: cuenta de "Cheque Debitado" (ej: 2.1.1.001 Proveedores) → Gs. 3.000.000
- HABER: cuenta de tesorería (ej: 1.1.1.001 Banco BNF) → Gs. 3.000.000
- Si alguna cuenta no está mapeada: el movimiento se confirma igual pero no genera asiento

---

PRUEBA 2.5 — Alerta de vencimiento próximo

Dónde: Tesorería y Bancos → tab Cheques

Condición: registrar un cheque con fecha de vencimiento dentro de 3 días o menos.

Resultado esperado:

- La card del cheque muestra badge naranja "⚠️ Vence en Xd" o "⚠️ Vencido"
- Aparece banner amarillo en la parte superior del tab indicando cuántos cheques vencen pronto
- Si ya venció: badge rojo "⚠️ Vencido"

---

PRUEBA 2.6 — Devolver cheque recibido

Dónde: tab Cheques → Recibidos → cheque EN_CARTERA → "Devolver"

Pasos:

1. En un cheque recibido en cartera, hacer clic en "Devolver"
2. Ingresar motivo: "El cliente solicitó devolución"
3. Confirmar

Resultado esperado:

- El chip cambia a "Devuelto" (gris)
- No se genera movimiento contable

---

PRUEBA 2.7 — Anular cheque emitido

Dónde: tab Cheques → Emitidos → cheque EN_CARTERA → "Anular"

Pasos:

1. En un cheque emitido en cartera, hacer clic en "Anular"
2. Ingresar motivo: "Pago cancelado por acuerdo con proveedor"
3. Confirmar

Resultado esperado:

- El chip cambia a "Anulado" (gris)
- No se genera movimiento contable

---

PRUEBA 2.8 — Cheque diferido (posfechado) recibido vía Recibo Multi-Factura

Dónde: Cobros → Recibos Multi-Factura → Nuevo recibo

Concepto: un cheque cuya `fecha_vencimiento` es posterior a hoy entra al sistema en estado **DIFERIDO**, no `EN_CARTERA`. Aun así, el recibo cierra la CxC del cliente y el saldo de la cuenta de tesorería sube de inmediato.

Pasos:

1. Crear un recibo multi para un cliente con factura pendiente
2. En el paso de medios de pago elegir "Cheque"
3. Completar datos del cheque:
   - Número, banco, titular
   - Fecha de emisión: hoy
   - **Fecha de vencimiento: hoy + 30 días** (cheque diferido a 30 días)
4. Seleccionar la cuenta "Cheques en Cartera" como cuenta de tesorería
5. Confirmar el recibo

Resultado esperado:

- En Cobros → Recibos Multi aparece el recibo CONFIRMADO
- La factura del cliente queda con saldo_pendiente = 0 (CxC cerrada)
- En Tesorería → Cheques → Recibidos aparece el cheque con chip **"Diferido"** (azul)
- El saldo de la cuenta "Cheques en Cartera" se incrementó por el monto del cheque
- En la fecha de vencimiento el cheque pasa automáticamente a "En cartera" y queda listo para depositar

Consideraciones:

- ⚠️ El cliente figura "sin deuda" aunque el banco no haya debitado el cheque. Para analizar morosidad real cruzar con cheques en estado DIFERIDO del cliente.
- ⚠️ Si el cheque diferido rechaza al depositarse: la CxC del cliente NO se reabre automáticamente. Hay que anular el recibo multi desde Cobros para revertir factura + saldo tesorería + asiento.
- ⚠️ Si en el wizard se omite `fecha_vencimiento`, el cheque entra como EN_CARTERA aunque la intención sea diferida — siempre completar la fecha al cargar el cheque.

---

PRUEBA 2.9 — Filtros y búsqueda

Dónde: tab Cheques

Pasos:

1. En el campo de búsqueda escribir el nombre del titular (ej: "Juan")
   → Solo aparecen los cheques de ese titular
2. Filtrar por estado "Depositado"
   → Solo aparecen cheques ya depositados
3. Combinar filtro de cuenta con toggle Recibidos/Emitidos
   → Los resultados se acumulan correctamente

---

FASE 3 — Transferencias entre Cuentas Propias

---

Conceptos clave de transferencias

┌──────────────────────┬────────────────────────────────────────────────────────────────────────────────────┐
│ Término              │ Qué es en la práctica                                                              │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Transferencia        │ Movimiento de fondos entre dos cuentas propias del sistema                         │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cuenta origen        │ La cuenta que egresa fondos (se debita)                                            │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cuenta destino       │ La cuenta que ingresa fondos (se acredita)                                         │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Tipo de cambio       │ Solo aparece cuando origen y destino tienen monedas distintas (ej: PYG ↔ USD)      │
│                      │ El usuario ingresa el TC real aplicado por el banco                                │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Monto origen         │ El monto que sale de la cuenta origen (en su moneda)                               │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Monto destino        │ Calculado automáticamente = monto origen × tipo de cambio (si multi-moneda)        │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ CONFIRMADO           │ Estado final al crear — ambos saldos se actualizan de inmediato                    │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ ANULADO              │ Se revierten los saldos de ambas cuentas. Requiere motivo.                         │
└──────────────────────┴────────────────────────────────────────────────────────────────────────────────────┘

Permiso requerido: TES_TRANSFERIR

Cuándo se genera asiento contable:
  Al crear la transferencia, si ambas cuentas tienen cuenta contable asignada y la empresa
  tiene el módulo Contabilidad activo con período abierto.
  Asiento generado: DEBE → cuenta contable de la cuenta destino / HABER → cuenta contable de la cuenta origen.

---

PRUEBA 3.1 — Transferencia básica entre dos cuentas PYG

Prerequisito: tener al menos 2 cuentas activas en PYG con saldo suficiente.

Dónde: Tesorería y Bancos → tab Transferencias → "Nueva Transferencia"

Pasos:

1. Hacer clic en "Nueva Transferencia"
2. Completar:
   - Cuenta origen: Cuenta Corriente Itaú (saldo: Gs. 5.000.000)
   - Cuenta destino: Caja Chica Oficina
   - Monto: 500.000
   - Fecha: hoy
   - Descripción: Reposición caja chica (opcional)
3. Verificar que NO aparece campo "Tipo de cambio" (ambas cuentas son PYG)
4. Hacer clic en "Confirmar Transferencia"

Resultado esperado:

- La transferencia aparece en la lista con estado "Confirmado" (chip verde)
- La fila muestra: fecha | Cuenta Corriente Itaú → Caja Chica Oficina | Gs. 500.000 | Gs. 500.000
- Ir a tab "Cuentas y Saldos":
  - Cuenta Corriente Itaú: saldo bajó en Gs. 500.000
  - Caja Chica Oficina: saldo subió en Gs. 500.000
- En tab Movimientos aparecen 2 movimientos vinculados (tipo TRANSFERENCIA):
  - EGRESO en Cuenta Corriente Itaú — Gs. 500.000 — Confirmado
  - INGRESO en Caja Chica Oficina — Gs. 500.000 — Confirmado

---

PRUEBA 3.2 — Transferencia multi-moneda con TC en sistema (PYG → USD)

Prerequisitos:
- Tener una cuenta en USD activa (ej: "Cuenta USD Itaú")
- Tener registrado el TC del día en Contabilidad → Tipo de Cambio (ej: USD = Gs. 7.850)

Dónde: Tesorería y Bancos → tab Transferencias → "Nueva Transferencia"

Contexto del caso: la empresa compra USD en el banco. El banco debita Gs. 3.000.000 de la
cuenta PYG y acredita USD 378,79 en la cuenta USD (TC banco: 7.920 — peor que el del sistema).

Pasos:

1. Hacer clic en "Nueva Transferencia"
2. Seleccionar:
   - Cuenta origen: BNF Cuenta PYG  →  el formulario muestra inmediatamente "Saldo: Gs. 5.000.000"
   - Cuenta destino: Itaú Cuenta USD →  el formulario muestra "Saldo: USD 1.200,00"
3. Verificar que el formulario cambia de modo automáticamente al detectar monedas distintas:
   - Aparecen DOS campos de monto: "Monto que sale (PYG)" y "Monto que llega (USD)"
   - NO hay un campo "Tipo de cambio" para ingresar — se calcula solo
4. Completar:
   - Monto que sale: Gs. 3.000.000
   - Monto que llega: USD 378,79
   - Fecha: hoy
5. Verificar el panel de resumen calculado en tiempo real:
   - TC efectivo (banco): Gs. 7.920  ← calculado: 3.000.000 / 378,79
   - TC referencia (sistema): Gs. 7.850  ← tomado de Contabilidad → Tipo de Cambio del día
   - Diferencia de cambio: Gs. 26.503 PÉRDIDA  ← (7.920 − 7.850) × 378,79
6. Verificar aviso contextual debajo del TC efectivo:
   "Este es el tipo de cambio real que aplicó tu banco. El sistema lo calculó automáticamente."
7. Confirmar

Resultado esperado — Tesorería:

- La transferencia aparece en la lista con estado "Confirmado"
  - Monto origen: Gs. 3.000.000 (rojo — egreso)
  - Monto destino: USD 378,79 (verde — ingreso)
- Saldo BNF Cuenta PYG: bajó en Gs. 3.000.000
- Saldo Itaú Cuenta USD: subió en USD 378,79

Resultado esperado — Contabilidad (si módulo activo, cuentas mapeadas y período abierto):

- Aparece asiento CONFIRMADO de 3 patas:
  - HABER: BNF Cuenta PYG (cuenta contable)       → Gs. 3.000.000
  - DEBE:  Itaú Cuenta USD (valorizado al TC sist.)→ Gs. 2.973.497  (378,79 × 7.850)
  - DEBE:  Diferencia de Cambio Perdida (6.3.1.03) → Gs.    26.503
  - Total DEBE = Total HABER = Gs. 3.000.000 ✓

---

PRUEBA 3.2.B — Transferencia multi-moneda SIN TC en sistema

Prerequisito: NO tener TC registrado en Contabilidad → Tipo de Cambio para la fecha de hoy.

Dónde: Tesorería y Bancos → tab Transferencias → "Nueva Transferencia"

Pasos:

1. Completar igual que en 3.2 (cuentas de monedas distintas, ambos montos)
2. Verificar que el panel de resumen muestra solo el TC efectivo calculado
   — la fila "TC referencia" y la fila "Diferencia de cambio" NO aparecen (no hay dato de referencia)
3. Verificar que el aviso dice:
   "No hay tipo de cambio registrado para hoy. La transferencia se confirmará sin registrar diferencia de cambio."
4. Confirmar

Resultado esperado:

- La transferencia se confirma normalmente — los saldos se actualizan igual que en 3.2
- El asiento contable generado es de 2 patas (sin línea de diferencia de cambio):
  - HABER: Cuenta origen (PYG)              → Gs. 3.000.000
  - DEBE:  Cuenta destino (al TC efectivo)  → Gs. 3.000.000
  - Glosa del asiento incluye: "TC referencia no disponible para esta fecha"
- No aparece ningún error — la falta de TC en sistema no bloquea la operación

---

PRUEBA 3.2.C — Feedback inmediato: saldo insuficiente al ingresar monto

Dónde: Tesorería y Bancos → tab Transferencias → "Nueva Transferencia"

Pasos:

1. Seleccionar cuenta origen con saldo Gs. 2.000.000
2. Ingresar monto que sale: Gs. 5.000.000 (supera el saldo)
3. NO hacer clic en confirmar

Resultado esperado:

- Aparece un aviso inline en rojo debajo del campo de monto, de forma inmediata:
  "Saldo insuficiente. Disponible: Gs. 2.000.000"
- El botón "Confirmar" permanece deshabilitado
- No aparece ningún toast ni alert — el error es contextual, al lado del dato problemático

---

PRUEBA 3.3 — Validación: cuenta origen = cuenta destino

Dónde: Tesorería y Bancos → tab Transferencias → "Nueva Transferencia"

Pasos:

1. Seleccionar la misma cuenta en origen y destino
2. Intentar confirmar

Resultado esperado:

- El botón "Confirmar" permanece deshabilitado
- El selector de cuenta destino no permite seleccionar la misma cuenta que el origen

---

PRUEBA 3.4 — Validación: saldo insuficiente

Dónde: Tesorería y Bancos → tab Transferencias → "Nueva Transferencia"

Pasos:

1. Ingresar un monto mayor al saldo disponible en la cuenta origen
2. Confirmar

Resultado esperado:

- El servidor rechaza la operación con un error descriptivo
- Toast rojo indicando "Saldo insuficiente en la cuenta origen"
- Los saldos no se modifican

---

PRUEBA 3.5 — Anular una transferencia

Dónde: Tesorería y Bancos → tab Transferencias → ícono de anulación en la fila

Prerequisito: tener una transferencia en estado "Confirmado".

Pasos:

1. En la lista de transferencias, hacer clic en el ícono de anulación (🚫) de la transferencia creada en 3.1
2. El diálogo muestra cuáles cuentas se verán afectadas:
   - "Se revertirá el egreso de Cuenta Corriente Itaú y el ingreso de Caja Chica Oficina"
3. Ingresar motivo: "Error en el monto transferido"
4. Confirmar

Resultado esperado:

- La transferencia cambia a estado "Anulado" (chip rojo)
- El ícono de anulación desaparece (ya no es anulable)
- El saldo de Cuenta Corriente Itaú se restaura (+Gs. 500.000)
- El saldo de Caja Chica Oficina se restaura (-Gs. 500.000)
- Los 2 movimientos de tipo TRANSFERENCIA en tab Movimientos cambian a estado "Anulado"

---

PRUEBA 3.6 — Filtros y búsqueda en transferencias

Dónde: Tesorería y Bancos → tab Transferencias

Pasos:

1. En el campo de búsqueda, escribir parte del nombre de una cuenta (ej: "Itaú")
   → Solo aparecen transferencias donde Itaú es origen o destino
2. Cambiar el rango de fechas (Desde / Hasta) a un mes anterior
   → Los resultados se actualizan — sin transferencias si no había
3. Filtrar por Estado "Anulado"
   → Solo aparecen transferencias anuladas
4. Filtrar por Cuenta: seleccionar "Caja Chica Oficina"
   → Solo aparecen transferencias donde esa cuenta es origen o destino

---

PRUEBA 3.7 — Exportar transferencias a Excel

Dónde: Tesorería y Bancos → tab Transferencias

Pasos:

1. Con algunos registros visibles, hacer clic en el botón "Excel" (ícono de descarga)
2. Abrir el archivo descargado

Resultado esperado:

- El archivo se descarga con nombre: `transferencias_YYYY-MM-DD.xlsx`
- Columnas presentes: Fecha | Cuenta Origen | Moneda Origen | Monto Origen | Cuenta Destino | Moneda Destino | Monto Destino | Tipo de Cambio | Estado | Descripción | Motivo Anulación
- Solo contiene los registros del filtro activo (no todos)
- Si no hay registros: el botón "Excel" está deshabilitado

---

PRUEBA 3.8 — Paginación

Dónde: Tesorería y Bancos → tab Transferencias

Condición: tener más de 20 transferencias registradas.

Resultado esperado:

- Aparecen los botones "◀ Ant" y "Sig ▶" en la parte inferior
- El contador muestra "Página X de Y (N registros)"
- Al navegar entre páginas los datos cambian correctamente
- Al limpiar un filtro, la página vuelve a 1

---

PRUEBA 3.9 — Vista responsive (mobile)

Dónde: Abrir Tesorería y Bancos en un dispositivo móvil o reducir el ancho del navegador a menos de 700px

Resultado esperado:

- La tabla desaparece y aparece una vista de cards apiladas
- Cada card muestra: fecha, cuenta origen → cuenta destino (con flecha), monto origen y monto destino, chip de estado
- Los botones de acción están accesibles dentro de la card

---

FASE 4 — Reportes de Tesorería

---

Conceptos clave de reportes

┌──────────────────────┬────────────────────────────────────────────────────────────────────────────────────┐
│ Término              │ Qué es en la práctica                                                              │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Posición de Caja     │ Foto del saldo actual de todas las cuentas activas, agrupadas por moneda           │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Flujo de Caja Real   │ Ingresos y egresos CONFIRMADOS en un período — lo que realmente ocurrió            │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Flujo Proyectado     │ Real + CxC pendientes (cobros que se esperan) + órdenes de pago pendientes         │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Extracto de cuenta   │ Cronología de una cuenta con saldo acumulado línea a línea                         │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Cartera de cheques   │ Estado de todos los cheques: cuántos en cartera, depositados, próximos a vencer    │
└──────────────────────┴────────────────────────────────────────────────────────────────────────────────────┘

Dónde viven los reportes:
  - Posición de Caja y Flujo de Caja → Módulo Reportes → sección "Administrativos y Financieros"
  - Extracto de Cuenta y Cartera de Cheques → Tesorería y Bancos → tab "Reportes"

Permiso requerido: TES_VER_REPORTES

---

PRUEBA 4.1 — Posición de Caja

Dónde: Reportes → sección "Administrativos y Financieros" → "Posición de Caja"

Prerequisito: tener al menos 2 cuentas activas (una PYG, una USD o cualquier otra moneda).

Pasos:

1. Ir a Reportes y hacer clic en "Posición de Caja"
2. Observar la pantalla

Resultado esperado:

- Las tarjetas superiores muestran una por moneda: PYG con su total, USD con su total (si aplica)
- Debajo aparece una tabla por moneda con columnas: Cuenta | Tipo | Banco | N° Cuenta | Saldo Actual
- El saldo en verde si es positivo, en rojo si es negativo
- El total de cada tarjeta es la suma de los saldos de las cuentas de esa moneda
- Las transferencias excluidas del flujo NO aparecen en el saldo — el saldo refleja el estado real

Exportar a Excel:

1. Hacer clic en "Excel"
2. Verificar que se descarga un archivo con todas las cuentas, tipos y saldos actuales

---

PRUEBA 4.2 — Flujo de Caja Real

Dónde: Reportes → "Flujo de Caja" → tab "Flujo Real"

Prerequisito: tener movimientos CONFIRMADOS en el período del mes actual (los de las pruebas anteriores sirven).

Pasos:

1. Hacer clic en "Flujo de Caja" en el módulo Reportes
2. El formulario carga con Desde=primer día del mes, Hasta=hoy
3. Hacer clic en "Buscar"
4. Permanecer en tab "Flujo Real"

Resultado esperado — KPIs:

- Tarjeta "Ingresos": suma de todos los movimientos CONFIRMADOS tipo INGRESO en el período
  (las transferencias entre cuentas propias están excluidas — no distorsionan el flujo)
- Tarjeta "Egresos": suma de EGRESOS confirmados (transferencias excluidas)
- Tarjeta "Resultado": Ingresos − Egresos (azul si positivo, amarillo si negativo)

Resultado esperado — Por Categoría:

- Lista de categorías usadas con barra de progreso proporcional
- Verde para categorías de ingreso, rojo para egresos
- El monto y cantidad de movimientos se muestra a la derecha

Resultado esperado — Movimientos:

- Tabla con todos los movimientos del período: Fecha | Cuenta | Tipo | Descripción | Categorías | Monto
- Los ingresos en verde, los egresos en rojo

Verificar con filtro de cuenta:

1. Seleccionar solo "Cuenta Corriente Itaú" en el selector "Cuenta (opcional)"
2. Hacer clic en "Buscar"
→ KPIs y tabla se actualizan mostrando solo movimientos de esa cuenta

Exportar a Excel:

1. Hacer clic en "Excel"
2. Verificar que el archivo tiene 3 hojas: "Resumen", "Por Categoría", "Movimientos"

---

PRUEBA 4.3 — Flujo de Caja Proyectado

Dónde: Reportes → "Flujo de Caja" → tab "Flujo Proyectado (incl. CxC / CxP)"

Prerequisito: tener CxC (cuentas por cobrar) en estado pendiente o parcial con fecha de vencimiento
dentro del período buscado. Si no hay CxC, el proyectado = real (cobros proyectados = 0).

Pasos:

1. Seleccionar el mismo período de la prueba 4.2
2. Hacer clic en "Buscar"
3. Cambiar al tab "Flujo Proyectado"

Resultado esperado — KPIs adicionales:

- Los 3 KPIs del flujo real siguen visibles (Ingresos, Egresos, Resultado)
- Aparecen 3 KPIs nuevos:
  - Cobros Proyectados (CxC): suma de saldo pendiente de CxC que vencen en el período
  - Pagos Proyectados (CxP): suma de órdenes de pago pendientes/aprobadas del período
  - Resultado Proyectado: Resultado real + Cobros − Pagos proyectados

Resultado esperado — CxC:

- Si hay CxC, aparece la tabla "Cobros esperados (CxC vencen en el período)"
  con columnas: Cliente | Vencimiento | Monto
- Si no hay CxC en el período: la sección no aparece (no hay tabla vacía)

---

PRUEBA 4.4 — Extracto de Cuenta

Dónde: Tesorería y Bancos → tab "Reportes" → sub-tab "Extracto de Cuenta"

Prerequisito: la cuenta debe tener movimientos CONFIRMADOS en el período.

Pasos:

1. Ir a Tesorería y Bancos → tab "Reportes"
2. En "Extracto de Cuenta", seleccionar: Cuenta = "Cuenta Corriente Itaú"
3. Dejar fechas por defecto (primer día del mes hasta hoy)
4. Hacer clic en "Buscar"

Resultado esperado — Resumen:

- 3 tarjetas: Saldo anterior al período | Saldo final | Cantidad de movimientos
- El "Saldo anterior" es el saldo histórico antes del período seleccionado
  (incluye saldo inicial + movimientos anteriores a la fecha desde)

Resultado esperado — Tabla:

- Columnas: Fecha | Descripción | Categorías | Ingreso | Egreso | Saldo
- Cada fila corresponde a un movimiento CONFIRMADO en orden cronológico
- La columna "Ingreso" tiene valor solo si el tipo es INGRESO, y "Egreso" si es EGRESO
- La columna "Saldo" se acumula: va sumando ingresos y restando egresos
- El saldo de la última fila = "Saldo final" de las tarjetas superiores
- Saldo negativo → color rojo en la columna Saldo

Exportar a Excel:

1. Hacer clic en "Excel"
2. Verificar: columnas Fecha | Descripción | Categorías | Tipo | Ingreso | Egreso | Saldo
3. El nombre del archivo incluye el nombre de la cuenta y la fecha desde

---

PRUEBA 4.5 — Cartera de Cheques

Dónde: Tesorería y Bancos → tab "Reportes" → sub-tab "Cartera de Cheques"

Prerequisito: tener cheques registrados en el sistema (las pruebas de FASE 2 sirven).

Pasos:

1. Ir a Tesorería y Bancos → tab "Reportes" → "Cartera de Cheques"
2. Sin aplicar filtros, hacer clic en "Buscar"

Resultado esperado — KPIs:

- En Cartera: cantidad de cheques con estado EN_CARTERA
- Depositados: cantidad de cheques DEPOSITADO
- Vencen en 7 días: cheques EN_CARTERA cuyo vencimiento es dentro de 7 días
- Total en cartera: suma de montos de cheques EN_CARTERA

Resultado esperado — Tabla:

- Columnas: Número | Tipo | Banco | Titular | Emisión | Vencimiento | Estado | Cuenta | Monto
- El estado aparece como badge con color: EN_CARTERA (azul), DEPOSITADO (verde),
  RECHAZADO (rojo), DEVUELTO (naranja), ANULADO (gris)
- Las fechas en formato DD/MM/YYYY

Filtros:

1. Filtrar por Tipo "Recibidos" → solo aparecen cheques de tipo RECIBIDO
2. Filtrar por Estado "En Cartera" → solo cheques sin procesar
3. Filtrar por rango de vencimiento (Vence desde / Vence hasta)
   → solo cheques que vencen en ese rango

Exportar a Excel:

1. Hacer clic en "Excel"
2. Verificar: todas las columnas presentes, archivo con nombre `cartera-cheques-YYYY-MM-DD.xlsx`

---

FASE 5 — Conciliación Bancaria

---

Conceptos clave de Conciliación

┌──────────────────────┬────────────────────────────────────────────────────────────────────────────────────┐
│ Término              │ Qué es en la práctica                                                              │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Extracto bancario    │ Listado de movimientos según el banco — lo que el banco registró                   │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Conciliación         │ Cruzar el extracto del banco con los movimientos del sistema → encontrar diferencias│
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Auto-match           │ El sistema cruza automáticamente por monto + tipo + fecha (±2 días) al importar    │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Línea conciliada     │ Línea del extracto que tiene un movimiento del sistema vinculado (✓ verde)         │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Línea pendiente      │ Línea del extracto sin movimiento vinculado — requiere revisión manual             │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Sin correspondencia  │ Línea del banco que no tiene ni tendrá movimiento en el sistema (comisiones        │
│                      │ automáticas, cargos bancarios, etc.) — se marca para cerrar la conciliación        │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Crear desde línea    │ Registrar un movimiento nuevo directamente desde una línea pendiente — el sistema   │
│                      │ crea el movimiento CONFIRMADO y lo vincula a esa línea de inmediato                │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ Saldo banco          │ Saldo inicial y final que reporta el banco en el extracto — visible en el header   │
│                      │ del detalle. Para PDF: la IA lo detecta automáticamente del documento              │
├──────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤
│ PDF con IA           │ El sistema extrae el texto del PDF y la IA normaliza las transacciones              │
│                      │ → no hace falta CSV, no hace falta mapear columnas, funciona con cualquier banco   │
└──────────────────────┴────────────────────────────────────────────────────────────────────────────────────┘

Formas de importar un extracto (orden recomendado):

  1. PDF (recomendado) — subís el PDF tal como lo descargás del banco → la IA lo procesa automáticamente
  2. CSV — alternativa si no tenés API key de IA o preferís control manual sobre los datos
  3. Excel — misma lógica que CSV, el sistema lo parsea igual

---

PRUEBA 5.1 — Importar un extracto bancario CSV

Dónde: Finanzas → Tesorería y Bancos → Conciliación → botón "+"

Prerequisito: tener una cuenta bancaria activa y al menos algunos movimientos confirmados en un período.

Formato CSV esperado (encabezado en primera fila, separador ";" o ","):
  fecha;descripcion;debito;credito;referencia
  22/04/2026;Débito comisión;;;500000;COM-001
  22/04/2026;Acreditación venta;1500000;;;TRF-099

Pasos:
  1. Click en "+" → se abre el modal de importación
  2. Observar la zona de drag & drop — acepta PDF, CSV y Excel
  3. Seleccionar la cuenta bancaria correspondiente
  4. Arrastrar el archivo CSV a la zona o hacer click y seleccionarlo
  5. Verificar que aparece el ícono de tabla y el contador de líneas (ej: "5 líneas detectadas")
  6. Ingresar período (desde / hasta) — requerido para CSV
  7. Ingresar saldo inicial y saldo final (opcional)
  8. Click en "Importar CSV"

Resultado esperado:
  - El extracto aparece en la lista izquierda con estado "Pendiente" o "Parcial"
  - Si alguna línea tiene monto y fecha que coincide (±2 días) con un movimiento confirmado de esa cuenta,
    se auto-concilia y aparece marcada con ✓ verde
  - Las demás líneas aparecen con ⚪ pendiente
  - El extracto NO muestra badge "✨ IA" (fue importado como CSV)

---

PRUEBA 5.2 — Verificar auto-match

Prerequisito: tener movimientos confirmados y un extracto importado con al menos una línea cuyo monto
              coincide exactamente con un movimiento confirmado de la misma cuenta y fecha similar.

Pasos:
  1. Al importar el extracto (prueba 5.1), revisar las líneas en el panel derecho
  2. Verificar que las líneas con fila verde y ✓ tienen un movimiento vinculado visible
     (muestra: fecha, tipo INGRESO/EGRESO, monto)

Resultado esperado:
  - Cada línea auto-conciliada muestra el movimiento del sistema al que fue vinculada
  - Las líneas sin match exacto quedan en pendiente (⚪)

---

PRUEBA 5.3 — Conciliar una línea manualmente

Dónde: Panel derecho del extracto → línea pendiente (⚪)

Pasos:
  1. Seleccionar el extracto en la lista izquierda
  2. Identificar una línea pendiente
  3. Click en "Conciliar" en la columna de acción
  4. Aparece un Autocomplete (campo con búsqueda) con los movimientos del sistema sin conciliar
     del mismo período y mismo tipo (débito→EGRESO, crédito→INGRESO)
  5. Escribir parte del monto o descripción para filtrar la lista
  6. Seleccionar el movimiento correspondiente
  7. Click en "Vincular"

Resultado esperado:
  - La línea cambia a ✓ verde y muestra el movimiento vinculado
  - El contador de "Conciliadas" en el header sube en 1
  - Si todas las líneas quedan conciliadas o marcadas → estado del extracto cambia a "Conciliado"
  - Si algunas quedan pendientes → estado "Parcial"

Verificar el Autocomplete:
  - Escribir "500" en el buscador → filtra solo movimientos con "500" en descripción o monto
  - Si no hay movimientos del tipo correcto → "Sin coincidencias"
  - Cancelar → click en "Cancelar" — el selector desaparece sin cambios

---

PRUEBA 5.4 — Desconciliar una línea

Pasos:
  1. Sobre una línea ya conciliada (✓ verde), click en el ícono de cadena rota (LinkOff)
  2. Confirmar visualmente

Resultado esperado:
  - La línea vuelve a ⚪ pendiente
  - El movimiento del sistema vuelve a aparecer disponible en el selector de otras líneas
  - El estado del extracto actualiza (Conciliado → Parcial si había quedado Conciliado)

---

PRUEBA 5.5 — Buscar dentro del extracto

Pasos:
  1. Con un extracto con varias líneas, escribir parte de una descripción en el campo de búsqueda
  2. Verificar el contador "X de Y líneas"

Resultado esperado:
  - Solo se muestran las líneas cuya descripción o referencia contiene el texto buscado
  - Click en X limpia el filtro y vuelven todas las líneas

---

PRUEBA 5.6 — Eliminar un extracto

Pasos:
  1. En la lista izquierda, click en el ícono de papelera del extracto
  2. El extracto desaparece de la lista

Resultado esperado:
  - El extracto y todas sus líneas se eliminan de la BD
  - Los movimientos del sistema que estaban vinculados quedan libres (no se tocan)

---

PRUEBA 5.7 — Importar extracto PDF con IA (caso feliz)

Dónde: Finanzas → Tesorería y Bancos → Conciliación → botón "+"

Prerequisito:
  - Tener una cuenta bancaria activa
  - Tener API key de IA configurada en IA Dashboard (Anthropic o OpenAI)
  - Tener el PDF del extracto descargado del banco (Banco Continental, Ueno, BNF, Itaú, etc.)

Pasos:
  1. Click en "+" → se abre el modal de importación
  2. Seleccionar la cuenta bancaria correspondiente
  3. Arrastrar el archivo PDF a la zona de drag & drop
     (o hacer click y seleccionarlo — el modal acepta archivos .pdf)
  4. Verificar que al soltarlo aparece:
     - Ícono ✨ violeta en lugar del ícono de tabla
     - Texto "Será procesado automáticamente por IA"
     - El nombre del archivo PDF
  5. Los campos "Período desde / hasta" NO son obligatorios para PDF — la IA los infiere del documento
     (se pueden completar si se quiere forzar un rango específico)
  6. Click en "Analizar con IA" (botón violeta)

Estado PROCESANDO — verificar inmediatamente:
  - El botón desaparece y aparece el estado de carga con ícono ✨ rotando
  - Mensaje: "Analizando extracto con Inteligencia Artificial…"
  - Subtítulo con el nombre del archivo PDF
  - Barra de progreso animada
  - Texto: "Esto puede tomar unos segundos"
  - El modal NO se puede cerrar mientras procesa (sin ×)

Estado PREVIEW — verificar al finalizar:
  - Banner verde con ícono ✨: "IA detectó X movimientos · [Nombre del banco] · Y auto-conciliados"
  - Aviso amarillo: "Revisá que los importes coincidan con tu PDF antes de usar este extracto"
  - Tabla con todas las transacciones detectadas con columnas:
    Fecha | Concepto | Ref. | Débito | Crédito | Estado
  - Columna "Estado" muestra chips:
    - "Auto-conciliado" (verde): la IA detectó una coincidencia con un movimiento del sistema
    - "Pendiente" (amarillo): sin match automático, requiere revisión
  - Los montos en rojo para débitos, verde para créditos
  - Botón "Listo — ver extracto" (verde)
  7. Comparar 3-5 filas de la tabla con el PDF impreso/en pantalla para verificar montos
  8. Click en "Listo — ver extracto"

Resultado esperado:
  - El modal se cierra
  - Toast verde con resumen: "[Banco] · X movimientos · Y auto-conciliados"
  - El nuevo extracto aparece en la lista izquierda
  - El extracto tiene badge "✨ IA" (violeta) junto al nombre del archivo
  - El panel derecho muestra las líneas con sus estados de conciliación
  - Las fechas detectadas por la IA están en el campo "Período" del extracto

Verificar en la lista de extractos:
  ┌─────────────────────────────────────────────────────────┐
  │  BNF Cta. Corriente    Abr 2026   ✨ IA   PARCIAL      │
  │  01/04/2026 → 22/04/2026                               │
  │  Extracto_Continental_Abril.pdf                        │
  └─────────────────────────────────────────────────────────┘

---

PRUEBA 5.8 — Importar PDF sin API key de IA configurada (fallback)

Dónde: Finanzas → Tesorería y Bancos → Conciliación → botón "+"

Prerequisito: la empresa NO tiene API key de IA configurada en IA Dashboard.

Pasos:
  1. Click en "+" → modal de importación
  2. Seleccionar cuenta bancaria
  3. Arrastrar un PDF a la zona de drop
  4. Click en "Analizar con IA"

Resultado esperado:
  - El sistema intenta procesar: entra en estado PROCESANDO
  - El backend devuelve error porque no hay API key
  - Toast rojo con mensaje descriptivo: "Sin API key configurada" o similar
  - El modal vuelve al estado IDLE con el archivo cargado
  - El usuario puede entonces optar por:
    a) Ir a IA Dashboard → configurar su API key → volver a intentar
    b) Exportar el extracto como CSV desde el banco y usar "Importar CSV"

Verificar UX del fallback:
  - El error es claro y orientativo, no técnico
  - El archivo NO se pierde — el usuario no tiene que seleccionarlo de nuevo
  - El CSV sigue disponible sin restricción (zona de drag acepta CSV también)

---

PRUEBA 5.9 — Badge IA en lista de extractos

Dónde: Lista izquierda de Conciliación

Prerequisito: tener al menos un extracto importado via PDF y uno via CSV.

Pasos:
  1. Observar la lista de extractos con ambos tipos

Resultado esperado:
  - El extracto importado vía PDF muestra el chip "✨ IA" pequeño y violeta
  - El extracto importado vía CSV NO muestra ese chip
  - Ambos tienen el mismo chip de estado (PENDIENTE/PARCIAL/CONCILIADO)
  - Hacer click en cualquiera de los dos funciona igual — el panel derecho muestra las líneas

---

PRUEBA 5.10 — Verificar calidad de detección por banco

Dónde: Panel derecho del extracto importado vía PDF

Esta prueba verifica que la IA detecta correctamente el formato de cada banco.

Para Banco Continental:
  - Las columnas "Día Hora | Movimiento | Descripción | Debe | Haber | Saldo" se interpretan correctamente
  - Los movimientos con valor en columna "Debe" → tipo DEBITO (egreso)
  - Los movimientos con valor en columna "Haber" → tipo CREDITO (ingreso)
  - Verificar al menos 3 filas comparando con el PDF
  - El campo "Ref." muestra el número de movimiento del banco (ej: "56 346872 95-CM-SYS")

Para Ueno Bank:
  - Las columnas "Fecha | Comprobante | Concepto | Importe | Saldo" se interpretan correctamente
  - Importes negativos → DEBITO, positivos → CREDITO
  - El campo "Ref." muestra el número de comprobante (ej: "7795057")
  - Conceptos multi-línea del PDF se unifican en una sola línea de concepto

Posibles diferencias admisibles (no son errores):
  - La IA puede no detectar el saldo acumulado — solo detecta el importe del movimiento (correcto)
  - Montos de varios dígitos: "18.500.000" debe aparecer como 18500000 (sin puntos de miles)
  - Si un importe aparece incorrecto (ej: "6" en vez de "6.578"): es un problema de OCR del PDF —
    desconciliar esa línea, editar manualmente el monto, y reportarlo

---

PRUEBA 5.11 — Drag & drop en mobile/tablet

Dónde: Modal de importación en dispositivo móvil o ventana reducida (< 700px)

Pasos:
  1. Abrir el modal en mobile
  2. Verificar que la zona de drag & drop muestra el botón "Seleccionar archivo"
  3. Tocar el botón → se abre el selector de archivos nativo del dispositivo
  4. Seleccionar un PDF

Resultado esperado:
  - El flujo funciona igual que en desktop: IDLE → PROCESANDO → PREVIEW → Listo
  - El modal es scrolleable si el contenido es largo
  - Los botones de acción son tocables (tamaño mínimo 44px)

---

PRUEBA 5.12 — Marcar línea como "Sin correspondencia"

Dónde: Panel derecho del extracto → línea pendiente (⚪)

Caso de uso típico: el banco débita una comisión de mantenimiento o cargo por transferencia
que no tiene (ni va a tener) un movimiento en el sistema — no tiene sentido crear un movimiento
solo para conciliarla.

Pasos:
  1. Seleccionar un extracto con al menos una línea pendiente
  2. En la fila de una línea pendiente, observar los 3 botones disponibles:
     - "Conciliar" → para vincular con un movimiento existente
     - "+ Mov."    → para crear un movimiento nuevo (PRUEBA 5.13)
     - Ícono 🚫 (Block) → para marcar como sin correspondencia
  3. Click en el ícono 🚫 de la línea que representa, por ejemplo, una comisión bancaria

Resultado esperado:
  - La línea cambia a fondo amarillo tenue (modo claro) o amarillo oscuro (modo oscuro)
  - El ícono de la línea cambia de ⚪ a 🚫 (Block gris)
  - Debajo de la descripción aparece el texto en cursiva: "Sin correspondencia"
  - Los 3 botones de acción desaparecen — aparece solo el ícono de cadena rota (LinkOff)
    para desmarcar si fue un error
  - El contador "Sin corresp." aparece en el header (si antes era 0, ahora muestra 1)
  - El contador "Pendientes" baja en 1
  - Si era la última línea por resolver: el estado del extracto cambia a "Conciliado"

---

PRUEBA 5.12.B — Desmarcar una línea "Sin correspondencia"

Pasos:
  1. Sobre una línea marcada como "Sin correspondencia"
  2. Click en el ícono de cadena rota (LinkOff) que aparece en la columna de acción

Resultado esperado:
  - La línea vuelve al estado pendiente (⚪, fondo normal)
  - Vuelven a aparecer los 3 botones: "Conciliar", "+ Mov.", 🚫
  - El contador "Sin corresp." baja en 1
  - El contador "Pendientes" sube en 1
  - El estado del extracto puede regresar de "Conciliado" a "Parcial"

---

PRUEBA 5.13 — Crear un movimiento directamente desde una línea pendiente

Dónde: Panel derecho del extracto → línea pendiente (⚪) → botón "+ Mov."

Caso de uso típico: hay una línea del banco que representa un movimiento real (ej: un depósito
recibido, una comisión, un pago) que todavía no fue registrado en el sistema. En vez de salir
a Movimientos a crearlo y luego volver a conciliar, se puede hacer todo desde aquí.

Pasos:
  1. En la fila de una línea pendiente, click en el botón "+ Mov."
  2. Se abre un diálogo "Registrar movimiento para esta línea" con:
     - Banner azul con la descripción, fecha, y monto de la línea del banco
       (ej: "TRF.INTRBN.SPI-... | 05/04/2026 — Débito: 1.647.000")
     - Selector de Categoría (obligatorio)
     - Campo de Descripción (opcional — por defecto toma la descripción de la línea)
  3. Seleccionar una categoría (ej: "Gasto bancario" para comisiones, "Egreso Otro" para gastos)
  4. (Opcional) Modificar la descripción
  5. Click en "Crear y conciliar"

Resultado esperado:
  - El diálogo se cierra
  - Toast verde: "Movimiento creado y línea conciliada"
  - La línea cambia a ✓ verde con el movimiento recién creado visible en la columna "Movimiento vinculado"
  - El saldo de la cuenta se actualiza (ingreso o egreso según corresponda)
  - En tab Movimientos aparece el nuevo movimiento en estado CONFIRMADO

Verificar el tipo de movimiento creado:
  - Si la línea tiene valor en columna "Débito" → el movimiento es EGRESO
  - Si la línea tiene valor en columna "Crédito" → el movimiento es INGRESO
  - El monto del movimiento es exactamente el monto de la línea del banco
  - La fecha del movimiento es la fecha de la línea del banco

Verificar que NO se puede usar en línea ya conciliada:
  - En una línea con ✓ verde, los botones "+ Mov." y 🚫 no aparecen — solo el LinkOff para desconciliar

---

PRUEBA 5.14 — Saldo banco con detección automática vía IA

Dónde: Header del panel derecho al seleccionar un extracto importado vía PDF

Resultado esperado:
  - El header muestra "Saldo banco (GS): X → Y" donde:
    - X = saldo inicial detectado por la IA del encabezado del PDF (o ingresado manualmente)
    - Y = saldo final detectado por la IA del pie del PDF (o ingresado manualmente)
    - La moneda se toma de la cuenta bancaria vinculada (GS, USD, etc.)
  - Si la IA no detectó el saldo inicial/final → muestra "0 → 0"
    (esto ocurre si el PDF no incluía esa información o la IA no la encontró)
  - Si el usuario ingresó manualmente saldo inicial/final en el formulario antes de procesar →
    esos valores tienen prioridad sobre los detectados por la IA

Verificar con extracto de Banco Continental:
  - El PDF incluye "Saldo anterior" al inicio y "Saldo actual" al final
  - Estos valores deben aparecer correctamente en el header del extracto

---

PRUEBA 5.15 — Editar importe o fecha detectado por IA (preview editable)

Dónde: Modal de importación PDF → estado PREVIEW (tabla de movimientos detectados)

Caso de uso típico: la IA detectó "6" en vez de "6.578.000" por un problema de OCR en el PDF,
o la fecha de un movimiento aparece un día corrida respecto al extracto impreso.

Pasos:
  1. Importar un PDF con IA (seguir prueba 5.7) hasta llegar al estado PREVIEW
  2. Identificar una fila con un monto o fecha incorrecto (comparar con el PDF)
  3. Hacer click en la celda de "Fecha" de esa fila (solo filas en estado "Pendiente", no "Auto-conciliado")
     → La celda se convierte en un input type="date"
  4. Editar la fecha y presionar Enter o hacer click fuera de la celda
  5. Hacer click en la celda del monto (Débito o Crédito según corresponda)
     → La celda se convierte en un input numérico
  6. Corregir el monto y presionar Enter o hacer click fuera
  7. Hacer click en "Listo — ver extracto"

Resultado esperado:
  - La celda muestra el nuevo valor inmediatamente después de editar (actualización local)
  - El cambio se persiste en la BD — al reabrir el extracto los valores editados se mantienen
  - Las celdas "Auto-conciliado" no son editables (click no abre input)
  - Si se presiona Escape durante la edición, el valor original se mantiene
  - El botón "Listo — ver extracto" sigue funcionando normalmente después de editar

Verificar en el extracto resultante:
  - El movimiento editado aparece con el monto/fecha corregidos
  - El auto-match no se ve afectado en los movimientos ya conciliados

---

PRUEBA 5.16 — Reporte de diferencias / Partidas en tránsito

Dónde: Panel derecho del extracto → botón "Diferencias ⚠" en el header

Caso de uso típico: cerrar la conciliación del mes requiere identificar qué movimientos del banco
no están en el sistema todavía (partidas en tránsito) y qué movimientos del sistema
no aparecieron en el extracto bancario aún.

Prerequisito: tener un extracto con al menos algunas líneas pendientes y al menos un movimiento
              confirmado en el sistema para la misma cuenta y período que no tiene línea vinculada.

Pasos:
  1. Seleccionar un extracto en la lista izquierda
  2. En el header del panel derecho, hacer click en "Diferencias ⚠" (botón naranja/outlined)
  3. El panel cambia de la vista de líneas a la vista de diferencias
  4. Observar las dos secciones:
     - "En banco, no en sistema (N)" — color rojo
     - "En sistema, no en banco (N)" — color naranja

Resultado esperado:

  Sección "En banco, no en sistema":
  - Lista de líneas del extracto que están pendientes (ni conciliadas ni sin correspondencia)
  - Columnas: Fecha | Descripción | Débito | Crédito
  - Si no hay ninguna línea pendiente: "Sin partidas pendientes en extracto."

  Sección "En sistema, no en banco":
  - Lista de movimientos CONFIRMADOS de esa cuenta en el período del extracto
    que NO tienen ninguna línea del extracto vinculada
  - Columnas: Fecha | Descripción | Categoría | Tipo (chip INGRESO/EGRESO) | Monto
  - Si todos los movimientos del sistema tienen su línea: "Sin movimientos del sistema sin conciliar en este período."

  Botón "← Líneas" — vuelve a la vista normal de líneas del extracto

---

PRUEBA 5.17 — Parsers CSV específicos por banco

Dónde: Modal de importación → archivo CSV de banco

Caso de uso: cada banco entrega el extracto en un formato diferente (columnas, separadores,
nombres de encabezados, filas de metadata). El sistema detecta automáticamente el formato
por los encabezados del CSV sin que el usuario tenga que configurar nada.

Banco Continental — formato detectado:
  - Encabezado esperado: Fecha;Descripcion;Debe;Haber;Saldo (o similar)
  - Separador: ";" (punto y coma)
  - Fecha: DD/MM/YYYY o DD/MM/YYYY HH:MM:SS (el sistema extrae solo la fecha)
  - Créditos → columna "Haber", débitos → columna "Debe"
  
Banco BNF — formato detectado:
  - Encabezado esperado: Fecha;Descripcion;Importe;Saldo (columna Importe única con signo)
  - Separador: ";" (punto y coma)
  - Montos negativos en "Importe" → débito; positivos → crédito

Banco Itaú — formato detectado:
  - Encabezado esperado: Fecha;Descripcion;Débitos;Créditos;Saldo
  - Separador: ";" (punto y coma)
  - Columnas separadas para débitos y créditos

Banco Sudameris — formato detectado:
  - Similar a Continental con columnas Debe/Haber

Pasos generales:
  1. Descargar el extracto CSV desde el homebanking del banco correspondiente
  2. En el modal de importación, seleccionar la cuenta y arrastrar el CSV
  3. Verificar el contador de líneas ("N líneas detectadas")
  4. Completar período (obligatorio para CSV), saldo inicial y final (opcionales)
  5. Click en "Importar CSV"

Resultado esperado para cualquier banco:
  - El contador de líneas muestra un número > 0 (el CSV fue parseado correctamente)
  - Después de importar, el extracto muestra las líneas con fechas y montos correctos
  - Los débitos aparecen en la columna "Débito" y créditos en la columna "Crédito"
  - El auto-match intenta cruzar con movimientos del sistema normalmente
  - Si el CSV tiene filas de metadata antes del encabezado (ej: nombre del banco, período),
    el sistema las ignora automáticamente y detecta la primera fila con "Fecha" como encabezado

Resultado negativo (si falla el parsing):
  - Toast rojo: "El CSV no contiene líneas válidas"
  - El modal vuelve a estado IDLE — el usuario puede revisar el archivo y volver a intentar
  - Posibles causas: el CSV tiene columna de fecha con nombre no reconocido, o el archivo
    no es texto sino está codificado en formato propietario

---

Notas generales

- Los movimientos en estado "Confirmado" solo se pueden anular, no editar
- Los movimientos en estado "Anulado" son solo lectura
- Un movimiento borrador puede editarse o eliminarse antes de confirmar
- El saldo de la cuenta siempre refleja solo los movimientos "Confirmados" activos
- La integración contable es silenciosa: si falla (sin período abierto, sin cuenta mapeada), el movimiento
  igual se confirma y el saldo se actualiza — solo se omite el asiento. Ver logs del servidor para diagnóstico.
- El extracto muestra solo movimientos CONFIRMADOS — los borradores y anulados no aparecen

Notas específicas de la importación PDF con IA

- La IA funciona con cualquier PDF de banco que tenga texto seleccionable (no PDFs escaneados sin OCR)
- Tamaño máximo del PDF: 15 MB
- El proceso demora entre 5 y 25 segundos según el largo del extracto y el proveedor de IA configurado
- Los saldos acumulados columna a columna del banco NO se importan — solo el importe de cada movimiento.
  El saldo de la cuenta en el sistema se recalcula correctamente igual, porque viene de los movimientos registrados.
- Si la IA no detecta transacciones (PDF vacío, escaneado, o protegido): el backend devuelve un error descriptivo
  y el usuario puede usar CSV como alternativa
- La IA hace un solo reintento automático si el primer resultado tiene formato incorrecto — si ambos fallan,
  el error se muestra al usuario sin registrar nada en la BD
- PDFs de múltiples páginas se procesan completos: el texto se extrae de todas las páginas antes de enviarse a la IA
- Los extractos importados vía PDF son funcionalmente idénticos a los importados vía CSV —
  se pueden conciliar, desconciliar, filtrar y eliminar exactamente igual
- El badge "✨ IA" es visual únicamente — identifica el origen del extracto pero no cambia su comportamiento

Notas específicas de cierre de conciliación (Sin correspondencia / Crear movimiento)

- Una línea marcada como "Sin correspondencia" cuenta como "cerrada" a los efectos del estado del extracto:
  si todas las líneas están conciliadas o marcadas como sin correspondencia, el extracto pasa a "Conciliado"
- El movimiento creado desde una línea nace directamente en estado CONFIRMADO y actualiza el saldo de la cuenta
  de inmediato — no pasa por estado Borrador
- Para producción: antes de ejecutar las pruebas de conciliación, asegurarse de haber corrido las migraciones:
    npx prisma migrate deploy
  (incluye 20260620_conciliacion_sin_correspondencia que agrega la columna sin_correspondencia)

---

PRUEBA 5.18 — Exportación Excel de reportes

Aplica a: Tesorería → Reportes

PRUEBA 5.18.1 — Posición de Caja Excel
Pasos:
  1. Ir a Reportes → Posición de Caja
  2. Click en el botón de descarga Excel (ícono de hoja de cálculo)
Resultado esperado:
  - Se descarga "posicion-caja.xlsx"
  - El archivo tiene una hoja con las cuentas agrupadas por moneda
  - Cada fila muestra: Cuenta, Tipo, Moneda, Saldo

PRUEBA 5.18.2 — Cash Flow Real Excel
Pasos:
  1. Ir a Reportes → Cash Flow Real, seleccionar un rango de fechas
  2. Click en "Descargar Excel"
Resultado esperado:
  - Se descarga "cash-flow-real-YYYY-MM-DD.xlsx"
  - 3 hojas: Resumen (totales por fecha), Por Categoría, Movimientos (listado detallado)

PRUEBA 5.18.3 — Extracto de Cuenta Excel
Pasos:
  1. Ir a Reportes → Extracto de Cuenta, elegir cuenta y rango
  2. Click en "Descargar Excel"
Resultado esperado:
  - Se descarga "extracto-YYYY-MM-DD.xlsx"
  - Hoja Resumen (saldo inicial/final) + hoja Extracto (movimientos con saldo acumulado)

PRUEBA 5.18.4 — Cartera de Cheques Excel
Pasos:
  1. Ir a Reportes → Cartera de Cheques
  2. Click en "Descargar Excel"
Resultado esperado:
  - Se descarga "cartera-cheques.xlsx"
  - Hoja Resumen (totales por estado) + hoja Cheques (listado completo)

---

PRUEBA 5.19 — Reglas automáticas de tesorería

Aplica a: Tesorería → Configuración → Reglas automáticas

PRUEBA 5.19.1 — Crear regla
Pasos:
  1. Ir a Configuración → tab "Reglas automáticas"
  2. Click en "Nueva regla"
  3. Seleccionar tipo: "Cobro depositado en cuenta"
  4. Seleccionar cuenta de tesorería (ej: Cuenta Banco X)
  5. Modo: Automático
  6. Click "Guardar"
Resultado esperado:
  - La regla aparece en la tabla con el tipo, cuenta, modo y estado "Activa"
  - Toast: "Regla guardada"

PRUEBA 5.19.2 — Editar regla
Pasos:
  1. Click en el ícono de edición de la regla creada
  2. Cambiar Modo a "Confirmación"
  3. Click "Guardar"
Resultado esperado:
  - La regla se actualiza — chip de modo cambia a amarillo "CONFIRMACION"

PRUEBA 5.19.3 — Intentar crear regla duplicada
Pasos:
  1. Click "Nueva regla", seleccionar el mismo tipo de operación que ya existe
  2. Seleccionar otra cuenta, Guardar
Resultado esperado:
  - La regla existente se actualiza (upsert por tipo_operacion único por empresa)
  - No se crea un duplicado

PRUEBA 5.19.4 — Eliminar regla
Pasos:
  1. Click en el ícono de eliminar de una regla
  2. Confirmar en el diálogo
Resultado esperado:
  - La regla desaparece de la tabla, toast: "Regla eliminada"

---

PRUEBA 5.20 — Reversa automática al rechazar cheque de tercero depositado

Aplica a: Tesorería → Cheques → cheque en estado DEPOSITADO

Pasos:
  1. Tener un cheque de tercero en estado DEPOSITADO (fue depositado con movimiento de ingreso)
  2. Ir a la acción "Rechazar" en ese cheque
  3. Ingresar motivo de rechazo
  4. Confirmar

Resultado esperado:
  - El cheque pasa a estado RECHAZADO
  - Se crea automáticamente un movimiento EGRESO con:
      * Monto: igual al monto del cheque original
      * Cuenta: la misma cuenta donde se depositó
      * Categoría: "Cheque rechazado" (creada automáticamente si no existe)
      * origen_tipo: CHEQUE_RECHAZADO
      * Estado: CONFIRMADO (impacta saldo de inmediato)
  - El saldo de la cuenta disminuye por el monto del cheque
  - En el log de auditoría del cheque aparece: reversa_movimiento_id con el ID del nuevo movimiento

Resultado negativo (cheque en estado diferente a DEPOSITADO):
  - El cheque simplemente se rechaza sin crear movimiento de reversa
  - El saldo de la cuenta no cambia (no había afectado al depositarlo)

