Reflect current project state across all 8 docs: ADMIN/ORGANISMO_OPERADOR/OPERATOR role hierarchy, scope filtering, organismos_operadores table, Histórico de Tomas page, new SQL migrations, and updated API endpoints with auth requirements. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
13 KiB
13 KiB
Estado Actual del Proyecto GRH
Fecha: 2026-02-09 Ultima actualizacion: Documentacion actualizada para reflejar el estado completo del proyecto
Resumen del Proyecto
Sistema full-stack de gestion de medidores de agua con:
- Frontend: React 18 + TypeScript + Vite (puerto 5173)
- Backend: Node.js + Express + TypeScript (puerto 3000)
- Base de datos: PostgreSQL
- Upload Panel: App separada para carga CSV masiva
Jerarquia de datos:
Organismos Operadores → Projects → Concentrators → Meters → Readings
→ Gateways → Devices ↗
URLs de produccion:
- Frontend: https://sistema.gestionrecursoshidricos.com
- Backend: https://api.gestionrecursoshidricos.com
Repositorios:
- Gitea: https://git.consultoria-as.com/consultoria-as/GRH
- GitHub: git@github.com:luanngel/water-project.git
Arquitectura del Sistema
┌─────────────────────────────────────────────────────────────┐
│ FRONTEND (React SPA) │
│ http://localhost:5173 │
├─────────────────────────────────────────────────────────────┤
│ React 18 + TypeScript + Vite │
│ Tailwind CSS (paleta Zinc) + Material-UI 7 │
│ Recharts (graficos) + Leaflet (mapas) │
│ Cliente API con JWT + refresh automatico │
│ Dark mode / Light mode / System │
└──────────────────────────┬──────────────────────────────────┘
│ REST API + JWT Bearer
▼
┌─────────────────────────────────────────────────────────────┐
│ BACKEND (Express) │
│ http://localhost:3000 │
├─────────────────────────────────────────────────────────────┤
│ Express + TypeScript + Zod (validacion) │
│ JWT access (15m) + refresh (7d) tokens │
│ 17 archivos de rutas, 18 servicios │
│ Helmet, CORS, Bcrypt, Winston logging │
│ node-cron (deteccion flujo negativo) │
│ Multer + XLSX (carga masiva) │
│ Webhooks TTS (The Things Stack / LoRaWAN) │
└──────────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ PostgreSQL │
├─────────────────────────────────────────────────────────────┤
│ 11 tablas: roles, users, organismos_operadores, projects, │
│ concentrators, gateways, devices, meters, meter_readings, │
│ tts_uplink_logs, refresh_tokens │
│ 2 vistas: meter_stats_by_project, device_status_summary │
│ 9 archivos SQL (schema + 8 migraciones) │
│ Triggers de updated_at, indices compuestos, JSONB │
└─────────────────────────────────────────────────────────────┘
Funcionalidades Implementadas
1. Autenticacion y Autorizacion
- Login con JWT: access token (15 min) + refresh token (7 dias)
- Refresh automatico de tokens en el cliente (cola de peticiones)
- Jerarquia de 3 niveles: ADMIN → ORGANISMO_OPERADOR → OPERATOR
- Scope filtering en todos los servicios backend (via
scope.ts) - JWT incluye: userId, roleId, roleName, projectId, organismoOperadorId
- Hash de contrasenas con bcrypt (12 rounds)
- Proteccion de rutas por rol en backend y frontend
- authenticateToken requerido en todas las rutas GET de medidores
2. Dashboard (Home)
- KPIs: Total medidores, medidores activos, consumo promedio, alertas
- Grafico de barras: Medidores por proyecto (Recharts)
- Selector de organismos operadores (filtrado por rol)
- Historial reciente de actividades
- Panel de ultimas alertas
- Soporte por rol (ADMIN, ORGANISMO_OPERADOR, OPERATOR)
3. Gestion de Proyectos
- CRUD completo
- Estados: ACTIVE, INACTIVE, COMPLETED
- Estadisticas por proyecto (medidores, lecturas, areas)
4. Gestion de Concentradores
- CRUD completo
- Vinculados a proyectos
- Estado: ACTIVE, INACTIVE, OFFLINE, MAINTENANCE, ERROR
- IP, firmware, ultima comunicacion
5. Gestion de Medidores
- CRUD completo con tabla, sidebar de detalle y modal de edicion
- Tipos de medidor: WATER, GAS, ELECTRIC
- Protocolos: GENERAL, LORA, LORAWAN
- Estados: ACTIVE, INACTIVE, OFFLINE, MAINTENANCE, ERROR
- Carga masiva via Excel y CSV
- Busqueda, filtros por proyecto/tipo/estado
- Ultima lectura visible en tabla
- Campos extendidos: protocolo, MAC, gateway, voltaje, senal, flujo, coordenadas
- Tipos adicionales: LORA, LORAWAN, GRANDES CONSUMIDORES
6. Consumo y Lecturas
- CRUD de lecturas
- Tipos: AUTOMATIC, MANUAL, SCHEDULED
- Carga masiva via Excel y CSV
- Filtros por proyecto, medidor, rango de fechas
- Resumen de consumo (total, promedio, min, max)
- Indicadores de bateria y senal
- Exportacion
7. Analytics
- Mapa: Visualizacion de medidores con coordenadas en mapa Leaflet interactivo
- Reportes: Dashboard de estadisticas y reportes de consumo
- Servidor: Metricas del sistema (CPU, memoria, uptime, requests)
8. Conectores Externos
- SH-Meters: Integracion con sistema de medidores SH
- XMeters: Integracion con sistema XMeters
- The Things Stack (TTS): Webhooks LoRaWAN para uplink, join y downlink/ack
- Sincronizacion programada a las 9:00 AM
- Seguimiento de ultima conexion y estado
9. Gestion de Organismos Operadores (NUEVO)
- CRUD completo (solo ADMIN)
- Tabla: organismos_operadores (nombre, codigo, contacto, telefono, estado)
- Vinculacion con proyectos (projects.organismo_operador_id)
- Vinculacion con usuarios (users.organismo_operador_id)
- Pagina frontend: OrganismosPage.tsx
10. Gestion de Usuarios
- CRUD completo (ADMIN y ORGANISMO_OPERADOR)
- Asignacion de roles, proyecto y organismo operador
- Filtrado por scope: ADMIN ve todos, ORGANISMO ve los de su organismo
- Estados: activo/inactivo
- Cambio de contrasena
11. Gestion de Roles
- 3 roles predefinidos: ADMIN, ORGANISMO_OPERADOR, OPERATOR
- Permisos granulares JSONB por recurso
- CRUD de roles (solo ADMIN)
- Conteo de usuarios por rol
12. Historico de Tomas (NUEVO)
- Pagina dedicada para consultar historial de lecturas por medidor
- Selector de medidor con busqueda por nombre, serial, ubicacion, cuenta CESPT y clave catastral
- Tarjeta de informacion del medidor seleccionado
- Cards de consumo: Consumo Actual (diario), Consumo Pasado (primer dia del mes anterior), Diferencial
- Grafica AreaChart (Recharts) con gradiente, eje Y ajustado al rango de datos
- Tabla paginada de lecturas (10/20/50 por pagina)
- Filtros de rango de fechas
- Exportacion CSV
- Filtrado por scope: cada rol solo ve los medidores asignados
13. Auditoria
- Registro automatico de todas las acciones via middleware
- Visor de logs con filtros (solo ADMIN)
- Actividad del usuario actual (todos los roles)
- Estadisticas de auditoria
- Busqueda por registro especifico
14. Notificaciones
- Notificaciones in-app
- Conteo de no leidas en tiempo real
- Marcar como leida (individual y masiva)
- Generacion automatica por flujo negativo (cron job)
- Dropdown en TopMenu
15. Dark Mode
- Soporte completo: Dark / Light / System
- Paleta Zinc de Tailwind
- Aplicado a todas las paginas, modales, tablas, formularios
- Persistencia en localStorage
16. Upload Panel
- Aplicacion separada (
upload-panel/) para carga CSV - Dropzone para archivos
- Carga de medidores (upsert)
- Carga de lecturas
- Descarga de plantillas
- Visualizacion de resultados y errores
Carga Masiva
Medidores (Excel / CSV)
Columnas requeridas:
serial_number- Numero de serie del medidor (unico)name- Nombre del medidorconcentrator_serial- Serial del concentrador existente
Columnas opcionales:
meter_id- ID del medidorlocation- Ubicaciontype- LORA, LORAWAN, GRANDES (default: LORA)status- ACTIVE, INACTIVE, etc. (default: ACTIVE)installation_date- Fecha de instalacion (YYYY-MM-DD)
Mapeos automaticos de columnas: device_s/n → serial_number, device_name → name, device_status → status, etc.
Normalizacion de status: "Installed" → ACTIVE, "New_LoRa" → ACTIVE, "Enabled" → ACTIVE, "Disabled" → INACTIVE.
Lecturas (Excel / CSV)
Columnas requeridas:
meter_serial- Serial del medidor existentereading_value- Valor de la lectura
Columnas opcionales:
reading_type- AUTOMATIC, MANUAL, SCHEDULED (default: MANUAL)received_at- Fecha/hora (default: ahora)battery_level- Nivel de bateria (%)signal_strength- Intensidad de senal (dBm)
Datos en Base de Datos
Proyectos
- ADAMANT
- OLE
- LUZIA
- ATELIER
Concentradores
| Serial | Nombre | Proyecto |
|---|---|---|
| 2024072612 | Adamant | ADAMANT |
| 2024030601 | OLE | OLE |
| 2024030402 | LUZIA | LUZIA |
| 2024072602 | ATELIER | ATELIER |
Medidores
- ADAMANT: 201 medidores
- OLE: 5 medidores
Historial de Correcciones
2026-01-23: Fix pantalla blanca y carga masiva
- Fix
.toFixed()con strings - PostgreSQL devuelve DECIMAL como string. Se envuelve conNumber(). - Fix modal de carga masiva - Separar recarga de datos del cierre del modal.
- Fix fechas invalidas en carga masiva - Validacion de formato con regex + mapeos de columnas + normalizacion de status.
2026-02-03: Dark mode, Analytics, Conectores, CSV Upload
- Implementacion completa de dark mode con paleta Zinc
- Seccion Analytics: mapa, reportes, servidor
- Seccion Conectores: SH-Meters, XMeters, TTS
- Toggle dark/light theme
- Panel CSV para carga masiva
- Nuevos tipos de medidor: LORA, LORAWAN, GRANDES CONSUMIDORES
- Documentacion completa del proyecto
2026-02-04: Favicon y conectores
- Actualizacion de favicon
- Mejoras en tiempo de ultima conexion de conectores
- Plan de implementacion para rol ORGANISMOS_OPERADORES
2026-02-09: Organismos Operadores + Historico de Tomas
- Implementacion completa del rol ORGANISMO_OPERADOR (jerarquia de 3 niveles)
- Nueva tabla
organismos_operadorescon migracion SQL - Scope filtering en todos los servicios backend (meter, reading, project, user, concentrator, notification)
- JWT actualizado con
organismoOperadorId - Pagina OrganismosPage.tsx para gestion de organismos (ADMIN)
- Pagina HistoricoPage.tsx para consulta de historial de lecturas por medidor
- Cards de consumo: Actual, Pasado, Diferencial
- Grafica AreaChart con gradiente y eje Y ajustado
- Busqueda por cuenta CESPT y clave catastral
- authenticateToken en rutas GET de medidores
- Sidebar con visibilidad de 3 niveles
- UsersPage actualizada con asignacion de organismo
- ProjectsPage con campo organismo_operador_id
2026-02-05: Sincronizacion de conectores
- Cambio de hora de sincronizacion de 2:00 AM a 9:00 AM
Comandos Utiles
# Iniciar backend (desarrollo)
cd /home/GRH/water-project/water-api
npm run dev
# Iniciar frontend (desarrollo)
cd /home/GRH/water-project
npm run dev
# Iniciar upload panel (desarrollo)
cd /home/GRH/water-project/upload-panel
npm run dev
# Compilar backend para produccion
cd /home/GRH/water-project/water-api
npm run build && npm run start
# Compilar frontend para produccion
cd /home/GRH/water-project
npm run build
# Ejecutar schema de base de datos
psql -d water_project -f water-api/sql/schema.sql
Proximos Pasos Sugeridos
- Reportes PDF - Generacion y descarga de reportes en PDF
- Tests - Suite de tests con Vitest (frontend) y Supertest (backend)
- CI/CD - Pipeline de integracion continua
- Docker - Containerizacion del proyecto completo
- Alertas avanzadas - Configuracion de umbrales y notificaciones por email