# TEST PLAN - MGN-003: Catálogos Maestros

**Módulo:** MGN-003 - Catálogos Maestros
**Sprint:** Sprint 5-6 (Semanas 9-12)
**Story Points:** 29 SP
**User Stories:** 8 US
**Fecha:** 2025-11-24
**QA Owner:** TBD
**Estado:** Draft

---

## 1. RESUMEN DEL MÓDULO

### 1.1 Descripción

El módulo MGN-003 Catálogos Maestros gestiona los datos maestros fundamentales del ERP: partners (clientes/proveedores/contactos), países, monedas, tasas de cambio, unidades de medida, categorías de productos y condiciones de pago.

Estos catálogos son la base de datos de referencia para todos los módulos transaccionales (ventas, compras, inventario, financiero).

### 1.2 Funcionalidades Principales

1. **Gestión de Partners:** CRUD de clientes, proveedores, contactos con múltiples direcciones
2. **Países y Regiones:** Gestión de países, estados, ciudades
3. **Monedas:** Gestión de monedas y tasas de cambio
4. **Unidades de Medida:** UoM con conversiones (kg, g, unidades, cajas, etc.)
5. **Categorías de Productos:** Árbol de categorías jerárquico
6. **Condiciones de Pago:** Payment terms con plazos y descuentos

### 1.3 Dependencias

**Módulos requeridos:**
- MGN-001: Fundamentos
- MGN-002: Empresas

**Datos maestros necesarios:**
- Empresas creadas
- Usuarios autenticados

---

## 2. ALCANCE DEL TESTING

### 2.1 En Alcance

- ✅ CRUD de partners (clientes, proveedores, contactos)
- ✅ Múltiples direcciones por partner
- ✅ Gestión de países, estados, ciudades
- ✅ Gestión de monedas
- ✅ Tasas de cambio con historización
- ✅ Conversión de monedas
- ✅ Gestión de UoM con factores de conversión
- ✅ Categorías de productos (árbol jerárquico)
- ✅ Condiciones de pago con plazos
- ✅ Validación de datos (email, tax ID, etc.)
- ✅ Tenant isolation de catálogos

### 2.2 Fuera de Alcance

- ❌ Importación masiva de partners (Fase 2)
- ❌ Integración con APIs de tasas de cambio externas (Fase 2)
- ❌ Geocoding de direcciones (Fase 2)

### 2.3 Assumptions

- Datos base de países pre-cargados (seed)
- Monedas principales pre-cargadas (USD, EUR, ARS, etc.)

---

## 3. ESTRATEGIA DE TESTING

### 3.1 Tipos de Tests

#### Unit Tests: 48 tests

**Backend (32 tests):**
- PartnersService: 12 tests (CRUD, validaciones, direcciones)
- CurrenciesService: 8 tests (CRUD, conversiones, tasas)
- UoMService: 6 tests (CRUD, conversiones)
- CategoriesService: 6 tests (árbol jerárquico)

**Frontend (16 tests):**
- PartnerList component: 5 tests
- PartnerForm component: 5 tests
- CurrencyConverter component: 3 tests
- CategoryTree component: 3 tests

#### Integration Tests: 24 tests

1. **Partners API:** 10 tests
   - GET /api/v1/partners
   - POST /api/v1/partners
   - PUT /api/v1/partners/:id
   - DELETE /api/v1/partners/:id
   - POST /api/v1/partners/:id/addresses

2. **Currencies API:** 6 tests
   - GET /api/v1/currencies
   - GET /api/v1/currencies/convert

3. **UoM API:** 4 tests
   - GET /api/v1/uom
   - POST /api/v1/uom/convert

4. **Categories API:** 4 tests
   - GET /api/v1/categories/tree
   - POST /api/v1/categories

#### E2E Tests: 8 tests

