# Cambios implementados y pruebas manuales (2026-04-08)

## 1) Correcciones de cálculo y consistencia en cobranza

### Cambios
- `app/Services/CobranzaWizardService.php`
  - Liquidación total: el descuento se topa al adeudo remanente después de saldo a favor.
  - Liquidación total: la aplicación se distribuye por fuente (`saldo_favor`, `descuento`, `pago`) por orden.
  - Abono a capital (`reducir_mensualidad` y `reducir_plazo`): recálculo completo de `monto_programado`, `pago_a_capital`, `interes`, `saldo_pendiente` con política de cuotas cerradas.
- `app/Http/Controllers/PagoController.php`, `app/Actions/Pago/UpdatePagoAction.php`
  - `updatePago`: validación explícita y bloqueo de sobrepago en pagos legacy directos por orden.
- `app/Queries/PagosIndexQuery.php`
  - Filtro `mes` corregido para aplicar rango mensual con año (`startOfMonth..endOfMonth`).
- `app/Services/RecargoAutomaticoService.php`
  - `metadata.base_amount` ahora guarda base real de cálculo.

### Pruebas manuales
1. Liquidación total con saldo a favor y descuento:
   - Preparación: venta con varias órdenes pendientes, saldo a favor disponible y descuento capturado alto.
   - Acción: registrar `Liquidación total` en Caja (`/pagos/create`).
   - Esperado:
     - el descuento aplicado no excede el remanente tras saldo a favor;
     - en detalle técnico (BD) existen aplicaciones separadas por fuente (`saldo_favor`, `descuento`, `pago`);
     - la orden no queda sobreaplicada.
2. Edición de pago con sobrepago:
   - Preparación: orden con adeudo parcial y un pago legacy ligado directo a la orden.
   - Acción: editar el pago desde detalle de venta y aumentar monto por arriba del adeudo real restante.
   - Esperado: rechazo con error y sin cambios en monto del pago.
3. Abono a capital (reducir mensualidad):
   - Preparación: crédito con mensualidades pendientes.
   - Acción: aplicar `abono_capital` con política `reducir_mensualidad`.
   - Esperado: en órdenes recalculadas cambian de forma consistente `monto_programado`, `pago_a_capital`, `interes`, `saldo_pendiente`.
4. Abono a capital (reducir plazo):
   - Preparación: crédito con varias mensualidades futuras.
   - Acción: aplicar `abono_capital` con política `reducir_plazo`.
   - Esperado: se cancelan solo filas finales elegibles y las restantes quedan recalculadas en campos financieros completos.
5. Filtro mensual de pagos:
   - Preparación: pagos en el mismo mes pero de años distintos.
   - Acción: ir a `/pagos?fecha_filtro=mes`.
   - Esperado: solo aparecen pagos del mes y año actual.
6. Metadata de recargo:
   - Preparación: ejecutar recargo automático sobre una mensualidad con adeudo parcial.
   - Acción: revisar `ordenes_pagos.metadata` del recargo generado.
   - Esperado: `base_amount` coincide con la base real usada para el cálculo.

## 2) Consistencia de métodos de pago y eliminación de hardcodes

### Cambios
- Nuevo catálogo central: `app/Support/MetodoPagoCatalog.php`.
- Actions migrados a catálogo único:
  - `app/Actions/Pago/StoreWizardPagoAction.php`
  - `app/Actions/Pago/StorePagoLegacyAction.php`
  - `app/Actions/Pago/UpdatePagoAction.php`
  - `app/Actions/Venta/StoreVentaWizardAction.php`
  - `app/Actions/Venta/StoreVentaLegacyAction.php`
- `app/Actions/Pago/StorePagoCapitalAction.php`
  - normaliza método de pago y valida datos mínimos de captura (monto > 0, fecha obligatoria).
- `app/Actions/Apartado/ConvertirApartadoAVentaAction.php`
  - el pago inicial de conversión (`Anticipo/Enganche`) usa el método real del `ApartadoCobro` (más reciente) y solo usa fallback `Efectivo` si no hay historial.
- Vistas homologadas al catálogo único:
  - `resources/views/pagos/create.blade.php`
  - `resources/views/pagos/createPagoCapital.blade.php`
  - `resources/views/pagos/index.blade.php`
  - `resources/views/ventas/detalle.blade.php`
  - `resources/views/ventas/create.blade.php`

### Pruebas manuales
1. Catálogo único en UI:
   - Acción: abrir `Pagos > Registrar pago`, `Ventas > Detalle > Editar pago`, y modal de cobro hoy en `Ventas > Crear`.
   - Esperado: en todos los selects aparecen exactamente `Efectivo`, `Transferencia`, `Deposito`, `Otro`.
2. Filtro por método en índice de pagos:
   - Acción: abrir `/pagos` y revisar filtro “Método pago”.
   - Esperado: incluye opción `Otro` además de las demás opciones canónicas.
3. Conversión de apartado heredando método:
   - Preparación: apartado cobrado con método `Transferencia`.
   - Acción: convertir apartado a venta con destino `anticipo`.
   - Esperado: el `Pago` inicial de la venta queda con `metodo_pago = Transferencia`.
4. Fallback de conversión en datos legacy:
   - Preparación: apartado marcado como cobrado sin registros de `apartado_cobros`.
   - Acción: convertir a venta con destino `anticipo`.
   - Esperado: el `Pago` inicial usa `Efectivo` como fallback.

## Evidencia de validación automatizada
- Suite completa ejecutada: `php artisan test`.
- Resultado: `120 passed (608 assertions)`.
