# 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
