---
audiencia: usuario
screen_key: cobranzas
titulo: Cobranzas
aliases: [cobranza, cobranzas, mora, mora avanzada, mora legal, gestion de mora, mesa de gestion, mesa de gestión, gestor de oficina, cobrador de oficina, cobrador de ruta, telemarketing, cobranza telefonica, worklist morosos, promesa de pago, promesas, promesa, refinanciacion, refinanciación, autorizacion descuento, exoneracion mora, interes moratorio, interes fiscal, productividad cobradores, hoja de ruta, gestion cobranza, gestión cobranza, gestion campo, novasis cobros, app cobradores]
---

# Cobranzas — Guía para el Usuario

Esta guía cubre todo el módulo **COBRANZAS** de Novasis: desde el contacto diario con clientes morosos (Mesa de Gestión), pasando por la mora con tratamiento legal (Mora avanzada), promesas de pago, autorizaciones de descuento/exoneración, intereses moratorios con comprobante fiscal, refinanciaciones, hasta el flujo del cobrador de ruta en la app móvil.

> El módulo se reorganizó en junio de 2026. Si estás acostumbrado al sidebar anterior, leé la sección **Reorganización del sidebar (2026-06-22)** abajo: el ítem "Promesas" se movió como tab dentro de Mesa de Gestión, y "Gestión de Mora" se renombró a "Mora avanzada (legal)".

---

## ¿Dónde encuentro esto en el menú?

### Sidebar Cobranzas (web)

- **Cobros** — registrar el cobro de una cuota (existente, con banner de promesas vigentes y aplicación automática de interés/mora).
- **Recibos** — listado de recibos emitidos.
- **Cuentas por Cobrar** — Revisión CxC + Saldos a Favor.
- **Mesa de Gestión** ⭐ — pantalla operativa diaria del gestor de oficina (worklist priorizada + tab Promesas).
- **Mora avanzada (legal)** — expedientes formales con doble autorización, antes llamado "Gestión de Mora".
- **Cobradores** — Hoja de Ruta (permite asignar cobrador cliente por cliente a los que figuran "sin cobrador"). La asignación masiva de cartera es una pantalla aparte: **Finanzas → Asignación**.
- **Autorizaciones** — descuentos de capital y exoneraciones de mora (acceso directo al Panel Supervisor).

### Reportes Cobranzas (centro de Reportes)

- **Reporte por Cobrador** (pantalla propia).
- **Reporte de Rendiciones** → tabs internas **Cobranzas del día / Pendientes / Diferencias / Comisiones a liquidar**.
- **Cumplimiento de Promesas**.
- **Productividad de Cobradores** (Submódulo 7).
- **Intereses Cobrados** (fiscal).

### Configuración

- **Cobranzas → Configuración de Mora** — política de interés (tasa, días de gracia, mínimo/máximo). Solo aparece si la empresa tiene activos `ADM_INTERES_MORA` y `COB_GMR` simultáneamente.
- **Cobranzas → Intereses moratorios (fiscal)** — punto de expedición + timbrado para emitir facturas de mora. Solo aparece si la empresa tiene `COB_INTERESES_MORATORIOS` activo y el usuario tiene `COB_INT_CONFIG_VER`.

### App móvil (Novasis Cobros)

- **Inicio** — KPIs del día, accesos a Nuevo cobro, Rendir, **Mis rendiciones**, **Mi agenda**.
- **Cobros** — buscar cliente, estado de cuenta, registrar cobro o visita sin cobro.
- **Clientes**, **Reportes**, **Ajustes**.

---

## Conceptos generales

### Las dos personas de la cobranza

Esta es la decisión más importante para entender el módulo. La cobranza se organizó en **dos roles operativos distintos**:

| Rol | Dónde trabaja | Qué hace |
|---|---|---|
| **Gestor de oficina** (telemarketing) | Web pos-ventas → Mesa de Gestión | Llama, manda WhatsApp, registra gestiones digitales, agenda promesas. Trabaja una bandeja priorizada. |
| **Cobrador de ruta** | App móvil Novasis Cobros | Visita físicamente, cobra con efectivo/cheque/transferencia, imprime ticket. |

La **Mesa de Gestión** (web) es el punto de entrada del gestor de oficina. La **app móvil** es el punto de entrada del cobrador de ruta. Cualquiera de los dos puede registrar gestiones — la diferencia es el canal y el contexto operativo.

### Mesa de Gestión vs. Mora avanzada (legal)

Ambas miran al mismo cliente moroso, pero son **flujos distintos**:

| Aspecto | Mesa de Gestión | Mora avanzada (legal) |
|---|---|---|
| Audiencia | Gestor de oficina (operativo diario) | Supervisor / legales |
| Frecuencia | Diaria, todo el día | Esporádica (solo casos pesados) |
| Naturaleza | Contacto informal (verbal, WhatsApp) | Expediente formal con estados |
| Estados | Sin estados | `GESTION_INTERNA → INFORMCONF → DEMANDA → INCOBRABLE / RECUPERADA / REFINANCIADA / AL_DIA` |
| Autorización | No requiere | Doble autorización para `DEMANDA` e `INCOBRABLE` |
| Documentos | Solo observaciones | Adjuntos obligatorios para algunos estados (carta documento, pagaré, etc.) |
| PDF | No | Expediente PDF con historial completo |

> **Regla**: contacto cotidiano = Mesa. Caso que ya pasó a legal o requiere expediente formal = Mora avanzada.

### Tipos de gestión y resultados

Cada gestión registrada (sea desde Mesa web o app móvil) tiene un **tipo de canal** y un **resultado**.

**Tipos** (`CobTipoGestion`): `VISITA | LLAMADA | WHATSAPP | EMAIL | SMS | OTRO`.

**Resultados** (`CobResultadoGestion`):

| Código | Significado | Considera "efectiva" |
|---|---|---|
| `COBRADO_TOTAL` | Se cobró toda la cuota/factura | Sí |
| `COBRADO_PARCIAL` | Se cobró menos del total | Sí |
| `PROMESA_PAGO` | Cliente se comprometió a pagar en fecha | Sí |
| `NO_ATIENDE` | No respondió la llamada / mensaje | No |
| `CLIENTE_AUSENTE` | No estaba en la casa / oficina | No |
| `DIRECCION_INCORRECTA` | Datos de contacto erróneos | No |
| `CLIENTE_DISPUTA` | El cliente discute la deuda | No |
| `RECHAZO_PAGAR` | El cliente se negó a pagar | No |
| `COMPROMISO_LLAMADA_POSTERIOR` | Pidió que se lo llame después | No |
| `CLIENTE_FALLECIDO` | El deudor falleció | No |
| `OTRO` | Cualquier otra situación | No |

