# US-MGN-006-004-001: Crear Devolución a Proveedor

**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:** Devoluciones a Proveedores
**Prioridad:** P1
**Story Points:** 3
**Sprint:** Sprint 15
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story
**Como** usuario de compras,
**Quiero** crear devoluciones de productos a proveedores,
**Para** retornar mercancía defectuosa o incorrecta.

---

## Descripción Detallada
Una devolución (return) crea un picking de tipo outgoing (inverso a recepción). Incluye:
- Referencia a PO y recepción original
- Productos y cantidades a devolver
- Motivo de devolución
- Se puede crear crédito nota automático

---

## Criterios de Aceptación

### Escenario 1: Crear devolución desde recepción (Camino Feliz)
**Dado que** tengo recepción validada con producto A qty=10,
**Cuando** creo devolución de 3 unidades con motivo="Producto defectuoso",
**Entonces** sistema crea picking return con línea producto A qty=3, motivo guardado.

### Escenario 2: Validar cantidad a devolver
**Dado que** producto recibido fue 10 unidades, ya devolví 2,
**Cuando** intento devolver 9 unidades,
**Entonces** sistema retorna error "Cantidad excede lo recibido (disponible para devolución: 8)".

### Escenario 3: Crear nota de crédito automática
**Dado que** valido devolución,
**Cuando** marco opción "Crear nota de crédito",
**Entonces** sistema genera credit note (vendor refund) con valores de líneas devueltas.

---

## Reglas de Negocio
- **RN-1:** Solo se pueden devolver productos recibidos.
- **RN-2:** Cantidad devuelta ≤ cantidad recibida - devoluciones previas.
- **RN-3:** Devolución genera picking outgoing.
- **RN-4:** Opcionalmente genera nota de crédito.

---

## Tareas Técnicas

### Backend
- [ ] Endpoint: POST /api/v1/purchase/returns
- [ ] Service: PurchaseReturnService.create(dto)
- [ ] Service: validateReturnQuantity(poLineId, qty)
- [ ] DTO: CreateReturnDto, ReturnLineDto
- [ ] Validar cantidades
- [ ] Unit tests
- [ ] Integration tests
- [ ] Swagger docs

### Frontend
- [ ] Componente: CreateReturnForm.tsx
- [ ] Selector de recepción origen
- [ ] Tabla con cantidades disponibles para devolver
- [ ] Campo motivo requerido
- [ ] API client: purchaseReturnApi.create()
- [ ] Component tests
- [ ] E2E test

### Database
- [ ] Tabla: purchase.purchase_returns
- [ ] Tabla: purchase.purchase_return_lines
- [ ] Índices: idx_returns_po_id

---

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

---

## Definition of Done
- [ ] Código implementado según ET
- [ ] Tests pasando (>80%)
- [ ] Code review aprobado
- [ ] Validaciones correctas
- [ ] 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)
