Commit Graph

78 Commits

Author SHA1 Message Date
Milton Gonzalez 420a794c9e feat: version 4.16.0 -- Equipos: tipo de licencia y software agrupado por fabricante
Clasificador por reglas sin IA, correccion manual (migracion 040) y filas desplegables en ListView.
Flyout por encima de popups.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 12:36:02 -05:00
Milton Gonzalez 34183d15ce feat: version 4.15.0 -- Equipos: pestaña Licenciamiento (Windows y Office)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 11:47:57 -05:00
Milton Gonzalez b2c25c4fe5 feat: version 4.14.0 -- Equipos: año del procesador con boton Obtener fecha (IA)
La IA consulta solo el nombre del procesador y devuelve el año (el mas antiguo si hay dos).
Migracion 039.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 19:07:31 -05:00
Milton Gonzalez d85a7196f0 feat: version 4.13.0 -- Agregar medicos desde proveedores de SAGA (solo por API)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 17:15:12 -05:00
Milton Gonzalez 0ee9ed65bf feat: version 4.12.0 -- Conexiones externas: pacientes de SAGA, empleados de nomina y medicos
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 17:06:10 -05:00
Milton Gonzalez 366447dffc feat: version 4.9.0 -- Agenda medica: clic en dia abre cita, autor fijo y borrado logico
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 07:57:36 -05:00
Milton Gonzalez 1e25022630 feat: version 4.7.0 -- Agenda medica
Modulo clinic (habilitado por usuario): citas de pacientes para medicos con choques
bloqueantes (medico, paciente con cualquier medico, quirofano/bloqueos recurrentes y
horario de atencion), validados en transaccion con bloqueo de filas para que dos
recepcionistas no tomen el mismo hueco. Recepcion (alcance todos) y medico (alcance
propio). Vista Dia por columnas de medico, Semana y Lista; pacientes con historial;
bloqueos; configuracion de personal, horarios y tipos solo admin/superadmin. Capa de
citas en el calendario personal del medico. Migracion 036.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 12:57:43 -05:00
Milton Gonzalez bdc62403f4 feat: version 4.6.0 -- Cambio de correo con aprobacion
El usuario solicita el cambio desde Mi cuenta (correo nuevo + clave actual). Lo
aprueba un admin/superadmin (colaboradores), solo un superadmin (admins) o el propio
superadmin mediante enlace a su correo actual. Tras aprobar se envia confirmacion al
correo nuevo y aviso al actual; al confirmar se aplica el cambio y se cierran todas
las sesiones. Todo el proceso queda en auditoria. Migracion 035.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 12:03:23 -05:00
Milton Gonzalez d562351242 feat: version 4.5.0 -- Calendario personal con filtros y capas por tipo
Calendario personal para todos los roles: reuniones que organizo o me invitaron,
proyectos donde soy dueno/miembro, actividades y tareas donde soy responsable y
tareas recurrentes creadas o compartidas conmigo (solo lectura si no soy el creador).
Filtros Ver (Todo / Solo lo mio / Compartido conmigo) y Mostrar (lista de tipos con
Todo); colores por tipo, vencidos en rojo, compartido marcado con franja.
La pestana Calendario del proyecto muestra todas sus reuniones vinculadas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 11:23:29 -05:00
Milton Gonzalez 6066f27ba0 feat: version 4.4.0 -- Calendario de reuniones
Menu Calendario (Mes/Semana/Dia/Agenda) para agendar reuniones con participantes
internos y externos, RSVP, vinculo a proyecto, vencimientos de actividades,
invitaciones iCalendar por correo, recurrencia con excepciones, recordatorios
in-app y aviso de choques. Migracion 034_meetings.sql.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 11:04:41 -05:00
Milton Gonzalez a6cc41666e feat: version 4.3.0 -- Sesiones activas y pagina Mi cuenta
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 16:42:19 -05:00
Milton Gonzalez 664d111faf feat: version 4.2.1 -- IA para proyectos de cualquier area y propuestas mas compactas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 18:30:38 -05:00
Milton Gonzalez 9d50bc8564 feat: version 4.2.0 -- Informe de estado del proyecto con IA
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 18:19:24 -05:00
Milton Gonzalez 120e54283e feat: version 4.1.0 -- Consumo de IA por usuario en Configuracion
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:48:49 -05:00
Milton Gonzalez f497da836c fix: version 4.0.5 -- Propuestas de IA grandes ya no quedan cortadas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:37:30 -05:00
Milton Gonzalez 6d41e96ec1 feat: version 4.0.4 -- Nuevo con IA detecta duplicados en actividades y tareas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:10:37 -05:00
Milton Gonzalez 3ee17d1c5a refactor: version 4.0.2 -- Duplicados de Nuevo con IA decididos por la IA
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:47:56 -05:00
Milton Gonzalez 7e59f0181d feat: version 4.0.1 -- Nuevo con IA: aviso de proyectos parecidos y objetivo redactado
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:38:28 -05:00
Milton Gonzalez 4b83a24e4c feat: version 4.0.0 -- Asistente Nuevo proyecto con IA
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:15:53 -05:00
Milton Gonzalez 89dec6da7e feat: version 3.2.0 -- Integracion IA: configuracion y plan de actividades
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 15:55:54 -05:00
Milton Gonzalez c64a16064f fix: version 3.1.2 -- Panel sin datos de proyectos para usuarios sin ese modulo
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 14:33:41 -05:00
Milton Gonzalez 4056c70d90 feat: version 3.1.0 -- Acceso por modulo y por usuario
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 14:14:01 -05:00
Milton Gonzalez 959c365d5c fix: version 3.0.1 -- Actualizador espera a backend y frontend antes de recargar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 11:59:48 -05:00
Milton Gonzalez e65111a7f4 feat: version 3.0.0 -- Correcciones de auditoria de seguridad, accesibilidad y redundancia
Permisos (superadmin, viewer, busqueda, tareas recurrentes), bootstrap atomico,
revocacion de JWT por version de sesion (028), control optimista de edicion (029),
logo sin SVG + CSP, ingesta endurecida, correos escapados, borradores, paginacion
de proyectos, accesibilidad de dialogos/controles e i18n.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 11:36:02 -05:00
Milton Gonzalez bcb9c9d714 refactor: version 2.18.2 -- Panel: se quita "Mis actividades pendientes"
El detalle vive en los popups de las tarjetas; se elimina tambien la consulta
myPendingActivities del backend, que quedaba sin uso.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 08:26:57 -05:00
Milton Gonzalez 3884239b7e feat: version 2.18.0 -- Panel: detalle de cada tarjeta en popup
Las 7 tarjetas abren su lista en un DetailPopup (proyectos o actividades segun
la tarjeta); el bloque "Mis actividades" queda fijo. Nuevas listas de proximos
a vencer y para hoy; "Para hoy" deja de contar eliminadas/cancelados.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 08:14:39 -05:00
Milton Gonzalez dda6aa3369 feat: version 2.17.9 -- Panel: medidor y detalle en "Actividades vencidas"
Base = actividades no eliminadas, no canceladas y de proyectos no cancelados;
el conteo de vencidas usa el mismo criterio (antes incluia eliminadas).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 08:03:22 -05:00
Milton Gonzalez 22b287fcd8 feat: version 2.17.8 -- Panel: medidor y detalle en "Actividades pendientes"
Base = actividades no eliminadas de proyectos no cancelados; el conteo de
pendientes pasa a usar el mismo criterio (antes incluia eliminadas).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 08:01:45 -05:00
Milton Gonzalez 10952beea5 feat: version 2.17.7 -- Panel: medidor y detalle en "Proyectos activos"
Porcentaje de activos sobre el total sin cancelados, "N de M" y lista de
proyectos activos al hacer clic. La lista de detalle pasa a un componente
compartido con "Proyectos atrasados".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 07:52:49 -05:00
Milton Gonzalez 4583e3c456 feat: version 2.17.5 -- Panel: medidor y detalle en "Proyectos atrasados"
La tarjeta muestra un medidor semicircular (atrasados/activos) con el valor al
centro; al hacer clic, el bloque inferior lista los proyectos atrasados en vez
de mis actividades. Por ahora solo esta tarjeta.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:02:45 -05:00
Milton Gonzalez 9231bd2c7a fix: version 2.17.4 -- el avance del proyecto ignoraba que habia actividades eliminadas
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 15:47:17 -05:00
Milton Gonzalez 30bb546b84 feat: version 2.17.0 -- Equipos: pestaña Usuarios (sesion, usuarios y grupos locales)
Migracion 027 (device_accounts).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 11:50:44 -05:00
Milton Gonzalez 4a305df73e feat: version 2.16.0 -- contador de cierre en Contraseñas, cierre por inactividad y ajustes de Equipos
Contraseñas: el cierre automatico ahora es por inactividad (no saca al usuario a medio escribir),
token de desbloqueo renovable y contador visible junto al titulo. Equipos: GUID como componente.
Sube la version para que el panel de Actualizaciones ofrezca los cambios 2.15.0 -> 2.16.0
(migraciones 025 y 026, instalador del agente y pestaña Compartir).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 08:52:46 -05:00
Milton Gonzalez d60b4b1d77 feat: version 2.15.0 -- pestaña Compartir en Equipos (acceso de solo lectura)
Admin/superadmin dan acceso de solo lectura (Resumen, Equipos, Software) a otros usuarios;
el backend valida el acceso en cada endpoint y el menu aparece solo a quien lo tenga.
Migracion 026 (device_viewers).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 08:32:53 -05:00
Milton Gonzalez d5f09dc91b feat: version 2.15.0 -- instalador del agente GLPI, filtro de componentes y token recuperable
Instalador .bat generado en el navegador, casilla para ocultar actualizaciones/drivers/componentes
en Software, buscador por pestaña en el detalle, GUIDs como componentes y tokens de ingesta
cifrados (migraciones 024 y 025).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 08:17:53 -05:00
Milton Gonzalez e25c2c3b35 feat: version 2.15.0 -- menu Equipos (inventario de TI con agente GLPI)
Ingesta POST /api/inventory (JSON/XML, token de instalacion), upsert por deviceid,
historial de cambios, pestañas Resumen/Equipos/Software/Agentes, detalle con buscador
por pestaña y casilla para ocultar actualizaciones/drivers/componentes del software.
Migraciones 023 y 024. Diseño en docs/ARQUITECTURA-INVENTARIO.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 19:05:00 -05:00
Milton Gonzalez 7139f1604e feat: version 2.14.0 -- compartir grupo completo y destruir con cascada
Contraseñas: "Compartir grupo" aplica el mismo share de solo lectura a todas
las credenciales de un grupo de una vez (el grupo sigue sin ser una unidad
de permiso -- es una accion de conveniencia). El grupo y cada credencial se
marcan con el icono de compartido. "Destruir grupo" ahora tiene dos
opciones: solo desagrupar (como antes) o destruir tambien las N credenciales,
con advertencia explicita del conteo.

