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