feat(ti/licenciamiento): BETA Proyeccion Presupuesto — sub-area del portal TI, calculada desde el inventario
feat(ti/licenciamiento): BETA Proyeccion Presupuesto, seccion hija que calcula el presupuesto 2027-2031 desde el inventario
QUE ES
Seccion hija de Licenciamiento en /sistemas/licenciamiento/presupuesto.
Replica el libro "CAABSA_Presupuesto_Licencias_TI_2027-2031" de Planeacion
Financiera, con una diferencia que es el punto de la vista: nada se
transcribe. El libro se arma copiando a mano de tres fuentes; esta pantalla se
arma sola desde ti_licencias.
EL GRANO YA CUADRABA — ESTO SOLO LO EXPONE
El libro agrupa por empresa x sistema x tipo de licencia x vencimiento, cuenta
usuarios en Cant. y guarda el precio unitario anual. Ese grano es exactamente
el nuestro: en ti_licencias cada fila es una asignacion, asi que Cant. es un
COUNT(*) y Precio unit. es costo. Verificado contra el libro:
AHE Alojamiento (= Ob Capital en nuestro catalogo), GOOGLE Workspace
libro: 3 Business Plus + 3 Business Starter + 27 Enterprise + 16 Frontline
= 49 usuarios, $4,999.20 USD, Ppto 2027 Business Plus = $11,635
portal: 49 usuarios, $4,999.20 USD, Ppto 2027 Business Plus = $11,635
Y contra la pestaña "Presupuesto por Sistema", con delta 0.0%: BUK ($592,369), Neodata ($256,965), AUTODESK REVIT ($43,871), AUTOCAD LT ($30,000).
FORMULAS (verificadas contra celdas reales del libro) costo_anual_orig = precio_unit x cantidad base_mxn = costo_anual_orig x tc_usd (solo si la moneda es USD) base_siva = base_mxn / (1 + iva) (solo si la linea trae IVA) ppto(anio) = base_siva x (1 + escalacion) ** (anio - anio_base)
La escalacion es COMPUESTA, no lineal: $11,081 x 1.1025 = $12,217 en 2028, que es la celda del libro al peso.
COBERTURA — LO QUE ESTA VISTA NO PUEDE DAR, Y POR QUE NO LO INVENTA El libro totaliza $7.94M porque suma tres fuentes: la pestaña 'Licencias' (la nuestra), 'Software Gpo Caabsa' y facturacion de TRATO y TENUS. De ahi, solo la primera esta en el inventario: ~58% del monto. Salesforce ($1.28M), Slack ($411K), SINUBE ($396K), TRATO ($318K), mantenimientos TENUS ($537K) y Azure ($214K) NO tienen costo capturado hoy.
Decision explicita del usuario: la fuente es mandatoriamente Licenciamiento. Lo que falte se resuelve capturandolo, no transcribiendolo aqui. La vista lo dice en su aviso de cabecera en vez de presentar un total que parece cerrado y no lo esta.
CALIDAD DE LA CAPTURA — LA PESTAÑA QUE EL LIBRO NO TIENE Requisito explicito: toda licencia a la que le falte un dato para presupuestarse se marca. Se hace en tres niveles, no en uno: · KPI card "Lineas incompletas", clickeable, que activa el filtro. · Panel lateral con el desglose por tipo de hueco (sin costo, costo en cero, sin moneda, sin vencimiento, sin periodicidad, sin cruce al catalogo, perpetuas, sin categoria) y cuantas licencias quedan fuera del monto. · Badge por linea en la tabla de detalle, con la fila teñida en ambar. Sobre los datos de hoy: 3 sin costo, 6 sin moneda, 6 sin vencimiento, 3 sin periodicidad, 124 sin cruce al catalogo, 47 lineas incompletas de 188.
PARAMETROS: /admin MANDA, LA VISTA SIMULA
Escalacion, tipo de cambio e IVA son KpiParameter (regla 4 del repo), sembrados
por backend/migrations/20260826_seed_ti_ppto_parametros.sql con los valores del
libro al corte 31-jul-2026 (5%, $19.00, 16%). La vista los puede sobreescribir
para simular sin guardar, y la respuesta marca origen —admin / simulacion /
respaldo— para que se sepa de donde salio cada corrida. Un cambio de T.C. no
puede requerir un deploy: el libro tiene esa pestaña con celdas amarillas justo
por eso.
DONDE NOS SEPARAMOS DEL LIBRO, DECLARADO EN PANTALLA
- IVA. El libro trae
IVA baseeditable POR LINEA: Cisco y SINUBE capturados con IVA, el resto sin el.ti_licenciasno tiene ese campo, asi que aqui es un interruptor global que arranca en "sin IVA". No es un detalle cosmetico: nuestro Cisco AMP da $1,564,155 y el libro $1,348,409, y $1,564,155 / 1.16 = $1,348,409 exacto. El interruptor reproduce el escenario del libro; lo correcto a futuro es capturar el campo por linea. - Categoria. Tampoco es campo del inventario. Se deriva del software con un mapa
en
services/ti_presupuesto.py. Deuda consciente y anotada: lo correcto es que sea captura. -
Continua 2027NO se captura, se DERIVA deestadoyvencimiento: inactiva -> N (proyecta $0), vencida -> Rev, resto -> S. Un campo menos que mantener a mano.Revmarca confianza, no un cero: en el libro la linea de SINUBE aparece Vencida y aun asi trae presupuesto 2027-2031. - Periodicidad.
mensualse anualiza x12 yperpetuaproyecta $0 por no ser gasto recurrente. El libro NO anualiza los mensuales —Claude aparece con $13,775, que es su costo de un mes x T.C.— y a nuestro juicio eso subestima el presupuesto 12 veces. Aqui se anualiza y la diferencia queda visible.
ESTRUCTURA DE LA VISTA, PESTAÑA POR PESTAÑA DEL LIBRO Instructivo -> aviso BETA de cabecera (supuestos y cobertura) Parametros -> barra de parametros, lo unico ajustable Consolidado -> KPI cards + grafica de evolucion 2026-2031 Ppto por Empresa / Sistema / Categoria -> tres tablas con columna por anio Inventario -> tabla de detalle al grano, con badges de faltantes
ARCHIVOS backend/services/ti_presupuesto.py la aritmetica, fuera del router backend/routers/ti_licencias.py GET /ti/licencias/presupuesto backend/migrations/2026...ppto_parametros.sql siembra los 3 KpiParameter portal_ti/.../ti/PresupuestoDashboard.tsx la vista (arbol compartido) portal_ti/.../ti/_internal/lib/ti.api.ts tipos + cliente portal_ti/app/.../presupuesto/page.tsx ruta standalone frontend/app/.../presupuesto/page.tsx espejo OAE (mismo commit) portal_ti/.../ti/LicenciamientoDashboard.tsx entrada a la seccion hija
El componente vive en el arbol compartido portal_ti/components/dashboard/ti/,
que compilan DOS builds con distinta raiz de @/. Solo importa de ./_internal
y de next/link, ambos resolubles en las dos raices; los enlaces usan Link y
no <a> porque OAE corre bajo basePath /oae.
VERIFICADO python3 scripts/check_lookandfeel.py <4 archivos> -> limpio, exit 0 docker exec caabsa_backend python ci_validate_models.py -> model graph OK npm run build en portal_ti -> /sistemas/licenciamiento/presupuesto 9.62 kB npm run build en frontend -> /sistemas/licenciamiento/presupuesto 9.6 kB GET /api/ti/licencias/presupuesto -> registrado, 401 sin token Calculo contra los 1252 registros reales: 188 lineas, 53 empresas, 18 sistemas, base s/IVA $5,081,717, Ppto 2027 $5,261,792, quinquenio $29,074,722.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com