# US-MGN-004-007-001: Registrar Pago Recibido de Cliente

**RF Asociado:** [RF-MGN-004-007](../../02-modelado/requerimientos-funcionales/mgn-004/RF-MGN-004-007-gestión-de-pagos-y-conciliación.md)
**Módulo:** MGN-004 - Financiero Básico
**Epic:** Pagos y Conciliación
**Prioridad:** P0 (MVP)
**Story Points:** 5
**Sprint:** Sprint 12
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story

**Como** usuario de tesorería,
**Quiero** registrar pagos recibidos de clientes,
**Para** contabilizar los ingresos y conciliar con facturas pendientes.

---

## Descripción Detallada

Pagos recibidos (payment_type='inbound') registran dinero recibido de clientes. Al registrar pago:
- Se crea registro en financial.payments
- Se genera asiento contable: Débito Banco/Caja, Crédito Cuentas por Cobrar
- Se puede conciliar con una o múltiples facturas de cliente
- Si pago cubre factura completa, factura pasa a state='paid'

---

## Criterios de Aceptación

### Escenario 1: Registrar pago recibido exitosamente
**Dado que** soy usuario tesorería,
**Cuando** registro pago amount=1210, payment_date="2024-01-20", payment_method="bank_transfer", journal_id=BAN (banco),
**Entonces** payment created, payment_type='inbound', asiento contable generado y posteado.

### Escenario 2: Generar asiento contable de pago
**Dado que** registro pago recibido 1210,
**Cuando** se genera asiento,
**Entonces** líneas:
  - Débito: Banco (journal.default_account) 1210
  - Crédito: Cuentas por Cobrar (partner.receivable_account) 1210

### Escenario 3: Conciliar pago con factura
**Dado que** registro pago 1210 y tengo factura cliente pendiente por 1210,
**Cuando** concilio pago con factura,
**Entonces** factura.state='paid', reconciliation creada.

### Escenario 4: Pago parcial
**Dado que** factura por 1500 y pago 1000,
**Cuando** concilio,
**Entonces** factura.state='partial', amount_residual=500.

### Escenario 5: Pago múltiples facturas
**Dado que** pago 3000 y facturas F1=1210, F2=1790,
**Cuando** concilio con ambas,
**Entonces** ambas paid, reconciliations creadas.

---

## Reglas de Negocio

- **RN-1:** payment_type='inbound' para pagos recibidos.
- **RN-2:** Partner debe ser customer.
- **RN-3:** payment_method: cash, bank_transfer, credit_card, check.
- **RN-4:** Journal debe ser tipo bank o cash.
- **RN-5:** Asiento contable se postea automáticamente.
- **RN-6:** Factura paid si amount_residual=0.
- **RN-7:** Un pago puede conciliar múltiples facturas.
- **RN-8:** RLS filtra por company_id.

---

## Tareas Técnicas

### Backend
- [ ] POST /api/v1/financial/payments
- [ ] POST /api/v1/financial/payments/:id/reconcile
- [ ] DTO: CreatePaymentDto (amount, payment_date, payment_method, journal_id, partner_id, payment_type)
- [ ] DTO: ReconcilePaymentDto (invoice_ids, amounts)
- [ ] Service: PaymentService.create()
- [ ] Service: PaymentService.generateJournalEntry()
- [ ] Service: PaymentService.reconcile()
- [ ] Actualizar invoice.state según amount_residual
- [ ] Crear payment_invoice_reconciliations
- [ ] Unit tests (12 test cases)
- [ ] Integration tests (10 test cases)

### Frontend
- [ ] CreatePaymentPage.tsx (inbound)
- [ ] CreatePaymentForm.tsx
- [ ] ReconcilePaymentModal.tsx (seleccionar facturas)
- [ ] Campo: payment_method (select: cash, bank, card, check)
- [ ] API client: paymentApi.create(), paymentApi.reconcile()
- [ ] E2E test: "register inbound payment and reconcile"

### Database
- [ ] Tabla: financial.payments (payment_type enum: 'inbound', 'outbound')
- [ ] Tabla: financial.payment_invoice_reconciliations (payment_id, invoice_id, amount)
- [ ] Campo: invoices.amount_residual (total - sum(reconciliations))
- [ ] Índices: idx_payments_partner_id, idx_payments_date, idx_payments_type

---

## Mockups / Wireframes

**Formulario Registrar Pago Recibido:**
```
┌────────────────────────────────────┐
│ Cliente: [Select Customer] ▼      │
│ Monto: [1210____]                  │
│ Fecha: [2024-01-20] (date)         │
│ Método: [Transferencia] ▼          │
│ Cuenta Bancaria: [Banco Santander]│
│ Referencia: [TRF-12345] (opcional)│
│ [Guardar] [Guardar y Conciliar]   │
└────────────────────────────────────┘
```

**Modal Conciliar Pago:**
```
┌────────────────────────────────────┐
│ Conciliar Pago: $1210              │
├────────────────────────────────────┤
│ Facturas Pendientes:               │
│ ☑ INV/2024/001 | $1210 | Venc: ... │
│ ☐ INV/2024/015 | $500  | Venc: ... │
│                                    │
│ Total a Conciliar: $1210           │
│ Remanente: $0                      │
│ [Cancelar] [Confirmar]             │
└────────────────────────────────────┘
```

---

## Casos de Prueba

1. **TC-001:** Registrar pago inbound exitosamente
2. **TC-002:** Generar asiento con débito banco, crédito receivables
3. **TC-003:** Conciliar pago completo → factura paid
4. **TC-004:** Conciliar pago parcial → factura partial
5. **TC-005:** Conciliar con múltiples facturas
6. **TC-006:** Actualizar amount_residual correctamente
7. **TC-007:** Error por partner no customer
8. **TC-008:** Error por journal no bank/cash

---

## Dependencias

- **US bloqueantes:**
  - US-MGN-004-005-002 (Validar Factura Cliente)
  - US-MGN-004-002-001 (CRUD Journals)
- **Módulos:** MGN-003, MGN-004

---

## Estimación: 9 horas = 5 SP

---

## Definition of Done

- [ ] Código implementado
- [ ] Tests pasando (>80%)
- [ ] Asiento contable correcto
- [ ] Conciliación funciona
- [ ] Factura state actualizado
- [ ] Code review aprobado
- [ ] Merge a develop

---

## Referencias

- [RF-MGN-004-007](../../02-modelado/requerimientos-funcionales/mgn-004/RF-MGN-004-007-gestión-de-pagos-y-conciliación.md)
- [TRACEABILITY-MGN-004.yaml](../../02-modelado/trazabilidad/TRACEABILITY-MGN-004.yaml)
