Monitoriza licencias Microsoft 365 del tenant. Sincroniza usuarios y SKUs desde Graph API, analiza patrones de uso e identifica licencias reasignables con ahorro estimado en euros.
Un scheduler en background sincroniza el tenant completo contra Graph API cada 24 horas. El alert engine analiza los datos y clasifica licencias por riesgo de desperdicio.
sync.interval_hours.assignedLicenses + signInActivity. Calcula days_inactive. Degradación elegante si AuditLog.Read.All no está concedido.El motor de análisis clasifica licencias por nivel de urgencia y calcula el ahorro potencial mensual en euros basándose en el coste anual configurado por SKU.
| Prioridad | Categoría | Descripción |
|---|---|---|
| CRITICAL | Deshabilitados con licencia | Cuentas OFF que siguen consumiendo — reclamo inmediato |
| HIGH | Nunca iniciaron sesión | Cuenta creada pero sin uso — reclamo muy probable |
| HIGH | Inactivos >180 días | +6 meses sin actividad — reclamo muy probable |
| MEDIUM | Inactivos >90 días | Posible inactividad legítima — revisar caso por caso |
| MEDIUM | Guests con licencia | Usuarios B2B con licencia full — downgrade posible |
| MEDIUM | Overlap E3+E5 | Asignación redundante (E5 ⊃ E3) — quitar E3 |
| INFO | Slots disponibles | Capacidad comprada no asignada — indicativo de sobrecompra |
| Tabla | Descripción |
|---|---|
license_skus | SKUs del tenant: total/consumido/disponible, annual_cost (editable), is_free |
users | Snapshot completo por sync: last_seen, days_inactive, is_licensed, user_type |
user_licenses | Asignaciones usuario→SKU. Rebuild completo cada sync. |
user_service_plans | Planes de servicio por usuario-SKU (opcional, fetch_license_details=true) |
app_users | SSO con flag is_admin |
sync_log | Historial de sincronizaciones: estado, duración, conteos, errores |
/)KPI cards: usuarios totales, con licencia, deshabilitados con licencia, inactivos, potencial reclamo, ahorro estimado. Indicador de sync (barra de progreso live via /api/sync/status).
/usuarios)DataTable filtrable: búsqueda por nombre/UPN/dept, filtros por SKU/status/inactividad/tipo. Paginación. Exportación CSV.
/inventario)SKU inventory: total/consumido/disponible/%, barra visual, annual_cost editable por admin (se persiste en config JSON).
/alertas)7 secciones por prioridad. Cada sección: n.º usuarios afectados, coste mensual total estimado, lista expandible con detalle por usuario.
cd C:\apps\jmfernandez\license_monitoring
.\deploy.ps1
# git pull + pip install sisapps-ui + restartTrigger manual de sync desde Admin → Sincronizar ahora. El sync corre en background — el navbar muestra el estado en tiempo real.
port | 8088 |
graph.certificate_thumbprint | Cert Windows store |
sync.interval_hours | Intervalo sync (default 24) |
sync.fetch_license_details | Service plans vía batch (más lento) |
analysis.inactivity_threshold_days | Umbral MEDIUM (default 90) |
analysis.high_inactivity_days | Umbral HIGH (default 180) |
bootstrap_admin | Admin inicial al arrancar |