Update all project documentation to reflect current state
Rewrite README.md, DOCUMENTATION.md, ESTADO_ACTUAL.md and CAMBIOS_SESION.md to accurately document the full-stack architecture, all modules, API endpoints, JWT auth, database schema, and features added in February 2026. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
327
ESTADO_ACTUAL.md
327
ESTADO_ACTUAL.md
@@ -1,55 +1,72 @@
|
||||
# Estado Actual del Proyecto Water Project GRH
|
||||
# Estado Actual del Proyecto GRH
|
||||
|
||||
**Fecha:** 2026-01-23
|
||||
**Última actualización:** Corrección de errores y mejoras en carga masiva
|
||||
**Fecha:** 2026-02-09
|
||||
**Ultima actualizacion:** Documentacion actualizada para reflejar el estado completo del proyecto
|
||||
|
||||
---
|
||||
|
||||
## Resumen del Proyecto
|
||||
|
||||
Sistema de gestión de medidores de agua con:
|
||||
- **Frontend:** React + TypeScript + Vite (puerto 5173)
|
||||
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
|
||||
|
||||
### Jerarquía de datos:
|
||||
### Jerarquia de datos:
|
||||
```
|
||||
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) │
|
||||
│ http://localhost:5173 │
|
||||
│ FRONTEND (React SPA) │
|
||||
│ http://localhost:5173 │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ - React 18 + TypeScript + Vite │
|
||||
│ - Tailwind CSS + Material-UI │
|
||||
│ - Recharts para gráficos │
|
||||
│ - Cliente API con JWT automático │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
│ 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 (Node.js) │
|
||||
│ http://localhost:3000 │
|
||||
│ BACKEND (Express) │
|
||||
│ http://localhost:3000 │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ - Express + TypeScript │
|
||||
│ - Autenticación JWT con refresh tokens │
|
||||
│ - CRUD completo para todas las entidades │
|
||||
│ - Carga masiva via Excel (xlsx) │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
│ 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) │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ BASE DE DATOS │
|
||||
│ PostgreSQL │
|
||||
│ PostgreSQL │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ Tablas: users, roles, projects, concentrators, │
|
||||
│ meters, meter_readings, refresh_tokens │
|
||||
│ 10 tablas: roles, users, projects, concentrators, │
|
||||
│ gateways, devices, meters, meter_readings, │
|
||||
│ tts_uplink_logs, refresh_tokens │
|
||||
│ 2 vistas: meter_stats_by_project, device_status_summary │
|
||||
│ 7 archivos SQL (schema + 6 migraciones) │
|
||||
│ Triggers de updated_at, indices compuestos, JSONB │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
@@ -57,58 +74,128 @@ Projects → Concentrators → Meters → Readings
|
||||
|
||||
## Funcionalidades Implementadas
|
||||
|
||||
### 1. Autenticación
|
||||
- Login con JWT + refresh tokens
|
||||
- Manejo automático de renovación de tokens
|
||||
- Roles: ADMIN, USER
|
||||
### 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)
|
||||
- 3 roles con permisos JSONB: ADMIN, OPERATOR, VIEWER
|
||||
- Relacion usuario-proyecto para acceso por scope
|
||||
- Hash de contrasenas con bcrypt (12 rounds)
|
||||
- Proteccion de rutas por rol en backend y frontend
|
||||
|
||||
### 2. Gestión de Proyectos
|
||||
### 2. Dashboard (Home)
|
||||
- KPIs: Total medidores, medidores activos, consumo promedio, alertas
|
||||
- Grafico de barras: Medidores por proyecto (Recharts)
|
||||
- Selector de organismos operadores (CESPT Tijuana, Tecate, Mexicali)
|
||||
- Historial reciente de actividades
|
||||
- Panel de ultimas alertas
|
||||
- Soporte por rol (ADMIN, OPERATOR, VIEWER)
|
||||
|
||||
### 3. Gestion de Proyectos
|
||||
- CRUD completo
|
||||
- Estados: ACTIVE/INACTIVE
|
||||
- Estados: ACTIVE, INACTIVE, COMPLETED
|
||||
- Estadisticas por proyecto (medidores, lecturas, areas)
|
||||
|
||||
### 3. Gestión de Concentradores
|
||||
### 4. Gestion de Concentradores
|
||||
- CRUD completo
|
||||
- Vinculados a proyectos
|
||||
- Tipos: Gateway LoRa/LoRaWAN
|
||||
- Estado: ACTIVE, INACTIVE, OFFLINE, MAINTENANCE, ERROR
|
||||
- IP, firmware, ultima comunicacion
|
||||
|
||||
### 4. Gestión de Medidores
|
||||
- CRUD completo
|
||||
- Tipos: LORA, LORAWAN, GRANDES
|
||||
- Estados: ACTIVE, INACTIVE, MAINTENANCE, FAULTY, REPLACED
|
||||
- **Carga masiva via Excel**
|
||||
- Última lectura visible en tabla
|
||||
### 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
|
||||
|
||||
### 5. Gestión de Lecturas (Consumo)
|
||||
- CRUD completo
|
||||
### 6. Consumo y Lecturas
|
||||
- CRUD de lecturas
|
||||
- Tipos: AUTOMATIC, MANUAL, SCHEDULED
|
||||
- **Carga masiva via Excel**
|
||||
- Filtros por proyecto, fecha
|
||||
- Exportación a CSV
|
||||
- Indicadores de batería y señal
|
||||
- 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
|
||||
|
||||
### 6. Dashboard
|
||||
- KPIs: Total lecturas, medidores activos, consumo promedio
|
||||
- Gráficos por proyecto
|
||||
- Últimas alertas
|
||||
### 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 Usuarios
|
||||
- CRUD completo (solo ADMIN)
|
||||
- Asignacion de roles
|
||||
- Asignacion de proyecto
|
||||
- Estados: activo/inactivo
|
||||
- Cambio de contrasena
|
||||
|
||||
### 10. Gestion de Roles
|
||||
- 3 roles predefinidos: ADMIN, OPERATOR, VIEWER
|
||||
- Permisos granulares JSONB por recurso
|
||||
- CRUD de roles (solo ADMIN)
|
||||
- Conteo de usuarios por rol
|
||||
|
||||
### 11. 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
|
||||
|
||||
### 12. 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
|
||||
|
||||
### 13. Dark Mode
|
||||
- Soporte completo: Dark / Light / System
|
||||
- Paleta Zinc de Tailwind
|
||||
- Aplicado a todas las paginas, modales, tablas, formularios
|
||||
- Persistencia en localStorage
|
||||
|
||||
### 14. 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)
|
||||
### Medidores (Excel / CSV)
|
||||
Columnas requeridas:
|
||||
- `serial_number` - Número de serie del medidor (único)
|
||||
- `serial_number` - Numero de serie del medidor (unico)
|
||||
- `name` - Nombre del medidor
|
||||
- `concentrator_serial` - Serial del concentrador existente
|
||||
|
||||
Columnas opcionales:
|
||||
- `meter_id` - ID del medidor
|
||||
- `location` - Ubicación
|
||||
- `location` - Ubicacion
|
||||
- `type` - LORA, LORAWAN, GRANDES (default: LORA)
|
||||
- `status` - ACTIVE, INACTIVE, etc. (default: ACTIVE)
|
||||
- `installation_date` - Fecha de instalación (YYYY-MM-DD)
|
||||
- `installation_date` - Fecha de instalacion (YYYY-MM-DD)
|
||||
|
||||
### Lecturas (Excel)
|
||||
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 existente
|
||||
- `reading_value` - Valor de la lectura
|
||||
@@ -116,21 +203,12 @@ Columnas requeridas:
|
||||
Columnas opcionales:
|
||||
- `reading_type` - AUTOMATIC, MANUAL, SCHEDULED (default: MANUAL)
|
||||
- `received_at` - Fecha/hora (default: ahora)
|
||||
- `battery_level` - Nivel de batería (%)
|
||||
- `signal_strength` - Intensidad de señal (dBm)
|
||||
- `battery_level` - Nivel de bateria (%)
|
||||
- `signal_strength` - Intensidad de senal (dBm)
|
||||
|
||||
---
|
||||
|
||||
## Credenciales
|
||||
|
||||
### Usuario Admin
|
||||
- **Nombre:** Ivan Alcaraz
|
||||
- **Email:** ialcarazsalazar@consultoria-as.com
|
||||
- **Password:** Aasi940812
|
||||
|
||||
---
|
||||
|
||||
## Datos Actuales en BD
|
||||
## Datos en Base de Datos
|
||||
|
||||
### Proyectos
|
||||
- ADAMANT
|
||||
@@ -152,98 +230,65 @@ Columnas opcionales:
|
||||
|
||||
---
|
||||
|
||||
## Correcciones Recientes (2026-01-23)
|
||||
## Historial de Correcciones
|
||||
|
||||
### 1. Error `.toFixed()` con valores string
|
||||
**Problema:** PostgreSQL devuelve DECIMAL como string, causando error al llamar `.toFixed()`.
|
||||
**Solución:** Convertir a número con `Number()` antes de llamar `.toFixed()`.
|
||||
**Archivos:**
|
||||
- `src/pages/meters/MetersTable.tsx:75`
|
||||
- `src/pages/consumption/ConsumptionPage.tsx:133, 213, 432`
|
||||
### 2026-01-23: Fix pantalla blanca y carga masiva
|
||||
1. **Fix `.toFixed()` con strings** - PostgreSQL devuelve DECIMAL como string. Se envuelve con `Number()`.
|
||||
2. **Fix modal de carga masiva** - Separar recarga de datos del cierre del modal.
|
||||
3. **Fix fechas invalidas en carga masiva** - Validacion de formato con regex + mapeos de columnas + normalizacion de status.
|
||||
|
||||
### 2. Modal de carga masiva se cerraba sin mostrar resultados
|
||||
**Problema:** El modal se cerraba automáticamente después de la carga.
|
||||
**Solución:** El modal ahora permanece abierto para mostrar resultados y errores.
|
||||
**Archivo:** `src/pages/meters/MeterPage.tsx:332-340`
|
||||
### 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
|
||||
|
||||
### 3. Validación de fechas en carga masiva
|
||||
**Problema:** Valores como "Installed" en columnas no mapeadas causaban error de fecha inválida.
|
||||
**Solución:** Validar que `installation_date` sea realmente una fecha antes de insertarla.
|
||||
**Archivo:** `water-api/src/services/bulk-upload.service.ts:183-195`
|
||||
### 2026-02-04: Favicon y conectores
|
||||
- Actualizacion de favicon
|
||||
- Mejoras en tiempo de ultima conexion de conectores
|
||||
- Plan de implementacion para rol ORGANISMOS_OPERADORES
|
||||
|
||||
### 4. Mapeo de columnas mejorado
|
||||
**Mejora:** Agregados más mapeos de columnas comunes (device_status, device_name, etc.)
|
||||
**Archivo:** `water-api/src/services/bulk-upload.service.ts:65-90`
|
||||
|
||||
### 5. Normalización de status
|
||||
**Mejora:** Valores como "Installed", "New_LoRa" se convierten automáticamente a "ACTIVE".
|
||||
**Archivo:** `water-api/src/services/bulk-upload.service.ts:210-225`
|
||||
### 2026-02-05: Sincronizacion de conectores
|
||||
- Cambio de hora de sincronizacion de 2:00 AM a 9:00 AM
|
||||
|
||||
---
|
||||
|
||||
## Comandos Útiles
|
||||
## Comandos Utiles
|
||||
|
||||
```bash
|
||||
# Iniciar backend
|
||||
# Iniciar backend (desarrollo)
|
||||
cd /home/GRH/water-project/water-api
|
||||
npm run dev
|
||||
|
||||
# Iniciar frontend
|
||||
# Iniciar frontend (desarrollo)
|
||||
cd /home/GRH/water-project
|
||||
npm run dev
|
||||
|
||||
# Compilar backend
|
||||
# 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
|
||||
|
||||
# Ver logs del backend
|
||||
tail -f /tmp/water-api.log
|
||||
# Ejecutar schema de base de datos
|
||||
psql -d water_project -f water-api/sql/schema.sql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Estructura de Archivos
|
||||
## Proximos Pasos Sugeridos
|
||||
|
||||
```
|
||||
water-project/
|
||||
├── src/ # Frontend React
|
||||
│ ├── api/ # Cliente API
|
||||
│ │ ├── client.ts # Cliente HTTP con JWT
|
||||
│ │ ├── meters.ts # API de medidores
|
||||
│ │ ├── readings.ts # API de lecturas
|
||||
│ │ ├── projects.ts # API de proyectos
|
||||
│ │ └── concentrators.ts # API de concentradores
|
||||
│ ├── pages/ # Páginas
|
||||
│ │ ├── meters/ # Módulo de medidores
|
||||
│ │ │ ├── MeterPage.tsx
|
||||
│ │ │ ├── MetersTable.tsx
|
||||
│ │ │ ├── MetersModal.tsx
|
||||
│ │ │ ├── MetersSidebar.tsx
|
||||
│ │ │ ├── MetersBulkUploadModal.tsx
|
||||
│ │ │ └── useMeters.ts
|
||||
│ │ ├── consumption/ # Módulo de consumo
|
||||
│ │ │ ├── ConsumptionPage.tsx
|
||||
│ │ │ └── ReadingsBulkUploadModal.tsx
|
||||
│ │ └── ...
|
||||
│ └── components/ # Componentes reutilizables
|
||||
│
|
||||
└── water-api/ # Backend Node.js
|
||||
├── src/
|
||||
│ ├── controllers/ # Controladores REST
|
||||
│ ├── services/ # Lógica de negocio
|
||||
│ │ ├── bulk-upload.service.ts
|
||||
│ │ └── ...
|
||||
│ ├── routes/ # Definición de rutas
|
||||
│ ├── middleware/ # Middlewares (auth, etc.)
|
||||
│ └── config/ # Configuración (DB, etc.)
|
||||
└── sql/ # Scripts SQL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Próximos Pasos Sugeridos
|
||||
|
||||
1. **Integración TTS** - Webhooks para The Things Stack
|
||||
2. **Alertas automáticas** - Notificaciones por consumo anormal
|
||||
3. **Reportes** - Generación de reportes PDF
|
||||
4. **Despliegue** - Configurar para producción
|
||||
1. **Rol ORGANISMOS_OPERADORES** - Implementar nuevo rol segun plan existente
|
||||
2. **Reportes PDF** - Generacion y descarga de reportes en PDF
|
||||
3. **Tests** - Suite de tests con Vitest (frontend) y Supertest (backend)
|
||||
4. **CI/CD** - Pipeline de integracion continua
|
||||
5. **Docker** - Containerizacion del proyecto completo
|
||||
|
||||
Reference in New Issue
Block a user