Files
GRH/ESTADO_ACTUAL.md
Exteban08 6c7d448b2f Fix: Corregir pantalla blanca y mejorar carga masiva
- 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>
2026-01-23 23:13:48 +00:00

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 medidor
  • concentrator_serial - Serial del concentrador existente

Columnas opcionales:

  • meter_id - ID del medidor
  • location - Ubicación
  • type - 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 existente
  • reading_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


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:75
  • src/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

  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