Fix de paso en ComboBox (afecta a toda la app): el panel se cerraba solo al
abrirse si el trigger estaba cerca del borde de un contenedor con scroll,
por un micro-scroll automatico del navegador al enfocar el boton.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 17:42:39 -05:00
Milton Gonzalez 3da652c136 feat: version 2.13.0 -- grupos y compartir en Contraseñas
Grupos de un solo nivel (tarjetas, clic entra a ver sus credenciales) y compartir
una credencial individual de solo lectura con otro usuario registrado (puede
revelar/copiar la contraseña real, nunca editar/borrar/compartir/mover de grupo).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 16:14:36 -05:00
Milton Gonzalez 3257c4f065 feat: version 2.12.0 -- editar y borrar comentarios
Hasta ahora un comentario (de proyecto o actividad) solo se podia crear, nunca tocar. Se
agrega PUT/DELETE /comments/:id, restringido a quien lo escribio o a superadmin/admin (igual
criterio que useria para notas/tareas: nunca otro colaborador aunque tenga permiso de
escritura en el proyecto). Migracion 021 agrega updated_at a comments para mostrar "Editado"
igual que ya hace Notas.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 12:22:27 -05:00
Milton Gonzalez 4520abe96f feat: version 2.11.0 -- contadores de dependencias/comentarios/documentos/miembros en listados
Actividades (dentro de un proyecto): nuevas columnas con la cantidad de dependencias,
comentarios y documentos de cada fila -- subconsultas correlacionadas agregadas al
LIST_SELECT existente (mismo patron que share_count de notas/proyectos), siempre numericas
(0 si no hay, nunca oculto).

