feat(comercial): modal Detalle del widget Pipeline con drill por etapa
Agrega el modal de Detalle del widget donut-comercial-funnel con estructura distinta a los modales de KPIs operativos: KPI strip dinamico (1 card por etapa del funnel) y filas colapsables (1 por etapa) con 2 charts cada una.
Modal Pipeline (ModalComercialPipelineDetalle, nuevo):
- Header con titulo Pipeline - Detalle por Etapa, subtitulo con filtros activos y boton cerrar.
- KPI strip dinamico: 1 card por etapa con su color (Cerrado verde, Propuesta violeta, Perdido rojo, fallback indexado para etapas no mapeadas como Prospeccion). Usa grid con gridTemplateColumns dinamico (repeat N minmax 0 1fr) para mantener altura consistente con los otros modales (mismo padding y tipografia).
- Orden fijo de etapas: Prospeccion/Prospectos, Propuesta, Cerrado/Cierres, Perdido, otras al final. Match por prefijo case-insensitive para tolerar variantes de spelling y plural. Aplica al KPI strip y al orden de las filas colapsables.
- FilterBar interno: Portafolio + Empresa cascade + Limpiar + contador X registros.
- Filas colapsables (default todas abiertas) ordenadas segun etapa. Header con chevron + dot color + nombre de la etapa + total. Click toggle expansion.
- Cada fila expandida muestra grid 2-col: Area chart con gradient (count por mes seleccionado del page, zero-fill de meses sin data) y Bar chart horizontal Top 10 (por empresa default, o por linea de negocio cuando hay 1 empresa filtrada). Click en barra de empresa setea filtroEmpresa para drill rapido. En modo groupByLinea el click se desactiva.
- Color de acento del modal: violeta #a78bfa (diferenciado de los 4 KPI modals).
Backend (comercial.py):
- Nuevo bloque funnel_etapa_empresa_mes[] granular per-(etapa, empresa, linea, mes) sobre indicadores_sin_mes. Cuenta 1 indicador por record. Etapa vacia se bucketea como Sin etapa, linea vacia como Sin Linea. La granularidad por linea permite que el modal cambie a vista por linea de negocio cuando hay 1 empresa filtrada sin pedirle al backend datos adicionales.
Plumbing (ExecWidgetBlock.tsx):
- comercial-pipeline agregado al union ModalKey.
- Entrada en DRILL_MAP para donut-comercial-funnel con color violeta. Primer entry para un widget tipo donut (los anteriores eran kpi_card).
- Render del modal con comercialData y filtroMeses.
Sin afectar otros widgets ni el resto del backend.