erp-core/docs/05-user-stories/mgn-006/US-MGN-006-001-001-crear-rfq.md

3.0 KiB

US-MGN-006-001-001: Crear Solicitud de Cotización (RFQ)

RF Asociado: RF-MGN-006-001 Módulo: MGN-006 - Compras Básico Epic: Solicitudes de Cotización Prioridad: P0 Story Points: 3 Sprint: Sprint 12 Estado: Ready for Development Fecha: 2025-11-24


User Story

Como usuario de compras, Quiero crear solicitudes de cotización (RFQ) para múltiples proveedores, Para comparar precios y condiciones antes de generar órdenes de compra.


Descripción Detallada

Una RFQ (Request for Quotation) es una solicitud formal a proveedores para cotizar productos. Incluye:

  • Proveedor(es) destinatarios
  • Líneas con productos y cantidades solicitadas
  • Fecha esperada de respuesta
  • Términos y condiciones
  • Estado: draft, sent, received, cancelled

Criterios de Aceptación

Escenario 1: Crear RFQ en draft (Camino Feliz)

Dado que soy usuario con permiso purchase_user, Cuando creo RFQ: partner_id=1, lines=[{product_id:1, qty:10}, {product_id:2, qty:5}], expected_date="2024-02-01", Entonces el sistema crea RFQ en estado draft con número RFQ/2024/0001.

Escenario 2: Validar proveedor es supplier

Dado que partner_id=5 tiene is_supplier=false, Cuando intento crear RFQ, Entonces el sistema retorna error 400 "El partner seleccionado no es proveedor".

Escenario 3: Generar número secuencial

Dado que creo una RFQ, Cuando guardo, Entonces el sistema genera número único: RFQ/2024/{seq:05d}.


Reglas de Negocio

  • RN-1: RFQ se crean en estado draft.
  • RN-2: Partner debe tener is_supplier=true.
  • RN-3: Número secuencial único por empresa.
  • RN-4: RFQ draft pueden editarse y eliminarse.

Tareas Técnicas

Backend

  • Endpoint: POST /api/v1/purchase/rfqs
  • Service: RFQService.create(createRFQDto)
  • DTO: CreateRFQDto, RFQLineDto
  • Validar proveedor es supplier
  • Generar número secuencial
  • Unit tests (>80%)
  • Integration tests
  • Swagger docs

Frontend

  • Componente: CreateRFQForm.tsx
  • Selector de proveedor (solo suppliers)
  • Tabla editable de líneas
  • API client: rfqApi.create()
  • Component tests
  • E2E test

Database

  • Tabla: purchase.rfqs
  • Tabla: purchase.rfq_lines
  • Índices: idx_rfqs_partner_id, idx_rfqs_state
  • RLS policy: company_isolation

Estimación Detallada

Tarea Horas
Backend 1.5
Frontend 2
Testing 1
Code Review 0.5
TOTAL 5 horas = 3 SP

Definition of Done

  • Código implementado según ET
  • Tests pasando (>80%)
  • Code review aprobado
  • QA validado
  • PO aprobado

Referencias