La **tasa de efectividad** (reporte de productividad) = efectivas / total.

### Promesa de pago — Opción A unificada

Una **promesa** es un compromiso del cliente de pagar en una fecha futura. La decisión clave de junio 2026 fue **unificar promesa con gestión** (Opción A):

- **Antes**: el operador registraba una gestión simple "PROMESA_PAGO" con fecha + monto. Más tarde, en otro flujo, podía cargar una promesa "formal" con cuotas seleccionadas, evidencia, pagador. Resultado: datos inconsistentes entre ambas.
- **Ahora**: cuando el operador elige **resultado = PROMESA_PAGO** en el modal de gestión, el modal **expande** con:
  - Selector de cuotas a comprometer (con botones "Solo vencidas" / "Todas" / "Limpiar")
  - Fecha prometida (default hoy + 7)
  - Monto prometido (auto-calculado del saldo de cuotas, editable con prorrateo)
  - Tipo de evidencia: `VERBAL | WHATSAPP | EMAIL | DOCUMENTO_FIRMADO`
  - Pagador: `CLIENTE | GARANTE | TERCERO` (con autocomplete de cliente si no es CLIENTE)
- **Una sola transacción** crea la gestión + **N promesas** (una por cuota seleccionada) con prorrateo del monto por saldo de cada cuota.

> El tab "Promesas de pago" dentro de Mesa de Gestión sigue ofreciendo "Nueva promesa" para casos atípicos (cliente avisó por email sin gestión asociada, carga histórica, etc.).

### Estados de la promesa

| Estado | Significado |
|---|---|
| `pendiente` | Vigente, fecha prometida en el futuro o hoy |
| `cumplida` | Cliente pagó el monto prometido |
| `cumplida_parcial` | Pagó menos del comprometido pero algo se cobró |
| `incumplida` | Fecha pasó sin pago — la marca un job o el operador |
| `cancelada` | Anulada manualmente con motivo |
| `renegociada` | Reemplazada por nueva promesa (se crea otra con `promesa_origen_id`) |

El sistema envía **recordatorio automático** vía Twilio un día antes de la fecha prometida (campo `fecha_recordatorio` = `fecha_prometida - 1`).

### Worklist priorizada (Mesa de Gestión)

El **score de prioridad** se calcula en backend con CTEs (no se persiste por cliente — se computa por request):

| Componente | Peso |
|---|---|
| Días máximos vencidos (normalizado a 90d) | 50% |
| Días sin gestión (normalizado a 30d) o "nunca gestionado" | 25% |
| Promesas incumplidas (hasta 3) | 15% |
| Saldo vencido (normalizado a 10M) | 10% |

Resultado: 0-100. Chip rojo si ≥70, naranja si ≥40, azul si <40.

Filtros disponibles:
- Búsqueda libre (razón social, RUC, CI, nombre fantasía)
- Zona
- Mora mínima en días
- Sin gestión hace ≥ N días
- Solo promesas incumplidas
- Solo mis gestiones (las del usuario actual)
- Estado: Todos / Por contactar (>7d sin gestión) / En gestión (<7d) / Con promesa vigente

Órdenes: `prioridad | vencimiento | saldo | sin_gestion`.

### Mora avanzada — máquina de estados

| Estado | Transiciones permitidas | Requiere documento | Doble autorización |
|---|---|---|---|
| `AL_DIA` | → `GESTION_INTERNA`, `REFINANCIADA` | No | No |
| `GESTION_INTERNA` | → `INFORMCONF`, `DEMANDA`, `RECUPERADA`, `REFINANCIADA`, `AL_DIA` | No | No |
| `INFORMCONF` | → `DEMANDA`, `RECUPERADA`, `REFINANCIADA` | No | No |
| `DEMANDA` | → `INCOBRABLE`, `RECUPERADA`, `REFINANCIADA` | **Sí** | **Sí** |
| `INCOBRABLE` | → `RECUPERADA` | **Sí** | **Sí** |
| `RECUPERADA` | → `AL_DIA`, `GESTION_INTERNA` | No | No |
| `REFINANCIADA` | → `AL_DIA`, `GESTION_INTERNA` | No | No |

Las transiciones se auditan en `cob_gestion_mora_historial`. Si el cliente paga toda la deuda, un hook automático transiciona todas sus gestiones activas a `RECUPERADA` (`autoRecuperarPorCliente`).

### Intereses moratorios — IVA INCLUIDO vs POR_FUERA

La empresa puede emitir **comprobante fiscal separado** por el interés cobrado. Hay dos modos de IVA:

| Modo | Cuándo usarlo | Cálculo |
|---|---|---|
| `INCLUIDO` | Default. El monto declarado en la fórmula ya incluye IVA | `iva = monto - monto / (1 + tasa/100)` |
| `POR_FUERA` | El cliente quiere ver el IVA separado | `iva = monto * tasa / 100` |

Si la tasa de IVA es `0` (cliente exento), se emite el comprobante con IVA exento sin tocar la fórmula.

### Autorizaciones de descuento

Cuando el cobrador necesita aplicar un descuento sobre capital o exonerar mora, lo solicita y un supervisor aprueba. Hay dos modalidades:

| Modalidad | Quién la crea | Vencimiento |
|---|---|---|
| **Solicitud del cobrador** | El cobrador en el flujo de Cobros | 30 días desde aprobación |
| **Descuento admin directo** | El supervisor crea sin solicitud previa | Configurable, default 30 días |

El supervisor aprueba/rechaza desde **Panel Supervisor → tab Descuentos** (acceso vía `Cobranzas → Autorizaciones` en el sidebar — redirige al Panel).

### Refinanciación (oculta del sidebar)

El submódulo de refinanciación está **completo en código pero oculto en el sidebar** desde 2026-06-22. La ruta `/cobranzas/refinanciaciones` sigue funcionando para deep links pero no se muestra en el menú. Para reactivar, descomentar el ítem en `dataEstatica.jsx`.

---

## Permisos y submódulos

### Submódulos del módulo COBRANZAS

