Update all documentation for 3-level roles, organismos, and Histórico

Reflect current project state across all 8 docs: ADMIN/ORGANISMO_OPERADOR/OPERATOR
role hierarchy, scope filtering, organismos_operadores table, Histórico de Tomas
page, new SQL migrations, and updated API endpoints with auth requirements.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Exteban08
2026-02-09 10:44:16 +00:00
parent 613fb2d787
commit da976b9003
8 changed files with 497 additions and 107 deletions

View File

@@ -4,21 +4,80 @@ Registro cronologico de cambios significativos realizados al proyecto.
--- ---
## 2026-02-09: Actualizacion de documentacion ## 2026-02-09: Organismos Operadores + Historico de Tomas + Documentacion
### Resumen ### Resumen
Actualizacion completa de los 4 archivos de documentacion para reflejar el estado real del proyecto. Implementacion completa del sistema de 3 niveles de roles (ADMIN → ORGANISMO_OPERADOR → OPERATOR), nueva pagina Historico de Tomas, y actualizacion de toda la documentacion.
### Archivos Modificados ### Nuevas Funcionalidades
**Rol ORGANISMO_OPERADOR (8 fases completas)**
- Nueva tabla `organismos_operadores` con migracion SQL
- JWT actualizado con campo `organismoOperadorId`
- Scope filtering en todos los servicios: meter, reading, project, user, concentrator, notification
- Utility `scope.ts` para centralizar logica de filtrado
- Pagina OrganismosPage.tsx para gestion de organismos (ADMIN only)
- UsersPage actualizada con campo organismo y filtrado por scope
- ProjectsPage con campo organismo_operador_id
- Sidebar con visibilidad de 3 niveles por rol
**Historico de Tomas**
- Nueva pagina `HistoricoPage.tsx` con selector de medidor searchable
- Busqueda por nombre, serial, ubicacion, cuenta CESPT, clave catastral
- Tarjeta de informacion del medidor seleccionado
- Cards de consumo: Actual (diario), Pasado (1er dia mes anterior), Diferencial con tendencia
- Grafica AreaChart (Recharts) con gradiente y eje Y ajustado al rango de datos
- Tabla paginada de lecturas (10/20/50 por pagina)
- Filtros de rango de fechas
- Exportacion CSV
- authenticateToken en rutas GET de medidores para scope filtering
**Documentacion**
- Actualizacion completa de 8 archivos de documentacion
### Archivos Nuevos
| Archivo | Descripcion |
|---------|-------------|
| `src/pages/OrganismosPage.tsx` | Pagina CRUD de organismos operadores |
| `src/pages/historico/HistoricoPage.tsx` | Pagina de historico de tomas |
| `src/api/organismos.ts` | Cliente API para organismos operadores |
| `water-api/src/services/organismo-operador.service.ts` | Servicio backend organismos |
| `water-api/src/controllers/organismo-operador.controller.ts` | Controlador organismos |
| `water-api/src/routes/organismo-operador.routes.ts` | Rutas organismos |
| `water-api/src/utils/scope.ts` | Utility de filtrado por scope |
| `water-api/sql/add_organismos_operadores.sql` | Migracion SQL organismos |
| `water-api/sql/add_user_meter_fields.sql` | Migracion campos usuario/medidor |
### Archivos Modificados (28+)
| Archivo | Cambio | | Archivo | Cambio |
|---------|--------| |---------|--------|
| `README.md` | Reescrito completamente: arquitectura full-stack, backend Express, PostgreSQL, todos los modulos, endpoints API, variables de entorno, estructura de directorios actualizada | | `src/App.tsx` | Agregados tipos "organismos" y "historico" al Page type |
| `DOCUMENTATION.md` | Reescrito completamente: documentacion tecnica con JWT real, todos los endpoints del backend, esquema relacional, hooks, sistema de temas, conectores, guia de desarrollo actualizada | | `src/components/layout/Sidebar.tsx` | Visibilidad de 3 niveles por rol |
| `ESTADO_ACTUAL.md` | Actualizado con todas las funcionalidades implementadas en febrero 2026: Analytics, Conectores, Dark mode, Notificaciones, Auditoria, Upload Panel, historial de correcciones | | `src/api/auth.ts` | Helpers de rol actualizados (organismoOperadorId) |
| `CAMBIOS_SESION.md` | Convertido a historial cronologico completo de cambios | | `src/api/meters.ts` | Interfaces MeterReadingFilters, PaginatedMeterReadings, fetchMeterReadings con paginacion |
| `src/api/users.ts` | Campo organismo_operador_id |
| `src/api/projects.ts` | Campo organismo_operador_id |
| `src/pages/Home.tsx` | Filtrado por scope |
| `src/pages/UsersPage.tsx` | Campo organismo y filtrado |
| `src/pages/projects/ProjectsPage.tsx` | Campo organismo |
| `src/pages/meters/MetersModal.tsx` | Campo project_id |
| `water-api/src/types/index.ts` | organismoOperadorId en tipos |
| `water-api/src/utils/jwt.ts` | organismoOperadorId en JWT payload |
| `water-api/src/middleware/auth.middleware.ts` | Extraccion de organismoOperadorId |
| `water-api/src/services/*.ts` | Scope filtering en todos los servicios |
| `water-api/src/controllers/*.ts` | requestingUser pass-through |
| `water-api/src/routes/*.ts` | authenticateToken en rutas GET |
| `water-api/src/validators/*.ts` | Campos de organismo |
---
## 2026-02-09: Actualizacion de documentacion (anterior)
### Resumen
Actualizacion de los 4 archivos de documentacion principales.
### Motivo ### Motivo
La documentacion previa describia una version temprana del proyecto (solo frontend, API externa NocoDB, auth con token simple) y no reflejaba el backend Express propio, JWT con refresh tokens, ni los modulos agregados en febrero 2026. La documentacion previa describia una version temprana del proyecto y no reflejaba el backend Express propio ni los modulos agregados.
--- ---

View File

