# US-MGN-006-003-001: Crear Recepción de Compra **RF Asociado:** [RF-MGN-006-004](../../02-modelado/requerimientos-funcionales/mgn-006/RF-MGN-006-004-recepciones-de-compras.md) **Módulo:** MGN-006 - Compras Básico **Epic:** Recepciones de Compras **Prioridad:** P0 **Story Points:** 5 **Sprint:** Sprint 14 **Estado:** Ready for Development **Fecha:** 2025-11-24 --- ## User Story **Como** usuario de almacén, **Quiero** registrar recepciones de productos comprados, **Para** actualizar el stock al recibir mercancía de proveedores. --- ## Descripción Detallada Una recepción (picking de tipo receipt/incoming) se genera automáticamente al confirmar una PO. El usuario de almacén: 1. Accede al picking pendiente 2. Verifica productos recibidos 3. Registra cantidades reales (pueden diferir de las ordenadas) 4. Valida la recepción para actualizar stock Estados: draft, assigned, done, cancelled --- ## Criterios de Aceptación ### Escenario 1: Crear recepción desde PO confirmada (Automático) **Dado que** PO se confirma con líneas, **Cuando** sistema ejecuta confirm(), **Entonces** genera picking de tipo receipt con state=assigned, líneas copiadas. ### Escenario 2: Registrar cantidades recibidas manualmente **Dado que** tengo picking de recepción en assigned, **Cuando** registro qty_done=8 (de qty_expected=10), **Entonces** sistema guarda qty_done para validación. ### Escenario 3: Validar cantidad parcial **Dado que** picking tiene línea con qty_expected=10, qty_done=8, **Cuando** valido, **Entonces** sistema pregunta: ¿Crear backorder para las 2 unidades faltantes? --- ## Reglas de Negocio - **RN-1:** Recepciones se generan automáticamente desde PO confirmadas. - **RN-2:** qty_done puede ser menor a qty_expected (recepción parcial). - **RN-3:** Si qty_done < qty_expected, se puede crear backorder. - **RN-4:** Validar recepción actualiza stock en ubicación de entrada. --- ## Tareas Técnicas ### Backend - [ ] Endpoint: POST /api/v1/inventory/pickings (type=receipt) - [ ] Endpoint: GET /api/v1/inventory/pickings?type=receipt - [ ] Service: PickingService.createReceipt(purchaseOrderId) - [ ] Service: PickingService.updateQuantitiesDone(pickingId, lines) - [ ] Validar PO asociada - [ ] Unit tests - [ ] Integration tests - [ ] Swagger docs ### Frontend - [ ] Componente: ReceiptsList.tsx - [ ] Componente: ReceiptForm.tsx - [ ] Tabla con qty_expected vs qty_done - [ ] API client: pickingApi - [ ] Component tests - [ ] E2E test ### Database - [ ] Tabla: inventory.pickings (picking_type_id = receipt) - [ ] Campo: inventory.picking_lines.qty_done - [ ] Índices: idx_pickings_type_po --- ## 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 - [ ] QA validado - [ ] PO aprobado --- ## Referencias - [RF-MGN-006-004](../../02-modelado/requerimientos-funcionales/mgn-006/RF-MGN-006-004-recepciones-de-compras.md) - [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-006.yaml) - [Schema](../../02-modelado/database-design/schemas/inventory-schema-ddl.sql)