# 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