@@ -38,7 +38,7 @@ El proyecto es una aplicacion **full-stack** con tres componentes principales:
│ Express Routes → Controllers → Services → PostgreSQL │ │ Express Routes → Controllers → Services → PostgreSQL │
├─────────────────────────────────────────────────────────────┤ ├─────────────────────────────────────────────────────────────┤
│ Capa de Datos │ │ Capa de Datos │
│ PostgreSQL: 10 tablas, 2 vistas, triggers, indices │ │ PostgreSQL: 11 tablas, 2 vistas, triggers, indices │
├─────────────────────────────────────────────────────────────┤ ├─────────────────────────────────────────────────────────────┤
│ Integraciones Externas │ │ Integraciones Externas │
│ The Things Stack (LoRaWAN), SH-Meters, XMeters │ │ The Things Stack (LoRaWAN), SH-Meters, XMeters │
@@ -67,7 +67,8 @@ export type Page =
| "home" | "projects" | "meters" | "concentrators" | "home" | "projects" | "meters" | "concentrators"
| "consumption" | "auditoria" | "users" | "roles" | "consumption" | "auditoria" | "users" | "roles"
| "sh-meters" | "xmeters" | "tts" | "sh-meters" | "xmeters" | "tts"
| "analytics-map" | "analytics-reports" | "analytics-server"; | "analytics-map" | "analytics-reports" | "analytics-server"
| "organismos" | "historico";
``` ```
La navegacion es **state-based** (sin React Router). El estado `currentPage` determina que pagina se renderiza. La navegacion es **state-based** (sin React Router). El estado `currentPage` determina que pagina se renderiza.
@@ -91,6 +92,8 @@ La navegacion es **state-based** (sin React Router). El estado `currentPage` det
| SH-Meters | `conectores/SHMetersPage.tsx` | Conector SH-Meters | | SH-Meters | `conectores/SHMetersPage.tsx` | Conector SH-Meters |
| XMeters | `conectores/XMetersPage.tsx` | Conector XMeters | | XMeters | `conectores/XMetersPage.tsx` | Conector XMeters |
| TTS | `conectores/TTSPage.tsx` | Conector The Things Stack | | TTS | `conectores/TTSPage.tsx` | Conector The Things Stack |
| Organismos | `OrganismosPage.tsx` | Gestion de organismos operadores (ADMIN) |
| Historico | `historico/HistoricoPage.tsx` | Historico de lecturas por medidor con grafica, estadisticas y tabla |
### Componentes de Layout ### Componentes de Layout
@@ -98,7 +101,10 @@ La navegacion es **state-based** (sin React Router). El estado `currentPage` det
- Menu lateral colapsable con hover expansion - Menu lateral colapsable con hover expansion
- Soporte para pin/unpin - Soporte para pin/unpin
- Menu jerarquico con submenus (Analytics, Conectores) - Menu jerarquico con submenus (Analytics, Conectores)
- Indicadores visuales de pagina activa - Visibilidad por rol de 3 niveles:
- ADMIN: ve todo (incluye Organismos, Conectores, Auditoria)
- ORGANISMO_OPERADOR: ve Dashboard, Project Management, Users, Analytics
- OPERATOR: ve Dashboard y Project Management
**TopMenu.tsx** **TopMenu.tsx**
- Breadcrumb de navegacion - Breadcrumb de navegacion
@@ -125,18 +131,22 @@ water-api/src/
├── config/ ├── config/
│ ├── index.ts # Variables de entorno centralizadas │ ├── index.ts # Variables de entorno centralizadas
│ └── database.ts # Pool de conexiones pg │ └── database.ts # Pool de conexiones pg
├── routes/ # Definicion de rutas (17 archivos) ├── routes/ # Definicion de rutas (18 archivos)
│ └── organismo-operador.routes.ts # Rutas CRUD organismos
├── controllers/ # Controladores HTTP ├── controllers/ # Controladores HTTP
├── services/ # Logica de negocio (18 modulos) │ └── organismo-operador.controller.ts
├── services/ # Logica de negocio (19 modulos)
│ └── organismo-operador.service.ts
├── middleware/ ├── middleware/
│ ├── auth.middleware.ts # Verificacion JWT + extraccion de rol │ ├── auth.middleware.ts # Verificacion JWT + extraccion de rol + requireRole
│ ├── audit.middleware.ts # Auto-logging de acciones │ ├── audit.middleware.ts # Auto-logging de acciones
│ └── ttsWebhook.middleware.ts # Verificacion de secreto webhook │ └── ttsWebhook.middleware.ts # Verificacion de secreto webhook
├── validators/ # Schemas de validacion Zod ├── validators/ # Schemas de validacion Zod
├── utils/ ├── utils/
│ ├── jwt.ts # sign/verify de tokens │ ├── jwt.ts # sign/verify de tokens (incluye organismoOperadorId)
│ ├── password.ts # hash/compare con bcrypt │ ├── password.ts # hash/compare con bcrypt
── logger.ts # Winston con formato timestamp ── logger.ts # Winston con formato timestamp
│ └── scope.ts # Filtrado por scope de rol (ADMIN/ORGANISMO/OPERATOR)
├── jobs/ ├── jobs/
│ └── negativeFlowDetection.ts # Cron de deteccion de flujo negativo │ └── negativeFlowDetection.ts # Cron de deteccion de flujo negativo
└── types/ # Interfaces TypeScript └── types/ # Interfaces TypeScript
@@ -202,12 +212,21 @@ water-api/src/
| PUT | `/:id` | Actualizar dispositivo | Si (ADMIN/OPERATOR) | | PUT | `/:id` | Actualizar dispositivo | Si (ADMIN/OPERATOR) |
| DELETE | `/:id` | Eliminar dispositivo | Si (ADMIN) | | DELETE | `/:id` | Eliminar dispositivo | Si (ADMIN) |
#### Usuarios (`/api/users`) - Solo ADMIN #### Organismos Operadores (`/api/organismos-operadores`) - Solo ADMIN
| Metodo | Ruta | Descripcion | Auth | | Metodo | Ruta | Descripcion | Auth |
|--------|------|-------------|------| |--------|------|-------------|------|
| GET | `/` | Listar usuarios | Si (ADMIN) | | GET | `/` | Listar organismos operadores | Si (ADMIN) |
| GET | `/:id` | Obtener organismo operador | Si (ADMIN) |
| POST | `/` | Crear organismo operador | Si (ADMIN) |
| PUT | `/:id` | Actualizar organismo operador | Si (ADMIN) |
| DELETE | `/:id` | Eliminar organismo operador | Si (ADMIN) |
#### Usuarios (`/api/users`) - ADMIN y ORGANISMO_OPERADOR
| Metodo | Ruta | Descripcion | Auth |
|--------|------|-------------|------|
| GET | `/` | Listar usuarios (filtrado por scope) | Si (ADMIN/ORGANISMO_OPERADOR) |
| GET | `/:id` | Obtener usuario | Si (ADMIN o self) | | GET | `/:id` | Obtener usuario | Si (ADMIN o self) |
| POST | `/` | Crear usuario | Si (ADMIN) | | POST | `/` | Crear usuario | Si (ADMIN/ORGANISMO_OPERADOR) |
| PUT | `/:id` | Actualizar usuario | Si (ADMIN o self) | | PUT | `/:id` | Actualizar usuario | Si (ADMIN o self) |
| DELETE | `/:id` | Desactivar usuario | Si (ADMIN) | | DELETE | `/:id` | Desactivar usuario | Si (ADMIN) |
| PUT | `/:id/password` | Cambiar contrasena | Si (self) | | PUT | `/:id/password` | Cambiar contrasena | Si (self) |
@@ -309,7 +328,7 @@ roles ←─── users ←─── refresh_tokens
``` ```
### ENUMs de PostgreSQL ### ENUMs de PostgreSQL
- `role_name`: ADMIN, OPERATOR, VIEWER - `role_name`: ADMIN, ORGANISMO_OPERADOR, OPERATOR
- `project_status`: ACTIVE, INACTIVE, COMPLETED - `project_status`: ACTIVE, INACTIVE, COMPLETED
- `device_status`: ACTIVE, INACTIVE, OFFLINE, MAINTENANCE, ERROR - `device_status`: ACTIVE, INACTIVE, OFFLINE, MAINTENANCE, ERROR
- `meter_type`: WATER, GAS, ELECTRIC - `meter_type`: WATER, GAS, ELECTRIC
@@ -319,13 +338,15 @@ roles ←─── users ←─── refresh_tokens
Ejecutar en orden despues del schema principal: Ejecutar en orden despues del schema principal:
1. `schema.sql` - Schema principal con 10 tablas, 2 vistas, seed de roles y admin 1. `schema.sql` - Schema principal con tablas base, 2 vistas, seed de roles y admin
2. `add_audit_logs.sql` - Tabla de logs de auditoria 2. `add_audit_logs.sql` - Tabla de logs de auditoria
3. `add_notifications.sql` - Tabla de notificaciones 3. `add_notifications.sql` - Tabla de notificaciones
4. `add_meter_extended_fields.sql` - Campos extendidos para medidores 4. `add_meter_extended_fields.sql` - Campos extendidos para medidores
5. `create_meter_types.sql` - Tabla de tipos de medidor 5. `create_meter_types.sql` - Tabla de tipos de medidor
6. `add_meter_project_relation.sql` - Relacion meter-proyecto 6. `add_meter_project_relation.sql` - Relacion meter-proyecto
7. `add_user_project_relation.sql` - Relacion user-proyecto 7. `add_user_project_relation.sql` - Relacion user-proyecto
8. `add_organismos_operadores.sql` - Tabla organismos_operadores, FK en projects y users, rol ORGANISMO_OPERADOR
9. `add_user_meter_fields.sql` - Campos adicionales en users y meters (cespt_account, cadastral_key)
--- ---
@@ -355,7 +376,7 @@ Ejecutar en orden despues del schema principal:
``` ```
### Tokens ### Tokens
- **Access Token** - JWT con userId, roleId, roleName, projectId. Expira en 15 minutos. - **Access Token** - JWT con userId, roleId, roleName, projectId, organismoOperadorId. Expira en 15 minutos.
- **Refresh Token** - JWT almacenado hasheado en BD. Expira en 7 dias. Revocable. - **Refresh Token** - JWT almacenado hasheado en BD. Expira en 7 dias. Revocable.
### Token Refresh Automatico (Frontend) ### Token Refresh Automatico (Frontend)
@@ -374,25 +395,42 @@ water_project_settings_v1 → {theme, compactMode}
mock_avatar → Avatar en base64 mock_avatar → Avatar en base64
``` ```
### Control de Acceso por Rol ### Control de Acceso por Rol (Jerarquia de 3 niveles)
| Recurso | ADMIN | OPERATOR | VIEWER | | Recurso | ADMIN | ORGANISMO_OPERADOR | OPERATOR |
|---------|-------|----------|--------| |---------|-------|-------------------|----------|
| Usuarios | CRUD completo | Solo lectura | Sin acceso | | Organismos | CRUD completo | Sin acceso | Sin acceso |
| Proyectos | CRUD completo | Crear/Leer/Actualizar | Solo lectura | | Usuarios | CRUD completo | CRUD (su organismo) | Sin acceso |
| Dispositivos | CRUD completo | Crear/Leer/Actualizar | Solo lectura | | Proyectos | CRUD completo | Leer (su organismo) | Leer (su proyecto) |
| Medidores | CRUD completo | Crear/Leer/Actualizar | Solo lectura | | Medidores | CRUD completo | Leer (su organismo) | Leer (su proyecto) |
| Lecturas | CRUD + eliminar | Crear/Leer | Solo lectura | | Lecturas | CRUD + eliminar | Leer (su organismo) | Leer (su proyecto) |
| Configuracion | Completa | Solo lectura | Sin acceso | | Historico | Todos los medidores | Medidores de su organismo | Medidores de su proyecto |
| Reportes | Crear/Leer/Exportar | Crear/Leer/Exportar | Solo lectura | | Analytics | Completo | Completo | Sin acceso |
| Conectores | Completo | Sin acceso | Sin acceso |
| Auditoria | Completa | Sin acceso | Sin acceso |
### Scope Filtering (Backend)
Todos los servicios aplican filtrado automatico basado en el rol del usuario:
```
ADMIN → Sin filtro (ve todos los datos)
ORGANISMO_OP. → project_id IN (SELECT id FROM projects WHERE organismo_operador_id = $N)
OPERATOR → project_id = $N (solo su proyecto asignado)
```
El utility `water-api/src/utils/scope.ts` centraliza esta logica.
### Helpers del Frontend ### Helpers del Frontend
```typescript ```typescript
getCurrentUserRole() // → "ADMIN" | "OPERATOR" | "VIEWER" getCurrentUserRole() // → "ADMIN" | "ORGANISMO_OPERADOR" | "OPERATOR"
getCurrentUserId() // → UUID string getCurrentUserId() // → UUID string
getCurrentUserProjectId() // → UUID string | undefined getCurrentUserProjectId() // → UUID string | undefined
getCurrentUserOrganismoId() // → UUID string | undefined
isCurrentUserAdmin() // → boolean isCurrentUserAdmin() // → boolean
isCurrentUserOrganismo() // → boolean
isCurrentUserOperator() // → boolean
``` ```
--- ---
@@ -412,14 +450,15 @@ Wrapper de `fetch` con:
| Archivo | Descripcion | | Archivo | Descripcion |
|---------|-------------| |---------|-------------|
| `auth.ts` | Login, logout, refresh, getMe, helpers de roles | | `auth.ts` | Login, logout, refresh, getMe, helpers de roles (3 niveles) |
| `client.ts` | Cliente HTTP base con JWT | | `client.ts` | Cliente HTTP base con JWT |
| `meters.ts` | CRUD medidores + lecturas | | `meters.ts` | CRUD medidores + lecturas historicas paginadas |
| `readings.ts` | Lecturas y resumen de consumo | | `readings.ts` | Lecturas y resumen de consumo |
| `projects.ts` | CRUD proyectos + nombres | | `projects.ts` | CRUD proyectos + nombres |
| `concentrators.ts` | CRUD concentradores | | `concentrators.ts` | CRUD concentradores |
| `users.ts` | CRUD usuarios | | `users.ts` | CRUD usuarios |
| `roles.ts` | CRUD roles | | `roles.ts` | CRUD roles |
| `organismos.ts` | CRUD organismos operadores |
| `analytics.ts` | Metricas, ubicaciones, reportes | | `analytics.ts` | Metricas, ubicaciones, reportes |
| `notifications.ts` | Notificaciones del usuario | | `notifications.ts` | Notificaciones del usuario |
| `audit.ts` | Logs de auditoria | | `audit.ts` | Logs de auditoria |

