6.1 KiB
US-MGN-004-007-001: Registrar Pago Recibido de Cliente
RF Asociado: RF-MGN-004-007 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
- TC-001: Registrar pago inbound exitosamente
- TC-002: Generar asiento con débito banco, crédito receivables
- TC-003: Conciliar pago completo → factura paid
- TC-004: Conciliar pago parcial → factura partial
- TC-005: Conciliar con múltiples facturas
- TC-006: Actualizar amount_residual correctamente
- TC-007: Error por partner no customer
- 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