Hola @ignacio96 y @angel_96,
@angel_96 ha dado en el clavo. El problema principal es que el método validateOrder del PaymentModule está diseñado para cerrar el ciclo de pago inmediatamente después de la validación del carrito. Para un pago aplazado, la lógica es completamente diferente: el pedido se crea, pero el pago real ocurre mucho después.
Para gestionar un pago aplazado de forma adecuada, necesitarás:
- Un estado de pedido personalizado: Como ya has intuido con
PS_OS_DEFERRED_PAYMENT_PENDING. Se define una vez en la instalación del módulo.
- Un controlador específico: Para manejar la acción de 'validar' el pago real cuando llegue el momento (ya sea manual o por un sistema externo).
- Hooks o tareas programadas (cron jobs): Para comprobar periódicamente los pedidos con estado 'Pendiente de Pago Aplazado' y, por ejemplo, enviar recordatorios o intentar el cobro si tienes los datos de pago guardados (con la debida seguridad y cumplimiento de la normativa).
Aquí te muestro cómo podrías definir el estado del pedido, que es el primer paso fundamental y lo harías en el install() de tu módulo:
// En el método install() de tu módulo
if (!Configuration::get('PS_OS_DEFERRED_PAYMENT_PENDING')) {
$orderState = new OrderState();
$orderState->name = array_fill(0, 10, 'Pendiente de Pago Aplazado'); // Nombres en todos los idiomas
$orderState->send_email = 0; // No enviar email de confirmación de pago inicial
$orderState->module_name = $this->name; // Asocia el estado a tu módulo
$orderState->invoice = 0; // No generar factura hasta que se pague
$orderState->color = '#FF8C00'; // Color naranja para identificar fácilmente
$orderState->logable = 0;
$orderState->paid = 0; // Marcar como no pagado
Este código solo te crea el estado, pero la parte más crítica es el flujo posterior al pedido. Implementar todo esto desde cero con hooks y overrides es bastante complejo y propenso a errores, sobre todo si no tienes experiencia profunda con el core de PrestaShop y necesitas compatibilidad con PHP 8.2/8.3 en PrestaShop 8 o 9.
Para una tienda en producción y evitar mantener un código tan complejo, te sugiero mirar este módulo dedicado que ya gestiona todo el ciclo de vida del pago aplazado, incluyendo recordatorios y cambio de estado automático o manual. Simplifica mucho la vida y asegura la compatibilidad con futuras versiones.