View File

@@ -15,7 +15,7 @@ Sistema full-stack de gestion de medidores de agua con:
### Jerarquia de datos: ### Jerarquia de datos:
``` ```
Projects → Concentrators → Meters → Readings Organismos Operadores → Projects → Concentrators → Meters → Readings
→ Gateways → Devices ↗ → Gateways → Devices ↗
``` ```
@@ -61,11 +61,11 @@ Projects → Concentrators → Meters → Readings
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ PostgreSQL │ │ PostgreSQL │
├─────────────────────────────────────────────────────────────┤ ├─────────────────────────────────────────────────────────────┤
│ 10 tablas: roles, users, projects, concentrators, │ 11 tablas: roles, users, organismos_operadores, projects,
│ gateways, devices, meters, meter_readings, concentrators, gateways, devices, meters, meter_readings, │
│ tts_uplink_logs, refresh_tokens │ │ tts_uplink_logs, refresh_tokens │
│ 2 vistas: meter_stats_by_project, device_status_summary │ │ 2 vistas: meter_stats_by_project, device_status_summary │
7 archivos SQL (schema + 6 migraciones) │ 9 archivos SQL (schema + 8 migraciones) │
│ Triggers de updated_at, indices compuestos, JSONB │ │ Triggers de updated_at, indices compuestos, JSONB │
└─────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────┘
``` ```
@@ -77,18 +77,20 @@ Projects → Concentrators → Meters → Readings
### 1. Autenticacion y Autorizacion ### 1. Autenticacion y Autorizacion
- Login con JWT: access token (15 min) + refresh token (7 dias) - Login con JWT: access token (15 min) + refresh token (7 dias)
- Refresh automatico de tokens en el cliente (cola de peticiones) - Refresh automatico de tokens en el cliente (cola de peticiones)
- 3 roles con permisos JSONB: ADMIN, OPERATOR, VIEWER - **Jerarquia de 3 niveles:** ADMIN → ORGANISMO_OPERADOR → OPERATOR
- Relacion usuario-proyecto para acceso por scope - Scope filtering en todos los servicios backend (via `scope.ts`)
- JWT incluye: userId, roleId, roleName, projectId, organismoOperadorId
- Hash de contrasenas con bcrypt (12 rounds) - Hash de contrasenas con bcrypt (12 rounds)
- Proteccion de rutas por rol en backend y frontend - Proteccion de rutas por rol en backend y frontend
- authenticateToken requerido en todas las rutas GET de medidores
### 2. Dashboard (Home) ### 2. Dashboard (Home)
- KPIs: Total medidores, medidores activos, consumo promedio, alertas - KPIs: Total medidores, medidores activos, consumo promedio, alertas
- Grafico de barras: Medidores por proyecto (Recharts) - Grafico de barras: Medidores por proyecto (Recharts)
- Selector de organismos operadores (CESPT Tijuana, Tecate, Mexicali) - Selector de organismos operadores (filtrado por rol)
- Historial reciente de actividades - Historial reciente de actividades
- Panel de ultimas alertas - Panel de ultimas alertas
- Soporte por rol (ADMIN, OPERATOR, VIEWER) - Soporte por rol (ADMIN, ORGANISMO_OPERADOR, OPERATOR)
### 3. Gestion de Proyectos ### 3. Gestion de Proyectos
- CRUD completo - CRUD completo
@@ -133,40 +135,58 @@ Projects → Concentrators → Meters → Readings
- Sincronizacion programada a las 9:00 AM - Sincronizacion programada a las 9:00 AM
- Seguimiento de ultima conexion y estado - Seguimiento de ultima conexion y estado
### 9. Gestion de Usuarios ### 9. Gestion de Organismos Operadores (NUEVO)
- CRUD completo (solo ADMIN) - CRUD completo (solo ADMIN)
- Asignacion de roles - Tabla: organismos_operadores (nombre, codigo, contacto, telefono, estado)
- Asignacion de proyecto - Vinculacion con proyectos (projects.organismo_operador_id)
- Vinculacion con usuarios (users.organismo_operador_id)
- Pagina frontend: OrganismosPage.tsx
### 10. Gestion de Usuarios
- CRUD completo (ADMIN y ORGANISMO_OPERADOR)
- Asignacion de roles, proyecto y organismo operador
- Filtrado por scope: ADMIN ve todos, ORGANISMO ve los de su organismo
- Estados: activo/inactivo - Estados: activo/inactivo
- Cambio de contrasena - Cambio de contrasena
### 10. Gestion de Roles ### 11. Gestion de Roles
- 3 roles predefinidos: ADMIN, OPERATOR, VIEWER - 3 roles predefinidos: ADMIN, ORGANISMO_OPERADOR, OPERATOR
- Permisos granulares JSONB por recurso - Permisos granulares JSONB por recurso
- CRUD de roles (solo ADMIN) - CRUD de roles (solo ADMIN)
- Conteo de usuarios por rol - Conteo de usuarios por rol
### 11. Auditoria ### 12. Historico de Tomas (NUEVO)
- Pagina dedicada para consultar historial de lecturas por medidor
- Selector de medidor con busqueda por nombre, serial, ubicacion, cuenta CESPT y clave catastral
- Tarjeta de informacion del medidor seleccionado
- Cards de consumo: Consumo Actual (diario), Consumo Pasado (primer dia del mes anterior), Diferencial
- Grafica AreaChart (Recharts) con gradiente, eje Y ajustado al rango de datos
- Tabla paginada de lecturas (10/20/50 por pagina)
- Filtros de rango de fechas
- Exportacion CSV
- Filtrado por scope: cada rol solo ve los medidores asignados
### 13. Auditoria
- Registro automatico de todas las acciones via middleware - Registro automatico de todas las acciones via middleware
- Visor de logs con filtros (solo ADMIN) - Visor de logs con filtros (solo ADMIN)
- Actividad del usuario actual (todos los roles) - Actividad del usuario actual (todos los roles)
- Estadisticas de auditoria - Estadisticas de auditoria
- Busqueda por registro especifico - Busqueda por registro especifico
### 12. Notificaciones ### 14. Notificaciones
- Notificaciones in-app - Notificaciones in-app
- Conteo de no leidas en tiempo real - Conteo de no leidas en tiempo real
- Marcar como leida (individual y masiva) - Marcar como leida (individual y masiva)
- Generacion automatica por flujo negativo (cron job) - Generacion automatica por flujo negativo (cron job)
- Dropdown en TopMenu - Dropdown en TopMenu
### 13. Dark Mode ### 15. Dark Mode
- Soporte completo: Dark / Light / System - Soporte completo: Dark / Light / System
- Paleta Zinc de Tailwind - Paleta Zinc de Tailwind
- Aplicado a todas las paginas, modales, tablas, formularios - Aplicado a todas las paginas, modales, tablas, formularios
- Persistencia en localStorage - Persistencia en localStorage
### 14. Upload Panel ### 16. Upload Panel
- Aplicacion separada (`upload-panel/`) para carga CSV - Aplicacion separada (`upload-panel/`) para carga CSV
- Dropzone para archivos - Dropzone para archivos
- Carga de medidores (upsert) - Carga de medidores (upsert)
@@ -251,6 +271,21 @@ Columnas opcionales:
- Mejoras en tiempo de ultima conexion de conectores - Mejoras en tiempo de ultima conexion de conectores
- Plan de implementacion para rol ORGANISMOS_OPERADORES - Plan de implementacion para rol ORGANISMOS_OPERADORES
### 2026-02-09: Organismos Operadores + Historico de Tomas
- Implementacion completa del rol ORGANISMO_OPERADOR (jerarquia de 3 niveles)
- Nueva tabla `organismos_operadores` con migracion SQL
- Scope filtering en todos los servicios backend (meter, reading, project, user, concentrator, notification)
- JWT actualizado con `organismoOperadorId`
- Pagina OrganismosPage.tsx para gestion de organismos (ADMIN)
- Pagina HistoricoPage.tsx para consulta de historial de lecturas por medidor
- Cards de consumo: Actual, Pasado, Diferencial
- Grafica AreaChart con gradiente y eje Y ajustado
- Busqueda por cuenta CESPT y clave catastral
- authenticateToken en rutas GET de medidores
- Sidebar con visibilidad de 3 niveles
- UsersPage actualizada con asignacion de organismo
- ProjectsPage con campo organismo_operador_id
### 2026-02-05: Sincronizacion de conectores ### 2026-02-05: Sincronizacion de conectores
- Cambio de hora de sincronizacion de 2:00 AM a 9:00 AM - Cambio de hora de sincronizacion de 2:00 AM a 9:00 AM
@@ -287,8 +322,8 @@ psql -d water_project -f water-api/sql/schema.sql
## Proximos Pasos Sugeridos ## Proximos Pasos Sugeridos
1. **Rol ORGANISMOS_OPERADORES** - Implementar nuevo rol segun plan existente 1. **Reportes PDF** - Generacion y descarga de reportes en PDF
2. **Reportes PDF** - Generacion y descarga de reportes en PDF 2. **Tests** - Suite de tests con Vitest (frontend) y Supertest (backend)
3. **Tests** - Suite de tests con Vitest (frontend) y Supertest (backend) 3. **CI/CD** - Pipeline de integracion continua
4. **CI/CD** - Pipeline de integracion continua 4. **Docker** - Containerizacion del proyecto completo
5. **Docker** - Containerizacion del proyecto completo 5. **Alertas avanzadas** - Configuracion de umbrales y notificaciones por email

