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