Sylius: Asociando gastos adicionales al Método de Pago

Blog Single

En un artículo pasado, vimos cómo podemos implementar una calculadora asociada a los gastos de envío en Sylius. En este artículo vamos a ver cómo podemos asociar un gasto adicional al pedido en función del método de pago seleccionado. El caso de uso surge por la necesidad de añadir un método de pago “a contra reembolso”, el cual que requiere añadir un gasto adicional para el cliente.

Para conseguir nuestro objetivo, nos vamos a basar en el uso de OrderProcessors. Los OrderProcessor son responsables de manipular los pedidos para aplicar diferentes ajustes predefinidos u otras modificaciones basadas en el estado del pedido. Con esta estrategia, podemos por ejemplo, aplicar descuentos por volumen o añadir impuestos adicionales. En nuestro caso, vamos a configurar un coste asociado al Método de Pago dado de alta que se sumará al pedido como un coste adicional.

Modificando el modelo PaymentMethod de Sylius

Para ello, lo primero que debemos de hacer es modificar el modelo PaymentMethod para añadirle un campo adicional. Para ello extendemos del modelo base que nos proporciona el framework Sylius\Component\Core\Model\PaymentMethod y añadimos nuestro campo price.

Una vez incluido nuestro campo lo añadimos a los metadatos de doctrine:

Para profundizar en la customización de los modelos, os recomiendo este apartado de la documentación. Una vez tenemos el modelo añadido, necesitamos añadir la opción en el panel de administración para añadir el coste asociado al método de pago. Para ello, vamos a extender el formulario utilizando un AbstractTypeExtension de Symfony tratando de extender el formulario SyliusPaymentMethodType. A este formulario añadiremos el campo adicional price.

Una vez implementada la clase, debemos de darla de alta en nuestro fichero services.yml

Para modificar la vista del panel de administración debemos de adaptar el la vista modificando el twig app/Resources/SyliusAdminBundle/views/PaymentMethod/_form.html.twig añadiendo al final del documento la renderización de nuestro nuevo campo:

Utilizando OrderProcessor

Como hemos comentado al principio, vamos a ayudarnos del concepto OrderProcessor para añadir nuestro gasto en el pedido. Para ello, vamos a añadir al pedido un elemento Adjustment en el caso de que el método de pago elegido durante la creación del pedido tenga un coste asociado.

 

El concepto Adjustment en Sylius nos permite hacer ajustes en el total de nuestro pedido. Los ajustes habituales se pueden dividir en tres grupos: ajustes de promoción, ajustes de envío y ajustes de impuestos. Hay que tener en cuenta que los ajustes pueden ser positivos (cargos) o negativos (descuentos).

Finalmente, para que el OrderProcessor empiece a funcionar, debemos de darlo de alta con el tag sylius.order_processor

Los OrderProcessor se añaden a un servicio de Sylius CompositeOrderProcessor que incluye todos los processors del sistema priorizados. Este servicio es capaz de ejecutarlos en el orden adecuado. Por defecto, la ejecución de estos OrderProcessors se ejecutan en casos particulares, por ejemplo cuando se añaden o eliminan elementos en el carrito de compra.

Como nuestra necesidad es que este cálculo se aplique cuando se asocia un método de pago a un pedido, se ha desarrollado un Subscriber asociado al evento sylius.order.post_payment, el cual es ejecutado justo después de asociar el método de pago, de esta manera recalculamos los ajustes necesarios:

Conclusión

Como resumen de lo visto a lo largo del articulo, hemos modificado el modelo PaymentMethod del framework y hemos modificado el formulario del panel de administración para que el usuario configure el coste asociado al método de pago.

Una vez realizado estos pasos, hemos añadido un OrderProcessor que se encargue de añadir el coste asociado al PaymentMethod, para que se ejecute cuando haya algún cambio en el método de pago del pedido, usamos el servicio CompositeOrderProcessor dentro de nuestro Subscriber al eventosylius.order.post_payment.

Espero que este artículo pueda resultar de utilidad y os animo a comentar alternativas a este método y vuestra experiencia manipulando el coste de un pedido en Sylius.

Nube de Tags

ecommercesylius
Comparte el artículo si te ha resultado interesante: