# 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