Commit Graph

186 Commits

Author SHA1 Message Date
Milton Gonzalez 043433bf9b feat: convertir una actividad en proyecto (con sus tareas)
Una tarea siempre necesita una actividad contenedora, asi que convertir crea DOS cosas: el
proyecto nuevo y, dentro, una actividad nueva que recibe las tareas -- y comentarios/adjuntos --
de la actividad original. Se piden ambos nombres (precargados con el nombre actual) antes de
confirmar. La actividad original se borra al final, ya vacia de tareas (no choca con el bloqueo
de removeActivity). Exige el mismo permiso que crear un proyecto, no solo escribir la actividad.

Nuevo POST /api/activities/:id/convert-to-project. Probado de punta a punta en dev: prioridad
heredada, tareas y comentario movidos correctamente, actividad original eliminada, navega al
proyecto nuevo al terminar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 08:59:16 -05:00
Milton Gonzalez cc7928464b docs: registra el deploy a produccion de v1.19.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 17:13:50 -05:00
Milton Gonzalez 59aadc6a35 feat: panel de Actualizaciones en Configuracion (solo informativo)
Compara la version instalada contra el CHANGELOG.md de main en Gitea (lectura anonima por HTTPS,
sin token) y muestra cada version pendiente con su criticidad -- derivada del digito que cambio
(1ro=Alta, 2do=Media, 3ro=Baja, sin etiquetar nada a mano, regla ya documentada en
VERSIONADO.md), una descripcion breve, y si trae migraciones de base de datos nuevas. Banner en
rojo avisando que la actualizacion requiere reiniciar el sistema.

No instala nada automaticamente -- solo informa. Aplicar la actualizacion (git pull, build,
migrar, reiniciar servicios) sigue siendo manual, a criterio del administrador de cada
instalacion, tal cual DEPLOY_WEB.md ya documenta.

Nuevo GET /api/updater/status (solo superadmin). Requiere que el repo en Gitea sea publico con
vista anonima habilitada -- documentado en DEPLOY_WEB.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 17:11:58 -05:00
Milton Gonzalez 95e3a0199d docs: registra el deploy a produccion de v1.18.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 15:05:37 -05:00
Milton Gonzalez 67cb58ed0b feat: el buscador de Proyectos y Actividades tambien busca en tareas
Buscador de Proyectos: ahora busca tambien en actividades y tareas de cualquier proyecto (antes
solo nombre/codigo del proyecto). Resultados en un panel flotante con la ruta completa
"Proyecto - Actividad - Tarea"; clic navega al proyecto y abre la actividad encontrada
(pestaña Tareas si el resultado era una tarea).

Buscador de Actividades (dentro de un proyecto): busca tambien en las tareas de esa actividad,
mismo panel con "Actividad - Tarea".

