/* global React */ // Module configurations per role + Home screen + Stub screen. // ---------------- MODULE DEFINITIONS ---------------- // Each module: id, icon (Lucide name), nav (sidebar label), title (card), // desc (one-line), badge (optional), variant (card size), inHome (show on home). const MODULE_DEFS = { inicio: { id: 'inicio', icon: 'Home', nav: 'Inicio', title: 'Inicio', desc: 'Hub principal del sistema.', inHome: false, short: 'Hub principal', }, tablero: { id: 'tablero', icon: 'LayoutDashboard', nav: 'Tablero de Control', title: 'Tablero de Control', short: 'Semáforo país consolidado', desc: 'Semáforo país consolidado de los tres mecanismos (MESICIC, UNCAC, OCDE), segmentado por institución, eje temático y estado. Datos actualizados en tiempo real, sin recarga manual.', variant: 'feature', }, compromisos: { id: 'compromisos', icon: 'ListChecks', nav: 'Compromisos', title: 'Compromisos', short: 'Inventario de recomendaciones', desc: 'Inventario único de recomendaciones de MESICIC, UNCAC y OCDE. Busca por ID interno o internacional, clasifica por eje y prioridad, asigna instituciones responsables y vincula recomendaciones relacionadas.', }, cargar_avance: { id: 'cargar_avance', icon: 'Upload', nav: 'Cargar Avance', title: 'Cargar Avance', short: 'Reporta progreso y evidencias', desc: 'Reporta el progreso de cada recomendación asignada a tu institución, adjuntando evidencias (PDF, JPG, PNG, XLSX, DOCX o URLs). La CGR revisa cada carga y puede devolverla con observaciones para ajuste.', }, mis_compromisos: { id: 'mis_compromisos', icon: 'ListChecks', nav: 'Mis Compromisos', title: 'Mis Compromisos Asignados', short: 'Recomendaciones a tu cargo', desc: 'Listado priorizado de las recomendaciones bajo responsabilidad de tu institución, con plazos internos, estado de cumplimiento vigente y observaciones de la CGR pendientes de atender.', }, nueva_recomendacion: { id: 'nueva_recomendacion', icon: 'PlusCircle', nav: 'Nueva Recomendación', title: 'Nueva Recomendación', short: 'Registra una recomendación', desc: 'Registra una recomendación internacional indicando mecanismo, ronda o capítulo, texto oficial e ID del organismo. El sistema asigna un ID interno trazable y la deja en estado inicial No Cumplido.', }, mensajeria: { id: 'mensajeria', icon: 'MessageSquare', nav: 'Mensajería', title: 'Mensajería', short: 'Conversaciones internas', desc: 'Canal interno CGR ↔ instituciones reportantes para enviar requerimientos, recordatorios y consultas vinculadas a cada recomendación. Reemplaza el correo y deja todo el intercambio trazable dentro del sistema.', }, alertas: { id: 'alertas', icon: 'Bell', nav: 'Alertas', title: 'Alertas', short: 'Plazos en riesgo y vencidos', desc: 'Notificaciones automáticas D-7, D-3, D-1 y D+1 sobre los plazos internos de carga de avances. Visualiza las recomendaciones en riesgo y aquellas vencidas sin reporte, con enlace directo a su detalle.', }, reportes: { id: 'reportes', icon: 'FileBarChart', nav: 'Reportes', title: 'Reportes', short: 'Exporta a Excel y PDF', desc: 'Genera reportes consolidados exportables en Excel y PDF con encabezado institucional, filtrados por mecanismo, institución, estado, período y eje temático. Base para el informe oficial país enviado a los organismos internacionales.', }, reportes_aprobados: { id: 'reportes_aprobados', icon: 'FileText', nav: 'Reportes Aprobados', title: 'Reportes Aprobados', short: 'Informes listos para envío', desc: 'Informes país consolidados, validados por la CGR y listos para su envío oficial a MESICIC (OEA), UNCAC (ONU) y OCDE. Acceso de solo lectura para Cancillería.', variant: 'feature', }, usuarios: { id: 'usuarios', icon: 'Users', nav: 'Usuarios', title: 'Usuarios', short: 'Cuentas y roles de acceso', desc: 'Crea, edita y desactiva cuentas de funcionarios CGR y representantes de instituciones reportantes. Asigna roles por nivel de acceso, conserva el historial de los usuarios desactivados y consulta el log de auditoría.', }, instituciones: { id: 'instituciones', icon: 'Building2', nav: 'Instituciones', title: 'Instituciones', short: 'Entidades reportantes', desc: 'Catálogo oficial de instituciones reportantes habilitadas en la plataforma, con sus datos de contacto, usuarios vinculados y compromisos asignados. Las instituciones desactivadas pierden acceso pero conservan su historial completo.', }, portal: { id: 'portal', icon: 'Globe', nav: 'Portal Público', title: 'Portal Público', short: 'Vista ciudadana', desc: 'Vista ciudadana del cumplimiento país: indicadores agregados por mecanismo, datasets descargables y noticias institucionales. No expone borradores, observaciones internas ni datos personales de funcionarios.', variant: 'accent', }, catalogos: { id: 'catalogos', icon: 'Settings', nav: 'Catálogos', title: 'Catálogos del sistema', short: 'Categorías, medidas y prioridades', desc: 'Listas maestras que alimentan los formularios de la plataforma: categorías (ejes temáticos), tipos de medida y niveles de prioridad. Crear y editar estos catálogos es exclusivo del Súper Administrador.', }, }; // ---------------- ROLE → MODULES ---------------- function modulesForRole(roleId) { // helper to attach a badge override const m = (id, extras = {}) => ({ ...MODULE_DEFS[id], ...extras }); if (roleId === 'institucion') { return [ m('inicio'), m('mis_compromisos', { badge: { count: 23, tone: 'info' } }), m('cargar_avance'), m('mensajeria', { badge: { count: 2, tone: 'danger' } }), m('alertas', { badge: { count: 3, tone: 'danger' } }), ]; } if (roleId === 'cancilleria') { return [ m('inicio'), m('reportes_aprobados', { badge: { count: 12, tone: 'info' } }), m('mensajeria'), ]; } // Admin / Super Admin const adminMods = [ m('inicio'), m('instituciones'), m('usuarios'), m('compromisos', { badge: { count: 527, tone: 'info' } }), m('reportes'), m('mensajeria', { badge: { count: 3, tone: 'info' } }), m('alertas', { badge: { count: 5, tone: 'info' } }), // Ocultos del menú por ahora. Descomentar para reactivar: // m('tablero'), // m('nueva_recomendacion'), // m('portal'), ]; // Solo el Súper Administrador gestiona los catálogos maestros del sistema. if (roleId === 'superadmin') adminMods.push(m('catalogos')); return adminMods; } // Which modules appear as cards on Home (excludes 'inicio') function homeModulesForRole(roleId) { const all = modulesForRole(roleId).filter(m => m.id !== 'inicio'); return all; } Object.assign(window, { MODULE_DEFS, modulesForRole, homeModulesForRole });