From the 2026-10-08 meeting.
- Clientes en rojo summed every row a customer ever had, so the opening
balance's history counted twice, cash receipts twice and the 2025
archive on top: 195 customers in the red against 22 real ones. It now
takes the balance scope balances() uses (extracted as balanceScopeSql),
sorts by most recent real movement, and filters by ramo, date, minimum
owed and inactive customers (status = 0, the internal accounts).
- Pagos no efectuados asked "no charge of any kind in N days"; legacy asks
"no row of THAT service's concept in the period". Rewritten to legacy's
question, per customer, defaulting to one billing cycle back. It also
passed ELECTRICITY/PHONE, which are not ServiceKind values, so Luz and
Telefono never returned a row. Sin fondos rows show as their own status.
- Faltantes demanded account, meter AND route of every kind; water and
phone have no route. Now the legacy fields per kind.
- Reporte de efectivo counted every credit BALANCE FORWARD as cash
(958 of 1093 rows on dev).
- Every report carries the legacy NUMid; policy reports add the
insurance file number. The statement header shows it too.
- Printed headers showed placeholder company details: prod sets no
COMPANY_* variables. Defaults are now the office's real locator, plus a
US mailing address line.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- New reports backend (registry, service, controller, outputs, types)
with catalog endpoint + slug/CSV/XLSX/PDF/print outputs.
- /reportes catalog + /reportes/[slug] runner; ReportRunner + ContextReports
components wire pre-filtered links from domain pages.
- Fix: /reportes/[slug] now reads searchParams and forwards initialParams to
ReportRunner so /reportes/edo-cuenta-datos?customerId=... auto-runs
instead of dropping the id and forcing a manual customer search.
- /inicio landing page; root + login redirect to /inicio.
- Company header env vars + logo asset for PDF/print rendering.
- exceljs + pdfkit deps.