| Submódulo | Cubre |
|---|---|
| `COB_COBROS` | Pantalla de cobros y registro de recibos |
| `COB_RECIBOS` | Listado y consulta de recibos |
| `COB_CUENTAS_COBRAR` | Cuentas por cobrar + saldos a favor |
| `COB_MESA_GESTION` | Mesa de Gestión (worklist priorizada) |
| `COB_WORKFLOW` | Workflow de gestiones (Submódulo 7) |
| `COB_GMR` | Mora avanzada (legal) |
| `COB_PROMESAS` | Promesas de pago |
| `COB_REF` | Refinanciaciones (oculto en sidebar) |
| `COB_INTERESES_MORATORIOS` | Intereses con comprobante fiscal |
| `COB_HOJA_RUTA` | Hoja de ruta del cobrador |
| `COB_AUTORIZACIONES` | Autorizaciones de descuento |
| `COB_ZONAS` | Zonas de cobranza |

### Privilegios principales

| Submódulo | Privilegios clave |
|---|---|
| `COB_MESA_GESTION` | `COB_MG_WORKLIST_VER`, `COB_MG_PASAR_A_RUTA`, `COB_MG_EXPORTAR` |
| `COB_WORKFLOW` | `COB_WFL_GESTION_VER / REGISTRAR / EDITAR / ANULAR`, `COB_WFL_REPORTE_PRODUCTIVIDAD`, `COB_WFL_VER_GESTIONES_AJENAS` |
| `COB_GMR` | `COB_GMR_GESTION_MORA_VER / REGISTRAR`, `COB_GMR_REPORTAR_INFORMCONF`, `COB_GMR_INICIAR_DEMANDA`, `COB_GMR_MARCAR_INCOBRABLE` |
| `COB_PROMESAS` | `COB_PRM_PROMESA_VER / CREAR / EDITAR / CANCELAR / RENEGOCIAR`, `COB_PRM_REPORTE_CUMPLIMIENTO` |
| `COB_INTERESES_MORATORIOS` | `COB_INT_CONFIG_VER / EDITAR`, `COB_INT_PREVIEW`, `COB_INT_VER`, `COB_INT_EXONERAR` |
| `COB_AUTORIZACIONES` | `COB_AUT_AUTORIZACION_VER / APROBAR / RECHAZAR` |

### Reglas de edición de gestión

- **Mismo día + autor**: el autor puede editar libremente.
- **Mismo día + otro usuario**: solo con `COB_WFL_GESTION_EDITAR` puede editar (rol supervisor).
- **Días posteriores**: solo el supervisor puede editar.
- **Anulación**: requiere `COB_WFL_GESTION_ANULAR` + motivo obligatorio.

---

## Pantalla: Mesa de Gestión

Pantalla principal del gestor de oficina. Acceso: **Cobranzas → Mesa de Gestión**.

### Layout

```
[Header: Mesa de Gestión + botón "Mora avanzada"]
[ScreenGuia colapsable con 4 pasos]
[6 KPIs: Clientes morosos / Saldo vencido / Sin gestión / +30d / +60d / +90d]
[Tabs: Bandeja de gestión | Mi agenda 🔴N | Promesas de pago]
[Filtros: search, zona, mora≥d, sin gestión≥d, orden, toggles "Promesas incumplidas" y "Mis gestiones"]
[Tabs internas de estado: Todos | Por contactar | En gestión | Con promesa vigente]
[Tabla worklist con acciones rápidas]
[Paginación centrada]
```

### Acciones rápidas por fila

| Ícono | Acción |
|---|---|
| 📞 | Discador (`tel:`) |
| 💬 (WhatsApp) | Link `wa.me/...` con mensaje precargado incluyendo razón social y saldo |
| 📋 | Registrar gestión (abre modal Opción A) |
| 👁 | Ver historial del cliente (drawer in-place — no navega) |

### Exportar Excel

Botón en el header. Genera XLSX con **dos hojas**:

1. **Detalle por cuota** (lo que el gestor usa para cobrar): Cliente, RUC, Cobrador, Zona, Tel/Cel, N° Factura, Fecha emisión, Moneda, Total factura, **Items facturados** (concatenados con `;`), N° Cuota, Vencimiento, Días vencidos, Monto cuota, Saldo pendiente. Autofilter activado.
2. **Resumen por cliente**: Cliente, RUC, Zona, Tel/Cel/Email, Saldo vencido, Facturas vencidas, Más antiguo desde, Días vencidos, Última gestión, Días sin gestión, Promesas vigentes/incumplidas, Prioridad, Gestionado por mí. Autofilter.

Cap del export: 20.000 filas por request (filtrado por los filtros activos en pantalla).

### Tab "Mi agenda" (2026-06-26)

Bandeja personal del usuario logueado con seguimientos cuya `proxima_fecha` cae en una ventana de 7 días. Endpoint: `GET /cobranzas/gestiones/mi-agenda?scope=mias|oficina`.

- **Bloques**: Vencidas (rojo) / Hoy (naranja) / Próximos 7 días (azul).
- **Filtro por defecto** `scope=mias`: lista gestiones donde `usuario_id` = usuario actual (típico para gestoras de oficina, que no son cobradoras).
- Switch interno `Mías ⇄ Toda la oficina` para supervisor.
- **Seguimiento atendido se oculta**: si después de registrar `proxima_fecha` el cliente ya tuvo otra gestión posterior, la entrada deja de aparecer.
- **Badge en la tab**: chip rojo con `vencidas + hoy` ("urgentes"). Polling cada 2 min. Se calcula en el backend (`totales.urgentes`).
- Cada fila muestra cliente, próxima acción, fecha, factura asociada y observación; el botón "Registrar" abre el modal de gestión precargado con ese cliente.

`cob_gestion` **no tiene relación Prisma nombrada** con `usuario` (sólo el FK escalar `usuario_id`). Tanto `miAgenda` como `getTimeline` resuelven `usuario_nombre` con un `prisma.usuario.findMany` separado + Map en memoria.

### Tab "Promesas de pago" embebida

Renderiza `PromesasListPage` dentro de la tab con: filtros (estado, fechas, cobrador, cliente), botón "Nueva promesa", acciones por fila (Cumplida / Incumplida / Renegociar / Cancelar), banner KPIs en el header. Cambios hechos acá refrescan también la worklist.

