diff --git a/bin/frontend/controls/CouponCodeInput.js b/bin/frontend/controls/CouponCodeInput.js index a055182a804dc89c13be701b91afa632e2b6ea35..7bd7b9b5bc358b327e17d32807a5e658cbdf1e11 100644 --- a/bin/frontend/controls/CouponCodeInput.js +++ b/bin/frontend/controls/CouponCodeInput.js @@ -6,8 +6,10 @@ */ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ + 'qui/QUI', 'qui/controls/Control', 'qui/controls/loader/Loader', + 'utils/Session', 'package/quiqqer/coupons/bin/frontend/CouponCodes', @@ -18,7 +20,7 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ 'text!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.html', 'css!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.css' -], function (QUIControl, QUILoader, CouponCodes, QUIAjax, QUILocale, Mustache, template) { +], function (QUI, QUIControl, QUILoader, Sessions, CouponCodes, QUIAjax, QUILocale, Mustache, template) { "use strict"; var lg = 'quiqqer/coupons'; @@ -135,10 +137,12 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ return; } - QUIAjax.get('package_quiqqer_order_ajax_frontend_basket_getOrderProcessUrl', function (url) { - window.location = url + '?coupon=' + code; - }, { - 'package': 'quiqqer/order' + self.$addCouponCodeToSession(code).then(function () { + QUIAjax.get('package_quiqqer_order_ajax_frontend_basket_getOrderProcessUrl', function (url) { + window.location = url + '?coupon=' + code; + }, { + 'package': 'quiqqer/order' + }); }); }); }, { @@ -163,7 +167,30 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ return; } - OrderProcess.reload(); + self.$addCouponCodeToSession(code).then(function () { + OrderProcess.reload(); + }); + }); + }, + + /** + * + * @param code + * @return {Promise} + */ + $addCouponCodeToSession: function (code) { + return Sessions.get('quiqqer-coupons').then(function (coupons) { + if (!coupons || typeOf(coupons) !== 'array') { + coupons = []; + } + + coupons.push(code); + + coupons = coupons.filter(function (value, index, self) { + return self.indexOf(value) === index; + }); + + return Sessions.set('quiqqer-coupons', JSON.encode(coupons)); }); }, diff --git a/events.xml b/events.xml index fea43d838fe3207a13667fe25936b2c8e973ba2a..40d75eddeba09ee773e4478d4e3597b257af8c21 100644 --- a/events.xml +++ b/events.xml @@ -20,4 +20,8 @@ fire="\QUI\ERP\Coupons\Events::onOrderProcess" /> -</events> \ No newline at end of file + <event on="onQuiqqerOrderBasketRemovePos" + fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderBasketRemovePos" + /> + +</events> diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php index 2287283e99e58e618607cc53a848d3f012caf6c0..2907bb4b44c54e6aac2234e082a72e97d6c2587f 100644 --- a/src/QUI/ERP/Coupons/Events.php +++ b/src/QUI/ERP/Coupons/Events.php @@ -61,29 +61,119 @@ public static function onOrderProcess(QUI\ERP\Order\OrderProcess $OrderProcess) return; } - if (!isset($_GET['coupon'])) { + $coupons = QUI::getSession()->get('quiqqer-coupons'); + + if (\is_string($coupons)) { + $coupons = \json_decode($coupons, true); + } + + if (!\is_array($coupons)) { + $coupons = []; + } + + if (isset($_GET['coupon'])) { + $coupons[] = $_GET['coupon']; + } + + $coupons = \array_unique($coupons); + + if (empty($coupons)) { return; } + $Order = $OrderProcess->getOrder(); + + foreach ($coupons as $coupon) { + self::addCouponToOrder($Order, $coupon); + } + } + + /** + * @param QUI\ERP\Order\Basket\Basket $Basket + * @param $pos + */ + public static function onQuiqqerOrderBasketRemovePos( + QUI\ERP\Order\Basket\Basket $Basket, + $pos + ) { + $Order = null; try { - $Order = $OrderProcess->getOrder(); - $code = Handler::sanitizeCode($_GET['coupon']); + $Order = $Basket->getOrder(); + } catch (QUI\Exception $Exception) { + $Orders = QUI\ERP\Order\Handler::getInstance(); - $CouponCode = Handler::getCouponCodeByCode($code); - $CouponCode->checkRedemption(QUI::getUserBySession()); + try { + $Order = $Orders->getLastOrderInProcessFromUser(QUI::getUserBySession()); + } catch (QUI\Exception $Exception) { + } + } - $coupons = $Order->getDataEntry('quiqqer-coupons'); - $coupons[] = $code; + if (!$Order) { + QUI::getSession()->remove('quiqqer-coupons'); - $coupons = \array_unique($coupons); + return; + } - $Order->setData('quiqqer-coupons', $coupons); - $Order->update(); + $Article = $Order->getArticles()->getArticle($pos); + $customData = $Article->getCustomData(); + $orderCoupons = $Order->getDataEntry('quiqqer-coupons'); - $CouponCode->addToOrder($Order); - } catch (\Exception $Exception) { + $articleCouponCode = false; + + if (isset($customData['package']) && isset($customData['code'])) { + $articleCouponCode = $customData['code']; + } + + if (!$articleCouponCode) { + return; + } + + // custom data has code params, so article is an coupon code + // we need to delete it + if (\in_array($articleCouponCode, $orderCoupons)) { + $pos = \array_search($articleCouponCode, $orderCoupons); + unset($orderCoupons[$pos]); + + $Order->setData('quiqqer-coupons', $orderCoupons); + + try { + $Order->save(); + } catch (QUI\Exception $Exception) { + } + } + + // look at session coupons + // we need to delete it + $coupons = QUI::getSession()->get('quiqqer-coupons'); + + if (\is_string($coupons)) { + $coupons = \json_decode($coupons, true); + } + + if (!\is_array($coupons) || empty($coupons)) { + return; + } + + if (!\in_array($customData['code'], $coupons)) { + return; + } + + // remove code from session + // because code is deleted + $newCouponList = []; + + foreach ($coupons as $coupon) { + if ($customData['code'] !== $coupon) { + $newCouponList[] = $coupon; + } + } + + if (empty($newCouponList)) { + QUI::getSession()->remove('quiqqer-coupons'); + } else { + QUI::getSession()->set('quiqqer-coupons', \json_encode($newCouponList)); } } @@ -99,14 +189,23 @@ public static function onQuiqqerOrderBasketToOrder( QUI\ERP\Order\AbstractOrder $Order, QUI\ERP\Products\Product\ProductList $Products ) { - $coupons = $Order->getDataEntry('quiqqer-coupons'); + $coupons = $Order->getDataEntry('quiqqer-coupons'); + $sessionCoupons = QUI::getSession()->get('quiqqer-coupons'); - if (!$coupons) { - return; + if (!\is_array($coupons)) { + $coupons = []; } - if (!\is_array($coupons)) { - return; + if (\is_string($sessionCoupons)) { + $sessionCoupons = \json_decode($sessionCoupons, true); + + if (\is_array($sessionCoupons)) { + $coupons = \array_merge($coupons, $sessionCoupons); + } + + $coupons = \array_unique($coupons); + + self::addSessionCouponsToOrder($Order, $sessionCoupons); } if (empty($coupons)) { @@ -222,4 +321,60 @@ public static function onQuiqqerOrderSuccessful($Order) } } } + + /** + * @param $Order + * @param $coupons + */ + protected static function addSessionCouponsToOrder($Order, $coupons) + { + if (!\is_array($coupons)) { + return; + } + + // coupons as article if not added + $Articles = $Order->getArticles(); + $isInArticles = function ($code) use ($Articles) { + foreach ($Articles as $Article) { + $customData = $Article->getCustomData(); + + if (isset($customData['code']) && $customData['code'] === $code) { + return true; + } + } + + return false; + }; + + foreach ($coupons as $coupon) { + if ($isInArticles($coupon) === false) { + self::addCouponToOrder($Order, $coupon); + } + } + } + + /** + * @param $Order + * @param $coupon + */ + protected static function addCouponToOrder($Order, $coupon) + { + try { + $code = Handler::sanitizeCode($coupon); + + $CouponCode = Handler::getCouponCodeByCode($code); + $CouponCode->checkRedemption(QUI::getUserBySession()); + + $coupons = $Order->getDataEntry('quiqqer-coupons'); + $coupons[] = $code; + + $coupons = \array_unique($coupons); + + $Order->setData('quiqqer-coupons', $coupons); + $Order->update(); + + $CouponCode->addToOrder($Order); + } catch (\Exception $Exception) { + } + } }