erp-core/docs/06-test-plans/TEST-PLAN-MGN-002-empresas.md

501 lines
12 KiB
Markdown

# TEST PLAN - MGN-002: Empresas y Organizaciones
**Módulo:** MGN-002 - Empresas y Organizaciones
**Sprint:** Sprint 3-7 (Semanas 5-14)
**Story Points:** 34 SP
**User Stories:** 7 US
**Fecha:** 2025-11-24
**QA Owner:** TBD
**Estado:** Draft
---
## 1. RESUMEN DEL MÓDULO
### 1.1 Descripción
El módulo MGN-002 Empresas y Organizaciones gestiona la información de las empresas dentro del sistema multi-tenancy. Permite crear múltiples empresas por tenant, configurar parámetros fiscales y contables, asignar usuarios a empresas y gestionar jerarquías empresariales (holdings).
Este módulo es crítico (P0) ya que establece el contexto empresarial para todos los módulos transaccionales.
### 1.2 Funcionalidades Principales
1. **Gestión de Empresas:** CRUD de empresas, logo y branding
2. **Configuración Empresarial:** Parámetros fiscales, contables, moneda base, país
3. **Multi-Empresa:** Asignación de usuarios a múltiples empresas, company switcher
4. **Jerarquías:** Holdings y subsidiarias (parent-child relationships)
5. **Plantillas por País:** Configuración pre-cargada según país (plan contable, impuestos, etc.)
### 1.3 Dependencias
**Módulos requeridos:**
- MGN-001: Fundamentos (autenticación, usuarios, tenants)
**Datos maestros necesarios:**
- Tenant activo
- Usuarios creados
- Catálogos: países, monedas (MGN-003)
---
## 2. ALCANCE DEL TESTING
### 2.1 En Alcance
- ✅ CRUD de empresas (create, read, update, delete)
- ✅ Logo y branding por empresa
- ✅ Configuración fiscal y contable
- ✅ Asignación de usuarios a empresas (multi-company access)
- ✅ Company switcher (cambiar empresa activa)
- ✅ Jerarquías de empresas (parent-child)
- ✅ Plantillas de configuración por país
- ✅ Validación de empresa activa en contexto de usuario
- ✅ Tenant isolation (empresas solo visibles dentro de su tenant)
### 2.2 Fuera de Alcance
- ❌ Consolidación financiera entre empresas (Fase 2)
- ❌ Transferencias inter-company (Fase 2)
- ❌ Reportes consolidados de holdings (Fase 2)
### 2.3 Assumptions
- Tenant existe y está configurado
- Usuarios están creados y autenticados
- Catálogos de países y monedas están disponibles
---
## 3. ESTRATEGIA DE TESTING
### 3.1 Tipos de Tests
#### Unit Tests: 42 tests
**Backend (28 tests):**
- CompaniesService: 15 tests (CRUD, validaciones, jerarquías)
- CompaniesConfigService: 8 tests (configuración fiscal, plantillas)
- UserCompanyService: 5 tests (asignación usuarios a empresas)
**Frontend (14 tests):**
- CompanyList component: 5 tests
- CompanyForm component: 5 tests
- CompanySwitcher component: 4 tests
#### Integration Tests: 21 tests
1. **Companies API:** 12 tests
- GET /api/v1/companies
- POST /api/v1/companies
- PUT /api/v1/companies/:id
- DELETE /api/v1/companies/:id
- POST /api/v1/companies/:id/logo
2. **User-Company Assignments:** 6 tests
- POST /api/v1/users/:id/companies
- GET /api/v1/users/:id/companies
- DELETE /api/v1/users/:id/companies/:companyId
3. **Company Hierarchies:** 3 tests
- GET /api/v1/companies/:id/subsidiaries
- PUT /api/v1/companies/:id/parent
#### E2E Tests: 7 tests
1. Admin crea empresa, configura parámetros fiscales, asigna logo
2. Admin asigna usuario a empresa, usuario puede acceder a ella
3. Usuario cambia de empresa activa con company switcher
4. Admin crea holding con subsidiarias, valida jerarquía
5. Admin usa plantilla de país para crear empresa
6. Tenant isolation: empresas no visibles entre tenants
7. Usuario elimina empresa sin transacciones
---
## 4. TEST CASES
### 4.1 Casos de Prueba Funcionales
#### TC-MGN-002-001: Crear Empresa Exitosamente
**US:** US-MGN-002-001-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** E2E
**Precondiciones:**
- Usuario admin autenticado
- Tenant activo
**Pasos:**
1. Navegar a /companies
2. Click en "Nueva Empresa"
3. Ingresar datos:
- Nombre: "Acme Corp"
- Tax ID: "20-12345678-9"
- País: "Argentina"
- Moneda: "ARS"
4. Click en "Guardar"
**Resultado Esperado:**
- Empresa se crea en companies table con tenant_id correcto
- Empresa aparece en lista de empresas
- Usuario admin se asigna automáticamente a la empresa
- Notificación de éxito se muestra
**Criterios de Aceptación Validados:**
- AC-001: Admin puede crear empresas
- AC-002: Empresa se asocia a tenant correcto
---
#### TC-MGN-002-002: Configurar Parámetros Fiscales
**US:** US-MGN-002-002-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** Integration
**Precondiciones:**
- Empresa "Acme Corp" creada
**Pasos:**
1. PUT /api/v1/companies/:id/config con body:
```json
{
"fiscal_regime": "responsable_inscripto",
"tax_id_type": "CUIT",
"accounting_method": "devengo",
"fiscal_year_start": "01-01"
}
```
**Resultado Esperado:**
- Status code: 200 OK
- Configuración se guarda en company_config table
- GET /api/v1/companies/:id retorna config actualizado
**Criterios de Aceptación Validados:**
- AC-003: Admin puede configurar parámetros fiscales
---
#### TC-MGN-002-003: Asignar Usuario a Empresa
**US:** US-MGN-002-003-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** E2E
**Precondiciones:**
- Usuario "contador@tenant-a.com" existe
- Empresa "Acme Corp" existe
**Pasos:**
1. Navegar a /users/:id/companies
2. Seleccionar empresa "Acme Corp"
3. Click en "Asignar"
4. Login como "contador@tenant-a.com"
5. Verificar que ve "Acme Corp" en company switcher
**Resultado Esperado:**
- Relación se crea en user_companies table
- Usuario puede acceder a empresa
- Usuario ve empresa en company switcher
**Criterios de Aceptación Validados:**
- AC-004: Usuarios se asignan a empresas
- AC-005: Usuario solo ve empresas asignadas
---
#### TC-MGN-002-004: Company Switcher Cambia Contexto
**US:** US-MGN-002-003-002
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** E2E
**Precondiciones:**
- Usuario asignado a empresas "Acme Corp" y "Beta Inc"
- Usuario autenticado con empresa activa "Acme Corp"
**Pasos:**
1. Click en company switcher (dropdown)
2. Seleccionar "Beta Inc"
3. Navegar a /products
4. Verificar que se muestran productos de "Beta Inc"
**Resultado Esperado:**
- Context de usuario cambia a company_id de "Beta Inc"
- Todas las queries filtran por company_id nuevo
- Company switcher muestra "Beta Inc" como activa
**Criterios de Aceptación Validados:**
- AC-006: Usuario puede cambiar empresa activa
- AC-007: Datos filtran por empresa activa
---
#### TC-MGN-002-005: Jerarquía de Holding y Subsidiarias
**US:** US-MGN-002-004-001
**Prioridad:** P1
**Tipo:** Functional
**Nivel:** Integration
**Precondiciones:**
- Empresa "Acme Holding" existe (parent)
- Empresas "Acme Argentina" y "Acme Chile" existen (subsidiaries)
**Pasos:**
1. PUT /api/v1/companies/acme-argentina con body: { "parent_id": "acme-holding" }
2. PUT /api/v1/companies/acme-chile con body: { "parent_id": "acme-holding" }
3. GET /api/v1/companies/acme-holding/subsidiaries
**Resultado Esperado:**
- Relaciones parent-child se crean
- GET subsidiaries retorna array con "Acme Argentina" y "Acme Chile"
- Validación: no permite ciclos (empresa no puede ser su propio parent)
**Criterios de Aceptación Validados:**
- AC-008: Admin puede crear jerarquías de empresas
- AC-009: Subsidiarias listan su parent
---
#### TC-MGN-002-006: Plantilla de País Aplica Configuración
**US:** US-MGN-002-005-001
**Prioridad:** P1
**Tipo:** Functional
**Nivel:** Integration
**Precondiciones:**
- Plantilla "Argentina" existe con plan contable y impuestos
**Pasos:**
1. POST /api/v1/companies con body:
```json
{
"name": "Nueva Empresa",
"country_code": "AR",
"apply_template": true
}
```
**Resultado Esperado:**
- Empresa se crea
- Plan contable se copia desde plantilla
- Impuestos se configuran según template
- Configuración fiscal se pre-carga
**Criterios de Aceptación Validados:**
- AC-010: Plantilla por país aplica configuración automática
---
#### TC-MGN-002-007: Tenant Isolation de Empresas
**US:** US-MGN-002-001-001
**Prioridad:** P0
**Tipo:** Security
**Nivel:** Integration
**Precondiciones:**
- Tenant A tiene empresa "Acme Corp"
- Tenant B tiene empresa "Beta Inc"
**Pasos:**
1. Login como usuario de Tenant A
2. GET /api/v1/companies
3. Verificar que solo retorna empresas de Tenant A
4. Intentar GET /api/v1/companies/:id con company_id de Tenant B
**Resultado Esperado:**
- GET /companies retorna solo empresas de Tenant A
- Intentar acceder empresa de Tenant B resulta en 403 Forbidden
- RLS policies previenen acceso cross-tenant
**Criterios de Aceptación Validados:**
- AC-011: Empresas están aisladas por tenant
---
### 4.2 Casos de Prueba No Funcionales
#### TC-MGN-002-PERF-001: Performance de GET /companies
**Tipo:** Performance
**Herramienta:** k6
**Escenario:**
- 50 usuarios concurrentes
- 500 requests/min
- Duración: 3 minutos
- Tenant con 100 empresas
**Criterios de Éxito:**
- p50: <80ms
- p95: <200ms
- p99: <400ms
- Error rate: <1%
---
## 5. DATOS DE PRUEBA
### 5.1 Test Data Requirements
**Empresas (5 por tenant):**
```json
{
"acme-corp": {
"name": "Acme Corp",
"tax_id": "20-12345678-9",
"country": "AR",
"currency": "ARS",
"status": "active"
},
"beta-inc": {
"name": "Beta Inc",
"tax_id": "20-98765432-1",
"country": "AR",
"currency": "ARS",
"status": "active"
}
}
```
**Jerarquías:**
- Acme Holding (parent)
- Acme Argentina (subsidiary)
- Acme Chile (subsidiary)
**User-Company Assignments:**
- admin@tenant-a.com: todas las empresas
- contador@tenant-a.com: Acme Corp, Beta Inc
- vendedor@tenant-a.com: Acme Corp
---
## 6. AMBIENTE DE TESTING
### 6.1 Configuración
**Base de datos:** PostgreSQL 16
- Tables: companies, company_config, user_companies
**Backend:** NestJS
- Port: 3000
- Companies module
**Frontend:** React
- Port: 5173
- Companies feature
### 6.2 URLs
- **API:** http://localhost:3000/api/v1/companies
- **Frontend:** http://localhost:5173/companies
---
## 7. SCHEDULE
### 7.1 Timeline
| Sprint | RF | Actividad | Duración |
|--------|-----|-----------|----------|
| Sprint 3 | RF-001, RF-003 | CRUD empresas, asignación usuarios | 2 sem |
| Sprint 4 | RF-002 | Configuración empresarial | 2 sem |
| Sprint 6 | RF-004 | Jerarquías de empresas | 2 sem |
| Sprint 7 | RF-005 | Plantillas por país | 2 sem |
---
## 8. ENTRY/EXIT CRITERIA
### Entry Criteria
- [ ] MGN-001 (Fundamentos) completado
- [ ] Tenants y usuarios creados
- [ ] Test data preparado
- [ ] Ambiente QA disponible
### Exit Criteria
- [ ] 70 tests ejecutados (100%)
- [ ] Unit coverage >80%
- [ ] Integration tests pasando (100%)
- [ ] E2E tests pasando (100%)
- [ ] Bugs P0/P1 resueltos
- [ ] Tenant isolation verificado
---
## 9. DEFECT MANAGEMENT
### 9.1 Severidad de Bugs
**P0 - Blocker:**
- Empresas no se crean
- Tenant isolation roto
- **SLA:** 24 horas
**P1 - Critical:**
- Company switcher no cambia contexto
- Configuración fiscal no se guarda
- **SLA:** 3 días
**P2 - Major:**
- Logo no se sube correctamente
- Jerarquías no se visualizan bien
- **SLA:** 1 sprint
---
## 10. RIESGOS ESPECÍFICOS DEL MÓDULO
| Riesgo | Probabilidad | Impacto | Mitigación |
|--------|--------------|---------|------------|
| **Company context no se aplica** | Media | Alto | Tests de context switching. Validación en cada endpoint. |
| **Jerarquías cíclicas** | Baja | Medio | Validación de parent_id. No permitir empresa ser su propio ancestro. |
| **Plantillas incompatibles** | Media | Medio | Testing de plantillas por país. Versionado de templates. |
---
## 11. MÉTRICAS
### 11.1 Test Execution Metrics
**Total test cases:** 70
- Unit: 42
- Integration: 21
- E2E: 7
**Executed:** 0/70 (0%)
**Pass rate:** 0% (objetivo: >95%)
### 11.2 Coverage Metrics
**Unit test coverage:** 0% (objetivo: >80%)
**API coverage:** 0/15 endpoints (objetivo: 100%)
---
## 12. SIGN-OFF
**QA Engineer:** _______________ Date: _______
**Tech Lead:** _______________ Date: _______
**Product Owner:** _______________ Date: _______
---
## 13. REFERENCIAS
- [User Stories MGN-002](../../03-user-stories/mgn-002/)
- [RF MGN-002](../../02-modelado/requerimientos-funcionales/mgn-002/)
- [ET Backend MGN-002](../../02-modelado/especificaciones-tecnicas/backend/mgn-002/)
- [ET Frontend MGN-002](../../02-modelado/especificaciones-tecnicas/frontend/mgn-002/)
- [Traceability MGN-002](../../02-modelado/trazabilidad/TRACEABILITY-MGN-002.yaml)
- [Master Test Plan](./MASTER-TEST-PLAN.md)
---
**Versión:** 1.0
**Última actualización:** 2025-11-24
**Estado:** Draft