1. Crear partner cliente con múltiples direcciones
2. Crear partner proveedor, convertir a cliente-proveedor
3. Configurar tasa de cambio, convertir montos
4. Crear árbol de categorías (Electrónica > Laptops > Gaming)
5. Crear UoM, configurar conversiones (1 caja = 12 unidades)
6. Buscar partner por nombre, email, tax ID
7. Tenant isolation: partners no visibles entre tenants
8. Validación de email y tax ID

---

## 4. TEST CASES

### 4.1 Casos de Prueba Funcionales

#### TC-MGN-003-001: Crear Partner Cliente con Direcciones
**US:** US-MGN-003-001-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** E2E

**Precondiciones:**
- Usuario autenticado
- Empresa activa

**Pasos:**
1. Navegar a /partners
2. Click en "Nuevo Partner"
3. Ingresar datos:
   - Nombre: "Cliente ABC"
   - Email: "contacto@abc.com"
   - Tax ID: "20-12345678-9"
   - Tipo: "Cliente"
4. Agregar dirección facturación:
   - Calle: "Av. Siempre Viva 123"
   - Ciudad: "Buenos Aires"
   - País: "Argentina"
5. Agregar dirección entrega (diferente)
6. Click en "Guardar"

**Resultado Esperado:**
- Partner se crea en partners table
- 2 direcciones se crean en partner_addresses
- Partner aparece en lista con tipo "Cliente"
- Email y tax ID son únicos en tenant

**Criterios de Aceptación Validados:**
- AC-001: Admin puede crear partners
- AC-002: Partner puede tener múltiples direcciones
- AC-003: Email y tax ID son únicos por tenant

---

#### TC-MGN-003-002: Conversión de Moneda con Tasa Actual
**US:** US-MGN-003-003-002
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** Integration

**Precondiciones:**
- Moneda USD existe
- Moneda ARS existe
- Tasa USD->ARS = 1000 (fecha actual)

**Pasos:**
1. POST /api/v1/currencies/convert con body:
```json
{
  "amount": 100,
  "from": "USD",
  "to": "ARS",
  "date": "2025-11-24"
}
```

**Resultado Esperado:**
- Status code: 200 OK
- Response: { "converted_amount": 100000, "rate": 1000 }
- Usa tasa más reciente <= fecha especificada

**Criterios de Aceptación Validados:**
- AC-004: Sistema convierte entre monedas usando tasa actual
- AC-005: Tasas son historizadas por fecha

---

#### TC-MGN-003-003: Conversión de UoM (Unidades de Medida)
**US:** US-MGN-003-004-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** Integration

**Precondiciones:**
- UoM "Unidad" existe
- UoM "Caja" existe con factor 12 (1 caja = 12 unidades)

**Pasos:**
1. POST /api/v1/uom/convert con body:
```json
{
  "quantity": 5,
  "from_uom": "Caja",
  "to_uom": "Unidad"
}
```

**Resultado Esperado:**
- Status code: 200 OK
- Response: { "converted_quantity": 60 }
- Cálculo: 5 cajas * 12 unidades/caja = 60 unidades

**Criterios de Aceptación Validados:**
- AC-006: Sistema convierte entre UoM usando factores
- AC-007: Conversiones son bidireccionales

---

#### TC-MGN-003-004: Árbol de Categorías Jerárquico
**US:** US-MGN-003-005-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** E2E

**Precondiciones:**
- Usuario autenticado

**Pasos:**
1. Navegar a /categories
2. Crear categoría raíz: "Electrónica"
3. Crear subcategoría: "Electrónica > Laptops"
4. Crear subcategoría: "Electrónica > Laptops > Gaming"
5. GET /api/v1/categories/tree

**Resultado Esperado:**
- Estructura de árbol se crea correctamente
- GET tree retorna JSON jerárquico:
```json
{
  "id": 1,
  "name": "Electrónica",
  "children": [{
    "id": 2,
    "name": "Laptops",
    "children": [{
      "id": 3,
      "name": "Gaming",
      "children": []
    }]
  }]
}
```

