fix(riesgos): alinear widget Fianzas Vigentes/Cancelar con el dashboard Riesgos
El widget kpi_fianzas_vc reportaba 22 vigentes y 60 por cancelar mientras el dashboard /finanzas/riesgos mostraba 16 y 3 con los mismos filtros. Tres causas:
- El endpoint sumaba todas las fianzas del universo, sin overlap con el periodo año/mes seleccionado.
- La regla de status era laxa: cancel in s incluía cancelada en el conteo de por cancelar, y vigente in s or activ in s incluía activa en vigentes.
- Cuando el dashboard ejecutivo y el ExecWidget colapsaban filtros multi-mes a un solo mes_corte=max, el backend perdía fianzas vigentes en meses anteriores del rango.
Cambios:
backend/routers/riesgos.py
- Helper _fianza_overlaps_period replica vigenciaOverlapsPeriod del dashboard: overlap entre fecha_inicio..fecha_fin y cualquier (anio, mes) del periodo.
- Conteos fianzas_vigentes_count y fianzas_por_cancelar_count se aíslan en su propio dedup, evaluando overlap antes de agrupar por f.fianza. Match estricto: por cancelar in s y vigente in s.
- Nuevo query param meses (CSV 1..12). Prioridad de meses para el overlap: meses CSV → mes_corte → todo el año si solo hay anio → sin filtro. mes_corte sigue intacto para los KPIs de autos/daños.
- unique_fianzas global sin tocar para no afectar otros widgets (monto afianzado, status donut, etc.).
frontend/components/dashboard/ExecWidget.tsx
- riesgosQs ahora setea meses (CSV) además de mes_corte. Mandar ambos no rompe nada: cada KPI lee el suyo.
frontend/app/dashboard/page.tsx
- El fetch directo del dashboard ejecutivo a /api/riesgos/dashboard-summary también arma meses (CSV) además del mes_corte que ya enviaba.
Resultado: con anio=2026 y meses=ene,feb,mar el widget reporta 16 vigentes y 3 por cancelar, idéntico al dashboard de Riesgos.