Proyectos: nuevas columnas con la cantidad de miembros, actividades completas al 100% sobre
el total (ej. "1/4", mismo patron pendientes/total que ya usa la pestaña de tareas de una
actividad), comentarios y documentos.

Nuevo componente CountBadge (icono + numero) reutilizado en ambos listados -- a diferencia de
SharedWithIcon/Tabs que ocultan el badge en 0, este siempre lo muestra.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 11:40:07 -05:00
Milton Gonzalez 0964ffb8a8 feat: version 2.10.4 -- tarjetas de Notas arrastrables para reordenar
Nueva columna sort_order en notes (migracion 020, mismo patron que 012_sort_order.sql de
activities/tasks). Se reusa el hook useDragReorder ya existente (drag & drop nativo, sin
libreria nueva) -- el icono de agarre va solo en una esquina de la tarjeta, nunca en la
tarjeta completa, para no pisar el click que abre la edicion (mismo truco que ya usa
ListView.jsx: stopPropagation en el handle).

Solo las notas propias son arrastrables/reordenables; las compartidas conmigo quedan
siempre despues, ordenadas por fecha (el orden manual de otro usuario no tiene sentido para
mi vista). Se desactiva mientras hay un filtro de busqueda activo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 16:17:51 -05:00
Milton Gonzalez 2d1bfc0bfd feat: version 2.10.3 -- reenviar correo de invitacion/verificacion desde Usuarios
Nueva opcion "Reenviar correo" en el menu de 3 puntos de Organizacion -> Usuarios, para
usuarios en estado 'invited' o 'pending_verification'. Reusa las mismas columnas
(verification_token/verification_token_expires) y plantillas que el envio original
(inviteUser / auth/service.js#register), solo genera un token nuevo -- el anterior pudo
vencer o perderse en spam.

De paso se corrige que el estado "invited" no tenia rama propia en el menu de acciones (caia
en el branch generico de editar/activar-desactivar, que no aplica a una cuenta placeholder sin
clave real todavia) ni traduccion de su badge (user_status_invited faltaba en i18n).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 16:02:24 -05:00
Milton Gonzalez 98d9196791 feat: version 2.10.2 -- icono de compartida + buscador en tarjetas de Notas
Tarjetas de Notas: icono junto a la fecha cuando la nota esta compartida (propia compartida
con alguien, via share_count nuevo en la consulta; o recibida de otro usuario). Buscador
junto al titulo que filtra las tarjetas en vivo por contenido (client-side, sin ida y vuelta
al backend ya que el contenido no esta cifrado como en Contraseñas).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 15:37:31 -05:00
Milton Gonzalez da4d83e7cc fix: version 2.10.1 -- "Probar correo" tiraba Error interno si la clave SMTP no descifraba
El decrypt() de la clave SMTP guardada estaba fuera del try/catch tanto en testSmtpConfig
(el boton "Probar") como en getSmtpConfigInternal (usado por el mailer real para forgot-
password, registro, invitaciones). Si ENCRYPTION_KEY no coincide con la que se uso para
guardar -- el caso documentado de exilaser, que recibio un dump de LinkedCorp con su propia
clave -- el fallo de decrypt() se propagaba sin control: "Error interno" generico en el boton
de prueba, y un crash silencioso en el envio real en vez de la degradacion a modo dev que el
propio comentario del codigo promete. Ambos casos ahora devuelven un mensaje claro / degradan
correctamente.

De paso se agrega `app.set('trust proxy', 1)`: la app corre detras de Nginx Proxy Manager pero
Express no lo sabia, asi que express-rate-limit usaba la IP del proxy para todos los clientes
(un cupo compartido en vez de uno por usuario) y tiraba un aviso de validacion en cada request.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 12:26:00 -05:00
Milton Gonzalez 926215297e feat: version 2.10.0 -- Notas en tarjetas, crear/editar en popup, compartir de solo lectura
Rediseno completo del modulo Notas (era lista inline, sin popup, sin compartir):
- Tarjetas con resumen del contenido en vez de lista vertical; la primera tarjeta siempre es
  un "+" para crear.
- Crear y editar se hacen en un DetailPopup (antes: textarea fijo arriba + edicion inline por
  tarjeta).
- Nueva tabla note_shares (migracion 019): compartir una nota con otro usuario ya registrado,
  siempre de solo lectura -- el dueño sigue siendo el unico que edita/borra/comparte (mismo
  patron que project_members pero sin rol ni invitacion por correo, ya que acá no hace falta).
  Quien recibe la nota la ve con "Compartida por {nombre}", sin ningun control de edicion.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-12 12:09:04 -05:00
Milton Gonzalez 3d220bcc20 feat: version 2.9.0 -- ver documentos .md/.txt directo, sin descargar
Agrega un boton "Ver" en Documentos (adjuntos de proyectos/actividades) para archivos de
texto plano y Markdown: se leen via blob (mismo mecanismo ya usado para descargar, que ya
maneja el Bearer token) y se muestran en un popup -- el .md se renderiza con formato (marked)
y se sanitiza con DOMPurify antes de insertarse en el DOM, para no abrir una via de XSS con
HTML/JS embebido en un documento subido por otro usuario.

De paso corrige que subir un .md fallaba con "tipo de archivo no permitido": el navegador no
manda un mimetype confiable para esa extension (varia segun SO), asi que ahora se normaliza
por extension en el fileFilter de multer en vez de depender solo del mimetype del navegador.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-07 17:17:03 -05:00
Milton Gonzalez 8214df62ae feat: version 2.8.1 -- catalogo de logos de marca en Contraseñas (simple-icons, CC0)
Amplia el selector de icono de una credencial con ~70 logos reales de marcas conocidas
(Google, GitHub, Cloudflare, cPanel, MikroTik, WordPress, etc.), empaquetados localmente
desde el paquete simple-icons (dominio publico) y tree-shakeados por Vite. Se mantiene el
criterio de privacidad ya establecido: ninguna consulta externa de favicon por entrada.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 14:16:31 -05:00
Milton Gonzalez 551ed9b790 feat: version 2.8.0 -- buscador en Contraseñas (nombre/usuario/enlace/notas)
Filtra las tarjetas mientras se escribe. Nombre/usuario/enlace se
comparan en texto plano; las notas (cifradas) se descifran solo en
el servidor para la comparacion -- el contenido nunca viaja de vuelta
al cliente salvo al revelar esa entrada puntual.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:57:10 -05:00
Milton Gonzalez 127ca2ba7e feat: version 2.7.2 -- tarjetas con icono en Contraseñas + fix borrado de password al editar
Listado de Contraseñas pasa de tabla a tarjetas: icono elegible (
catalogo fijo, sin servicios externos de favicon por privacidad) o
inicial del nombre como fallback, junto con nombre y enlace.

Fix real: editar una credencial sin revelar la contraseña antes la
dejaba vacia al guardar -- ahora se conserva la que ya estaba si no
se escribe una nueva.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:41:22 -05:00
Milton Gonzalez 0be0712ff0 feat: version 2.7.0 -- menu Contraseñas (repositorio de credenciales privado)
Nuevo modulo backend/src/modules/vault/: contraseña y notas cifradas
en el servidor (AES-256-GCM, mismo mecanismo ya usado para la clave
SMTP). Acceso al menu protegido con un PIN de 4 digitos independiente
del login (token corto propio, header X-Vault-Token, nunca el JWT de
sesion). El PIN no participa del cifrado -- cambiarlo o restablecerlo
por correo nunca afecta las contraseñas ya guardadas. Privado por
usuario, sin excepcion. Cada accion sensible (crear/editar/eliminar/
revelar/desbloquear) queda en audit_log. Compartir con otro usuario
queda para una proxima version.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-01 12:12:54 -05:00