# US-MGN-006-002-001: Crear Orden de Compra

**RF Asociado:** [RF-MGN-006-002](../../02-modelado/requerimientos-funcionales/mgn-006/RF-MGN-006-002-gestión-de-órdenes-de-compra.md)
**Módulo:** MGN-006 - Compras Básico
**Epic:** Órdenes de Compra
**Prioridad:** P0
**Story Points:** 5
**Sprint:** Sprint 13
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story
**Como** usuario de compras,
**Quiero** crear órdenes de compra (PO) a proveedores,
**Para** formalizar la adquisición de productos con precios y condiciones acordadas.

---

## Descripción Detallada
Una Purchase Order (PO) es el documento formal de compra. Incluye:
- Proveedor
- Líneas con: producto, cantidad, precio unitario, subtotal, impuestos
- Términos de pago
- Fecha esperada de entrega
- Total de la orden
- Estados: draft, sent, purchase (confirmada), done, cancelled

---

## Criterios de Aceptación

### Escenario 1: Crear PO en draft (Camino Feliz)
**Dado que** creo PO: partner_id=1, lines=[{product:1, qty:10, price:100}], payment_term_id=1,
**Cuando** guardo,
**Entonces** sistema crea PO en draft con número PO/2024/0001, amount_total=1000.

### Escenario 2: Calcular totales automáticamente
**Dado que** línea tiene qty=10, price=100, tax=19%,
**Cuando** guardo línea,
**Entonces** sistema calcula subtotal=1000, tax_amount=190, total=1190.

### Escenario 3: Crear PO desde RFQ
**Dado que** tengo RFQ con cotización aceptada,
**Cuando** creo PO desde RFQ,
**Entonces** sistema copia líneas con precios cotizados.

---

## Reglas de Negocio
- **RN-1:** PO se crean en estado draft.
- **RN-2:** Total = suma(líneas.subtotal) + impuestos.
- **RN-3:** Partner debe ser supplier.
- **RN-4:** Número secuencial único: PO/{year}/{seq}.

---

## Tareas Técnicas

### Backend
- [ ] Endpoint: POST /api/v1/purchase/orders
- [ ] Service: PurchaseOrderService.create(dto)
- [ ] Service: PurchaseOrderService.calculateTotals(lines)
- [ ] DTO: CreatePurchaseOrderDto, OrderLineDto
- [ ] Validar proveedor supplier
- [ ] Calcular totales automáticamente
- [ ] Unit tests
- [ ] Integration tests
- [ ] Swagger docs

### Frontend
- [ ] Componente: CreatePOForm.tsx
- [ ] Tabla editable de líneas con cálculo automático
- [ ] Selector de proveedor y productos
- [ ] Resumen de totales
- [ ] API client: purchaseOrderApi.create()
- [ ] Component tests
- [ ] E2E test

### Database
- [ ] Tabla: purchase.purchase_orders
- [ ] Tabla: purchase.purchase_order_lines
- [ ] Índices: idx_pos_partner_id, idx_pos_state
- [ ] RLS policy: company_isolation

---

## Estimación Detallada
| Tarea | Horas |
|-------|-------|
| Backend | 2.5 |
| Frontend | 3 |
| Testing | 2 |
| Code Review | 0.5 |
| **TOTAL** | **8 horas = 5 SP** |

---

## Definition of Done
- [ ] Código implementado según ET
- [ ] Tests pasando (>80%)
- [ ] Code review aprobado
- [ ] Cálculos correctos
- [ ] QA validado
- [ ] PO aprobado

---

## Referencias
- [RF-MGN-006-002](../../02-modelado/requerimientos-funcionales/mgn-006/RF-MGN-006-002-gestión-de-órdenes-de-compra.md)
- [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-006.yaml)
- [Schema](../../02-modelado/database-design/schemas/purchase-schema-ddl.sql)
