- 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>
250 lines
9.0 KiB
Markdown
250 lines
9.0 KiB
Markdown
# 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
|
|
- **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: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
|
|
|
|
```bash
|
|
# 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
|