**Criterios de Aceptación Validados:**
- AC-008: Categorías soportan jerarquía ilimitada
- AC-009: GET tree retorna estructura completa

---

#### TC-MGN-003-005: Condiciones de Pago con Plazos
**US:** US-MGN-003-006-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** Integration

**Precondiciones:**
- Usuario autenticado

**Pasos:**
1. POST /api/v1/payment-terms con body:
```json
{
  "name": "30/60/90",
  "terms": [
    { "days": 30, "percentage": 33.33 },
    { "days": 60, "percentage": 33.33 },
    { "days": 90, "percentage": 33.34 }
  ]
}
```

**Resultado Esperado:**
- Payment term se crea
- Suma de percentages = 100%
- Validación: percentages deben sumar 100%

**Criterios de Aceptación Validados:**
- AC-010: Payment terms soportan múltiples plazos
- AC-011: Percentages deben sumar 100%

---

#### TC-MGN-003-006: Búsqueda de Partner por Múltiples Criterios
**US:** US-MGN-003-001-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** Integration

**Precondiciones:**
- 100 partners creados

**Pasos:**
1. GET /api/v1/partners?search=ABC
2. GET /api/v1/partners?email=contacto@abc.com
3. GET /api/v1/partners?tax_id=20-12345678-9
4. GET /api/v1/partners?type=customer

**Resultado Esperado:**
- Search busca en name, email, tax_id
- Filtros se pueden combinar
- Response incluye paginación
- Performance <200ms con 10,000 partners

**Criterios de Aceptación Validados:**
- AC-012: Búsqueda funciona por nombre, email, tax ID
- AC-013: Filtros por tipo (customer, supplier, both)

---

#### TC-MGN-003-007: Tenant Isolation de Partners
**US:** US-MGN-003-001-001
**Prioridad:** P0
**Tipo:** Security
**Nivel:** Integration

**Precondiciones:**
- Tenant A tiene partner "Cliente A"
- Tenant B tiene partner "Cliente B"

**Pasos:**
1. Login como usuario de Tenant A
2. GET /api/v1/partners
3. Verificar que solo retorna partners de Tenant A
4. Intentar GET /api/v1/partners/:id con partner de Tenant B

**Resultado Esperado:**
- GET partners retorna solo partners de Tenant A
- Intentar acceder partner de Tenant B resulta en 403
- RLS policies previenen acceso cross-tenant

**Criterios de Aceptación Validados:**
- AC-014: Partners están aislados por tenant

---

#### TC-MGN-003-008: Validación de Email y Tax ID Únicos
**US:** US-MGN-003-001-001
**Prioridad:** P0
**Tipo:** Functional
**Nivel:** Integration

**Precondiciones:**
- Partner "Cliente A" existe con email "cliente@a.com" y tax_id "20-11111111-1"

**Pasos:**
1. POST /api/v1/partners con email duplicado
2. POST /api/v1/partners con tax_id duplicado

**Resultado Esperado:**
- Status code: 409 Conflict
- Error: "Email ya está en uso en este tenant"
- Error: "Tax ID ya está en uso en este tenant"
- Validación es por tenant (mismo email puede existir en otro tenant)

**Criterios de Aceptación Validados:**
- AC-015: Email y tax ID son únicos por tenant
- AC-016: Errores de validación son claros

---

### 4.2 Casos de Prueba No Funcionales

#### TC-MGN-003-PERF-001: Performance de Búsqueda de Partners
**Tipo:** Performance
**Herramienta:** k6

**Escenario:**
- 10,000 partners en BD
- 50 usuarios concurrentes
- 500 búsquedas/min
- Duración: 3 minutos

**Criterios de Éxito:**
- p50: <100ms
- p95: <200ms
- p99: <400ms
- Índices optimizados (name, email, tax_id)

---

## 5. DATOS DE PRUEBA

### 5.1 Test Data Requirements

**Partners (50):**
- 25 clientes
- 20 proveedores
- 5 cliente-proveedor