Refactor 2026-06-26:
- Reemplazada `StandardTable` por `Table` MUI plana con `tableLayout: "auto"` y sin `TableContainer` → **se eliminó el scroll horizontal** que aparecía por el ancho mínimo de la columna de acciones.
- **Click en cualquier celda de la fila → abre `ClienteHistorialDrawer`** con la ficha del cliente.
- Acciones de fila pasaron a un menú desplegable (`mdi:dots-vertical`).
- Paginación con `TablePagination` client-side, **centrada horizontalmente** (oculto el spacer + `justifyContent: center` en el toolbar). Default 25, opciones 10/25/50/100.
- La columna **Estado** muestra el chip + icono de evidencia (verbal/whatsapp/escrito) como un solo bloque, sin columna extra.
- El listado de cuotas en `PromesaPagoFormModal` ahora usa `<FacturaCuotasSelector />` — ver sección **"Selector de cuotas con detalle expandible"** más abajo.

### Selector de cuotas con detalle expandible

Nuevo componente reusable `components/cobranzas/promesas/FacturaCuotasSelector.jsx`, usado por:
- `PromesaPagoFormModal` (Registrar promesa)
- `RegistrarGestionModal` (sección "Detalle del compromiso de pago" cuando resultado = `PROMESA_PAGO`)

Funciona como el bloque de facturas de la **Nueva gestión de mora**:
- Agrupa las cuotas (recibidas planas desde `getCuotasPendientes`) **por factura**.
- Cada fila de factura tiene checkbox de cabecera (con `indeterminate` cuando hay selección parcial), chevron de expansión, número, fecha emisión, contador `X/N seleccionadas` o `N cuotas + chip "venc."`, saldo total.
- Al expandir, **Grid 5/7**:
  - **Izquierda**: items de la factura (cantidad × descripción × precio unitario × subtotal) consumidos desde `factura_cab.factura_det`.
  - **Derecha**: tabla detalle de cuotas con checkbox individual, número, vencimiento, chip de antigüedad/al día, monto original, saldo pendiente.
- Prop `compact` reduce fuentes para modales chicos (usado por la gestión).

La selección se mantiene a nivel **cuota** (no factura): el envío de la promesa sigue siendo por cuota (cada cuota genera una fila en `promesas_pago` con prorrateo proporcional si el monto total fue editado).

---

## Pantalla: Mora avanzada (legal)

Acceso: **Cobranzas → Mora avanzada (legal)**.

### Listado

- Filtros: cliente (autocomplete), estado, fecha desde / hasta.
- Tabla con paginación: cliente, estado (chip color-coded), monto involucrado, facturas, ingreso al estado, acciones (ver detalle, transicionar estado).
- Botón "Nueva gestión" + "Exportar Excel".

### Crear gestión de mora

1. Elegir cliente con cuotas vencidas.
2. Seleccionar las **facturas afectadas** (deben tener saldo pendiente).
3. Elegir el **estado inicial** (típicamente `GESTION_INTERNA`).
4. Monto involucrado (suma de saldos pendientes seleccionados).
5. Observación + adjuntos opcionales.

> El sistema bloquea si alguna factura ya está incluida en otra gestión activa del mismo cliente. Hay que cerrar la existente o agregarla a esa misma.

### Transicionar estado

- Click "Transicionar" → modal con opciones permitidas según la matriz.
- Si la transición es a `DEMANDA` o `INCOBRABLE`: **adjuntar documento** + **seleccionar usuario autorizador** (doble autorización obligatoria).
- Motivo siempre obligatorio.
- Se persiste en `cob_gestion_mora_historial` con `estado_anterior`, `estado_nuevo`, `motivo`, `usuario_id`, `documento_url`.

### PDF expediente

Botón "Generar PDF" en el detalle. Incluye datos de la empresa, cliente, gestión, todas las facturas con saldos snapshot y actual, timeline cronológico y placeholders para garantes (Submódulo 2 pendiente).

### Cierre automático

Cuando el cliente paga toda la deuda (saldo pendiente = 0), un hook (`autoRecuperarPorCliente`) llama desde el `CobrosService` al crear el recibo y transiciona automáticamente todas las gestiones activas del cliente a `RECUPERADA` con motivo "Auto-cierre: el cliente canceló la deuda".

### Job nocturno

Para clientes con cuotas vencidas hace más de 30 días (o `dias_mora_maximo` del cliente si está configurado) y sin gestión activa, abre automáticamente una gestión `GESTION_INTERNA` (`autoAbrirGestionesVencidas`).

---

## Pantalla: Cobros (con integración de promesas, mora e intereses)

### Banner de promesas vigentes

Cuando se selecciona un cliente en el wizard de cobro, el banner muestra:

- KPI header: cantidad de promesas + badge "N vencidas" + total por moneda
- Chips ordenados (vencidas primero) con factura, monto, fecha
- Link "Ver detalle →" que abre Mesa de Gestión filtrada al cliente

### Aplicación automática de mora

Al seleccionar cuotas vencidas en el wizard:

1. El sistema lee la `config_mora` de la empresa.
2. Calcula el interés por cuota: `monto × (tasa/100) × días_vencidos` (modificable según `tipo_calculo`: diario/mensual/fijo).
3. Aplica límites: `monto_mínimo_mora` y `monto_máximo_mora`.
4. Muestra el interés calculado + total a cobrar incluido.
5. El cobrador puede **solicitar exoneración total/parcial** de la mora si tiene permiso. El monto exonerado queda pendiente de aprobación del supervisor.

### Emisión del comprobante fiscal de interés

Si la empresa tiene el submódulo `COB_INTERESES_MORATORIOS` configurado:

1. Después de crear el recibo, el sistema emite una **factura electrónica separada** por el monto del interés cobrado.
2. Punto de expedición + timbrado dedicados (configurados en Configuración → Cobranzas → Intereses moratorios (fiscal)).
3. Vínculo bidireccional: el recibo guarda `factura_interes_id`, la factura guarda `recibo_origen_id`.
4. Si SIFEN rechaza, un job de retry reintenta cada hora (`@nestjs/schedule`).

### Cierre automático de promesas

Cuando se crea el recibo, `PromesasService.cerrarPorCobro` evalúa las cuotas pagadas:

- Saldo cuota = 0 → promesa pasa a `cumplida`
- Saldo > 0 + cuota recibió cobro → `cumplida_parcial`
- Saldo > 0 sin cobro → no se toca

Promesas factura-nivel (sin cuota específica) usan criterio agregado de saldo de la factura.

---

## App móvil — Novasis Cobros (cobrador de ruta)

### Login y dashboard

