# Changelog Semanal - Sistema de Activación de Usuarios y Tenants ## Fecha: 22 de Octubre de 2025 ### Monitoreo RUT — Unificación de Consultas y Logs - El modal “Crear Nuevo Monitoreo” ahora unifica RUTs de “Consultas” y `sheriff-logs`, eliminando duplicados. - Búsqueda mejorada: por `rut`, razón social y texto en `duxiterMD` cuando existe. - Encabezado fijo en el dropdown con contadores: `Total cargados` y `Filtrados`. - Se mantiene la visualización de `rut`, empresa y “Última consulta”. #### Cambios de código relevantes - Frontend: `src/pages/MonitoringPage.tsx` - Importado `getResults` desde `src/services/api.ts`. - `fetchExistingRuts`: paginación de `sheriff-logs`, carga de “Consultas”, mapeo a estructura compatible, unión y deduplicación por RUT. - `filteredRuts`: ampliada para coincidir por razón social y `duxiterMD`. - Encabezado sticky con contadores en el dropdown de RUTs. #### Notas técnicas - Origen de datos: - Logs: `/rut/sheriff-logs` (paginados). - Consultas: `/rut/results` (global por tenant). - Conversión de “Consultas”: se mapean campos a objetos compatibles con `SheriffDataLogResponse`; se descartan entradas sin `rut` válido. - Extracción de razón social: desde `siiData.summaryData` o `details.razonSocial` cuando esté disponible. - Deduplicación: por clave `rut`, priorizando el registro con `fetchedAt` más reciente. #### Verificación - Abrir `http://localhost:4032/` y navegar a `Monitoreo` → `Crear Nuevo Monitoreo`. - Buscar por RUT o nombre de empresa proveniente de “Consultas” y confirmar el conteo en el encabezado del dropdown. #### Impacto en UX - Selección de RUTs más completa y rápida, con búsqueda flexible. - Mayor claridad al mostrar el número de resultados cargados y filtrados. --- ## Fecha: 21 de Octubre de 2025 ### Fast Check — Indicador de Progreso Mejorado - Barra de progreso lineal con porcentaje animado que avanza por pasos. - Etiquetas de pasos traducidas al español y visibles junto al porcentaje. - Se eliminó el paso de IA del indicador (no se muestra ni afecta el %). - Colores dinámicos: azul en curso (con pulso), verde al completar, rojo en error. - Se mantienen los puntos de estado por paso debajo de la barra. - El indicador también se muestra durante el estado “Cargando…”. #### Flujo de pasos - Inicio de evaluación → Solicitud de lookup RUT → Cargando resultados → Verificación de Listas Propias → Listo. #### Cambios de código relevantes - Frontend: `src/pages/FastCheck.tsx` - `initialSteps`: traducción de etiquetas y eliminación de `ai`. - `stepsOrder`: actualizado a `['start','lookup','fetch','listas','ready']`. - Cálculo de porcentaje y helpers para color/animación y “paso actual”. - Render del estado de carga: ahora muestra barra + puntos, no solo “Cargando…”. - Instrumentación de pasos en `handleRefresh` y `fetchData`. - Nota: la generación de análisis IA sigue disponible bajo demanda, pero fuera del indicador. #### UX y textos - Mensajes en español: “Cargando…”, “Evaluación en curso…”, nombres de pasos. ### Infraestructura/Git - `.gitignore`: se agregó `server/equifax_responses/` para excluir respuestas de Equifax del control de versiones. --- ## Fecha: Enero 2025 ### Resumen de Cambios Implementados Esta semana se implementó un sistema completo de activación para usuarios y tenants en la plataforma Duxiter, mejorando la seguridad y el control administrativo. --- ## 🔐 Sistema de Activación de Usuarios ### 1. Modelo de Usuario Actualizado - **Archivo modificado**: `server/src/models/user.model.ts` - **Cambio**: Agregado campo `isActive` con valor por defecto `false` - **Impacto**: Todos los nuevos usuarios requieren activación manual por el superadministrador ### 2. Controller de Registro Actualizado - **Archivo modificado**: `server/src/controllers/auth.controller.ts` - **Cambios**: - Los nuevos usuarios se crean con `isActive: false` - Mensaje de confirmación actualizado para informar sobre activación pendiente - **Beneficio**: Control total sobre nuevos registros ### 3. Controller de Login Mejorado - **Archivo modificado**: `server/src/controllers/auth.controller.ts` - **Cambios**: - Verificación de estado activo antes del login - Mensaje de error específico para usuarios no activados - Traducción del mensaje de activación pendiente al español - **Mensaje implementado**: "Tu cuenta está pendiente de activación por parte del superadministrador. Contacta al administrador para completar la activación." ### 4. Frontend - Servicio de Autenticación - **Archivo modificado**: `src/services/authService.ts` - **Cambios**: - Manejo específico de errores de activación pendiente - Detección del estado `activationStatus: 'pending'` ### 5. Frontend - Página de Login - **Archivo modificado**: `src/pages/auth/Login.tsx` - **Cambios**: - Nuevo estado `activationMessage` para mostrar mensajes de activación - Interfaz visual para mostrar mensaje de activación pendiente - Detección del mensaje en español ### 6. Panel de Administración - Gestión de Usuarios - **Archivo modificado**: `src/pages/admin/UserManagement.tsx` - **Funcionalidades agregadas**: - Columna "Estado" en la tabla de usuarios - Botones "Activar" y "Desactivar" para cada usuario - Función `handleToggleUserStatus` para cambiar estado - Indicadores visuales de estado (activo/inactivo) --- ## 🏢 Sistema de Activación de Tenants ### 1. Modelo de Tenant Actualizado - **Archivo modificado**: `server/src/models/tenant.model.ts` - **Cambio**: Agregado campo `isActive` con valor por defecto `false` - **Impacto**: Todos los nuevos tenants requieren activación manual ### 2. Controller de Tenant Actualizado - **Archivo modificado**: `server/src/controllers/tenant.controller.ts` - **Cambios**: - Endpoint PATCH `/api/tenants/:id/toggle-status` para activar/desactivar - Función `toggleTenantStatus` implementada - Validaciones de autorización para superadmin ### 3. Middleware de Autenticación Mejorado - **Archivo modificado**: `server/src/middleware/auth.middleware.ts` - **Cambios**: - Verificación de tenant activo en cada request autenticado - Bloqueo automático de usuarios con tenants inactivos - Mensaje de error específico para tenants desactivados ### 4. Panel de Administración - Gestión de Tenants - **Archivo modificado**: `src/pages/admin/TenantManagement.tsx` - **Funcionalidades agregadas**: - Columna "Estado" en la tabla de tenants - Botones "Activar" y "Desactivar" para cada tenant - Función `handleToggleTenantStatus` para cambiar estado - Indicadores visuales de estado --- ## 🛠️ Correcciones Técnicas ### 1. Eliminación de Transacciones MongoDB - **Archivos afectados**: Múltiples controllers - **Problema resuelto**: Error `MongoServerError` por uso incorrecto de transacciones - **Solución**: Removidas transacciones innecesarias en operaciones simples ### 2. Limpieza de Resultados Huérfanos - **Problema**: Results pertenecientes a tenants eliminados causaban errores 404 - **Solución**: Implementada limpieza automática de datos huérfanos - **Beneficio**: Mayor estabilidad del sistema --- ## 🌐 Mejoras de Internacionalización ### Traducción al Español - **Mensajes de error**: Traducidos del italiano al español - **Interfaz de usuario**: Mensajes de activación en español - **Consistencia**: Toda la comunicación de errores unificada en español --- ## 📊 Impacto en la Seguridad 1. **Control de Acceso Mejorado**: Solo usuarios y tenants activados pueden acceder al sistema 2. **Gestión Centralizada**: El superadministrador tiene control total sobre activaciones 3. **Prevención de Accesos No Autorizados**: Bloqueo automático de cuentas no activadas 4. **Trazabilidad**: Logs detallados de intentos de login de usuarios no activados --- ## 🚀 Funcionalidades Implementadas ### Para Superadministradores: - ✅ Activar/desactivar usuarios individualmente - ✅ Activar/desactivar tenants completos - ✅ Vista consolidada del estado de todos los usuarios y tenants - ✅ Control granular sobre el acceso al sistema ### Para Usuarios: - ✅ Mensajes claros sobre el estado de activación - ✅ Interfaz informativa durante el proceso de login - ✅ Comunicación en español para mejor comprensión --- ## 📝 Archivos Modificados ### Backend: - `server/src/models/user.model.ts` - `server/src/models/tenant.model.ts` - `server/src/controllers/auth.controller.ts` - `server/src/controllers/tenant.controller.ts` - `server/src/middleware/auth.middleware.ts` ### Frontend: - `src/services/authService.ts` - `src/pages/auth/Login.tsx` - `src/pages/admin/UserManagement.tsx` - `src/pages/admin/TenantManagement.tsx` --- ## 🔧 Configuración y Despliegue del Sistema Multi-Tenant ### Fecha: 7 de Septiembre de 2025 ### Configuración Completa del Entorno #### 1. Servidor Backend Configurado - **Puerto**: 4040 - **Estado**: ✅ Operativo y funcional - **Base de datos**: MongoDB conectada exitosamente - **Documentación API**: Disponible en http://localhost:4040/api/docs #### 2. Creación de Usuarios Administrativos - **Superadministrador**: - Email: `superadmin@gmail.com` - Contraseña: `SuperAdmin3465#` - Estado: ✅ Creado y verificado - **Administrador de Tenant**: - Email: `tenantadmin@test.com` - Contraseña: `password123` - Estado: ✅ Creado y verificado #### 3. Gestión de Tenants - **Tenant de Prueba Creado**: - ID: `68bd9178eabb7855861b2983` - Nombre: "Test Tenant" - Estado: ✅ Activado exitosamente - Configuración: Créditos iniciales (100), estadísticas de uso configuradas #### 4. Servidor Frontend Configurado - **Puerto**: 4031 (puerto 4030 ocupado, redirigido automáticamente) - **Tecnología**: Vite + React - **Estado**: ✅ Operativo y accesible - **URL**: http://localhost:4031/ - **Verificación**: Sin errores en el navegador ### Resolución de Problemas Técnicos #### 1. Conflicto de Puertos - **Problema**: Puerto 4040 ocupado por proceso anterior - **Solución**: Terminación forzada del proceso con `lsof -ti:4040 | xargs kill -9` - **Resultado**: ✅ Servidor reiniciado exitosamente #### 2. Autenticación de Superadministrador - **Problema**: Credenciales inválidas en primer intento - **Causa**: Usuario superadmin no existía en la base de datos - **Solución**: Ejecución del script `create-superadmin.ts` - **Resultado**: ✅ Superadmin creado y autenticación exitosa #### 3. Gestión de Tenants - **Problema**: "Tenant not found" en operaciones iniciales - **Causa**: No existían tenants en la base de datos - **Solución**: Creación de tenant de prueba vía API POST - **Resultado**: ✅ Tenant creado y activado correctamente ### Funcionalidades Verificadas #### Sistema de Autenticación Multi-Rol - ✅ Superuser: Control total del sistema - ✅ Tenant Admin: Gestión de tenant específico - ✅ Evaluator: Acceso a funcionalidades de evaluación #### API RESTful Completa - ✅ Endpoints de autenticación (`/api/auth/login`) - ✅ Gestión de usuarios (`/api/users`) - ✅ Gestión de tenants (`/api/tenant`) - ✅ Activación/desactivación de tenants (`/api/tenant/:id/superadmin-toggle-status`) #### Interfaz Frontend - ✅ Aplicación React moderna y responsiva - ✅ Integración completa con backend - ✅ Manejo de estados de autenticación - ✅ Navegación basada en roles ### Comandos de Despliegue Utilizados ```bash # Backend cd /root/duxiter/server npm run dev # Puerto 4040 # Frontend cd /root/duxiter npm run dev # Puerto 4031 # Creación de superadmin cd server && npx tsx src/scripts/create-superadmin.ts # Resolución de conflictos de puerto lsof -ti:4040 | xargs kill -9 ``` ### APIs de Prueba Ejecutadas ```bash # Login de superadmin curl -X POST http://localhost:4040/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"superadmin@gmail.com","password":"SuperAdmin3465#"}' # Creación de tenant curl -X POST http://localhost:4040/api/tenant \ -H "Authorization: Bearer [TOKEN]" \ -H "Content-Type: application/json" \ -d '{"name":"Test Tenant","settings":{},"usageStats":{"evaluationsRemaining":100,"evaluationsUsed":0}}' # Activación de tenant curl -X PATCH http://localhost:4040/api/tenant/68bd9178eabb7855861b2983/superadmin-toggle-status \ -H "Authorization: Bearer [SUPERADMIN_TOKEN]" ``` --- ## ✅ Estado del Proyecto Todas las funcionalidades han sido implementadas y probadas exitosamente. El sistema de activación está completamente operativo y listo para producción. **Sistema Multi-Tenant Completamente Configurado:** - ✅ Backend operativo en puerto 4040 - ✅ Frontend operativo en puerto 4031 - ✅ Base de datos MongoDB conectada - ✅ Usuarios administrativos creados - ✅ Tenant de prueba activado - ✅ APIs funcionando correctamente - ✅ Interfaz web accesible y funcional **Próximos pasos sugeridos:** - Implementar notificaciones por email para activaciones - Agregar logs de auditoría para cambios de estado - Considerar activación automática basada en criterios específicos - Configurar entorno de producción con Docker - Implementar monitoreo y métricas del sistema --- ## 🔄 Sistema de Reciclaje de Consultas ### Fecha: Enero 2025 ### Problema Identificado - **Error**: `TypeError: Cannot read properties of undefined (reading 'getResultByRut')` - **Ubicación**: `server/src/controllers/rutController.ts:1021` - **Causa**: Llamada incorrecta a método estático usando `this.getResultByRut()` ### Solución Implementada #### 1. Corrección de Llamada a Método Estático - **Archivo modificado**: `server/src/controllers/rutController.ts` - **Línea 1021**: Cambiado `this.getResultByRut()` por `RutController.getResultByRut()` - **Razón**: Los métodos estáticos deben ser llamados usando el nombre de la clase, no `this` #### 2. Corrección de Parámetros - **Problema**: Paso incorrecto de parámetros en la llamada recursiva - **Solución**: - Eliminado objeto falso `{ params: { rut: rut } }` - Implementado `req.params.rut = rut` antes de la llamada - Uso del objeto `req` original en la llamada recursiva #### 3. Anotación de Tipo de Retorno - **Línea 982**: Agregado `Promise` como tipo de retorno - **Propósito**: Resolver error de TypeScript sobre tipo de retorno implícito - **Beneficio**: Eliminar referencia circular en el análisis de tipos ### Funcionalidad del Sistema de Reciclaje El sistema permite reutilizar resultados de consultas entre diferentes tenants: 1. **Búsqueda Inicial**: Se busca un resultado por RUT sin filtrar por tenant 2. **Verificación de Tenant**: Si el resultado pertenece a otro tenant 3. **Reciclaje**: Se crea una copia del resultado para el tenant actual 4. **Llamada Recursiva**: Se vuelve a llamar al método para obtener el nuevo resultado ### Código Corregido ```typescript // Antes (incorrecto) return this.getResultByRut({ params: { rut: rut } }, res); // Después (correcto) req.params.rut = rut; return RutController.getResultByRut(req, res); ``` ### Beneficios de la Corrección - ✅ **Eliminación del Error**: Ya no se produce el TypeError - ✅ **Funcionalidad Restaurada**: El reciclaje de consultas funciona correctamente - ✅ **Optimización de Recursos**: Reutilización eficiente de resultados existentes - ✅ **Compatibilidad TypeScript**: Código completamente tipado y sin errores ### Archivos Modificados - `server/src/controllers/rutController.ts` - Línea 982: Agregada anotación de tipo de retorno - Líneas 1020-1022: Corregida llamada recursiva al método estático ### Impacto en el Sistema - **Estabilidad**: Eliminación de crashes del servidor - **Eficiencia**: Mejor reutilización de datos entre tenants - **Mantenibilidad**: Código más claro y correctamente tipado