View File

@@ -15,8 +15,10 @@ El **Sistema GRH** es una aplicacion web completa para organismos operadores de
- **Consumo y Lecturas** - Seguimiento historico de lecturas con filtros y exportacion - **Consumo y Lecturas** - Seguimiento historico de lecturas con filtros y exportacion
- **Analytics** - Mapa de medidores, reportes y metricas del servidor - **Analytics** - Mapa de medidores, reportes y metricas del servidor
- **Conectores** - Integracion con SH-Meters, XMeters y The Things Stack - **Conectores** - Integracion con SH-Meters, XMeters y The Things Stack
- **Usuarios y Roles** - Control de acceso basado en roles (ADMIN, OPERATOR, VIEWER) - **Organismos Operadores** - Gestion de organismos operadores de agua (ADMIN)
- **Auditoria** - Registro completo de actividad del sistema - **Historico de Tomas** - Consulta de historial de lecturas por medidor con grafica y estadisticas
- **Usuarios y Roles** - Control de acceso basado en roles con jerarquia de 3 niveles
- **Auditoria** - Registro completo de actividad del sistema (ADMIN)
- **Notificaciones** - Alertas en tiempo real (flujo negativo, etc.) - **Notificaciones** - Alertas en tiempo real (flujo negativo, etc.)
- **Tema claro/oscuro** - Personalizacion de la interfaz - **Tema claro/oscuro** - Personalizacion de la interfaz
- **Diseno responsive** - Compatible con desktop, tablet y movil - **Diseno responsive** - Compatible con desktop, tablet y movil
@@ -42,7 +44,7 @@ El **Sistema GRH** es una aplicacion web completa para organismos operadores de
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────┐
│ PostgreSQL │ │ PostgreSQL │
│ 10 tablas + 2 vistas + triggers + indices │ │ 11 tablas + 2 vistas + triggers + indices │
└─────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────┘
``` ```
@@ -113,6 +115,8 @@ psql -d water_project -f water-api/sql/add_meter_extended_fields.sql
psql -d water_project -f water-api/sql/create_meter_types.sql psql -d water_project -f water-api/sql/create_meter_types.sql
psql -d water_project -f water-api/sql/add_meter_project_relation.sql psql -d water_project -f water-api/sql/add_meter_project_relation.sql
psql -d water_project -f water-api/sql/add_user_project_relation.sql psql -d water_project -f water-api/sql/add_user_project_relation.sql
psql -d water_project -f water-api/sql/add_organismos_operadores.sql
psql -d water_project -f water-api/sql/add_user_meter_fields.sql
``` ```
### 3. Configurar el backend ### 3. Configurar el backend
@@ -211,12 +215,13 @@ GRH/
│ ├── api/ # Cliente API (14 modulos) │ ├── api/ # Cliente API (14 modulos)
│ │ ├── client.ts # Cliente HTTP con JWT y refresh automatico │ │ ├── client.ts # Cliente HTTP con JWT y refresh automatico
│ │ ├── auth.ts # Autenticacion y gestion de tokens │ │ ├── auth.ts # Autenticacion y gestion de tokens
│ │ ├── meters.ts # CRUD de medidores │ │ ├── meters.ts # CRUD de medidores + lecturas historicas
│ │ ├── readings.ts # Lecturas de consumo │ │ ├── readings.ts # Lecturas de consumo
│ │ ├── projects.ts # Proyectos │ │ ├── projects.ts # Proyectos
│ │ ├── concentrators.ts # Concentradores │ │ ├── concentrators.ts # Concentradores
│ │ ├── users.ts # Usuarios │ │ ├── users.ts # Usuarios
│ │ ├── roles.ts # Roles │ │ ├── roles.ts # Roles
│ │ ├── organismos.ts # CRUD organismos operadores
│ │ ├── analytics.ts # Analytics y metricas │ │ ├── analytics.ts # Analytics y metricas
│ │ ├── notifications.ts # Notificaciones │ │ ├── notifications.ts # Notificaciones
│ │ ├── audit.ts # Auditoria │ │ ├── audit.ts # Auditoria
@@ -242,6 +247,7 @@ GRH/
│ │ ├── UsersPage.tsx # Gestion de usuarios │ │ ├── UsersPage.tsx # Gestion de usuarios
│ │ ├── RolesPage.tsx # Gestion de roles │ │ ├── RolesPage.tsx # Gestion de roles
│ │ ├── AuditoriaPage.tsx # Visor de logs de auditoria │ │ ├── AuditoriaPage.tsx # Visor de logs de auditoria
│ │ ├── OrganismosPage.tsx # Gestion de organismos operadores
│ │ ├── projects/ │ │ ├── projects/
│ │ │ └── ProjectsPage.tsx │ │ │ └── ProjectsPage.tsx
│ │ ├── meters/ # Modulo de medidores │ │ ├── meters/ # Modulo de medidores
@@ -260,6 +266,8 @@ GRH/
│ │ ├── consumption/ # Modulo de consumo │ │ ├── consumption/ # Modulo de consumo
│ │ │ ├── ConsumptionPage.tsx │ │ │ ├── ConsumptionPage.tsx
│ │ │ └── ReadingsBulkUploadModal.tsx │ │ │ └── ReadingsBulkUploadModal.tsx
│ │ ├── historico/ # Modulo de historico de tomas
│ │ │ └── HistoricoPage.tsx
│ │ ├── analytics/ # Modulo de analytics │ │ ├── analytics/ # Modulo de analytics
│ │ │ ├── AnalyticsMapPage.tsx │ │ │ ├── AnalyticsMapPage.tsx
│ │ │ ├── AnalyticsReportsPage.tsx │ │ │ ├── AnalyticsReportsPage.tsx
@@ -293,19 +301,22 @@ GRH/
│ │ ├── utils/ │ │ ├── utils/
│ │ │ ├── jwt.ts # Generacion/verificacion de tokens │ │ │ ├── jwt.ts # Generacion/verificacion de tokens
│ │ │ ├── password.ts # Wrappers de bcrypt │ │ │ ├── password.ts # Wrappers de bcrypt
│ │ │ ── logger.ts # Configuracion Winston │ │ │ ── logger.ts # Configuracion Winston
│ │ │ └── scope.ts # Filtrado por scope de rol
│ │ ├── jobs/ │ │ ├── jobs/
│ │ │ └── negativeFlowDetection.ts # Tarea programada │ │ │ └── negativeFlowDetection.ts # Tarea programada
│ │ └── types/ # Interfaces TypeScript │ │ └── types/ # Interfaces TypeScript
│ │ │ │
│ ├── sql/ # Schema y migraciones │ ├── sql/ # Schema y migraciones
│ │ ├── schema.sql # Schema principal (10 tablas + 2 vistas) │ │ ├── schema.sql # Schema principal + migraciones (11 tablas + 2 vistas)
│ │ ├── add_audit_logs.sql │ │ ├── add_audit_logs.sql
│ │ ├── add_notifications.sql │ │ ├── add_notifications.sql
│ │ ├── add_meter_extended_fields.sql │ │ ├── add_meter_extended_fields.sql
│ │ ├── create_meter_types.sql │ │ ├── create_meter_types.sql
│ │ ├── add_meter_project_relation.sql │ │ ├── add_meter_project_relation.sql
│ │ ── add_user_project_relation.sql │ │ ── add_user_project_relation.sql
│ │ ├── add_organismos_operadores.sql
│ │ └── add_user_meter_fields.sql
│ │ │ │
│ ├── package.json │ ├── package.json
│ ├── tsconfig.json │ ├── tsconfig.json
@@ -346,9 +357,10 @@ Projects → Concentrators → Meters → Readings
| Tabla | Descripcion | | Tabla | Descripcion |
|-------|-------------| |-------|-------------|
| `roles` | Roles del sistema (ADMIN, OPERATOR, VIEWER) con permisos JSONB | | `roles` | Roles del sistema (ADMIN, ORGANISMO_OPERADOR, OPERATOR) con permisos JSONB |
| `users` | Usuarios con email, password hash, rol y estado | | `users` | Usuarios con email, password hash, rol, proyecto y organismo |
| `projects` | Proyectos de infraestructura hidrica | | `organismos_operadores` | Organismos operadores de agua (CESPT Tijuana, Tecate, etc.) |
| `projects` | Proyectos de infraestructura hidrica (vinculados a organismo) |
| `concentrators` | Concentradores de datos vinculados a proyectos | | `concentrators` | Concentradores de datos vinculados a proyectos |
| `gateways` | Gateways LoRaWAN con integracion TTS | | `gateways` | Gateways LoRaWAN con integracion TTS |
| `devices` | Dispositivos LoRaWAN (sensores/transmisores) | | `devices` | Dispositivos LoRaWAN (sensores/transmisores) |
@@ -370,8 +382,9 @@ Todos los endpoints estan bajo el prefijo `/api/`. La mayoria requieren autentic
| Grupo | Prefijo | Descripcion | | Grupo | Prefijo | Descripcion |
|-------|---------|-------------| |-------|---------|-------------|
| Auth | `/api/auth` | Login, refresh, logout, perfil | | Auth | `/api/auth` | Login, refresh, logout, perfil |
| Organismos | `/api/organismos-operadores` | CRUD de organismos operadores (ADMIN) |
| Projects | `/api/projects` | CRUD de proyectos + estadisticas | | Projects | `/api/projects` | CRUD de proyectos + estadisticas |
| Meters | `/api/meters` | CRUD de medidores + lecturas | | Meters | `/api/meters` | CRUD de medidores + lecturas historicas |
| Meter Types | `/api/meter-types` | Tipos de medidor | | Meter Types | `/api/meter-types` | Tipos de medidor |
| Concentrators | `/api/concentrators` | CRUD de concentradores | | Concentrators | `/api/concentrators` | CRUD de concentradores |
| Gateways | `/api/gateways` | CRUD de gateways + dispositivos | | Gateways | `/api/gateways` | CRUD de gateways + dispositivos |
@@ -400,12 +413,12 @@ El sistema usa **JWT con refresh tokens**:
4. El cliente HTTP envia el access token en `Authorization: Bearer <token>` 4. El cliente HTTP envia el access token en `Authorization: Bearer <token>`
5. Al expirar, el cliente automaticamente llama a `POST /api/auth/refresh` 5. Al expirar, el cliente automaticamente llama a `POST /api/auth/refresh`
### Roles y permisos ### Roles y permisos (Jerarquia de 3 niveles)
| Rol | Descripcion | | Rol | Descripcion | Scope |
|-----|-------------| |-----|-------------|-------|
| `ADMIN` | Acceso completo al sistema | | `ADMIN` | Acceso completo al sistema | Ve todos los datos |
| `OPERATOR` | Gestiona proyectos, dispositivos, medidores (sin configuracion del sistema) | | `ORGANISMO_OPERADOR` | Gestiona proyectos de su organismo | Ve datos de proyectos de su organismo |
| `VIEWER` | Solo lectura de datos y reportes | | `OPERATOR` | Opera medidores de su proyecto | Ve datos de su proyecto asignado |
--- ---