- Usuario + contraseña → selector de empresa si tiene >1 → Home.
- Home: KPIs Recaudado hoy / Recibos hoy + botones grandes:
  - **Nuevo cobro** (primario)
  - **Rendición** (entregar la cobranza del día)
  - **🧾 Mis rendiciones** (historial con estados)
  - **📅 Mi agenda** (gestiones agendadas para hoy con badge contador)

### Flujo de cobro mobile

1. Buscar cliente (debounce 450ms, botón ✕ para limpiar).
2. Estado de cuenta del cliente:
   - Banners de alerta en orden: 🔒 mora avanzada (bloquea cobro si INFORMCONF o DEMANDA) / ♻️ refinanciación activa / ⚠️ promesas incumplidas
   - Facturas pendientes con expand para ver cuotas
   - Botón **"📋 Registrar visita sin cobro"** siempre visible
3. Tap factura → modal con cuotas + selector de cuáles cobrar
4. Total a cobrar = capital + mora estimada − descuento autorizado (cuando aplique)
5. Tap "Cobrar" → pantalla NuevoCobro:
   - Resumen "Cobrando a X" con desglose capital / mora / total
   - Cuotas seleccionadas readonly
   - Checkbox **descuento autorizado** (pre-tildado si existe disponible)
   - Medio de pago: Giro / Efectivo / Cheque / Tarjeta crédito / Tarjeta débito / Transferencia
   - Monto recibido (precargado con neto sugerido)
   - Botón "Cobrar Gs. X" con total exacto

### Resultado de cobro

- Si el cliente pagó exacto → toast verde + ticket impreso (o cola si la impresora no está conectada).
- Si pagó más → línea "**Vuelto** Gs. X" en azul.
- Si pagó menos pero coincide con mora estimada → línea "**Aplicado a mora** Gs. X" en amarillo (no es vuelto, es intereses).

### Registrar visita sin cobro

Pantalla con grid de **7 botones grandes**:

- 🤝 Me prometió pagar (abre selector de cuotas + fecha + evidencia)
- 📞 No atiende
- 🚪 No estaba en la casa
- 🗺️ La dirección está mal
- ❌ Se negó a pagar
- 🔁 Me dijo que lo llame después (pide próxima fecha)
- ⚖️ Tiene un reclamo / disputa
- ✏️ Otra cosa

Submit envía `POST /mobile/gestiones` con idempotencia (Idempotency-Key). El resultado aparece en Mesa de Gestión web del gestor de oficina y en Mi agenda si tiene próxima fecha.

### Rendición de la cobranza

Pantalla principal: lista de recibos del día sin rendir + sección **"CÓMO RENDIR"** desglosada por medio de pago:

| Medio | Instrucción al cobrador |
|---|---|
| 💵 Efectivo | "Contá los billetes y monedas" |
| 📄 Cheques | "Entregá los cheques físicos" (lista nros de cheque) |
| 🏦 Transferencias | "Mostrá los comprobantes" |
| 💳 Tarjeta | "Mostrá los voucher" |
| 📱 Pago QR | "Mostrá los comprobantes" |

Cuando hay mora cobrada, el bucket del medio que la recibió muestra la nota **"incluye mora cobrada"** en amarillo. La distribución es pro-rata si la mora no se duplicó en `medios_pago_multi`.

Submit → idempotente → redirige automáticamente a `RendicionDetalle` con el estado real ("✏️ Sin enviar", "⏳ Esperando aprobación", etc.).

> **Cambio 2026-06-26**: el endpoint mobile `rendir` (`MobileCajaService.rendir`) ahora **crea la rendición y la promueve directo a `PENDIENTE`** llamando `enviarATesoreria` en cadena. El cobrador móvil no tenía web para promover BORRADOR→PENDIENTE, así que el supervisor la veía como borrador y nadie la mandaba. Ahora aparece directo en la cola de tesorería.

### Mis rendiciones

Listado de las propias rendiciones del cobrador con:

| Estado | Emoji | Label en español |
|---|---|---|
| BORRADOR | ✏️ | Sin enviar |
| PENDIENTE | ⏳ | Esperando aprobación |
| OBSERVADO | ⚠️ | La tesorería pidió aclarar algo |
| APROBADO | ✅ | Aprobada |
| RECHAZADO | ❌ | Rechazada |

Detalle: hero del estado + observación de tesorería destacada (si hay) + totales con diferencia color-coded + lista de recibos incluidos + historial con emojis.

### Mi agenda (mobile)

Lista de gestiones con `proxima_fecha` agendada. Cards con borde naranja resaltado para las de hoy + chip "📍 Hoy". Tap → navega a Estado de cuenta del cliente para registrar la nueva interacción.

> Es el equivalente mobile de la tab "Mi agenda" web — ambas consumen información de `cob_gestion.proxima_fecha`, pero la mobile se filtra por `cobrador_id` (endpoint `getProximasAccionesCobrador/:cobradorId`) mientras la web filtra por `usuario_id` (endpoint `mi-agenda`).

---

## Estado de cuenta del cliente (mobile)

### Último pago por factura

`mobile-cobros.service.ts:cuotasPendientes` enriquece cada `factura_cab` con `ultimo_pago: { fecha, monto, numero_recibo, cobrador } | null`. Se calcula con una query a `recibo_cobro_detalle` filtrando por `factura_cab_id ∈ facturas` y excluyendo recibos anulados; agrupa por `(factura, recibo)`, suma los montos del mismo recibo y guarda el recibo más reciente por factura. Para resolver el nombre del cobrador usa la relación `recibos_cobro.cobrador` (`vendedores_cobradores`) con fallback a `recibos_cobro.usuario` (nombres+apellidos o username).

En `EstadoCuentaScreen.tsx`:
- En la lista de facturas → línea chica abajo de "Emitida": `Último pago: 15 mar 2026 · ₲ 200.000 · Juan Pérez` (o `Sin pagos previos`).
- En el modal de cuotas de la factura → misma línea pero con número de recibo.

Sirve para responder al cliente "¿cuándo pagué la última vez?" sin tener que volver a la oficina.

### Cheque y transferencia simplificados (2026-06)

El payload del cobro desde la app se alineó con la web:
- **Cheque**: sólo `numero` (8 dígitos) + `banco_emisor` (texto libre, mín 4 caracteres). Se removió el dropdown de bancos, titular, fechas y flag diferido. Tipo `ChequeInput` tiene `banco_id` opcional.
- **Transferencia**: sin datos extra (la operadora declara comprobante físicamente).
- **Tarjeta**: sin datos extra.
- Se agregó `forma_pago: 'otro'` en `FormaPago`.

