chore(release): v1.0.0 — primer despliegue a producción
project.linkedcorp.net operativo en https://project.linkedcorp.net (servidor 192.168.222.3, BD 192.168.222.32, NPM con SSL forzado). Documenta la topología real y el flujo de deploy en PRODUCCION.md/DEPLOY_WEB.md, y actualiza AGENTS.md/ESTADO.md/README.md con el estado actual. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,50 +1,67 @@
|
||||
# ESTADO — project.linkedcorp.net
|
||||
|
||||
Ultima actualizacion: 2026-09-03
|
||||
Fase actual: MVP funcional en desarrollo local (fase 1 completa, sin deploy a produccion).
|
||||
Ultima actualizacion: 2026-09-06
|
||||
Fase actual: **En produccion** (`https://project.linkedcorp.net`, v1.0.0). MVP fase 1 operativo.
|
||||
|
||||
## Como retomar
|
||||
|
||||
1. Leer primero el orquestador: `/home/mgonzalez/desarrollo/project-md-templates/leeme_primero.txt`.
|
||||
2. Leer `AGENTS.md`, `SPEC.md` y este archivo.
|
||||
3. Backend: `cd backend && npm install && npm run dev` (puerto 4019). Requiere `backend/.env`
|
||||
(no versionado — si falta, copiar `backend/.env.example` y completar con las credenciales de
|
||||
la BD dev `project_linkedcorp` en `192.168.222.20`, usuario `project_linkedcorp`; la clave
|
||||
generada la tiene el usuario, no esta en este archivo).
|
||||
4. Frontend: `cd frontend && npm install && npm run dev` (puerto 5196, con proxy `/api` al backend).
|
||||
5. Login de prueba (dev): `mgonzalez@linkedcorp.net` / clave `mgonzalez` (rol Administrador).
|
||||
6. Migraciones/seed ya aplicados en la BD dev. Si se recrea la BD: `npm run migrate && npm run seed`
|
||||
dentro de `backend/`.
|
||||
2. Leer `AGENTS.md`, `SPEC.md`, `PRODUCCION.md` y este archivo.
|
||||
3. Backend dev: `cd backend && npm install && npm run dev` (puerto 4019). Requiere `backend/.env`
|
||||
(no versionado — completar con las credenciales de la BD dev `project_linkedcorp` en
|
||||
`192.168.222.20`; la clave la tiene el usuario).
|
||||
4. Frontend dev: `cd frontend && npm install && npm run dev` (puerto 5196, proxy `/api` al backend).
|
||||
5. Login dev: `mgonzalez@linkedcorp.net` / clave `mgonzalez` (rol Administrador). Login de
|
||||
**producción**: mismo email, clave fuerte generada por `create-admin.js` (no está en este repo,
|
||||
se entregó al usuario al desplegar).
|
||||
6. Produccion: ver `PRODUCCION.md` y `DEPLOY_WEB.md` para topología, comandos y el flujo de deploy
|
||||
de actualizaciones (arquetipo B, dos servicios systemd en `192.168.222.3`).
|
||||
|
||||
## Hecho y verificado (2026-09-03)
|
||||
## Hecho y verificado
|
||||
|
||||
- Repo/estructura inicial: `backend/` (Express + mysql2, arquitectura routes→controller→service→
|
||||
repository), `frontend/` (React + Vite, identidad Fluent/Windows), `docs/` (UI-UX-WINDOWS,
|
||||
SEGURIDAD-Y-CALIDAD adaptada).
|
||||
- Puertos reservados en `PORTS_INVENTORY.md` del grupo: frontend `5196`, backend `4019`.
|
||||
- BD dev `project_linkedcorp` creada en `192.168.222.20` con `crear-db-dev.sh`; esquema aplicado
|
||||
(`backend/database/migrations/001_initial.sql`) y seed cargado (roles, catalogos, departamentos
|
||||
TI/Finanzas/RRHH/Comercial + sub-areas de TI, usuario admin de dev).
|
||||
- Backend: modulos completos — auth (JWT + rate limit en login), users, departments, catalogs
|
||||
(priorities/project-statuses/activity-statuses/project-types), projects (+ members), activities
|
||||
(+ dependencies), subtasks, comments, attachments (multer, MIME whitelist), notifications,
|
||||
dashboard (summary/calendar/gantt), audit. Recalculo automatico de `progress_pct` (actividad
|
||||
desde subtareas, proyecto desde el promedio de sus actividades) verificado con pruebas manuales
|
||||
via curl (login → crear proyecto → actividad → subtareas → avances correctos: 50%/50%).
|
||||
- Frontend: identidad Fluent/Windows adaptada a web (sin barra de titulo falsa) — NavigationView,
|
||||
ContentDialog, InfoBar, Toast, Flyout (menu contextual), ListView con orden/buscador, ComboBox
|
||||
con buscador, Treeview, Tabs reales, Expander. Paginas: Login, Dashboard (KPIs + actividades
|
||||
propias + proyectos por estado), Proyectos (listado + detalle con tabs Info/Actividades/Gantt/
|
||||
Calendario/Comentarios/Documentos, master-detail de actividades con subtareas/dependencias/
|
||||
comentarios/adjuntos), Organizacion (Departamentos en arbol + Usuarios), Configuracion
|
||||
(apariencia + editor de los 4 catalogos). i18n es-EC/en-US, tema claro/oscuro y modo de botones
|
||||
persistidos y funcionando.
|
||||
- Verificacion end-to-end con Playwright (headless, instalado solo en el entorno de trabajo, no en
|
||||
el proyecto): login, dashboard, listado y detalle de proyecto con las 6 pestañas, detalle de
|
||||
actividad con subtareas, organizacion (arbol + usuarios), configuracion, cambio a tema claro,
|
||||
creacion de un proyecto nuevo de punta a punta, y el ContentDialog de confirmacion de borrado —
|
||||
todo sin errores de consola. Capturas no se conservaron en el repo (solo en el entorno temporal
|
||||
de la sesion).
|
||||
### Fase 1 — MVP en desarrollo (2026-09-03)
|
||||
|
||||
- Backend completo: auth (JWT + rate limit), users, departments, catalogs, projects (+members),
|
||||
activities (+dependencies), subtasks, comments, attachments, notifications, dashboard, audit.
|
||||
Recalculo automatico de `progress_pct` verificado.
|
||||
- Frontend completo: identidad Fluent/Windows adaptada a web — NavigationView, ContentDialog,
|
||||
InfoBar, Toast, Flyout, ListView, ComboBox, Treeview, Tabs, Expander. Paginas: Login, Dashboard,
|
||||
Proyectos (listado + detalle), Organizacion, Configuracion. i18n es-EC/en-US, tema claro/oscuro.
|
||||
- Verificacion end-to-end con Playwright sin errores de consola.
|
||||
|
||||
### Iteraciones de UI/UX (2026-09-03 al 2026-09-05)
|
||||
|
||||
- `DetailPopup`: reemplaza el antipatron "formulario apilado debajo/al costado del listado" en
|
||||
TODOS los listados de gestion (Proyectos, Actividades, Departamentos, Usuarios, Miembros,
|
||||
Catalogos) — popup de tamaño fijo por instancia, listado inactivo detras, nunca se cierra con
|
||||
clic afuera. Regla documentada en `project-md-templates/UI-UX-WINDOWS.md`.
|
||||
- Bug de stacking corregido: `ContentDialog` ahora usa portal a `document.body` (antes quedaba
|
||||
tapado detras de un `DetailPopup` abierto). Jerarquia de z-index: Flyout(100) < DetailPopup(200)
|
||||
< ContentDialog(250) < Toast(300).
|
||||
- Bug de remount corregido: las guardas `if (loading || !data) return <Cargando/>` desmontaban
|
||||
TODA la pantalla (y el popup abierto dentro) en cada recarga en segundo plano. Cambiadas a
|
||||
`if (!data)` — solo bloquean la carga inicial.
|
||||
- Bug de clipping corregido: `ComboBox` (y `Flyout`) se posicionan con portal + `position:fixed`
|
||||
calculado desde el trigger — antes un ancestro con `overflow:hidden` (Expander, DetailPopup) los
|
||||
recortaba. Regla documentada en `UI-UX-WINDOWS.md`.
|
||||
- "Miembros" del proyecto es su propia pestaña (antes vivia dentro de "Info").
|
||||
- Logo real de LinkedCorp (`/desarrollo/imgLinkedCorp/logoLinkedCorpTxt(Black).png`) en sidebar y
|
||||
login, theme-aware, tamaño duplicado respecto a la primera version.
|
||||
|
||||
### Deploy a produccion (2026-09-06)
|
||||
|
||||
- BD `project_linkedcorp` creada en `192.168.222.32` (prod) con `crear-db-prod.sh`.
|
||||
- Servidor `192.168.222.3`: `/opt/apps/project.linkedcorp.net/{source,backend,frontend,storage,logs}`.
|
||||
- Migraciones aplicadas; catalogos sembrados (`seed-db.js`, sin datos de ejemplo en produccion —
|
||||
ver decision abajo); usuario Administrador inicial creado con `create-admin.js`.
|
||||
- Servicios systemd `project-linkedcorp-backend` (4019) y `project-linkedcorp-frontend` (5196,
|
||||
`serve -s dist`), ambos `enabled` + `active`.
|
||||
- NPM: Proxy Host id 77 → frontend, Custom Location `/api` → backend, SSL Let's Encrypt forzado.
|
||||
- Verificado end-to-end via curl contra `https://project.linkedcorp.net`: health check, login,
|
||||
token valido. Detalle completo en `PRODUCCION.md`.
|
||||
- **Pendiente no bloqueante**: limpiar `.md` de `/opt/apps/project.linkedcorp.net/source` (paso de
|
||||
higiene de `DEPLOY_WEB.md`) — bloqueado por el clasificador de auto-mode del agente durante el
|
||||
deploy; requiere ejecutarlo a mano o con autorizacion explicita la proxima vez.
|
||||
|
||||
## Pendiente (fase 2, sin comprometer lo ya construido)
|
||||
|
||||
@@ -53,32 +70,31 @@ Fase actual: MVP funcional en desarrollo local (fase 1 completa, sin deploy a pr
|
||||
- Recursos (servidores/licencias/software), Proveedores, Presupuesto y costos.
|
||||
- Registro de horas trabajadas detallado (bitacora diaria).
|
||||
- Reportes exportables (PDF/Excel/CSV) y vista ejecutiva separada.
|
||||
- Permisos configurables por modulo × accion desde la UI (hoy: roles fijos codificados en
|
||||
`backend/src/middleware/auth.js` y en cada `service.js`).
|
||||
- Permisos configurables por modulo × accion desde la UI (hoy: roles fijos codificados).
|
||||
- Notificaciones por email/WhatsApp (hoy: solo in-app).
|
||||
- Job programado para detectar actividades vencidas/por vencer y generar notificaciones
|
||||
automaticas (hoy: la notificacion solo se dispara al asignar/reasignar una actividad).
|
||||
- DatePicker/ComboBox: se uso `<input type="date">` nativo en vez de un flyout de calendario
|
||||
propio (simplificacion deliberada para el MVP; UI-UX-WINDOWS.md recomienda uno propio).
|
||||
|
||||
## Deploy a produccion — NO ejecutado
|
||||
|
||||
Pendiente de que el usuario valide el MVP en local. Cuando se confirme, seguir
|
||||
`BASE_DE_DATOS.md` (seccion produccion) y crear `PRODUCCION.md`/`DEPLOY_WEB.md` del proyecto
|
||||
siguiendo el arquetipo B (dos servicios) descrito en el orquestador.
|
||||
- Job programado para detectar actividades vencidas/por vencer (hoy: solo se notifica al asignar).
|
||||
- DatePicker: sigue usando `<input type="date">` nativo (simplificacion deliberada del MVP).
|
||||
- En producción, crear los departamentos/usuarios reales de la empresa desde la UI (arranca limpia
|
||||
a proposito, ver decision abajo).
|
||||
|
||||
## Decisiones clave
|
||||
|
||||
- MVP simplificado respecto al listado original de 30 areas del usuario — detalle completo y
|
||||
justificacion de cada simplificacion en `SPEC.md` (seccion "Fuera de alcance por ahora") y en el
|
||||
plan de esta sesion.
|
||||
- Identidad UI/UX: `UI-UX-WINDOWS.md` (Fluent/Windows 11) en vez de `UI-UX-LINKEDCORP.md` —
|
||||
decision explicita del usuario. Adaptacion documentada en `AGENTS.md`.
|
||||
- Empresa unica (single-company): no existe tabla `companies` en el MVP.
|
||||
- Arquetipo de despliegue B (dos servicios separados) — decision explicita del usuario.
|
||||
- MVP simplificado respecto al listado original de 30 areas — detalle en `SPEC.md`.
|
||||
- Identidad UI/UX: `UI-UX-WINDOWS.md` (Fluent/Windows 11), no la identidad web estandar del grupo.
|
||||
- Empresa unica (single-company): no existe tabla `companies`.
|
||||
- Arquetipo de despliegue B (dos servicios separados).
|
||||
- Produccion arranca sin datos de ejemplo: `seed-db.js` solo carga catalogos universales
|
||||
(roles/prioridades/estados/tipos) cuando `NODE_ENV=production`; los departamentos y usuarios de
|
||||
ejemplo (TI/Finanzas/RRHH/Comercial, admin con clave=usuario) son SOLO de dev. El admin real de
|
||||
produccion se crea con `create-admin.js` (clave fuerte generada, nunca clave=usuario).
|
||||
|
||||
## Deuda tecnica
|
||||
|
||||
- `npm audit` en backend: 3 vulnerabilidades moderadas en `qs`/`body-parser`, transitivas de
|
||||
Express 4.x (sin fix no-breaking disponible al 2026-09-03). No critico para uso interno; revisar
|
||||
cuando Express publique el fix o evaluar migrar a Express 5 en fase 2.
|
||||
- `npm audit`: 3 vulnerabilidades moderadas en `qs`/`body-parser`, transitivas de Express 4.x (sin
|
||||
fix no-breaking disponible al 2026-09-06). No critico; revisar cuando Express publique el fix.
|
||||
- Ruteo backend: `app.use('/api', subtasksRoutes)` actua como catch-all de cualquier `/api/*` no
|
||||
matcheado por un mount mas especifico registrado antes; una request SIN token a una ruta
|
||||
inexistente bajo `/api` devuelve 401 "No autenticado" en vez de 404. No afecta ninguna ruta real
|
||||
de la app (todas requieren auth de todos modos) — deteccion: `curl .../api/health` (esa ruta no
|
||||
existe bajo `/api`, solo en la raiz `/health`). Prolijidad pendiente para fase 2: montar
|
||||
`subtasksRoutes` bajo un prefijo mas especifico.
|
||||
|
||||
Reference in New Issue
Block a user