501 lines
12 KiB
Markdown
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
|