### Multi-cuota / multi-factura

Soportado de punta a punta:
- `EstadoCuentaScreen`: `seleccion: Set<string>` global por id de cuota — abarca cuotas de distintas facturas. `seleccionarTodasDeFactura` para conveniencia.
- Navegación a `NuevoCobro` con `cuotaIds: string[]` plano.
- `NuevoCobroScreen` envía a `/mobile/cobros/preview-distribucion` que reparte el monto recibido entre las cuotas (devuelve `distribucion: PreviewDistribucionItem[]` con pago completo/parcial por cuota y descuento aplicado).
- Persiste con `POST /mobile/cobros/crear-desde-distribucion`.

---

## Reportes

### Productividad de Cobradores

Acceso: **Reportes → Cobranzas → Productividad de Cobradores**.

- Filtros: desde / hasta (default: inicio de mes a hoy).
- KPIs: Cobradores activos / Total gestiones / Efectivas / Tasa efectividad global.
- Tabla por cobrador: total, efectivas, **chip de tasa color-coded** (verde ≥60%, ámbar ≥30%, rojo <30%), conteo por tipo y por resultado.
- Exportar Excel.

> Las gestiones efectivas = `COBRADO_TOTAL + COBRADO_PARCIAL + PROMESA_PAGO`.

### Cumplimiento de Promesas

Acceso: **Reportes → Cobranzas → Cumplimiento de Promesas**.

- KPI cards: Total / Cumplidas / Incumplidas / Tasa global / Monto cumplido.
- Tabla por cobrador con tasa color-coded.
- Cashflow proyectado en sección separada.

### Intereses Cobrados

Acceso: **Reportes → Cobranzas → Intereses Cobrados**.

- Detalle de intereses cobrados con comprobante fiscal en un rango.
- Diferencia entre lo cobrado y lo facturado (si SIFEN rechazó).

---

## Cosas a tener en cuenta — Configuración previa

### Para usar Mesa de Gestión

1. Activar submódulo `COB_MESA_GESTION` en el plan de la empresa.
2. Asignar a los usuarios gestores el privilegio `COB_MG_WORKLIST_VER`.
3. (Opcional) `COB_MG_EXPORTAR` para descargar Excel.
4. Asegurarse que los clientes tengan `cobrador_id` asignado en su ficha (sino, aparecen como "Sin cobrador asignado").

### Para usar Mora avanzada

1. Activar submódulo `COB_GMR`.
2. Privilegios mínimos a operativos: `COB_GMR_GESTION_MORA_VER / REGISTRAR`.
3. Privilegios sensibles (solo supervisores): `COB_GMR_INICIAR_DEMANDA / MARCAR_INCOBRABLE`.
4. **Doble autorización**: el sistema permite que el mismo usuario autorice, **no se valida** que sea distinto del que solicita. La separación es procedimental, no técnica.

### Para usar intereses moratorios fiscal

1. Activar `COB_INTERESES_MORATORIOS`.
2. En **Configuración → Cobranzas → Configuración de Mora**: tasa mensual, días de gracia, tipo de cálculo (diario/mensual/fijo), montos mínimo/máximo. Activar el flag general.
3. En **Configuración → Cobranzas → Intereses moratorios (fiscal)**:
   - Punto de expedición a usar para las facturas de interés
   - Timbrado vigente
   - Modo de IVA (`INCLUIDO | POR_FUERA`)
4. El sidebar **oculta** estos ítems si la empresa no tiene los submódulos activos.

### Para que el cobrador de ruta use la app móvil

1. Crear o usar un usuario en `usuario` con login configurado.
2. Vincularlo a un registro de `vendedores_cobradores` con `tipo IN ('cobrador', 'ambos')` y `active = true`. **El sistema valida que un usuario solo esté vinculado a un cobrador activo por empresa** (frontend deshabilita en select + backend rechaza con error explícito).
3. Asignar privilegios mobile: `COB_COB_COBRO_REGISTRAR`, `COB_WFL_GESTION_REGISTRAR`, `COB_RND_RENDICION_CREAR`, etc.
4. Compilar el APK con `cd /var/www/html/proyectos/novasis-print/android && ./gradlew assembleRelease`. El archivo sale como `novasis-cobros-vX.Y-release.apk`.

---

## Reorganización del sidebar (2026-06-22)

Cambios visibles que pueden confundir si veniste del sidebar anterior:

| Antes | Ahora |
|---|---|
| Sidebar tenía "Promesas" | "Promesas" **removido del sidebar**. Se accede como tab dentro de Mesa de Gestión. La ruta `/cobranzas/promesas` sigue activa para deep links. |
| "Gestión de Mora" | Renombrado a "**Mora avanzada (legal)**" para diferenciar de Mesa de Gestión. |
| "Refinanciaciones" | **Oculto** del sidebar pero código intacto. Ruta `/cobranzas/refinanciaciones` sigue funcionando. |
| Header Finanzas tenía botón "Panel Supervisor" | **Removido**. Acceso natural ahora es por sidebar "Cobranzas → Autorizaciones" (redirige al Panel Supervisor tab Descuentos). |
| "Cobradores" en sidebar | Sigue, pero la columna "Registrar" se eliminó de la Hoja de Ruta (los cobradores de ruta usan app móvil, no web). |

---

## Validaciones y mensajes del backend

### Mesa de Gestión

- **"Tu usuario no está vinculado a ningún vendedor/cobrador. Pedí a un administrador que te vincule en Contactos → Vendedores y Cobradores."** — al rendir o ver Mis rendiciones sin vinculación.
- **"Tu usuario está vinculado en otra empresa (…XXXX). Estás conectado en empresa …YYYY. Cambiá de empresa o pedí vinculación en ésta."** — si la vinculación existe pero en otra empresa.
- **"El vendedor/cobrador 'Nombre' está marcado como inactivo. Pedí que lo reactiven."**
- **"Tu usuario está vinculado pero solo como 'Vendedor'. Para rendir necesitás tipo 'Cobrador' o 'Ambos'."**

### Gestiones

