feat(comercial): portal_comercial con dashboard Tableau 2025
Nuevo portal standalone basado en portal_juridico, con 6 indicadores operativos calculados contra los datos de INDICADORES COMERCIALES y METAS COMERCIALES del Tableau 2025:
- Prospectos: count(etapa ~ prospect) / meta de prospectos
- Propuesta: count(etapa ~ propuest|oferta) / meta de propuestas
- Cierres: count + monto (etapa ~ cierr|cerrad|ganad)
- Ciclo de venta: avg dias entre fecha_prospeccion y fecha_cierre
- Mix de venta: Intercompania vs Externa (solo cierres)
- Backlog: monto de cierres agrupado por mes de fecha_cierre
Implementacion:
- portal_comercial/ : Next.js 14 con basePath /comercial, puerto 3004
- backend/database_comercial.py + models/comercial.py + routers/comercial.py
- backend/main.py: create_all(Base_comercial) + _migrate_comercial seed
- backend/ci_validate_models.py: incluye Base_comercial
- docker-compose.yml: servicio portal_comercial en 3014:3004
- docker-compose.override.yml: dev hot reload para portal_comercial
- frontend/components/layout/Sidebar.tsx: link al portal desde OAE
- frontend/app/comercial/inicio/page.tsx: landing con link externo
- backend/scripts/import_comercial.py: one-shot importer desde xlsx (xlsx gitignoreado — bajar del Google Sheet al correrlo)
Valores de etapa_funnel en el dataset real son muy heterogeneos (Cierre/Cierres/Cerrado/CERRADO/Ganado/GANADO...), normalizados en el frontend con matcher case-insensitive por prefijo.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com