From c580a59d4de259872b4386c137e69f45322fad61 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Wed, 16 Jun 2021 14:50:40 +0200
Subject: [PATCH] feat: coupon products (temp commit)

---
 bin/backend/controls/Manager.css              |  7 ++
 events.xml                                    |  8 --
 src/QUI/ERP/Coupons/Events.php                | 90 +++++--------------
 .../Coupons/Products/CouponProductType.php    | 11 +--
 src/QUI/ERP/Coupons/Products/Handler.php      |  7 ++
 5 files changed, 40 insertions(+), 83 deletions(-)

diff --git a/bin/backend/controls/Manager.css b/bin/backend/controls/Manager.css
index 61aa78d..af2a041 100644
--- a/bin/backend/controls/Manager.css
+++ b/bin/backend/controls/Manager.css
@@ -104,6 +104,13 @@
     width: 50%;
 }
 
+.quiqqer-coupons-manager-create-advanced-discount table,
+.quiqqer-coupons-manager-create-advanced-discount table tbody,
+.quiqqer-coupons-manager-create-advanced-discount table tbody tr,
+.quiqqer-coupons-manager-create-advanced-discount table tbody tr td {
+    display: block;
+}
+
 .quiqqer-coupons-manager-create-advanced-restrictions {
     padding-left: 10px;
     width: 50%;
diff --git a/events.xml b/events.xml
index 6abc225..eee1145 100644
--- a/events.xml
+++ b/events.xml
@@ -36,12 +36,4 @@
            fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderBasketRemovePos"
     />
 
-    <event on="onQuiqqerOrderOrderProcessGetBodyBegin"
-           fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderOrderProcessGetBodyBegin"
-    />
-
-    <event on="onQuiqqerOrderBasketToOrderBegin"
-           fire="\QUI\ERP\Coupons\Events::onQuiqqerOrderBasketToOrderBegin"
-    />
-
 </events>
diff --git a/src/QUI/ERP/Coupons/Events.php b/src/QUI/ERP/Coupons/Events.php
index 8780beb..7c0b6f2 100644
--- a/src/QUI/ERP/Coupons/Events.php
+++ b/src/QUI/ERP/Coupons/Events.php
@@ -12,8 +12,6 @@
 use QUI\ERP\Coupons\Handler as CouponsHandler;
 use QUI\ERP\Discount\EventHandling as DiscountEvents;
 use QUI\ERP\Coupons\Products\CouponProductType;
-use QUI\ERP\Coupons\Products\Handler as CouponProductsHandler;
-use QUI\ERP\Products\Handler\Products;
 
 /**
  * Class Events
@@ -421,7 +419,7 @@ protected static function addCouponToOrder($Order, $coupon)
     protected static function createProductFields()
     {
         $fields = [
-            CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE       => [
+            CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE               => [
                 'title'    => [
                     'de' => 'Gutschein-Code ist übertragbar',
                     'en' => 'Coupon code is transferable'
@@ -430,7 +428,7 @@ protected static function createProductFields()
                 'public'   => false,
                 'standard' => false
             ],
-            CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF       => [
+            CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF               => [
                 'title'    => [
                     'de' => 'Gutschein-Code als PDF bereitstellen',
                     'en' => 'Provide coupon code as PDF'
@@ -439,7 +437,7 @@ protected static function createProductFields()
                 'public'   => false,
                 'standard' => false
             ],
-            CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT      => [
+            CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT              => [
                 'title'    => [
                     'de' => 'Gutschein Wert',
                     'en' => 'Coupon amount'
@@ -448,7 +446,7 @@ protected static function createProductFields()
                 'public'   => false,
                 'standard' => false
             ],
-            CouponProductType::PRODUCT_FIELD_ID_DAYS_VALID         => [
+            CouponProductType::PRODUCT_FIELD_ID_DAYS_VALID                 => [
                 'title'    => [
                     'de' => 'Gutschein-Code Gültigkeit (Tage)',
                     'en' => 'Coupon code validity (days)'
@@ -457,7 +455,7 @@ protected static function createProductFields()
                 'public'   => false,
                 'standard' => false
             ],
-            CouponProductType::PRODUCT_FIELD_ID_COUPON_DESCRIPTION => [
+            CouponProductType::PRODUCT_FIELD_ID_COUPON_DESCRIPTION         => [
                 'title'    => [
                     'de' => 'Gutschein-Beschreibung',
                     'en' => 'Coupon description'
@@ -465,6 +463,15 @@ protected static function createProductFields()
                 'type'     => Fields::TYPE_INPUT_MULTI_LANG,
                 'public'   => false,
                 'standard' => false
+            ],
+            CouponProductType::PRODUCT_FIELD_ID_IS_PRODUCT_SPECIFIC_COUPON => [
+                'title'    => [
+                    'de' => 'Ist Gutschein für ein spezifisches Produkt ("Einzweck-Gutschein")',
+                    'en' => 'Is coupon for a specific product ("single purpose coupon")'
+                ],
+                'type'     => Fields::TYPE_BOOL,
+                'public'   => false,
+                'standard' => false
             ]
         ];
 
@@ -515,11 +522,12 @@ public static function onQuiqqerProductsProductCreate(ProductInterface $Product)
         }
 
         $fields = [
-            CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE       => true,
-            CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF       => true,
-            CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT      => null,
-            CouponProductType::PRODUCT_FIELD_ID_DAYS_VALID         => 1095, // 3 years
-            CouponProductType::PRODUCT_FIELD_ID_COUPON_DESCRIPTION => null
+            CouponProductType::PRODUCT_FIELD_ID_TRANSFERABLE               => true,
+            CouponProductType::PRODUCT_FIELD_ID_GENERATE_PDF               => true,
+            CouponProductType::PRODUCT_FIELD_ID_COUPON_AMOUNT              => null,
+            CouponProductType::PRODUCT_FIELD_ID_DAYS_VALID                 => 1095, // 3 years
+            CouponProductType::PRODUCT_FIELD_ID_COUPON_DESCRIPTION         => null,
+            CouponProductType::PRODUCT_FIELD_ID_IS_PRODUCT_SPECIFIC_COUPON => false
         ];
 
         foreach ($fields as $fieldId => $value) {
@@ -552,62 +560,4 @@ public static function onQuiqqerOrderCreated(AbstractOrder $Order)
     {
         QUI\ERP\Coupons\Products\Handler::createCouponCodesFromOrder($Order);
     }
-
-    public static function onQuiqqerOrderBasketToOrderBegin(
-        QUI\ERP\Order\Basket\BasketOrder $BasketOrder,
-        AbstractOrder $Order,
-        array &$products
-    ) {
-        foreach ($products as $k => $product) {
-            $products[$k]['vat'] = 0;
-        }
-    }
-
-    /**
-     * quiqqer/order: onQuiqqerOrderOrderProcessGetBodyBegin
-     *
-     * Set VAT to 0% for specific coupons.
-     *
-     * @param QUI\ERP\Order\OrderProcess $OrderProcess
-     * @return void
-     */
-    public static function onQuiqqerOrderOrderProcessGetBodyBegin(QUI\ERP\Order\OrderProcess $OrderProcess)
-    {
-        try {
-            $Order = $OrderProcess->getOrder();
-        } catch (\Exception $Exception) {
-            QUI\System\Log::writeException($Exception);
-            return;
-        }
-
-        if (empty($Order)) {
-            return;
-        }
-//
-//        $OrderBasket = new QUI\ERP\Order\Basket\BasketOrder($Order->getHash());
-//
-//        foreach ($OrderBasket->get)
-
-        $Articles     = $Order->getArticles();
-        $articleStock = [];
-
-        /** @var QUI\ERP\Accounting\Article $Article */
-        foreach ($Articles as $Article) {
-            try {
-                // Do not parse coupon codes / discounts
-                if (empty($Article->getId()) || !\is_numeric($Article->getId())) {
-                    continue;
-                }
-
-                $Product = Products::getProduct($Article->getId());
-
-                if ($Product instanceof CouponProductType) {
-                    // @todo
-                }
-            } catch (\Exception $Exception) {
-                QUI\System\Log::writeDebugException($Exception);
-                continue;
-            }
-        }
-    }
 }
