# US-MGN-006-001-001: Crear Solicitud de Cotización (RFQ) **RF Asociado:** [RF-MGN-006-001](../../02-modelado/requerimientos-funcionales/mgn-006/RF-MGN-006-001-solicitudes-de-cotización-rfq.md) **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 - [RF-MGN-006-001](../../02-modelado/requerimientos-funcionales/mgn-006/RF-MGN-006-001-solicitudes-de-cotización-rfq.md) - [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-006.yaml) - [Schema](../../02-modelado/database-design/schemas/purchase-schema-ddl.sql)