View File

@@ -187,6 +187,7 @@ Authorization: Bearer {accessToken}
GET /meters?page=1&pageSize=50 GET /meters?page=1&pageSize=50
Authorization: Bearer {accessToken} Authorization: Bearer {accessToken}
``` ```
*Resultados filtrados automaticamente por scope del usuario (ADMIN ve todos, ORGANISMO ve su organismo, OPERATOR ve su proyecto)*
**Parametros de consulta:** **Parametros de consulta:**
| Parametro | Tipo | Descripcion | | Parametro | Tipo | Descripcion |
@@ -202,11 +203,50 @@ Authorization: Bearer {accessToken}
### Obtener Medidor ### Obtener Medidor
```http ```http
GET /meters/:id GET /meters/:id
Authorization: Bearer {accessToken}
``` ```
### Lecturas del Medidor ### Lecturas del Medidor
```http ```http
GET /meters/:id/readings?page=1&pageSize=50 GET /meters/:id/readings?page=1&pageSize=50
Authorization: Bearer {accessToken}
```
*Resultados filtrados por scope del usuario*
**Parametros de consulta:**
| Parametro | Tipo | Descripcion |
|-----------|------|-------------|
| page | number | Numero de pagina |
| pageSize | number | Registros por pagina (max 100) |
| start_date | date | Fecha inicio (YYYY-MM-DD) |
| end_date | date | Fecha fin (YYYY-MM-DD) |
**Respuesta:**
```json
{
"success": true,
"data": [
{
"id": "uuid",
"meter_id": "uuid",
"reading_value": 1234.56,
"reading_type": "AUTOMATIC",
"battery_level": 85,
"signal_strength": -45,
"received_at": "2024-01-20T10:30:00Z",
"meter_serial_number": "MED001",
"meter_name": "Medidor 001",
"project_id": "uuid",
"project_name": "ADAMANT"
}
],
"pagination": {
"page": 1,
"pageSize": 50,
"total": 150,
"totalPages": 3
}
}
``` ```
### Crear Medidor ### Crear Medidor
@@ -382,6 +422,54 @@ GET /csv-upload/readings/template
--- ---
## Organismos Operadores
### Listar Organismos
```http
GET /organismos-operadores
Authorization: Bearer {accessToken}
```
*Requiere rol ADMIN*
### Obtener Organismo
```http
GET /organismos-operadores/:id
Authorization: Bearer {accessToken}
```
### Crear Organismo
```http
POST /organismos-operadores
Authorization: Bearer {accessToken}
Content-Type: application/json
{
"name": "CESPT Tijuana",
"code": "CESPT-TJ",
"contact_name": "Juan Perez",
"contact_email": "juan@cespt.gob.mx",
"contact_phone": "664-123-4567",
"is_active": true
}
```
*Requiere rol ADMIN*
### Actualizar Organismo
```http
PUT /organismos-operadores/:id
Authorization: Bearer {accessToken}
Content-Type: application/json
```
### Eliminar Organismo
```http
DELETE /organismos-operadores/:id
Authorization: Bearer {accessToken}
```
*Requiere rol ADMIN*
---
## Usuarios ## Usuarios
### Listar Usuarios ### Listar Usuarios
@@ -389,7 +477,7 @@ GET /csv-upload/readings/template
GET /users GET /users
Authorization: Bearer {accessToken} Authorization: Bearer {accessToken}
``` ```
*Requiere rol ADMIN* *Requiere rol ADMIN o ORGANISMO_OPERADOR. Resultados filtrados por scope.*
### Crear Usuario ### Crear Usuario
```http ```http
@@ -402,10 +490,11 @@ Content-Type: application/json
"password": "contraseña123", "password": "contraseña123",
"name": "Nombre Usuario", "name": "Nombre Usuario",
"role_id": "uuid-rol", "role_id": "uuid-rol",
"project_id": "uuid-proyecto" "project_id": "uuid-proyecto",
"organismo_operador_id": "uuid-organismo"
} }
``` ```
*Requiere rol ADMIN* *Requiere rol ADMIN o ORGANISMO_OPERADOR*
### Actualizar Usuario ### Actualizar Usuario
```http ```http
@@ -441,12 +530,12 @@ GET /roles
Authorization: Bearer {accessToken} Authorization: Bearer {accessToken}
``` ```
**Roles disponibles:** **Roles disponibles (jerarquia de 3 niveles):**
| Rol | Descripcion | | Rol | Descripcion | Scope |
|-----|-------------| |-----|-------------|-------|
| ADMIN | Acceso completo al sistema | | ADMIN | Acceso completo al sistema | Ve todos los datos |
| OPERATOR | Gestion de medidores y lecturas de su proyecto | | ORGANISMO_OPERADOR | Gestiona proyectos de su organismo | Ve datos de proyectos de su organismo |
| VIEWER | Solo lectura | | OPERATOR | Opera medidores de su proyecto | Ve datos de su proyecto asignado |
--- ---

