erp-core/docs/05-user-stories/mgn-004/US-MGN-004-007-001-registrar-pago-recibido.md

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

  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