- Fix error .toFixed() con valores DECIMAL de PostgreSQL (string vs number) - Fix modal de carga masiva que se cerraba sin mostrar resultados - Validar fechas antes de insertar en BD (evita error con "Installed") - Agregar mapeos de columnas comunes (device_status, device_name, etc.) - Normalizar valores de status (Installed -> ACTIVE, New_LoRa -> ACTIVE) - Actualizar documentación del proyecto Archivos modificados: - src/pages/meters/MetersTable.tsx - src/pages/consumption/ConsumptionPage.tsx - src/pages/meters/MeterPage.tsx - water-api/src/services/bulk-upload.service.ts - ESTADO_ACTUAL.md - CAMBIOS_SESION.md Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.0 KiB
Estado Actual del Proyecto Water Project GRH
Fecha: 2026-01-23 Última actualización: Corrección de errores y mejoras en carga masiva
Resumen del Proyecto
Sistema de gestión de medidores de agua con:
- Frontend: React + TypeScript + Vite (puerto 5173)
- Backend: Node.js + Express + TypeScript (puerto 3000)
- Base de datos: PostgreSQL
Jerarquía de datos:
Projects → Concentrators → Meters → Readings
Arquitectura del Sistema
┌─────────────────────────────────────────────────────────────┐
│ FRONTEND (React) │
│ http://localhost:5173 │
├─────────────────────────────────────────────────────────────┤
│ - React 18 + TypeScript + Vite │
│ - Tailwind CSS + Material-UI │
│ - Recharts para gráficos │
│ - Cliente API con JWT automático │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ BACKEND (Node.js) │
│ http://localhost:3000 │
├─────────────────────────────────────────────────────────────┤
│ - Express + TypeScript │
│ - Autenticación JWT con refresh tokens │
│ - CRUD completo para todas las entidades │
│ - Carga masiva via Excel (xlsx) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ BASE DE DATOS │
│ PostgreSQL │
├─────────────────────────────────────────────────────────────┤
│ Tablas: users, roles, projects, concentrators, │
│ meters, meter_readings, refresh_tokens │
└─────────────────────────────────────────────────────────────┘
Funcionalidades Implementadas
1. Autenticación
- Login con JWT + refresh tokens
- Manejo automático de renovación de tokens
- Roles: ADMIN, USER
2. Gestión de Proyectos
- CRUD completo
- Estados: ACTIVE/INACTIVE
3. Gestión de Concentradores
- CRUD completo
- Vinculados a proyectos
- Tipos: Gateway LoRa/LoRaWAN
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. Gestión de Lecturas (Consumo)
- CRUD completo
- Tipos: AUTOMATIC, MANUAL, SCHEDULED
- Carga masiva via Excel
- Filtros por proyecto, fecha
- Exportación a CSV
- Indicadores de batería y señal
6. Dashboard
- KPIs: Total lecturas, medidores activos, consumo promedio
- Gráficos por proyecto
- Últimas alertas
Carga Masiva
Medidores (Excel)
Columnas requeridas:
serial_number- Número de serie del medidor (único)name- Nombre del medidorconcentrator_serial- Serial del concentrador existente
Columnas opcionales:
meter_id- ID del medidorlocation- Ubicacióntype- LORA, LORAWAN, GRANDES (default: LORA)status- ACTIVE, INACTIVE, etc. (default: ACTIVE)installation_date- Fecha de instalación (YYYY-MM-DD)
Lecturas (Excel)
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 batería (%)signal_strength- Intensidad de señal (dBm)
Credenciales
Usuario Admin
- Nombre: Ivan Alcaraz
- Email: ialcarazsalazar@consultoria-as.com
- Password: Aasi940812
Datos Actuales en BD
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
Correcciones Recientes (2026-01-23)
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:75src/pages/consumption/ConsumptionPage.tsx:133, 213, 432
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
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
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
Comandos Útiles
# Iniciar backend
cd /home/GRH/water-project/water-api
npm run dev
# Iniciar frontend
cd /home/GRH/water-project
npm run dev
# Compilar backend
cd /home/GRH/water-project/water-api
npm run build
# Ver logs del backend
tail -f /tmp/water-api.log
Estructura de Archivos
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
- Integración TTS - Webhooks para The Things Stack
- Alertas automáticas - Notificaciones por consumo anormal
- Reportes - Generación de reportes PDF
- Despliegue - Configurar para producción