erp-core/docs/06-test-plans/TEST-PLAN-MGN-003-catalogos.md

13 KiB

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:
{
  "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:
{
  "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:
{
  "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:
{
  "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


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


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