. */ /* */ /*************************************************************************************/ namespace Front\Controller; use Propel\Runtime\Exception\PropelException; use Thelia\Controller\Front\BaseFrontController; use Thelia\Core\Event\Coupon\CouponConsumeEvent; use Thelia\Core\Event\Order\OrderEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Form\CouponCode; use Thelia\Form\Exception\FormValidationException; use Thelia\Log\Tlog; use Thelia\Model\AddressQuery; use Thelia\Module\Exception\DeliveryException; /** * Class CouponController * @package Thelia\Controller\Front * @author Guillaume MOREL */ class CouponController extends BaseFrontController { /** * Clear all coupons. */ public function clearAllCouponsAction() { // Dispatch Event to the Action $this->getDispatcher()->dispatch(TheliaEvents::COUPON_CLEAR_ALL); } /** * Coupon consuming */ public function consumeAction() { $this->checkAuth(); $this->checkCartNotEmpty(); $message = false; $couponCodeForm = new CouponCode($this->getRequest()); try { $form = $this->validateForm($couponCodeForm, 'post'); $couponCode = $form->get('coupon-code')->getData(); if (null === $couponCode || empty($couponCode)) { $message = true; throw new \Exception('Coupon code can\'t be empty'); } $couponConsumeEvent = new CouponConsumeEvent($couponCode); // Dispatch Event to the Action $this->getDispatcher()->dispatch(TheliaEvents::COUPON_CONSUME, $couponConsumeEvent); /* recalculate postage amount */ $order = $this->getSession()->getOrder(); if (null !== $order) { $deliveryModule = $order->getModuleRelatedByDeliveryModuleId(); $deliveryAddress = AddressQuery::create()->findPk($order->getChoosenDeliveryAddress()); if (null !== $deliveryModule && null !== $deliveryAddress) { $moduleInstance = $deliveryModule->getModuleInstance($this->container); $orderEvent = new OrderEvent($order); try { $postage = $moduleInstance->getPostage($deliveryAddress->getCountry()); $orderEvent->setPostage($postage); $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_POSTAGE, $orderEvent); } catch (DeliveryException $ex) { // The postage has been chosen, but changes dues to coupon causes an exception. // Reset the postage data in the order $orderEvent->setDeliveryModule(0); $this->getDispatcher()->dispatch(TheliaEvents::ORDER_SET_DELIVERY_MODULE, $orderEvent); } } } $this->redirect($couponCodeForm->getSuccessUrl()); } catch (FormValidationException $e) { $message = sprintf('Please check your coupon code: %s', $e->getMessage()); } catch (PropelException $e) { $this->getParserContext()->setGeneralError($e->getMessage()); } catch (\Exception $e) { $message = sprintf('Sorry, an error occurred: %s', $e->getMessage()); } if ($message !== false) { Tlog::getInstance()->error(sprintf("Error during order delivery process : %s. Exception was %s", $message, $e->getMessage())); $couponCodeForm->setErrorMessage($message); $this->getParserContext() ->addForm($couponCodeForm) ->setGeneralError($message); } } }