Skip to content

/reports/payments

Cuadro de mando analítico de cobros. La pantalla envuelve los seis endpoints /api/v1/payments/reports/* en una vista calm-design y permite saltar al detalle del listado /payments (o /patients para la antigüedad) desde casi cualquier interacción.

Permisos

Controlada por payments.reports.read. Por defecto la tienen admin, dentista y recepción. Los drill-downs hacia /payments requieren además payments.record.read.

Estructura

La pantalla se lee de arriba abajo:

  1. Fila hero — dos tarjetas grandes.
    • Cobrado neto muestra el total del periodo, la variación porcentual respecto al periodo anterior de igual longitud y una línea de tendencia (sparkline) del neto.
    • Pendiente de cobro muestra el saldo pendiente de la clínica y cuatro mini-barras por bucket de antigüedad (0–30, 31–60, 61–90, 90+ días). Cada barra es clicable y lleva a /patients filtrado por deuda.
  2. KPIs secundarios — cobrado, devuelto, saldo a favor de pacientes y tasa de devoluciones. Cobrado y devuelto son clicables; "devuelto" añade has_refunds=true al filtro.
  3. Evolución del cobro — gráfico de área del neto por bucket con una línea discontinua de devoluciones encima. El selector de granularidad (día / semana / mes) está a la derecha del título. Hacer clic en un punto abre /payments para ese bucket.
  4. Por método — donut con leyenda. Clic en un sector → /payments?method=….
  5. Por profesional — top 8 de tratamiento ejecutado (no cobrado), no de cobros. El clic salta al listado del periodo.
  6. Antigüedad — barras a ancho completo por bucket. Cada fila lleva a /patients?has_debt=true.
  7. Devoluciones por motivo — distribución de devoluciones por la causa registrada.

Filtros

  • Periodo: FilterDateRange con presets rápidos (Hoy / 7d / 30d / Este mes / Trimestre / Año). Por defecto, últimos 90 días.
  • Granularidad: solo afecta al gráfico de tendencia.

Estados vacíos

Si el periodo seleccionado no tiene datos, las secciones secundarias se colapsan en una única tarjeta vacía. Cada sección renderiza su propio empty state cuando solo a ella le faltan datos (sin métodos, sin profesionales, sin devoluciones, sin pendiente).

Salvaguarda off-books

Este informe nunca compara cobrado contra facturado ni ejecutado contra facturado. El desglose por profesional refleja tratamiento ejecutado, no facturado. Ver payments/CLAUDE.md "Gotchas" y ADR 0010.

Pantallas relacionadas

  • /payments — listado de cobros, destino de la mayoría de drill-downs.
  • /patients con has_debt=true — destino de los drill-downs de antigüedad.