**Países (pre-cargados):**
- Argentina con estados y ciudades principales
- Chile, Brasil, Uruguay

**Monedas (pre-cargadas):**
- USD, EUR, ARS, CLP, BRL

**Tasas de Cambio:**
- USD/ARS: 1000 (2025-11-24)
- EUR/ARS: 1100 (2025-11-24)

**UoM:**
- Unidad, Caja, Pallet
- kg, g, ton
- m, cm, mm

**Categorías:**
- Electrónica > Laptops, Smartphones
- Muebles > Oficina, Hogar

---

## 6. AMBIENTE DE TESTING

### 6.1 Configuración

**Base de datos:** PostgreSQL 16
- Tables: partners, partner_addresses, currencies, currency_rates, uom, product_categories, payment_terms

**Backend:** NestJS
- Port: 3000

**Frontend:** React
- Port: 5173

### 6.2 URLs

- **API:** http://localhost:3000/api/v1/partners
- **Frontend:** http://localhost:5173/partners

---

## 7. SCHEDULE

### 7.1 Timeline

| Sprint | RF | Actividad | Duración |
|--------|-----|-----------|----------|
| Sprint 5 | RF-001, RF-002 | Partners, Países | 2 sem |
| Sprint 4 | RF-003 | Monedas, Tasas de Cambio | 2 sem |
| Sprint 6 | RF-004, RF-005, RF-006 | UoM, Categorías, Payment Terms | 2 sem |

---

## 8. ENTRY/EXIT CRITERIA

### Entry Criteria

- [ ] MGN-001 y MGN-002 completados
- [ ] Empresas creadas
- [ ] Test data preparado
- [ ] Ambiente QA disponible

### Exit Criteria

- [ ] 80 tests ejecutados (100%)
- [ ] Unit coverage >80%
- [ ] Integration tests pasando (100%)
- [ ] E2E tests pasando (100%)
- [ ] Bugs P0/P1 resueltos
- [ ] Performance <200ms para búsquedas

---

## 9. DEFECT MANAGEMENT

### 9.1 Severidad de Bugs

**P0 - Blocker:**
- Partners no se crean
- Conversión de monedas incorrecta
- **SLA:** 24 horas

**P1 - Critical:**
- Búsqueda de partners no funciona
- UoM conversions incorrectas
- **SLA:** 3 días

---

## 10. RIESGOS ESPECÍFICOS DEL MÓDULO

| Riesgo | Probabilidad | Impacto | Mitigación |
|--------|--------------|---------|------------|
| **Conversión de monedas incorrecta** | Media | Alto | Unit tests exhaustivos. Validación con casos reales. |
| **Performance con 100k partners** | Alta | Medio | Índices optimizados. Paginación. Búsqueda full-text. |
| **Árbol de categorías corrupto** | Baja | Medio | Validación de parent_id. No permitir ciclos. |

---

## 11. MÉTRICAS

### 11.1 Test Execution Metrics

**Total test cases:** 80
- Unit: 48
- Integration: 24
- E2E: 8

**Executed:** 0/80 (0%)
**Pass rate:** 0% (objetivo: >95%)

### 11.2 Coverage Metrics

**Unit test coverage:** 0% (objetivo: >80%)
**API coverage:** 0/20 endpoints (objetivo: 100%)

---

## 12. SIGN-OFF

**QA Engineer:** _______________  Date: _______
**Tech Lead:** _______________  Date: _______
**Product Owner:** _______________  Date: _______

---

## 13. REFERENCIAS

- [User Stories MGN-003](../../03-user-stories/mgn-003/)
- [RF MGN-003](../../02-modelado/requerimientos-funcionales/mgn-003/)
- [Traceability MGN-003](../../02-modelado/trazabilidad/TRACEABILITY-MGN-003.yaml)
- [Master Test Plan](./MASTER-TEST-PLAN.md)

---

**Versión:** 1.0
**Última actualización:** 2025-11-24
**Estado:** Draft