View File

@@ -54,6 +54,7 @@
│ │ │ - meters │ │ - meter │ │ - meter │ │ │ │ │ │ - meters │ │ - meter │ │ - meter │ │ │
│ │ │ - readings │ │ - reading │ │ - reading │ │ │ │ │ │ - readings │ │ - reading │ │ - reading │ │ │
│ │ │ - users │ │ - user │ │ - user │ │ │ │ │ │ - users │ │ - user │ │ - user │ │ │
│ │ │ - organismos│ │ - organismo │ │ - organismo │ │ │
│ │ │ - csv-upload│ │ - etc... │ │ - csv-upload│ │ │ │ │ │ - csv-upload│ │ - etc... │ │ - csv-upload│ │ │
│ │ │ - webhooks │ │ │ │ - tts │ │ │ │ │ │ - webhooks │ │ │ │ - tts │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
@@ -83,6 +84,7 @@
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ users │ │ projects │ │concentrators│ │ │ │ │ │ users │ │ projects │ │concentrators│ │ │
│ │ │ roles │ │ gateways │ │ meters │ │ │ │ │ │ roles │ │ gateways │ │ meters │ │ │
│ │ │ organismos │ │ │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
@@ -125,11 +127,24 @@
│ id (PK) │──┐ │ id (PK) │ ┌──│ id (PK) │ │ id (PK) │──┐ │ id (PK) │ ┌──│ id (PK) │
│ name │ └───▶│ role_id (FK) │ │ │ name │ │ name │ └───▶│ role_id (FK) │ │ │ name │
│ description │ │ project_id (FK) │◀───┤ │ description │ │ description │ │ project_id (FK) │◀───┤ │ description │
│ permissions │ │ email │ │ │ area_name │ │ permissions │ │ organismo_op_id │──┐ │ │ area_name │
└─────────────┘ │ password_hash │ │ status │ └─────────────┘ │ email │ │ status │
name │ │ created_by (FK) │──▶ users password_hash │ │ organismo_op_id │──┐
is_active │ │ meter_type_id │──▶ meter_types name │ │ │ │ created_by (FK) │──▶ users
└─────────────────┘ │ └─────────────────┘ │ is_active │ │ │ │ meter_type_id │──▶ meter_types
└─────────────────┘ │ │ └─────────────────┘ │
│ │ │
┌─────────────────┐ │ │ │
│ organismos_ │◀─┘─┼───────────────────────┘
│ operadores │ │
├─────────────────┤ │
│ id (PK) │ │
│ name │ │
│ code │ │
│ contact_name │ │
│ contact_email │ │
│ is_active │ │
└─────────────────┘ │
│ │ │ │
│ │ │ │
┌─────────────────┐ │ │ ┌─────────────────┐ │ │
@@ -183,6 +198,36 @@
└─────────────────┘ └─────────────────┘
## Scope Filtering (Control de Acceso por Datos)
Todos los servicios del backend aplican filtrado automatico basado en el rol del usuario autenticado:
```
┌──────────────────────────────────────────────────────────┐
│ Scope Filtering │
├──────────────────────────────────────────────────────────┤
│ │
│ ADMIN (roleName = 'ADMIN') │
│ └── Sin filtro, ve TODOS los registros │
│ │
│ ORGANISMO_OPERADOR (organismoOperadorId = X) │
│ └── WHERE project_id IN ( │
│ SELECT id FROM projects │
│ WHERE organismo_operador_id = X │
│ ) │
│ │
│ OPERATOR (projectId = Y) │
│ └── WHERE project_id = Y │
│ │
├──────────────────────────────────────────────────────────┤
│ Utility: water-api/src/utils/scope.ts │
│ Se aplica en: meter, reading, project, user, │
│ concentrator, notification services │
└──────────────────────────────────────────────────────────┘
```
---
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ audit_logs │ │ notifications │ │ meter_types │ │ audit_logs │ │ notifications │ │ meter_types │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤
@@ -206,7 +251,7 @@
| Campo | Tipo | Descripcion | | Campo | Tipo | Descripcion |
|-------|------|-------------| |-------|------|-------------|
| id | UUID | Identificador unico | | id | UUID | Identificador unico |
| name | ENUM | ADMIN, OPERATOR, VIEWER | | name | ENUM | ADMIN, ORGANISMO_OPERADOR, OPERATOR |
| description | TEXT | Descripcion del rol | | description | TEXT | Descripcion del rol |
| permissions | JSONB | Permisos detallados | | permissions | JSONB | Permisos detallados |
@@ -219,9 +264,23 @@
| name | VARCHAR | Nombre completo | | name | VARCHAR | Nombre completo |
| role_id | UUID FK | Rol asignado | | role_id | UUID FK | Rol asignado |
| project_id | UUID FK | Proyecto asignado (OPERATOR) | | project_id | UUID FK | Proyecto asignado (OPERATOR) |
| organismo_operador_id | UUID FK | Organismo asignado (ORGANISMO_OPERADOR) |
| is_active | BOOLEAN | Estado de la cuenta | | is_active | BOOLEAN | Estado de la cuenta |
| last_login | TIMESTAMP | Ultimo acceso | | last_login | TIMESTAMP | Ultimo acceso |
#### `organismos_operadores`
| Campo | Tipo | Descripcion |
|-------|------|-------------|
| id | UUID | Identificador unico |
| name | VARCHAR | Nombre del organismo |
| code | VARCHAR | Codigo unico (ej: CESPT-TJ) |
| contact_name | VARCHAR | Nombre del contacto |
| contact_email | VARCHAR | Email de contacto |
| contact_phone | VARCHAR | Telefono de contacto |
| is_active | BOOLEAN | Estado activo |
| created_at | TIMESTAMP | Fecha de creacion |
| updated_at | TIMESTAMP | Fecha de actualizacion |
#### `refresh_tokens` #### `refresh_tokens`
| Campo | Tipo | Descripcion | | Campo | Tipo | Descripcion |
|-------|------|-------------| |-------|------|-------------|
@@ -244,6 +303,7 @@
| area_name | VARCHAR | Nombre del area | | area_name | VARCHAR | Nombre del area |
| location | TEXT | Ubicacion | | location | TEXT | Ubicacion |
| status | ENUM | ACTIVE, INACTIVE, COMPLETED | | status | ENUM | ACTIVE, INACTIVE, COMPLETED |
| organismo_operador_id | UUID FK | Organismo operador propietario |
| meter_type_id | UUID FK | Tipo de medidor por defecto | | meter_type_id | UUID FK | Tipo de medidor por defecto |
| created_by | UUID FK | Usuario creador | | created_by | UUID FK | Usuario creador |