diff --git a/src/QUI/ERP/Coupons/Products/CouponProductType.php b/src/QUI/ERP/Coupons/Products/CouponProductType.php
index fd6d892..3d5ea3b 100644
--- a/src/QUI/ERP/Coupons/Products/CouponProductType.php
+++ b/src/QUI/ERP/Coupons/Products/CouponProductType.php
@@ -15,11 +15,12 @@ class CouponProductType extends DigitalProduct
     /**
      * Special fields for coupon products
      */
-    const PRODUCT_FIELD_ID_TRANSFERABLE       = 670;
-    const PRODUCT_FIELD_ID_GENERATE_PDF       = 671;
-    const PRODUCT_FIELD_ID_COUPON_AMOUNT      = 672;
-    const PRODUCT_FIELD_ID_DAYS_VALID         = 673;
-    const PRODUCT_FIELD_ID_COUPON_DESCRIPTION = 674;
+    const PRODUCT_FIELD_ID_TRANSFERABLE               = 670;
+    const PRODUCT_FIELD_ID_GENERATE_PDF               = 671;
+    const PRODUCT_FIELD_ID_COUPON_AMOUNT              = 672;
+    const PRODUCT_FIELD_ID_DAYS_VALID                 = 673;
+    const PRODUCT_FIELD_ID_COUPON_DESCRIPTION         = 674;
+    const PRODUCT_FIELD_ID_IS_PRODUCT_SPECIFIC_COUPON = 675;
 
     /**
      * @param QUI\Locale $Locale
diff --git a/src/QUI/ERP/Coupons/Products/Handler.php b/src/QUI/ERP/Coupons/Products/Handler.php
index 43f3723..a930fd1 100644
--- a/src/QUI/ERP/Coupons/Products/Handler.php
+++ b/src/QUI/ERP/Coupons/Products/Handler.php
@@ -158,6 +158,13 @@ protected static function createDiscountFromProduct(Product $Product): Discount
             $discountAmount = $Product->getPrice()->getValue();
         }
 
+        // Determine discount calculation basis based on coupon type
+        $isProductSpecificCoupon = $Product->getFieldValue(
+            CouponProductType::PRODUCT_FIELD_ID_IS_PRODUCT_SPECIFIC_COUPON
+        );
+
+        // @todo für Einzweck-Gutscheine muss ein spezieller Rabatt-Typ verwendet werden
+
         /** @var Discount $NewDiscount */
         $NewDiscount = $Handler->createChild([
             'active'        => 1,
-- 
GitLab