- **"Resultado PROMESA_PAGO requiere promesa_fecha"** — falta la fecha en una promesa.
- **"Resultado PROMESA_PAGO requiere factura_cab_id o promesa_cuota_ids"** — en modo legacy se exige factura, en modo Opción A se exigen cuotas.
- **"Alguna cuota no existe o no pertenece al cliente/empresa"** — al crear promesa con cuotas que no son del cliente.
- **"Si el pagador no es CLIENTE, promesa_pagador_cliente_id es requerido"** — para garante/tercero hay que indicar el cliente que paga.
- **"Solo el autor puede editar dentro del mismo día"** — sin permiso supervisor, no se puede editar gestión ajena del mismo día.
- **"Gestión anulada, no se puede editar"**.

### Mora avanzada

- **"Las siguientes facturas ya están en una gestión activa: 001-001-0000123. Cierre la gestión existente o use 'Transicionar estado' antes de abrir una nueva."**
- **"El estado DEMANDA requiere adjuntar documento_url"**.
- **"El estado INCOBRABLE requiere doble autorización (autorizado_por_id)"**.
- **"Transición no permitida: GESTION_INTERNA → INCOBRABLE"** (no figura en la matriz).

### Vendedores/cobradores

- **"Este usuario ya está vinculado a otro vendedor/cobrador activo: 'NICO DACOSTA'. Liberalo de ahí antes de asignarlo acá."** — al crear/editar con un `usuario_id` ya tomado.

### Mobile rendición

- **"No hay recibos para rendir"** — el cobrador no tiene recibos sin rendir (estado `'emitido'` o `'CONFIRMADO'`, sin `rendicion_id`).
- **"Hay recibos anulados o ya rendidos en la selección: REC-XXX. Refrescá la lista y reintentá."** (2026-06-26) — `RendicionesService.create` ahora exige `estado: ReciboCobroEstado.EMITIDO` cuando el cliente envía `recibo_ids` explícitos. Cubre la race condition entre que el cobrador abre "Rendir" y el momento en que toca el botón (un recibo se anuló en el medio).

---

## Bug fixes destacados en rendiciones (2026-06)

### 1. Desglose por medio de pago mal categorizado

`RendicionesService.create` (líneas ~160-170) categorizaba mal los detalles legacy: hacía `codigo === 3 || codigo === 4 → tarjeta` y `codigo === 5 → transferencia`, pero la convención real (la usa `normalizarRendicion.codigoToMedio`) es `1=efectivo, 2=cheque, 3=tarjeta, 4=transferencia`. Las transferencias quedaban guardadas como tarjeta en los campos denormalizados `monto_*` de `rendiciones_cobranza`. El web los leía directos y mostraba mal; mobile recalculaba al vuelo y mostraba bien.

**Fix**: helper exportable `resolverMedio(codigo, descripcion)` arriba del archivo `rendiciones.service.ts`. Mapea códigos **1-8** (alineado con el cliente mobile: 5=transferencia, 6=cheque, 7=qr, 8=tarjeta) y como fallback hace **substring matching** sobre la descripción (`'transf'`, `'cheque'`, `'tarj'`, `'efectivo'`, `'qr'`). `create()` y `normalizarRendicion()` lo usan ambos. Las rendiciones viejas mal guardadas se siguen mostrando bien en el modal "Verificar rendición" porque ese modal lee `medios_pago_unificado` (recalculado en `findOne`), no las columnas denormalizadas.

### 2. Bucketing inverso 3↔4 en columnas denormalizadas

Aparte del helper permisivo de arriba, el swap puntual `codigo === 4 → montoTransferencia` (no `montoTarjeta`) quedó documentado por separado para casos donde se hayan abierto rendiciones nuevas tras el deploy y persistan rendiciones viejas. El usuario explícitamente pidió **no backfillear**: las nuevas guardan bien, las viejas quedan como están.

### 3. Recibos anulados se incluían en la rendición

`RendicionesService.create` filtraba `id ∈ recibo_ids` + `rendicion_id: null`, pero **no** `estado != anulado`. Si un recibo se anulaba entre el momento en que el cobrador abría "Rendir" y enviaba, su monto se incluía en `monto_cobrado` y `monto_efectivo/cheque/...`. Se agregó el filtro `estado: ReciboCobroEstado.EMITIDO` y un segundo lookup para devolver mensaje claro identificando los `numero_recibo` afectados.

### 4. Reporte de Cobranzas con desglose por medio de pago

- Backend `reporteCobranzasDia`: el objeto `totales` ahora incluye `total_efectivo`, `total_cheque`, `total_transferencia`, `total_tarjeta` agregados a nivel empresa.
- PDF (`generarReporteCobranzasPdf.js`): pasa a **landscape** con 10 columnas (Cobrador / Rend. / Recibos / Efectivo / Cheque / Transferencia / Tarjeta / Declarado / Verificado / Diferencia) + fila TOTAL al final.
- UI (`ReportesRendicionesPanel.jsx → TabCobranzasDia`): mismas columnas + fila TOTAL. Bonus: arreglado bug donde Declarado/Verificado mostraban 0 (ahora cae a `total_cobrado`).

---

## Problemas frecuentes

- **"En Mesa de Gestión no veo a un cliente que sé que tiene mora"**: verificar que la factura no esté `Anulada`, que tenga cuotas con `estado='pendiente'` y `saldo_pendiente > 0`, y que `dvenccuo < hoy`. Si todo está OK, refrescar (Ctrl+Shift+R) para limpiar caché del PWA.

- **"El botón 'Registrar gestión' no abre nada"**: faltan permisos `COB_WFL_GESTION_REGISTRAR`. Pedir al admin que lo asigne.

- **"Aplico el descuento pero el monto recibido no baja"**: verificar que el descuento autorizado vigente coincide con la factura seleccionada (`autorizacion.factura_cab_id`). Si no, queda como "del cliente cualquier factura".

- **"Cobré una cuota con mora pero no veo el comprobante fiscal de interés"**: verificar que el submódulo `COB_INTERESES_MORATORIOS` esté activo, que haya configuración válida (punto de expedición + timbrado vigente), y que SIFEN no haya rechazado. En el reporte "Intereses Cobrados" hay un filtro para ver pendientes.

- **"La rendición desde mobile dice 'Sin recibos para rendir' pero tengo cobros del día"**: probable que el cobro se haya asignado a otro cobrador vinculado al mismo usuario (problema histórico de duplicados). La query de mobile ahora trae todos los cobros de los cobradores del mismo `usuario_id` (resiliencia). Si seguís sin verlos, revisar `recibos_cobro.cobrador_id` directo en DB.