View File

@@ -49,8 +49,12 @@ psql -U water_user -d water_project -f add_notifications.sql
psql -U water_user -d water_project -f add_meter_extended_fields.sql psql -U water_user -d water_project -f add_meter_extended_fields.sql
psql -U water_user -d water_project -f add_meter_project_relation.sql psql -U water_user -d water_project -f add_meter_project_relation.sql
psql -U water_user -d water_project -f add_meter_types.sql psql -U water_user -d water_project -f add_meter_types.sql
psql -U water_user -d water_project -f add_organismos_operadores.sql
psql -U water_user -d water_project -f add_user_meter_fields.sql
``` ```
**Nota:** `add_organismos_operadores.sql` crea la tabla `organismos_operadores`, agrega columnas FK en `projects` y `users`, y agrega el rol `ORGANISMO_OPERADOR`. `add_user_meter_fields.sql` agrega campos como `cespt_account` y `cadastral_key`.
### 3. Configurar Variables de Entorno ### 3. Configurar Variables de Entorno
```bash ```bash

View File

@@ -8,10 +8,12 @@
4. [Gestion de Concentradores](#gestion-de-concentradores) 4. [Gestion de Concentradores](#gestion-de-concentradores)
5. [Gestion de Medidores](#gestion-de-medidores) 5. [Gestion de Medidores](#gestion-de-medidores)
6. [Consumo y Lecturas](#consumo-y-lecturas) 6. [Consumo y Lecturas](#consumo-y-lecturas)
7. [Panel de Carga CSV](#panel-de-carga-csv) 7. [Historico de Tomas](#historico-de-tomas)
8. [Notificaciones](#notificaciones) 8. [Organismos Operadores](#organismos-operadores)
9. [Administracion de Usuarios](#administracion-de-usuarios) 9. [Panel de Carga CSV](#panel-de-carga-csv)
10. [Auditoria](#auditoria) 10. [Notificaciones](#notificaciones)
11. [Administracion de Usuarios](#administracion-de-usuarios)
12. [Auditoria](#auditoria)
--- ---
@@ -28,13 +30,24 @@
3. Introduzca su contraseña 3. Introduzca su contraseña
4. Haga clic en "Iniciar Sesion" 4. Haga clic en "Iniciar Sesion"
### Roles de Usuario ### Roles de Usuario (Jerarquia de 3 niveles)
| Rol | Permisos | | Rol | Permisos | Visibilidad |
|-----|----------| |-----|----------|-------------|
| **ADMIN** | Acceso completo a todas las funciones | | **ADMIN** | Acceso completo a todas las funciones | Ve todos los datos del sistema |
| **OPERATOR** | Gestion de medidores y lecturas de su proyecto asignado | | **ORGANISMO_OPERADOR** | Gestion de usuarios y visualizacion de su organismo | Ve datos de los proyectos de su organismo |
| **VIEWER** | Solo visualizacion de datos | | **OPERATOR** | Operacion de medidores de su proyecto | Ve datos de su proyecto asignado |
### Menu Lateral por Rol
| Seccion | ADMIN | ORGANISMO_OPERADOR | OPERATOR |
|---------|-------|-------------------|----------|
| Dashboard | Si | Si | Si |
| Project Management | Si | Si | Si |
| Users Management | Si | Si | No |
| Organismos Operadores | Si | No | No |
| Conectores | Si | No | No |
| Analytics | Si | Si | No |
--- ---
@@ -204,6 +217,83 @@ Los concentradores son dispositivos que agrupan multiples medidores.
--- ---
## Historico de Tomas
*Disponible para todos los roles. Cada rol solo ve los medidores de su scope.*
### Acceder al Historico
1. Navegue a **Historico** en la seccion "Project Management" del menu lateral
2. Vera un selector de medidor y un estado vacio inicial
### Seleccionar Medidor
1. Haga clic en el campo de busqueda
2. Escriba para filtrar por:
- Nombre del medidor
- Numero de serie
- Ubicacion
- Cuenta CESPT
- Clave catastral
3. Seleccione el medidor del dropdown
### Informacion del Medidor
Al seleccionar un medidor se muestra:
- **Tarjeta de informacion:** Serial, nombre, proyecto, ubicacion, tipo, estado, ultima lectura
- **Cards de consumo:**
- **Consumo Actual:** Lectura mas reciente (consumo diario)
- **Consumo Pasado:** Lectura del primer dia del mes anterior
- **Diferencial:** Diferencia entre actual y pasado (con indicador de tendencia)
### Filtrar por Fechas
1. Use los campos "Desde" y "Hasta" para definir un rango
2. Los datos se actualizan automaticamente
3. Use el boton "Limpiar" para remover los filtros
### Grafica de Consumo
- Grafica de area con gradiente azul
- Eje X: fechas, Eje Y: valor de lectura (m3)
- El rango del eje Y se ajusta automaticamente a los datos
### Tabla de Lecturas
- Columnas: Fecha/Hora, Lectura (m3), Tipo, Bateria, Senal
- Paginacion configurable: 10, 20 o 50 registros por pagina
- Indicadores visuales de bateria y senal
### Exportar CSV
1. Haga clic en el boton **"Exportar CSV"** en el encabezado
2. Se descargara un archivo `historico_{serial}_{fecha}.csv`
---
## Organismos Operadores
*Solo disponible para usuarios con rol ADMIN*
### Ver Organismos
1. Haga clic en **"Organismos Operadores"** en el menu lateral
2. Vera la tabla con todos los organismos registrados
### Crear Organismo
1. Haga clic en **"Nuevo Organismo"**
2. Complete los campos:
- **Nombre:** Nombre del organismo (ej: CESPT Tijuana)
- **Codigo:** Codigo unico (ej: CESPT-TJ)
- **Contacto:** Nombre de la persona de contacto
- **Email:** Correo electronico de contacto
- **Telefono:** Numero de telefono
- **Estado:** Activo/Inactivo
3. Haga clic en **"Guardar"**
### Editar Organismo
1. Haga clic en el icono de edicion del organismo
2. Modifique los campos necesarios
3. Haga clic en **"Guardar"**
### Vincular Proyectos y Usuarios
- Los proyectos se vinculan a un organismo via el campo `organismo_operador_id` en la pagina de Proyectos
- Los usuarios con rol ORGANISMO_OPERADOR se vinculan a un organismo via la pagina de Usuarios
---
## Panel de Carga CSV ## Panel de Carga CSV
El panel de carga CSV permite subir datos de medidores y lecturas sin necesidad de autenticacion. El panel de carga CSV permite subir datos de medidores y lecturas sin necesidad de autenticacion.
@@ -297,11 +387,11 @@ MED002,567.89,2024-01-20 10:35:00,MANUAL,90,-42
## Administracion de Usuarios ## Administracion de Usuarios
*Solo disponible para usuarios con rol ADMIN* *Disponible para ADMIN (ve todos) y ORGANISMO_OPERADOR (ve los de su organismo)*
### Ver Usuarios ### Ver Usuarios
1. Navegue a **Usuarios** en el menu lateral 1. Navegue a **Usuarios** en el menu lateral
2. Vera la lista de todos los usuarios 2. Vera la lista de usuarios filtrada segun su rol
### Crear Usuario ### Crear Usuario
1. Haga clic en **"Nuevo Usuario"** 1. Haga clic en **"Nuevo Usuario"**
@@ -309,8 +399,9 @@ MED002,567.89,2024-01-20 10:35:00,MANUAL,90,-42
- **Email**: Correo electronico (sera el usuario de login) - **Email**: Correo electronico (sera el usuario de login)
- **Nombre**: Nombre completo - **Nombre**: Nombre completo
- **Contraseña**: Contraseña inicial - **Contraseña**: Contraseña inicial
- **Rol**: ADMIN, OPERATOR, o VIEWER - **Rol**: ADMIN, ORGANISMO_OPERADOR, u OPERATOR
- **Proyecto**: Solo para OPERATOR - proyecto asignado - **Organismo Operador**: Para ORGANISMO_OPERADOR - organismo asignado
- **Proyecto**: Para OPERATOR - proyecto asignado
3. Haga clic en **"Guardar"** 3. Haga clic en **"Guardar"**
### Editar Usuario ### Editar Usuario