# 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)