Nuevo GET /api/search?q=...&projectId= (global o acotado a un proyecto). Nuevos componentes/hooks
reutilizables: SearchResultsDropdown, useDebouncedValue.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 15:04:53 -05:00
Milton Gonzalez 528a1e7cae docs: registra el deploy a produccion de v1.17.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:48:51 -05:00
Milton Gonzalez 53570bd4f8 feat: mover una actividad (con sus tareas) a otro proyecto
Menu de tres puntos en el listado de Actividades -> elegir proyecto destino -> confirmar
("Se movera la actividad... (junto con sus tareas)... Aceptar/Cancelar) antes de ejecutar.

Tareas, comentarios y adjuntos se mueven solos (referencian la actividad, no el proyecto). Las
dependencias existentes se eliminan al mover -- solo tienen sentido dentro del mismo proyecto
(addDependency ya lo exigia). Nuevo PUT /api/activities/:id/move, exige permiso de escritura en
ambos proyectos (origen y destino).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:47:57 -05:00
Milton Gonzalez 397fed5eb1 docs: registra el deploy a produccion de v1.16.4
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:39:21 -05:00
Milton Gonzalez 9d76e1b79b feat: columna Actualizado (fecha y hora) en el listado de Actividades
Mismo formato que ya existia en Proyectos. Ordenable por columna; no cambia el orden por
defecto (sigue siendo el orden manual arrastrado con el mouse).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:38:44 -05:00
Milton Gonzalez 089c79eb63 docs: registra el deploy a produccion de v1.16.3
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:22:59 -05:00
Milton Gonzalez 696ab0d092 fix: arrastrar tareas para reordenar dejo de funcionar
Regresion del fix del checkbox (v1.15.2): draggable/onDragStart quedaron directo sobre el <svg>
del icono de agarre, que solo capta el mousedown sobre lo pintado (huecos entre sus formas), no
sobre todo su recuadro -- el navegador no siempre detectaba el inicio del arrastre. Envuelto en
un <span> con area de agarre solida, mismo patron ya usado en el listado de Actividades.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 14:22:26 -05:00
Milton Gonzalez 8e7c0d87c2 docs: registra el deploy a produccion de v1.16.2
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 13:03:05 -05:00
Milton Gonzalez 60347fab72 feat: contador de Tareas muestra pendientes/total (ej. 2/3)
Solo la pestaña Tareas -- Comentarios y Documentos siguen con el total simple. Se recalcula al
agregar, quitar o marcar/desmarcar tareas.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 13:02:34 -05:00
Milton Gonzalez 00545220e1 docs: registra el deploy a produccion de v1.16.1
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:57:07 -05:00
Milton Gonzalez 22e09c989e style: contador de pestañas en rojo en vez de azul
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:56:37 -05:00
Milton Gonzalez 60f70d1122 docs: registra el deploy a produccion de v1.16.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:52:51 -05:00
Milton Gonzalez 1b23da7151 feat: contador en las pestañas de Tareas/Comentarios/Documentos de una actividad
Circulo con el numero al lado del nombre de la pestaña: Tareas muestra las pendientes (sin
marcar), Comentarios y Documentos el total. Soporte agregado al componente Tabs reutilizable
(tab.count), no solo al detalle de actividad.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:52:00 -05:00
Milton Gonzalez 551d4f8c38 docs: registra el deploy a produccion de v1.15.2
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:34:58 -05:00
Milton Gonzalez c84a07968f fix: checkbox de tarea (hecho) no se actualizaba tras guardar
useDragReorder resincronizaba su copia local solo cuando cambiaba el conjunto de ids, no cuando
se editaba un campo de una tarea existente (marcar hecho, renombrar) -- la fila se quedaba
mostrando el snapshot viejo para siempre despues de guardar. Ahora compara el contenido completo.

De paso: draggable/onDragStart pasan a vivir solo en el icono de agarre, nunca en toda la fila --
un ancestro draggable=true le gana el mousedown a los controles interactivos que tenga adentro en
algunos navegadores (no era la causa de este bug puntual, pero es un problema real del mismo
patron que conviene cerrar ya que se reutiliza en cualquier lista futura).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 12:33:35 -05:00
Milton Gonzalez f8e42d4377 feat: instalador para servidor nuevo + fix migracion 006 en BD vacia
scripts/install.sh automatiza el primer despliegue en un servidor Debian/Ubuntu nuevo: verifica
requisitos (Node.js, npm, cliente mysql, systemd, espacio, puertos libres), pregunta dominio,
puertos y base de datos (MariaDB local auto-instalada o un servidor existente), genera
backend/.env con secretos aleatorios, corre migraciones + catalogos, compila el frontend y
crea/arranca los servicios systemd. No crea usuarios: el primer registro publico se vuelve
superadmin solo (bootstrap ya existente).

Probando el instalador de punta a punta contra una base de datos recien creada goo un bug real:
la migracion 006_seed_it_baseline.sql (datos de ejemplo especificos de LinkedCorp) fallaba por
foreign key al no existir todavia catalogos ni usuario. Corregido para que detecte esa situacion
y quede inerte en instalaciones nuevas, sin tocar el comportamiento ya probado en dev/prod.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 15:43:11 -05:00
Milton Gonzalez 2a1bdf1ba9 feat: nombre y logo de empresa configurables (solo dev, no desplegado a prod)
Nueva marca configurable desde Configuracion -> Empresa (solo superadmin): nombre y logo,
guardados en system_settings (mismo patron que SMTP, sin tabla nueva). Nuevo endpoint publico
GET /api/company (+ /logo) para que login/registro/recuperacion de clave puedan mostrar la marca
antes de iniciar sesion. Sin configurar, se ve "LinkedCorp" y el logo estatico de siempre.

Probado en dev (build + Playwright: panel de Configuracion, sidebar expandido/compacto, login
publico), sin desplegar a produccion por pedido explicito del usuario -- este commit sirve de
punto de control en git antes de decidir el despliegue.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 14:42:15 -05:00
Milton Gonzalez 7ba4a89d49 fix: version real en pie del menu + logo abajo-izquierda
El pie del menu lateral mostraba el texto fijo "v0.1.0" en vez de la version real (se lee ahora
de package.json via import JSON de Vite). El logo de LinkedCorp se mueve del encabezado del menu
al pie, sobre el numero de version, en modo expandido y compacto.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:08:55 -05:00
Milton Gonzalez 937762322e docs: registra el deploy a produccion de v1.14.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 12:42:00 -05:00
Milton Gonzalez 80981e9063 feat: arrastrar con el mouse para reordenar actividades y tareas
Hook reutilizable useDragReorder (drag & drop nativo HTML5, sin
libreria nueva) usado en dos lugares: ListView (opt-in via onReorder,
deshabilitado mientras haya un ordenamiento por columna activo) para
el listado de actividades de un proyecto, y el listado de tareas de
una actividad. Orden persistido en sort_order (activities y tasks,
migracion 012, posiciones siempre 1..N).

Fix real encontrado durante las pruebas: sincronizar el estado interno
del hook por la REFERENCIA del arreglo de entrada entraba en loop
infinito de renders cuando el llamador pasa "algo || []" (un arreglo
nuevo en cada render mientras los datos cargan). Corregido para
sincronizar por el contenido (ids), no por referencia.

Probado en dev con curl (persistencia del orden) y Playwright
(arrastrar filas en el navegador, orden visible y guardado
correctamente, sin errores de consola tras el fix).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 12:41:19 -05:00
Milton Gonzalez 9bb8fecf1c docs: registra el deploy a produccion de v1.13.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 12:31:27 -05:00
Milton Gonzalez 5e0bc0809e feat: eliminar actividad, bloqueado si tiene tareas pendientes
No existia forma de borrar una actividad. Agregado DELETE
/api/activities/:id con boton "Eliminar" en el listado (popup de
confirmacion). Si tiene tareas, se bloquea con 400 y mensaje claro en
vez de arrastrar todo en cascada sin avisar.

De paso: la logica de borrar adjunto (fila + archivo en disco) se
extrajo a un attachments/service.js reutilizable, usado tanto por el
borrado individual como por el borrado en cascada de una actividad
(evita archivos huerfanos). Comentarios de la actividad tambien se
limpian (sin FK fisica cruzada, entity_type/entity_id es polimorfico).

Probado en dev con curl (bloquea con tarea, permite sin tareas, 404
tras borrar) y Playwright (mensaje de advertencia visible).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 12:30:53 -05:00
Milton Gonzalez 5d48cc6d32 docs: registra el deploy a produccion de v1.12.5
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 17:27:23 -05:00
Milton Gonzalez 8fa45de6d0 feat: reemplaza "Creado" por "Actualizado" en el listado de Proyectos
Columna con fecha y hora, orden por defecto (mas reciente primero) en
vez de fecha de creacion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 17:26:41 -05:00
Milton Gonzalez 24aaa5efe8 docs: registra el deploy a produccion de v1.12.4
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 09:30:18 -05:00
Milton Gonzalez a9904074e5 feat: boton editar (lapiz) en cada tarea de una actividad
El backend ya soportaba renombrar una tarea (PUT /api/tasks/:id), solo
faltaba el boton en la UI. Edicion en linea: input + guardar (Enter o
icono) / cancelar (Escape o icono).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 09:29:49 -05:00
Milton Gonzalez 9dad88e7e4 docs: registra el deploy a produccion de v1.12.3
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 09:21:30 -05:00
Milton Gonzalez ab30dfe53e feat: muestra la fecha del documento en la lista de adjuntos
El backend ya devolvia created_at, solo faltaba mostrarlo junto a
quien lo subio y el tamaño.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 09:21:01 -05:00
Milton Gonzalez d2319a7f85 docs: registra el deploy a produccion de v1.12.2
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 08:52:19 -05:00
Milton Gonzalez d3ef86c1db fix: icono de calendario invisible en campos de fecha con tema oscuro
Reportado en produccion: el icono nativo del input type="date" se
dibujaba negro sobre fondo oscuro. Se agrega color-scheme: dark para
esos inputs cuando data-theme="dark", asi el navegador elige un icono
claro automaticamente. Verificado en dev con Playwright.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 08:51:40 -05:00
Milton Gonzalez d7c7d17ead docs: registra el deploy a produccion de v1.12.1
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 10:29:51 -05:00
Milton Gonzalez 13a69aadc3 feat: campo "hasta" opcional en Tareas recurrentes
Vacio = se repite sin fin (comportamiento previo). Al completar un
ciclo cuyo proximo vencimiento supera "hasta", la tarea se desactiva
sola. Probado en dev con curl (3 ciclos seguidos, se desactiva justo
al superar la fecha) y validacion de que "hasta" no puede ser anterior
al proximo vencimiento.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 10:29:09 -05:00
Milton Gonzalez d00b9c50c6 docs: registra el deploy a produccion de v1.12.0 (Tareas recurrentes)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 10:18:02 -05:00
Milton Gonzalez 72b616bd02 feat: Tareas recurrentes con recordatorio por correo
Menu propio en la barra lateral, independiente de Proyectos:
- Periodicidad configurable (cada N dias/meses/años), proximo
  vencimiento, responsable, proyecto de origen opcional.
- "Completar ciclo" avanza el proximo vencimiento sumando la
  periodicidad y limpia el recordatorio ya enviado.
- Recordatorio por correo automatico N dias antes del vencimiento
  (default 7), a una hora del dia configurable. Un job en el propio
  proceso del backend (setInterval cada 15 min) revisa y envia, sin
  infraestructura nueva (cron del SO, cola, etc).
- Desde la pestaña Tareas de una actividad, cada tarea tiene un boton
  "Convertir en recurrente" que la promueve (la tarea original no se
  borra).

Probado en dev con curl (crear, completar ciclo avanza next_due_date,
promover desde una tarea real, disparo real del job de recordatorios
verificado forzando fecha/hora, segunda corrida no reenvia) y Playwright
(listado, popup de creacion, popup de promocion anidado sobre el detalle
de actividad) sin errores de consola.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 10:17:02 -05:00
Milton Gonzalez 02e5590b42 docs: registra el deploy a produccion de v1.11.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:56:39 -05:00
Milton Gonzalez 3ab0656a3e feat: filtros de Estado, Prioridad y proximos a vencer en Proyectos
El backend ya soportaba filtrar por statusId/priorityId; solo faltaba
exponerlo en la UI. "Proximos a vencer" es client-side, ventana de 7
dias (misma definicion que el KPI del dashboard).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:56:09 -05:00
Milton Gonzalez b7901693da docs: registra el deploy a produccion de v1.10.0
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:41:49 -05:00
Milton Gonzalez ccf5cbeb13 feat: ordenar proyectos por prioridad real + separa paginas web de dominios
canWriteProject/ListView ya soportaba ordenar por cualquier columna con
clic en el encabezado; solo Prioridad ordenaba alfabetico por el texto
en vez de por severidad real. Se agrega pr.level a la consulta y
sortValue en la columna.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:41:07 -05:00
Milton Gonzalez 44d0e10527 docs: registra el deploy a produccion de v1.9.3
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:34:35 -05:00
Milton Gonzalez bf31182425 data: agrega actividad de inventario de servicios de tecnologia
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:34:06 -05:00
Milton Gonzalez 41011423b0 docs: registra el deploy a produccion de v1.9.2
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:30:49 -05:00
Milton Gonzalez 472e0be886 data: aclara revision de equipos y agrega actividad de cableado de red
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:30:19 -05:00
Milton Gonzalez 669c9f1a2a docs: registra el reset de produccion y el camino usado para lograrlo
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:24:49 -05:00
Milton Gonzalez 6087f5659d data: reset de Proyectos y baja de un usuario, pedido por el superadmin
Migracion 006 de una sola vez (marcador en system_settings, no se repite
en deploys futuros): reemplaza el proyecto de prueba "Sistema ERP" por
los 6 proyectos reales de TI clasificados a partir del listado que
compartio el usuario, y borra la cuenta pflores@hotmail.es (autorregistro
nunca verificado). Probado en dev incluyendo la idempotencia (un proyecto
creado despues de correr la migracion sobrevive a un segundo "npm run
migrate").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-11 09:22:14 -05:00
Milton Gonzalez 69aee6f5af docs: registra el deploy a produccion de v1.9.0 y el pendiente real
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-10 16:01:02 -05:00
Milton Gonzalez f8b80d9bb4 feat: permite rechazar (eliminar) usuarios en pending_verification
Antes solo se podia rechazar un usuario en pending_approval. Una cuenta
autorregistrada que nunca confirmo su correo quedaba en
pending_verification para siempre, sin ninguna accion disponible en
Usuarios para quitarla.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-10 16:00:00 -05:00