diff --git a/ajax/frontend/redeem.php b/ajax/frontend/redeem.php index 45e12d24aef912489a61b46aea431348dbd23ad0..2c1bde477a9a99931c54457fc04b37e4d513777d 100644 --- a/ajax/frontend/redeem.php +++ b/ajax/frontend/redeem.php @@ -38,8 +38,13 @@ function ($code, $orderHash) { return false; } - $Order = QUI\ERP\Order\Handler::getInstance()->getOrderByHash($orderHash); - $coupons = $Order->getDataEntry('quiqqer-coupons'); + $Order = QUI\ERP\Order\Handler::getInstance()->getOrderByHash($orderHash); + $coupons = $Order->getDataEntry('quiqqer-coupons'); + + if (empty($coupons)) { + $coupons = []; + } + $coupons[] = $code; $coupons = \array_unique($coupons); diff --git a/ajax/frontend/removeCoupons.php b/ajax/frontend/removeCoupons.php new file mode 100644 index 0000000000000000000000000000000000000000..d9a48571cdc220110001b1b68293615d56286163 --- /dev/null +++ b/ajax/frontend/removeCoupons.php @@ -0,0 +1,40 @@ +<?php + +/** + * This file contains package_quiqqer_coupons_ajax_frontend_removeCoupons + */ + +/** + * Remove all coupons from an order + * + * @param string $orderHash - Order hash + */ +QUI::$Ajax->registerFunction( + 'package_quiqqer_coupons_ajax_frontend_removeCoupons', + function ($orderHash) { + $Order = QUI\ERP\Order\Handler::getInstance()->getOrderByHash($orderHash); + $Articles = $Order->getArticles(); + + foreach ($Articles as $index => $Article) { + $customData = $Article->getCustomData(); + + if (!isset($customData['package'])) { + continue; + } + + if ($customData['package'] !== 'quiqqer/coupon') { + continue; + } + + if (!isset($customData['code'])) { + continue; + } + + $Order->removeArticle($index); + } + + $Order->setData('quiqqer-coupons', []); + $Order->save(); + }, + ['orderHash'] +); diff --git a/bin/frontend/controls/CouponCodeInput.css b/bin/frontend/controls/CouponCodeInput.css index d29243083855411ca4aa7b57c334d898565b2ade..733fcde5014fdda23c64a4a184d2fd968c61ffde 100644 --- a/bin/frontend/controls/CouponCodeInput.css +++ b/bin/frontend/controls/CouponCodeInput.css @@ -7,6 +7,7 @@ div + .quiqqer-coupons-field { } .quiqqer-coupons-couponcodeinput { + background: rgba(0, 0, 0, 0.05); display: flex; padding: 5px; } @@ -23,4 +24,12 @@ div + .quiqqer-coupons-field { .quiqqer-coupons-couponcodeinput input { line-height: 36px; margin-right: 1rem; -} \ No newline at end of file +} + +.quiqqer-coupons-remove { + margin-left: 1rem; +} + +.quiqqer-coupons-remove .fa { + margin-right: 0; +} diff --git a/bin/frontend/controls/CouponCodeInput.js b/bin/frontend/controls/CouponCodeInput.js index 146bc734f2104d8dc624f6cbb803d008cabfa948..a055182a804dc89c13be701b91afa632e2b6ea35 100644 --- a/bin/frontend/controls/CouponCodeInput.js +++ b/bin/frontend/controls/CouponCodeInput.js @@ -75,6 +75,35 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ event.stop(); self.$submit(); }); + + if (this.isInOrder()) { + var OrderProcess = this.getOrderProcess(); + + new Promise(function (resolve) { + if (!OrderProcess.isLoaded()) { + return OrderProcess.addEvent('onLoad', resolve); + } + + resolve(); + }).then(function () { + if (OrderProcess.getAttribute('basketEditable') === false) { + // remove coupon codes button + new Element('button', { + 'class': 'quiqqer-coupons-remove', + 'html' : '<span class="fa fa-close"></span>', + title : QUILocale.get(lg, 'remove.coupons.button'), + events : { + click: function (e) { + e.stop(); + self.removeCouponsFromOrder().catch(function (e) { + console.error(e); + }); + } + } + }).inject(self.$Elm.getElement('.quiqqer-coupons-couponcodeinput')); + } + }); + } }, /** @@ -97,10 +126,6 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ this.Loader.show(); // get order process - var OrderProcessNode = this.getElm().getParent( - '[data-qui="package/quiqqer/order/bin/frontend/controls/OrderProcess"]' - ); - if (!this.isInOrder()) { QUIAjax.get('package_quiqqer_order_ajax_frontend_basket_getLastOrder', function (order) { CouponCodes.addCouponCodeToBasket(code, order.hash).then(function (redeemed) { @@ -123,7 +148,7 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ return; } - var OrderProcess = window.QUI.Controls.getById(OrderProcessNode.get('data-quiid')); + var OrderProcess = this.getOrderProcess(); OrderProcess.Loader.show(); @@ -152,6 +177,47 @@ define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ ); return !!OrderProcessNode; + }, + + /** + * Return the order process + * + * @return {Object} + */ + getOrderProcess: function () { + var OrderProcessNode = this.getElm().getParent( + '[data-qui="package/quiqqer/order/bin/frontend/controls/OrderProcess"]' + ); + + return window.QUI.Controls.getById(OrderProcessNode.get('data-quiid')); + }, + + /** + * Remove all coupons from the order + * + * @return {Promise} + */ + removeCouponsFromOrder: function () { + if (!this.isInOrder()) { + return Promise.resolve(); + } + + var self = this; + + return new Promise(function (resolve) { + var OrderProcess = self.getOrderProcess(); + + OrderProcess.Loader.show(); + OrderProcess.getOrder().then(function (orderHash) { + QUIAjax.get('package_quiqqer_coupons_ajax_frontend_removeCoupons', function () { + resolve(); + OrderProcess.reload(); + }, { + 'package': 'quiqqer/coupon', + orderHash: orderHash + }); + }); + }); } }); }); diff --git a/composer.json b/composer.json index 53e8e45094ce6d882dc452d3c48e2de8d761080d..24a15ddb15b6b382d5176bc085148eadaa0f742c 100644 --- a/composer.json +++ b/composer.json @@ -1,27 +1,26 @@ { - "name": "quiqqer/coupons", - "type": "quiqqer-module", - "description": "Coupons for QUIQQER", - "version": "dev-master", - "license": "GPL-3.0+", - "authors": [ - { - "name": "Patrick Müller", - "email": "support@pcsg.de", - "homepage": "http://www.pcsg.de", - "role": "Developer" + "name": "quiqqer\/coupons", + "type": "quiqqer-module", + "description": "Coupons for QUIQQER", + "license": "GPL-3.0+", + "authors": [ + { + "name": "Patrick M\u00fcller", + "email": "support@pcsg.de", + "homepage": "http:\/\/www.pcsg.de", + "role": "Developer" + } + ], + "support": { + "email": "support@pcsg.de" + }, + "require": { + "quiqqer\/quiqqer": "^1.2|*@dev", + "quiqqer\/discount": "^1|*@dev" + }, + "autoload": { + "psr-4": { + "QUI\\ERP\\Coupons\\": "src\/QUI\/ERP\/Coupons" + } } - ], - "support": { - "email": "support@pcsg.de" - }, - "require": { - "quiqqer/quiqqer": "^1.2|*@dev", - "quiqqer/discount": "^1|*@dev" - }, - "autoload": { - "psr-4": { - "QUI\\ERP\\Coupons\\": "src/QUI/ERP/Coupons" - } - } } diff --git a/locale.xml b/locale.xml index 02b516e31ee9973bb451592d5203abdd2fc8c39e..bdffa68363f8cf416110b670c44b09fb7f9709e0 100644 --- a/locale.xml +++ b/locale.xml @@ -390,5 +390,10 @@ <de><![CDATA[Einlösen]]></de> <en><![CDATA[Redeem]]></en> </locale> + + <locale name="remove.coupons.button"> + <de><![CDATA[Alle Coupons entfernen]]></de> + <en><![CDATA[Remove all coupons]]></en> + </locale> </groups> </locales>