- **"La promesa se creó pero no tiene cuota asociada"**: la app móvil vieja envía promesa simple (`promesa_fecha + monto`). El backend mantiene la ruta legacy. Para que tenga cuotas, usar la app actualizada (Opción A) o cargarla desde el tab Promesas web.

- **"El cliente quedó marcado como 'Nunca' en última gestión aunque le hablé"**: la gestión se registró pero quizás con `anulada=true`. O fue contra otro cliente. Mirá el timeline en el drawer (botón 👁).

- **"La diferencia entre 'Capital seleccionado' y 'Total a cobrar' no me cierra"**: la diferencia debería ser exactamente `+ mora estimada − descuento autorizado`. Si no, el cálculo de mora no usó la cuota correcta (verificar `dias_vencido` real vs `dias_vencido` mostrado).

- **"El export Excel de Mesa de Gestión cae con timeout"**: el cap es 20.000 filas. Aplicar más filtros antes de exportar.

- **"No puedo cambiar el tipo de un cobrador de 'cobrador' a 'ambos'"**: si tiene asignaciones activas, primero hay que cerrarlas o usar el endpoint del admin.

---

## Lo que NO se puede hacer

- Crear dos `vendedores_cobradores` activos con el mismo `usuario_id` en la misma empresa.
- Aplicar descuento autorizado a una factura distinta de la que está en la autorización (a menos que la autorización sea "del cliente cualquier factura").
- Eliminar gestiones (solo se anulan con motivo).
- Transicionar mora a un estado no permitido por la matriz (ej. `AL_DIA → DEMANDA` directo).
- Cobrar mora sin tener `config_mora.activo = true` para la empresa.
- Emitir comprobante fiscal de interés sin que el cliente tenga `tipo_contribuyente` definido (Contribuyente o No Contribuyente).
- Editar una gestión anulada.
- Rendir cuando el usuario no está vinculado a ningún cobrador activo en la empresa actual.
- Pasar la app móvil a empresa distinta sin re-loguearse y elegir la otra empresa en el selector.

---

## Limitaciones actuales

- **Score de prioridad** se computa en cada request (CTE). Si la base crece a >10K morosos por empresa y la query supera 3s p95, hay que materializar `cob_worklist_cache` con job nocturno + invalidación incremental (path documentado en `plan-cobranzas-roadmap-2026-h2.md`, Fase A "Punto de escalado").
- **Dashboard supervisor live** no existe todavía. KPIs se ven en `ProductividadCobradoresPage` y `Mesa → Resumen` (sin polling automático). Está planificado en Fase E.
- **Campañas masivas WhatsApp/SMS** no existen. Se planifica en Fase C del roadmap H2 2026.
- **Forecast IA** no existe. Requiere acumular 3+ meses de gestiones reales.
- **Garantes** (Submódulo 2) está en placeholder — el PDF del expediente de mora deja `garantes: []`.
- **Submódulo 5 (Refinanciación)** está completo en código pero oculto del sidebar.
- **Pasar a ruta** (`COB_MG_PASAR_A_RUTA`) — el permiso está sembrado pero el botón para que el gestor de oficina "pase" a un cliente al cobrador de campo todavía no está implementado en la UI. Hoy el flujo es verbal/WhatsApp entre gestor y cobrador.
- **Centrales de riesgo** (Informconf, BCP, etc.) no integradas. Plan F del roadmap H2 2026 las prepara con adapters configurables.
- **Asignación automática** de clientes a cobradores: hoy es manual (se asigna `cobrador_id` en la ficha del cliente). Plan D del roadmap H2 2026.
- **Auditoría de gestiones anuladas**: la anulación queda en `cob_gestion.anulada=true + motivo_anulacion + anulada_at + anulada_por_id`. No hay reporte dedicado todavía.
- **Recordatorios automáticos de "Mi agenda"**: el endpoint `mi-agenda` ya devuelve `totales.urgentes` para el badge, pero todavía no hay job que mande email/notif al gestor con su agenda del día. Pieza de backend lista; falta el cron.
- **Drilldown desde "Mi agenda" oficina**: el switch `Mías ⇄ Toda la oficina` se muestra a cualquier usuario; no se restringe por rol supervisor. Si se quiere ocultar a no-supervisores, agregar guard en el frontend.

---

## Drawer del cliente (`ClienteHistorialDrawer`)

Acceso: botón 👁 en Mesa de Gestión, click en fila de Promesas, o desde cualquier listado de clientes.

Secciones del drawer:
- **Header**: nombre + RUC + botón "Estado de cuenta" (PDF).
- **Card "Gestiones de cobranza"** colapsado: muestra las últimas 8 gestiones inline (fecha, chips tipo/resultado, observación, próxima acción) + chip rojo con conteo total. **Click en el header → abre `GestionesTimelineDrawer`** con el historial completo (200 más recientes) que incluye:
  - factura asociada
  - chips de tipo/resultado
  - observación
  - próxima acción agendada
  - **link "Ver ubicación"** que abre Google Maps con `geo_lat,geo_lng` si la gestión la registró el cobrador de campo
  - **"Registrado por <usuario>"** (2026-06-26) — `getTimeline` enriquece cada gestión con `usuario_nombre` resuelto vía lookup separado a `prisma.usuario` (la tabla `cob_gestion` no tiene relación nombrada).
- **Cards "Mora avanzada activa"** y **"Refinanciaciones"** si aplican.
- **Tabla de facturas** con columnas: Factura/Fecha, Estado, Total, **Saldo** (2026-06-26 — calculado con `saldoPendienteFactura(f)` sumando saldo pendiente o `dmoncuota - pagado` por cuota). Color: rojo si saldo > 0, verde si está saldada. Permite drill-down a items y cuotas.

---

## Documentos relacionados

- `guia-cobros-finanzas.md` — flujo de cobros, recibos, cuentas a cobrar, autorizaciones de descuento.
- `guia-solicitud-credito.md` — concesión inicial de crédito al cliente.
- `guia-comisiones.md` — comisiones a cobradores por cobranza.
- `guia-tesoreria-bancos.md` — rendición y aprobación desde Tesorería.
- `plan-cobranzas-gestion-integral.md` — plan técnico completo del módulo (estado de implementación detallado).
- `plan-prueba-usuario-cobranzas.md` — checklist QA para validar cada submódulo.
- `plan-cobranzas-roadmap-2026-h2.md` — roadmap de próximas fases (configurabilidad, campañas, scoring concesión).
- `plan-novasis-cobros-mobile.md` — plan técnico de la app móvil del cobrador de ruta.
