From 2bfff68eed909070c03561cee88c096af386e3b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de> Date: Wed, 29 Aug 2018 16:19:14 +0200 Subject: [PATCH] feat: CouponCodeInput for basket --- ajax/frontend/redeem.php | 42 +++++++++ bin/{ => backend}/CouponCodes.js | 6 +- bin/{ => backend}/classes/CouponCodes.js | 6 +- .../controls/Manager.Create.html | 0 .../controls/Manager.Usages.html | 0 bin/{ => backend}/controls/Manager.css | 0 bin/{ => backend}/controls/Manager.html | 0 bin/{ => backend}/controls/Manager.js | 22 ++--- .../controls/settings/CodeGeneratorSelect.css | 0 .../controls/settings/CodeGeneratorSelect.js | 8 +- bin/frontend/CouponCodes.js | 17 ++++ bin/frontend/classes/CouponCodes.js | 38 ++++++++ bin/frontend/controls/CouponCodeInput.html | 9 ++ bin/frontend/controls/CouponCodeInput.js | 94 +++++++++++++++++++ events.xml | 5 + locale.xml | 10 ++ menu.xml | 2 +- src/QUI/ERP/Coupons/CouponCode.php | 35 +++++-- src/QUI/ERP/Coupons/Events.php | 89 ++++++++++++++++++ 19 files changed, 351 insertions(+), 32 deletions(-) create mode 100644 ajax/frontend/redeem.php rename bin/{ => backend}/CouponCodes.js (50%) rename bin/{ => backend}/classes/CouponCodes.js (93%) rename bin/{ => backend}/controls/Manager.Create.html (100%) rename bin/{ => backend}/controls/Manager.Usages.html (100%) rename bin/{ => backend}/controls/Manager.css (100%) rename bin/{ => backend}/controls/Manager.html (100%) rename bin/{ => backend}/controls/Manager.js (97%) rename bin/{ => backend}/controls/settings/CodeGeneratorSelect.css (100%) rename bin/{ => backend}/controls/settings/CodeGeneratorSelect.js (86%) create mode 100644 bin/frontend/CouponCodes.js create mode 100644 bin/frontend/classes/CouponCodes.js create mode 100644 bin/frontend/controls/CouponCodeInput.html create mode 100644 bin/frontend/controls/CouponCodeInput.js create mode 100644 events.xml create mode 100644 src/QUI/ERP/Coupons/Events.php diff --git a/ajax/frontend/redeem.php b/ajax/frontend/redeem.php new file mode 100644 index 0000000..3fe02a7 --- /dev/null +++ b/ajax/frontend/redeem.php @@ -0,0 +1,42 @@ +<?php + +/** + * This file contains package_quiqqer_coupons_ajax_delete + */ + +use QUI\ERP\Coupons\Handler; + +/** + * Redeem a CouponCode + * + * @param int $id - CouponCode ID + * @return bool - success + */ +QUI::$Ajax->registerFunction( + 'package_quiqqer_coupons_ajax_frontend_redeem', + function ($id) { + $id = (int)$id; + + try { + $CouponCode = Handler::getCouponCode($id); + + // @todo + + } catch (\Exception $Exception) { + QUI\System\Log::writeException($Exception); + + QUI::getMessagesHandler()->addError( + QUI::getLocale()->get( + 'quiqqer/coupons', + 'message.ajax.general_error' + ) + ); + + return false; + } + + return true; + }, + ['id'], + 'Permission::checkAdminUser' +); diff --git a/bin/CouponCodes.js b/bin/backend/CouponCodes.js similarity index 50% rename from bin/CouponCodes.js rename to bin/backend/CouponCodes.js index 8656be4..a302a3d 100644 --- a/bin/CouponCodes.js +++ b/bin/backend/CouponCodes.js @@ -1,14 +1,14 @@ /** * CouponCodes Handler * - * @module package/quiqqer/coupons/bin/classes/CouponCodes + * @module package/quiqqer/coupons/bin/backend/classes/CouponCodes * @author www.pcsg.de (Patrick Müller) * * @require Ajax */ -define('package/quiqqer/coupons/bin/CouponCodes', [ +define('package/quiqqer/coupons/bin/backend/CouponCodes', [ - 'package/quiqqer/coupons/bin/classes/CouponCodes' + 'package/quiqqer/coupons/bin/backend/classes/CouponCodes' ], function (CouponCodesManager) { "use strict"; diff --git a/bin/classes/CouponCodes.js b/bin/backend/classes/CouponCodes.js similarity index 93% rename from bin/classes/CouponCodes.js rename to bin/backend/classes/CouponCodes.js index 88a3f6d..9107243 100644 --- a/bin/classes/CouponCodes.js +++ b/bin/backend/classes/CouponCodes.js @@ -1,12 +1,12 @@ /** * CouponCodes Handler * - * @module package/quiqqer/coupons/bin/classes/CouponCodes + * @module package/quiqqer/coupons/bin/backend/classes/CouponCodes * @author www.pcsg.de (Patrick Müller) * * @require Ajax */ -define('package/quiqqer/coupons/bin/classes/CouponCodes', [ +define('package/quiqqer/coupons/bin/backend/classes/CouponCodes', [ 'Ajax' @@ -17,7 +17,7 @@ define('package/quiqqer/coupons/bin/classes/CouponCodes', [ return new Class({ - Type: 'package/quiqqer/coupons/bin/classes/CouponCodes', + Type: 'package/quiqqer/coupons/bin/backend/classes/CouponCodes', /** * Create new CouponCode diff --git a/bin/controls/Manager.Create.html b/bin/backend/controls/Manager.Create.html similarity index 100% rename from bin/controls/Manager.Create.html rename to bin/backend/controls/Manager.Create.html diff --git a/bin/controls/Manager.Usages.html b/bin/backend/controls/Manager.Usages.html similarity index 100% rename from bin/controls/Manager.Usages.html rename to bin/backend/controls/Manager.Usages.html diff --git a/bin/controls/Manager.css b/bin/backend/controls/Manager.css similarity index 100% rename from bin/controls/Manager.css rename to bin/backend/controls/Manager.css diff --git a/bin/controls/Manager.html b/bin/backend/controls/Manager.html similarity index 100% rename from bin/controls/Manager.html rename to bin/backend/controls/Manager.html diff --git a/bin/controls/Manager.js b/bin/backend/controls/Manager.js similarity index 97% rename from bin/controls/Manager.js rename to bin/backend/controls/Manager.js index 1d138ea..8bf5a0d 100644 --- a/bin/controls/Manager.js +++ b/bin/backend/controls/Manager.js @@ -1,10 +1,10 @@ /** * Manage Invite Codes * - * @module package/quiqqer/coupons/bin/controls/Manager + * @module package/quiqqer/coupons/bin/backend/controls/Manager * @author www.pcsg.de (Patrick Müller) */ -define('package/quiqqer/coupons/bin/controls/Manager', [ +define('package/quiqqer/coupons/bin/backend/controls/Manager', [ 'qui/QUI', 'qui/controls/desktop/Panel', @@ -17,15 +17,15 @@ define('package/quiqqer/coupons/bin/controls/Manager', [ 'controls/grid/Grid', 'qui/utils/Form', - 'package/quiqqer/coupons/bin/CouponCodes', + 'package/quiqqer/coupons/bin/backend/CouponCodes', 'Locale', 'Mustache', - 'text!package/quiqqer/coupons/bin/controls/Manager.html', - 'text!package/quiqqer/coupons/bin/controls/Manager.Create.html', - 'text!package/quiqqer/coupons/bin/controls/Manager.Usages.html', - 'css!package/quiqqer/coupons/bin/controls/Manager.css' + 'text!package/quiqqer/coupons/bin/backend/controls/Manager.html', + 'text!package/quiqqer/coupons/bin/backend/controls/Manager.Create.html', + 'text!package/quiqqer/coupons/bin/backend/controls/Manager.Usages.html', + 'css!package/quiqqer/coupons/bin/backend/controls/Manager.css' ], function (QUI, QUIPanel, QUILoader, QUIPopup, QUIConfirm, QUIButton, QUISeparator, Grid, QUIFormUtils, CouponCodes, QUILocale, Mustache, template, templateCreate, @@ -37,7 +37,7 @@ define('package/quiqqer/coupons/bin/controls/Manager', [ return new Class({ Extends: QUIPanel, - Type : 'package/quiqqer/coupons/bin/controls/Manager', + Type : 'package/quiqqer/coupons/bin/backend/controls/Manager', Binds: [ '$onCreate', @@ -445,11 +445,7 @@ define('package/quiqqer/coupons/bin/controls/Manager', [ )); if (CouponData) { - - console.log(CouponData); - CouponData.discountIds = CouponData.discountIds.join(','); - QUIFormUtils.setDataToForm(CouponData, Form); } @@ -602,8 +598,6 @@ define('package/quiqqer/coupons/bin/controls/Manager', [ var Content = Popup.getContent(); var TableBody = Content.getElement('tbody'); - console.log(TableBody); - for (var i = 0, len = RowData.usages.length; i < len; i++) { var usage = RowData.usages[i]; diff --git a/bin/controls/settings/CodeGeneratorSelect.css b/bin/backend/controls/settings/CodeGeneratorSelect.css similarity index 100% rename from bin/controls/settings/CodeGeneratorSelect.css rename to bin/backend/controls/settings/CodeGeneratorSelect.css diff --git a/bin/controls/settings/CodeGeneratorSelect.js b/bin/backend/controls/settings/CodeGeneratorSelect.js similarity index 86% rename from bin/controls/settings/CodeGeneratorSelect.js rename to bin/backend/controls/settings/CodeGeneratorSelect.js index c30b830..f51f43f 100644 --- a/bin/controls/settings/CodeGeneratorSelect.js +++ b/bin/backend/controls/settings/CodeGeneratorSelect.js @@ -1,10 +1,10 @@ /** * Select available CodeGenerators * - * @module package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect + * @module package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect * @author www.pcsg.de (Patrick Müller) */ -define('package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect', [ +define('package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect', [ 'qui/controls/buttons/Select', 'qui/controls/loader/Loader', @@ -12,7 +12,7 @@ define('package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect', [ 'Locale', 'Ajax', - 'css!package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect.css' + 'css!package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect.css' ], function (QUISelect, QUILoader, QUILocale, QUIAjax) { "use strict"; @@ -21,7 +21,7 @@ define('package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect', [ return new Class({ Extends: QUISelect, - Type : 'package/quiqqer/coupons/bin/controls/settings/CodeGeneratorSelect', + Type : 'package/quiqqer/coupons/bin/backend/controls/settings/CodeGeneratorSelect', Binds: [ '$onImport' diff --git a/bin/frontend/CouponCodes.js b/bin/frontend/CouponCodes.js new file mode 100644 index 0000000..bd8c0c8 --- /dev/null +++ b/bin/frontend/CouponCodes.js @@ -0,0 +1,17 @@ +/** + * CouponCodes Handler (Frontend) + * + * @module package/quiqqer/coupons/bin/frontend/classes/CouponCodes + * @author www.pcsg.de (Patrick Müller) + * + * @require Ajax + */ +define('package/quiqqer/coupons/bin/frontend/CouponCodes', [ + + 'package/quiqqer/coupons/bin/frontend/classes/CouponCodes' + +], function (CouponCodesManager) { + "use strict"; + + return new CouponCodesManager(); +}); diff --git a/bin/frontend/classes/CouponCodes.js b/bin/frontend/classes/CouponCodes.js new file mode 100644 index 0000000..643f2e5 --- /dev/null +++ b/bin/frontend/classes/CouponCodes.js @@ -0,0 +1,38 @@ +/** + * CouponCodes Handler (Frontend) + * + * @module package/quiqqer/coupons/bin/frontend/classes/CouponCodes + * @author www.pcsg.de (Patrick Müller) + * + * @require Ajax + */ +define('package/quiqqer/coupons/bin/frontend/classes/CouponCodes', [ + + 'Ajax' + +], function (QUIAjax) { + "use strict"; + + var pkg = 'quiqqer/coupons'; + + return new Class({ + + Type: 'package/quiqqer/coupons/bin/frontend/classes/CouponCodes', + + /** + * Adds a coupon to the current session basket + * + * @param {String} code + * @return {Promise} + */ + addCouponCodeToBasket: function (code) { + return new Promise(function (resolve, reject) { + QUIAjax.post('package_quiqqer_coupons_ajax_frontend_redeem', resolve, { + 'package': pkg, + code : code, + onError : reject + }); + }); + } + }); +}); diff --git a/bin/frontend/controls/CouponCodeInput.html b/bin/frontend/controls/CouponCodeInput.html new file mode 100644 index 0000000..93c214b --- /dev/null +++ b/bin/frontend/controls/CouponCodeInput.html @@ -0,0 +1,9 @@ +<div class="quiqqer-coupons-couponcodeinput"> + <label> + <span>{{labelInput}}</span> + <input type="text" name="code"/> + </label> + <button class="quiqqer-coupons-couponcodeinput-btn"> + <span>{{submitBtnText}}</span> + </button> +</div> \ No newline at end of file diff --git a/bin/frontend/controls/CouponCodeInput.js b/bin/frontend/controls/CouponCodeInput.js new file mode 100644 index 0000000..a5ae990 --- /dev/null +++ b/bin/frontend/controls/CouponCodeInput.js @@ -0,0 +1,94 @@ +/** + * CouponCodeInput + * + * @module package/quiqqer/coupons/bin/frontend/classes/CouponCodeInput + * @author www.pcsg.de (Patrick Müller) + */ +define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [ + + 'qui/controls/Control', + 'qui/controls/loader/Loader', + + 'package/quiqqer/coupons/bin/frontend/CouponCodes', + + 'Locale', + 'Mustache', + + 'text!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.html', + //'css!package/quiqqer/coupons/bin/frontend/classes/CouponCodeInput.css' + +], function (QUIControl, QUILoader, CouponCodes, QUILocale, Mustache, template) { + "use strict"; + + var lg = 'quiqqer/coupons'; + + return new Class({ + + Extends: QUIControl, + Type : 'package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', + + Binds: [ + '$submit' + ], + + initialize: function (options) { + this.parent(options); + + this.$Input = null; + this.Loader = new QUILoader(); + + this.addEvents({ + onInject: this.$onInject + }); + }, + + /** + * Event: onInject + */ + $onInject: function () { + var self = this; + var lgPrefix = 'controls.frontend.CouponCodeInput.template.'; + + this.$Elm.set('html', Mustache.render(template, { + labelInput : QUILocale.get(lg, lgPrefix + 'labelInput'), + submitBtnText: QUILocale.get(lg, lgPrefix + 'submitBtnText') + })); + + this.Loader.inject(this.$Elm); + + this.$Input = this.$Elm.getElement('input[name="code"]'); + + this.$Input.addEvent('keyup', function (event) { + if (event.code === 13) { + self.$submit(); + } + }); + + var SubmitBtn = this.$Elm.getElement('button.quiqqer-coupons-couponcodeinput-btn'); + SubmitBtn.addEvent('click', function (event) { + event.stop(); + self.$submit(); + }); + }, + + /** + * Submit a CouponCode + */ + $submit: function () { + var self = this; + var code = this.$Input.value.trim(); + + if (code === '') { + this.$Input.focus(); + return; + } + + this.Loader.show(); + + CouponCodes.addCouponCodeToBasket(code).then(function () { + // @todo + self.Loader.hide(); + }); + } + }); +}); diff --git a/events.xml b/events.xml new file mode 100644 index 0000000..bf2f088 --- /dev/null +++ b/events.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<events> + <event on="onQuiqqer::order::orderProcessBasketEnd" fire="\QUI\ERP\Coupons\Events::templateOrderProcessBasketEnd"/> + <!--<event on="onQuiqqer::order::basketSmall::end" fire="\QUI\ERP\Payments\PayPal\Events::templateOrderBasketSmallEnd"/>--> +</events> \ No newline at end of file diff --git a/locale.xml b/locale.xml index 92cf892..a26cae0 100644 --- a/locale.xml +++ b/locale.xml @@ -327,5 +327,15 @@ <de><![CDATA[Erweiterte Einstellungen ausblenden]]></de> <en><![CDATA[Hide advanced settings]]></en> </locale> + + <!-- Control: frontend/controls/CouponCodeInput --> + <locale name="controls.frontend.CouponCodeInput.template.labelInput"> + <de><![CDATA[Coupon-Code]]></de> + <en><![CDATA[Coupon code]]></en> + </locale> + <locale name="controls.frontend.CouponCodeInput.template.submitBtnText"> + <de><![CDATA[Einlösen]]></de> + <en><![CDATA[Redeem]]></en> + </locale> </groups> </locales> diff --git a/menu.xml b/menu.xml index 98da8d9..b9f8a56 100644 --- a/menu.xml +++ b/menu.xml @@ -8,7 +8,7 @@ </item> <item parent="/extras/erp/" name="couponcodes" - require="package/quiqqer/coupons/bin/controls/Manager" + require="package/quiqqer/coupons/bin/backend/controls/Manager" icon="fa fa-credit-card-alt" > <locale group="quiqqer/coupons" var="menu.erp.couponcodes.title" /> diff --git a/src/QUI/ERP/Coupons/CouponCode.php b/src/QUI/ERP/Coupons/CouponCode.php index 78d489d..5ee626f 100644 --- a/src/QUI/ERP/Coupons/CouponCode.php +++ b/src/QUI/ERP/Coupons/CouponCode.php @@ -206,6 +206,27 @@ public function getDiscountIds() return $this->discountIds; } + /** + * Get all discounts associated with this CouponCode + * + * @return QUI\ERP\Discount\Discount[] + */ + public function getDiscounts() + { + $discounts = []; + $DiscountHandler = DiscountHandler::getInstance(); + + foreach ($this->discountIds as $discountId) { + try { + $discounts[] = $DiscountHandler->getChild($discountId); + } catch (\Exception $Exception) { + QUI\System\Log::writeDebugException($Exception); + } + } + + return $discounts; + } + /** * Redeems this CouponCode * @@ -260,6 +281,13 @@ public function redeem($User = null) */ protected function checkRedemption($User) { + if (!$this->isValid()) { + throw new CouponCodeException([ + 'quiqqer/coupons', + 'exception.CouponCode.no_longer_valid' + ]); + } + $DiscountHandler = DiscountHandler::getInstance(); $discountsValid = false; $discountError = false; @@ -296,13 +324,6 @@ protected function checkRedemption($User) } } - if (!$this->isValid()) { - throw new CouponCodeException([ - 'quiqqer/coupons', - 'exception.CouponCode.no_longer_valid' - ]); - } - if (!empty($this->userIds)) { if (in_array($User->getId(), $this->userIds)) { if (!$this->reusable && $this->hasUserRedeemed($User)) { diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php new file mode 100644 index 0000000..7bf60df --- /dev/null +++ b/src/QUI/ERP/Coupons/Events.php @@ -0,0 +1,89 @@ +<?php + +namespace QUI\ERP\Coupons; + +use QUI; +use Quiqqer\Engine\Collector; +use QUI\ERP\Order\Basket\Basket; +use QUI\ERP\Order\Basket\BasketGuest; +use QUI\ERP\Order\Utils\Utils as OrderUtils; +use QUI\ERP\Order\Controls\OrderProcess\Checkout as CheckoutStep; + +/** + * Class Events + * + * Global Event Handler for quiqqer/payment-paypal + */ +class Events +{ + /** + * Template event quiqqer/order: onQuiqqer::order::orderProcessBasketEnd + * + * @param Collector $Collector + * @param BasketGuest $Basket + * @return void + * + * @throws QUI\Exception + */ + public static function templateOrderProcessBasketEnd(Collector $Collector, $Basket) + { + if (!($Basket instanceof Basket)) { + return; + } + + $Collector->append( + '<div data-qui="package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput"></div>' + ); + } + +// /** +// * Template event quiqqer/order: onQuiqqer::order::basketSmall::end +// * +// * @param Collector $Collector +// * @param BasketGuest $Basket +// * @return void +// * +// * @throws QUI\Exception +// */ +// public static function templateOrderBasketSmallEnd(Collector $Collector, $Basket) +// { +// $PaymentExpress = Provider::getPayPalExpressPayment(); +// +// if (!$PaymentExpress || !$PaymentExpress->isActive()) { +// return; +// } +// +// if (!($Basket instanceof Basket)) { +// return; +// } +// +// // do not display PayPal button if basket has no articles +// if (!$Basket->count()) { +// return; +// } +// +// $Project = QUI::getProjectManager()->getStandard(); +// $CheckoutStep = new CheckoutStep(); +// $checkout = 0; +// +// if ($Basket->hasOrder()) { +// $Order = $Basket->getOrder(); +// +// if ($Order->getPaymentDataEntry(Payment::ATTR_PAYPAL_PAYMENT_ID)) { +// $checkout = 1; +// } +// } +// +// $Collector->append( +// '<div data-qui="package/quiqqer/payment-paypal/bin/controls/ExpressBtnLoader" +// data-qui-options-context="smallbasket" +// data-qui-options-basketid="' . $Basket->getId() . '" +// data-qui-options-checkout="' . $checkout . '" +// data-qui-options-displaysize="' . Provider::getWidgetsSetting('btn_express_size_smallbasket') . '" +// data-qui-options-displaycolor="' . Provider::getWidgetsSetting('btn_express_color') . '" +// data-qui-options-displayshape="' . Provider::getWidgetsSetting('btn_express_shape') . '" +// data-qui-options-orderprocessurl="' . OrderUtils::getOrderProcessUrl($Project, $CheckoutStep) . '"> +// </div>' +// ); +// } +} -- GitLab