472e0be886
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
11 KiB
11 KiB
Changelog - project.linkedcorp.net
[1.9.2] - 2026-09-11
Changed
- "Revision periodica de equipos" (Gestión de equipos y activos de TI) renombrada a "Revisión de equipos para verificar obsolescencia y mejoras" — dejaba dudas sobre qué cubría.
- Nueva actividad en Infraestructura y redes: "Reponchado de cableado de red y certificación de los puntos".
[1.9.1] - 2026-09-11
Changed
- Migración de datos de una sola vez (
006_seed_it_baseline.sql, con marcador ensystem_settings— nunca se repite en un deploy futuro): reemplaza el proyecto de prueba "Sistema ERP" por 6 proyectos reales de TI (Cumplimiento legal, Correos, Equipos, Credenciales y licencias, Infraestructura y redes, Mejoras a SAGA) con sus actividades, y da de baja la cuentapflores@hotmail.es(autorregistro nunca verificado). Pedido explícito del superadmin.
[1.9.0] - 2026-09-10
Added
- Organización → Usuarios: ahora se puede "Rechazar" (eliminar) también a un usuario en
pending_verification(autorregistro que nunca confirmó su correo) — antes esa acción solo existía parapending_approval, así que una cuenta abandonada antes de verificar el correo no tenía ninguna forma de quitarse desde la UI.
[1.8.1] - 2026-09-10
Fixed
- "Agregar dependencia" en una actividad no daba ninguna señal cuando no había otra actividad del proyecto disponible para elegir (proyecto con una sola actividad, o ya se agregaron todas) — el combo quedaba vacío, no se seleccionaba nada, y el botón hacía clic sin ningún efecto visible. Reportado como "el botón no hace nada". El mecanismo en sí funcionaba bien (verificado con curl y Playwright con 2+ actividades); ahora, cuando no hay opciones, se muestra un mensaje explicando por qué en vez del selector, y el botón queda deshabilitado si no hay nada seleccionado.
[1.8.0] - 2026-09-10
Changed
- Renombrado "Subtareas" a "Tareas" en todo el sistema (Actividad → Tarea, sin nivel "sub"
intermedio): tabla
subtasks→tasks(migración005,RENAME TABLEidempotente), módulo backendsubtasks/→tasks/, rutas/api/activities/:id/subtasks→/api/activities/:id/tasksy/api/subtasks/:id→/api/tasks/:id, servicio frontend, pestaña dentro del detalle de actividad, i18n (es-EC/en-US) y documentación (API.md,BASE_DE_DATOS.md,AGENTS.md,README.md,SPEC.md). Sin cambios de comportamiento, solo nombres.
[1.7.0] - 2026-09-10
Added
- Agregar miembro a un proyecto ahora acepta un correo que todavía no es usuario del sistema
(campo "Invitar por correo" en el popup de Miembros, alternativo a elegir uno existente). Si el
correo no pertenece a nadie, se crea una cuenta en estado
invitedy se le manda un correo con un enlace de un solo uso (/aceptar-invitacion?token=..., vence en 7 días) para que complete su propio registro (elige nombre y clave); la fila deproject_membersya queda creada de una vez, así que en cuanto acepta ya aparece como miembro sin pasos adicionales. A diferencia del autorregistro público, no pasa por aprobación de un admin — quien lo agregó a su proyecto ya lo vetó. Nuevos endpoints públicosGET /api/auth/inviteyPOST /api/auth/accept-invite.
[1.6.1] - 2026-09-09
Changed
- Nuevo ícono/logo de la app derivado del ícono original de LinkedCorp (círculo azul de marca
#1C55FFcon la red de nodos): se agregó una insignia con el acento de la app (#0078D4) para identificar visualmente el módulo de Proyectos. ActualizadoslogoLinked1.png,logoLinkedCorpTxt.pngylogoLinkedCorpTxtBlack.png(sidebar y login, temas oscuro/claro). - Favicon nuevo (
favicon.svg+favicon.png+apple-touch-icon.png); antes la app no declaraba ninguno.
[1.6.0] - 2026-09-09
Added
- Un proyecto puede tener uno o más administradores del proyecto (
role_in_project = 'admin'enproject_members), sin importar el rol global del usuario — uncollaboratorpuede ser administrador de un proyecto puntual. Se otorga/quita desde Miembros: casilla "Agregar como administrador del proyecto" al agregar, y un botón de escudo para promover/degradar a un miembro existente (protegido: nunca toca alDueño). NuevoPUT /api/projects/:id/members/:userId/role.canWriteProjectahora reconoce este rol por-proyecto además del comportamiento previo (admin/superadmin/it_manager global, o project_lead miembro).
Changed
- El menú "Configuración" (apariencia, catálogos, SMTP) ahora es visible y accesible solo para
el superadmin — antes cualquier usuario logueado lo veía y podía entrar (el tema/idioma
personal sigue disponible para todos desde los íconos de la barra superior, eso no cambió). Se
guarda tanto en el menú lateral como en la ruta directa
/configuracion. - Escritura de catálogos (
/api/catalogs/*, usado por la pantalla de Configuración) restringida de[superadmin, admin]a solosuperadmin, para que el backend sea consistente con queadminya no ve ni puede entrar a esa pantalla — la lectura sigue abierta a cualquier usuario (los combos de prioridad/estado en el resto de la app la necesitan).
[1.5.0] - 2026-09-09
Added
- Eliminar proyecto: eliminación lógica (
deleted_at/deleted_by) disponible para quien puede editar el proyecto (superadmin/admin/it_manager/project_lead dueño o miembro), con popup de confirmación (ContentDialog) antes de aplicarla. El proyecto desaparece del listado y del dashboard, pero sigue en la base de datos. - Papelera de proyectos, visible solo para el superadmin (botón "Papelera" en Proyectos):
lista los proyectos eliminados lógicamente, con acciones "Restaurar" y "Eliminar
definitivamente" (esta última con su propia confirmación, más severa — advierte que también
borra actividades/comentarios/adjuntos). El borrado físico (
DELETE) solo puede aplicarse sobre un proyecto que ya pasó por la eliminación lógica (nunca en un solo paso). - Columna "Creado" (fecha) en el listado de proyectos, ordenada por defecto de más nuevo a más
antiguo — un proyecto recién creado aparece primero sin tener que buscarlo.
ListViewahora soporta un orden inicial (initialSort) además del ordenamiento por clic en cabecera que ya tenía.
Fixed
- Los KPIs del dashboard (proyectos activos/atrasados/por vencer, avance promedio, actividades pendientes/atrasadas/de hoy, proyectos por estado) ahora excluyen proyectos eliminados lógicamente — antes de este cambio no existía el concepto, así que no aplica como regresión, pero se dejó explícito para que un futuro cambio no los vuelva a incluir por accidente.
[1.4.0] - 2026-09-09
Added
- Boton de revelar/ocultar clave (icono de ojo) en todos los campos de contraseña de la app:
login, registro, restablecer clave, cambiar clave (usuario logueado), crear usuario y la clave
SMTP en Configuración. Nuevo componente reutilizable
PasswordInput.
Fixed
- El fix de espacios en SMTP del v1.3.0 usaba
trim(), que solo recorta los bordes. El caso real en producción tenía el espacio a mitad del host ("mail.linkedcorp." + " " + "net"), asi que seguia fallando tras el primer fix. Corregido para quitar cualquier espacio, no solo los bordes.
[1.3.0] - 2026-09-06
Added
- Configuración → Correo (SMTP): botón "Enviar prueba" con campo de destinatario. Ejecuta un envío
real (
POST /api/settings/smtp/test, solo superadmin, rate-limited) usando los valores actuales del formulario (aunque no se hayan guardado) y muestra el resultado real — éxito o el error tal cual lo devuelve el servidor SMTP — a diferencia desendMail()(correo de negocio), que nunca lanza para no romper flujos comoforgot-password.
Fixed
- La pantalla de SMTP no tenía forma de verificar que la configuración guardada funcionara de
verdad; un error de host/certificado/credenciales solo se detectaba cuando fallaba un correo real
de negocio, sin ningún diagnóstico. Regla agregada a
SEGURIDAD-Y-CALIDAD.mddel orquestador: toda config de servicio externo debe incluir una acción de prueba real.
[1.2.0] - 2026-09-06
Added
- Cambiar clave desde la app:
PUT /api/auth/change-password(exige la clave actual) + opción "Cambiar clave" en el menú de usuario (popup), disponible para cualquier usuario logueado.
[1.1.0] - 2026-09-06
Added
- Autorregistro público (
/registro) con verificación de correo (enlace de un solo uso, 24h) y aprobación posterior por Administrador/Superadministrador (/api/users/:id/approve|reject). - Recuperación de clave (
/olvide-clave→/restablecer-clave), respuesta siempre genérica. - Rol
superadmin: el usuario más antiguo del sistema (bootstrap automático al primer registro). - Configuración → Correo (SMTP), solo visible/editable por el superadmin; clave cifrada
(AES-256-GCM) en
system_settings, nunca expuesta por la API. Sin configurar, los correos de verificación/recuperación se loguean en vez de enviarse (modo dev, no rompe el flujo).
Fixed
- Bug real:
React.StrictModedisparaba dos veces el efecto deVerifyEmailPage, y la segunda llamada (token ya consumido) mostraba "enlace inválido" aunque la verificación sí había funcionado. Corregido con una guarda por token ya solicitado. - Reordenado el montaje de rutas del backend:
subtasksRoutes(mount genérico en/api) queda al final, para no interceptar con surequireAuthinterno una request sin token dirigida a un router más específico registrado después (ver deuda técnica de la v1.0.0).
[1.0.0] - 2026-09-06
Added
- Primer despliegue a producción:
https://project.linkedcorp.net(arquetipo B, dos servicios). create-admin.js: bootstrap del usuario Administrador de producción con clave fuerte generada.
Changed
seed-db.jssepara catálogos (universal) de datos de ejemplo (solo entornos no productivos).- Logo real de LinkedCorp (sidebar, login) en vez del placeholder "LC"; tamaño duplicado.
ComboBox/Flyoutse posicionan con portal adocument.body(ya no se recortan dentro de unExpanderoDetailPopup).- Master-detail de listados unificado en
DetailPopup(popup de tamaño fijo, no se cierra con clic afuera) en Proyectos, Actividades, Departamentos, Usuarios, Miembros y Catálogos. - "Miembros" del proyecto pasa a ser su propia pestaña (antes vivía dentro de "Info").
[0.1.0] - 2026-09-03
Added
- Estructura inicial del proyecto (backend Express + frontend React/Vite + MariaDB).
- Modelo de datos MVP: usuarios/roles, departamentos, proyectos, actividades, subtareas, dependencias, comentarios, adjuntos, notificaciones, auditoría, catálogos.
- Identidad UI/UX Fluent/Windows 11 (UI-UX-WINDOWS) adaptada a app web.