263 lines
11 KiB
Markdown
263 lines
11 KiB
Markdown
# GAP ANALYSIS - MGN-001: Fundamentos
|
|
|
|
**Fecha:** 2025-11-23
|
|
**Basado en:** Odoo base + auth_signup, Gamilit auth_management, Construcción MAI-001
|
|
**Estado:** Gap analysis completado
|
|
|
|
## Resumen Ejecutivo
|
|
|
|
| Métrica | Valor |
|
|
|---------|-------|
|
|
| **Funcionalidades de Odoo** | 12 |
|
|
| **Funcionalidades incluidas en MGN-001** | 8 |
|
|
| **Gaps identificados** | 7 |
|
|
| **Gaps P0 (críticos)** | 3 |
|
|
| **Gaps P1 (altos)** | 2 |
|
|
| **Gaps P2 (bajos)** | 2 |
|
|
| **% Cobertura** | 67% |
|
|
|
|
## 1. FUNCIONALIDADES DE ODOO
|
|
|
|
### Del Módulo base (res.users, res.groups, ir.model.access, ir.rule)
|
|
|
|
1. **Autenticación de usuarios:** Login con sesiones, cookies
|
|
2. **Gestión de usuarios:** CRUD usuarios con perfiles completos
|
|
3. **Sistema RBAC:** Roles (groups), permisos por modelo (ir.model.access)
|
|
4. **Record Rules (RLS):** Filtros SQL dinámicos por rol (ir.rule)
|
|
5. **Herencia de roles:** Grupos pueden heredar permisos de otros grupos
|
|
6. **Permisos campo-level:** Restricción de acceso a campos específicos
|
|
7. **Multi-company:** Usuarios acceden a múltiples empresas
|
|
8. **OAuth2 login:** Google, Facebook, Microsoft
|
|
9. **API Keys:** Tokens para integraciones externas
|
|
10. **Password policies:** Complejidad, expiración, historial
|
|
|
|
### Del Módulo auth_signup
|
|
|
|
11. **Signup con validación:** Registro de usuarios con email verification
|
|
12. **Reset password:** Token seguro con expiración
|
|
|
|
## 2. FUNCIONALIDADES INCLUIDAS EN MGN-001
|
|
|
|
[Lista de funcionalidades que se incluyen según ALCANCE-POR-MODULO.md]
|
|
|
|
1. ✅ **Autenticación JWT:** Incluida en MGN-001 (Login con JWT tokens)
|
|
2. ✅ **Gestión de usuarios:** Incluida en MGN-001 (CRUD completo)
|
|
3. ✅ **RBAC:** Incluida en MGN-001 (Roles, permisos CRUD por modelo)
|
|
4. ✅ **Multi-tenancy schema-level:** Incluida en MGN-001 (Isolation por schema)
|
|
5. ✅ **Signup:** Incluida en MGN-001 (Registro con validación email)
|
|
6. ✅ **Reset password:** Incluida en MGN-001 (Token seguro, 24h)
|
|
7. ✅ **Cambio de contraseña:** Incluida en MGN-001 (Con validación fuerte)
|
|
8. ✅ **RLS Policies:** Incluida en MGN-001 (Record-level security)
|
|
|
|
## 3. GAPS IDENTIFICADOS
|
|
|
|
### Gap P0 (Críticos - Debe incluirse en MVP)
|
|
|
|
#### GAP-MGN-001-001: API Keys para Integraciones Externas
|
|
- **Descripción:** Sistema de autenticación con API Keys para integraciones M2M (machine-to-machine)
|
|
- **Referencia Odoo:** base (API access tokens)
|
|
- **Impacto:** CRÍTICO
|
|
- **Justificación impacto:** Necesario para integración con INFONAVIT API, servicios externos, webhooks. Sin esto, todas las integraciones deben usar usuarios normales (riesgo de seguridad)
|
|
- **Recomendación:** INCLUIR en MVP
|
|
- **Esfuerzo estimado:** 8 SP
|
|
- **Implementación sugerida:**
|
|
```sql
|
|
CREATE TABLE auth.api_keys (
|
|
id UUID PRIMARY KEY,
|
|
user_id UUID REFERENCES auth.users(id),
|
|
key_hash TEXT NOT NULL, -- bcrypt hash
|
|
name TEXT NOT NULL,
|
|
scopes TEXT[], -- ['read:projects', 'write:budgets']
|
|
expires_at TIMESTAMP,
|
|
last_used_at TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
```
|
|
- **Dependencias:** MGN-001 (usuarios)
|
|
|
|
#### GAP-MGN-001-002: Permisos Granulares a Nivel de Campo
|
|
- **Descripción:** Restricción de acceso a campos específicos por rol (field-level permissions)
|
|
- **Referencia Odoo:** ir.model.fields.access
|
|
- **Impacto:** CRÍTICO
|
|
- **Justificación impacto:** INFONAVIT requiere ocultar campos sensibles (presupuestos, costos) a ciertos roles. Sin esto, usuarios ven información que no deben
|
|
- **Recomendación:** INCLUIR en MVP
|
|
- **Esfuerzo estimado:** 13 SP
|
|
- **Implementación sugerida:**
|
|
```sql
|
|
CREATE TABLE auth.field_permissions (
|
|
id UUID PRIMARY KEY,
|
|
role_id UUID REFERENCES auth.roles(id),
|
|
table_name TEXT NOT NULL,
|
|
field_name TEXT NOT NULL,
|
|
can_read BOOLEAN DEFAULT FALSE,
|
|
can_write BOOLEAN DEFAULT FALSE,
|
|
UNIQUE(role_id, table_name, field_name)
|
|
);
|
|
```
|
|
- **Dependencias:** MGN-001 (RBAC)
|
|
|
|
#### GAP-MGN-001-003: Herencia de Roles
|
|
- **Descripción:** Roles pueden heredar permisos de otros roles (role inheritance)
|
|
- **Referencia Odoo:** res.groups (implied_ids)
|
|
- **Impacto:** CRÍTICO
|
|
- **Justificación impacto:** Evita duplicación de permisos. Ej: "Supervisor" hereda de "Employee" + permisos adicionales. Sin esto, mantener permisos es muy manual
|
|
- **Recomendación:** INCLUIR en MVP
|
|
- **Esfuerzo estimado:** 10 SP
|
|
- **Implementación sugerida:**
|
|
```sql
|
|
CREATE TABLE auth.role_inheritance (
|
|
parent_role_id UUID REFERENCES auth.roles(id),
|
|
child_role_id UUID REFERENCES auth.roles(id),
|
|
PRIMARY KEY (parent_role_id, child_role_id)
|
|
);
|
|
```
|
|
- **Dependencias:** MGN-001 (roles)
|
|
|
|
### Gap P1 (Altos - Deseable para MVP)
|
|
|
|
#### GAP-MGN-001-004: Two-Factor Authentication (2FA)
|
|
- **Descripción:** Autenticación de dos factores (TOTP, SMS, email)
|
|
- **Referencia Odoo:** auth_totp
|
|
- **Impacto:** ALTO
|
|
- **Justificación impacto:** Aumenta seguridad significativamente, especialmente para usuarios con permisos críticos (Director, Administrador). NO bloquea operación básica pero es importante
|
|
- **Recomendación:** CONSIDERAR para MVP o Fase 2
|
|
- **Esfuerzo estimado:** 13 SP
|
|
- **Implementación sugerida:**
|
|
- TOTP (Google Authenticator, Authy)
|
|
- Backup codes
|
|
- Recovery email
|
|
```sql
|
|
CREATE TABLE auth.user_2fa (
|
|
user_id UUID PRIMARY KEY REFERENCES auth.users(id),
|
|
method TEXT NOT NULL, -- 'totp' | 'sms' | 'email'
|
|
secret TEXT, -- TOTP secret
|
|
backup_codes TEXT[], -- Array de códigos de respaldo
|
|
enabled BOOLEAN DEFAULT FALSE
|
|
);
|
|
```
|
|
- **Dependencias:** MGN-001 (autenticación)
|
|
|
|
#### GAP-MGN-001-005: OAuth2 Social Login
|
|
- **Descripción:** Login con proveedores externos (Google, Microsoft, Facebook)
|
|
- **Referencia Odoo:** auth_oauth
|
|
- **Impacto:** ALTO
|
|
- **Justificación impacto:** Mejora UX (usuarios no necesitan recordar contraseña). Útil para derechohabientes (login con Google). NO es crítico pero mejora adopción
|
|
- **Recomendación:** CONSIDERAR para MVP o Fase 2
|
|
- **Esfuerzo estimado:** 13 SP
|
|
- **Implementación sugerida:**
|
|
- Passport.js con estrategias Google, Microsoft
|
|
- Vincular OAuth account a usuario existente
|
|
```sql
|
|
CREATE TABLE auth.oauth_providers (
|
|
user_id UUID REFERENCES auth.users(id),
|
|
provider TEXT NOT NULL, -- 'google' | 'microsoft' | 'facebook'
|
|
provider_user_id TEXT NOT NULL,
|
|
access_token TEXT,
|
|
refresh_token TEXT,
|
|
UNIQUE(provider, provider_user_id)
|
|
);
|
|
```
|
|
- **Dependencias:** MGN-001 (autenticación)
|
|
|
|
### Gap P2 (Medios/Bajos - No crítico)
|
|
|
|
#### GAP-MGN-001-006: Delegación Temporal de Permisos
|
|
- **Descripción:** Usuario A puede delegar permisos a usuario B temporalmente
|
|
- **Referencia Odoo:** No existe en Odoo (funcionalidad custom)
|
|
- **Impacto:** BAJO
|
|
- **Justificación impacto:** Caso de uso específico (Director delega durante vacaciones). No es genérico, puede implementarse con lógica custom
|
|
- **Recomendación:** POSPONER a Fase 2 o posterior
|
|
- **Esfuerzo estimado:** 8 SP
|
|
|
|
#### GAP-MGN-001-007: Password Policy Configurable
|
|
- **Descripción:** Políticas de contraseña configurables (longitud mínima, complejidad, expiración, historial)
|
|
- **Referencia Odoo:** base (password_policy)
|
|
- **Impacto:** MEDIO
|
|
- **Justificación impacto:** Útil para compliance (ISO 27001), pero política hardcodeada (8+ chars, mayúsculas, números) es suficiente para MVP
|
|
- **Recomendación:** POSPONER a Fase 2
|
|
- **Esfuerzo estimado:** 5 SP
|
|
|
|
## 4. FUNCIONALIDADES SOBRANTES (No en Odoo, pero incluidas)
|
|
|
|
1. **Multi-Tenancy Schema-Level:** No en Odoo (Odoo usa multi-company a nivel de filas). Incluimos schema-level isolation para mejor seguridad y performance
|
|
- Razón: Mejor aislamiento, queries más rápidas (sin filtros WHERE company_id)
|
|
- Patrón Gamilit: 9 schemas separados
|
|
|
|
## 5. ANÁLISIS COMPARATIVO CON CONSTRUCCIÓN
|
|
|
|
### Funcionalidades en ERP Construcción (MAI-001)
|
|
|
|
**Implementadas:**
|
|
- ✅ Autenticación JWT
|
|
- ✅ Usuarios (CRUD básico)
|
|
- ✅ Roles (CRUD)
|
|
- ✅ Permisos por modelo (básico)
|
|
- ✅ Multi-tenancy (schema-level)
|
|
- ✅ Signup (con email)
|
|
- ✅ Reset password
|
|
|
|
**Parcialmente implementadas:**
|
|
- 🟡 RLS Policies (~20 policies, Odoo tiene 159)
|
|
- 🟡 RBAC (sin herencia de roles)
|
|
|
|
**No implementadas:**
|
|
- ❌ API Keys
|
|
- ❌ Permisos field-level
|
|
- ❌ 2FA
|
|
- ❌ OAuth2
|
|
- ❌ Password policies configurables
|
|
|
|
### Gaps vs Construcción
|
|
|
|
**Funcionalidades que Construcción NO tiene pero DEBERÍA tener según Odoo:**
|
|
|
|
1. **API Keys (P0):** Crítico para integración INFONAVIT API
|
|
2. **Herencia de roles (P0):** Simplifica gestión de permisos
|
|
3. **Permisos field-level (P0):** Ocultar campos sensibles (presupuestos, costos)
|
|
4. **2FA (P1):** Seguridad para usuarios críticos
|
|
5. **159 RLS Policies completas (P0):** Construcción tiene ~20, faltan 139
|
|
|
|
## 6. RECOMENDACIONES
|
|
|
|
### Para MGN-001
|
|
|
|
- [x] **Incluir API Keys (GAP-001):** CRÍTICO para integraciones. Implementar con scopes granulares
|
|
- [x] **Incluir permisos field-level (GAP-002):** CRÍTICO para seguridad. Implementar con tabla auth.field_permissions
|
|
- [x] **Incluir herencia de roles (GAP-003):** CRÍTICO para mantenibilidad. Implementar con tabla auth.role_inheritance
|
|
- [ ] **Considerar 2FA (GAP-004):** Deseable para MVP, implementar TOTP con backup codes
|
|
- [ ] **Considerar OAuth2 (GAP-005):** Deseable para UX, implementar Google + Microsoft
|
|
|
|
### Para ERP Construcción
|
|
|
|
- [x] **Retroalimentación 1:** Agregar API Keys para integración INFONAVIT API
|
|
- [x] **Retroalimentación 2:** Completar RLS Policies (20 → 159, faltan 139)
|
|
- [x] **Retroalimentación 3:** Implementar herencia de roles para simplificar gestión
|
|
- [x] **Retroalimentación 4:** Agregar permisos field-level para campos sensibles
|
|
- [ ] **Retroalimentación 5:** Considerar 2FA para Director y Administrador
|
|
|
|
## 7. IMPACTO EN STORY POINTS
|
|
|
|
| Concepto | SP Original | SP Gaps P0 | SP Nuevo | Δ SP |
|
|
|----------|-------------|------------|----------|------|
|
|
| MGN-001 Original | 50 SP | - | 50 SP | - |
|
|
| GAP-001 (API Keys) | - | +8 SP | - | +8 SP |
|
|
| GAP-002 (Field permissions) | - | +13 SP | - | +13 SP |
|
|
| GAP-003 (Role inheritance) | - | +10 SP | - | +10 SP |
|
|
| **MGN-001 Total** | **50 SP** | **+31 SP** | **81 SP** | **+31 SP (+62%)** |
|
|
|
|
**Análisis:** Agregar gaps P0 aumenta MGN-001 en 62%. Si incluimos P1 (2FA, OAuth2), llegaría a 107 SP (+114%).
|
|
|
|
**Recomendación:**
|
|
- MVP: 81 SP (incluir P0)
|
|
- Fase 2: +26 SP (2FA + OAuth2)
|
|
|
|
## 8. REFERENCIAS
|
|
|
|
- [ALCANCE-POR-MODULO.md - MGN-001](../ALCANCE-POR-MODULO.md#mgn-001-fundamentos)
|
|
- [MAPEO-ODOO-TO-MGN.md](../../00-analisis-referencias/odoo/MAPEO-ODOO-TO-MGN.md)
|
|
- [odoo-base-analysis.md](../../00-analisis-referencias/odoo/odoo-base-analysis.md)
|
|
- [odoo-auth-analysis.md](../../00-analisis-referencias/odoo/odoo-auth-analysis.md)
|
|
- [ADR-001: Stack Tecnológico](../../adr/ADR-001-stack-tecnologico.md)
|
|
- [ADR-003: Multi-Tenancy](../../adr/ADR-003-multi-tenancy.md)
|
|
- [ADR-006: RBAC](../../adr/ADR-006-rbac.md)
|