From 10023c735e4694311e804e5361ae38d2f8d251d6 Mon Sep 17 00:00:00 2001
From: Henning Leutz <leutz@pcsg.de>
Date: Thu, 4 Jun 2020 10:28:02 +0200
Subject: [PATCH] feat: quiqqer/stock-management#13

---
 ajax/frontend/basket/save.php            |  9 ++-
 locale.xml                               | 15 +++++
 settings.xml                             | 41 ++++++++----
 src/QUI/ERP/Order/Basket/BasketOrder.php | 80 ++++++++++++++++++++++--
 4 files changed, 126 insertions(+), 19 deletions(-)

diff --git a/ajax/frontend/basket/save.php b/ajax/frontend/basket/save.php
index c3dbe6ff..acd99494 100644
--- a/ajax/frontend/basket/save.php
+++ b/ajax/frontend/basket/save.php
@@ -21,16 +21,23 @@ function ($basketId, $products) {
         $User = QUI::getUserBySession();
 
         $Basket = new QUI\ERP\Order\Basket\Basket($basketId, $User);
-        $Basket->import(\json_decode($products, true));
 
         if (!QUI::getUsers()->isNobodyUser($User)) {
             try {
                 $Order       = Handler::getInstance()->getLastOrderInProcessFromUser($User);
                 $BasketOrder = new QUI\ERP\Order\Basket\BasketOrder($Order->getHash(), $User);
                 $BasketOrder->import(\json_decode($products, true));
+
+                $productsCalc = $BasketOrder->getProducts()->toArray();
+                $products     = $productsCalc['products'];
+
+                // set the order products to the basket
+                $Basket->import($products);
             } catch (QUI\Exception $Exception) {
                 Log::writeDebugException($Exception);
             }
+        } else {
+            $Basket->import(\json_decode($products, true));
         }
 
         return $Basket->toArray();
diff --git a/locale.xml b/locale.xml
index 53c7b2ec..e8fca604 100644
--- a/locale.xml
+++ b/locale.xml
@@ -752,6 +752,21 @@
             <de><![CDATA[Artikelnummer im Warenkorb anzeigen]]></de>
             <en><![CDATA[Show article number in shopping cart]]></en>
         </locale>
+        <locale name="order.settings.orderProcess.mergeSameProducts">
+            <de><![CDATA[Gleiche Produkte zusammenführen]]></de>
+            <en><![CDATA[Merge the same products]]></en>
+        </locale>
+        <locale name="order.settings.orderProcess.mergeSameProducts.description">
+            <de><![CDATA[
+            Beim Hinzufügen eines Produktes werden gleiche Produkte zu einem Produkt zusammen geführt
+            und die Anzahl dementsprechend erhöht.
+            Ist diese Option nicht aktiviert bekommt jedes Hinzufügen eines Produktes eine eigene Position.
+            ]]></de>
+            <en><![CDATA[
+            When a product is added, identical products are merged into one product and the number is increased accordingly.
+            If this option is not activated, each product added will have its own position.
+            ]]></en>
+        </locale>
 
         <locale name="exception.order.process.not.found">
             <de><![CDATA[Keinen Bestellprozess gefunden. Bitte legen Sie einen Bestellprozess an.]]></de>
diff --git a/settings.xml b/settings.xml
index f91212eb..6cb84169 100644
--- a/settings.xml
+++ b/settings.xml
@@ -64,6 +64,10 @@
                     <type><![CDATA[bool]]></type>
                     <defaultvalue><![CDATA[1]]></defaultvalue>
                 </conf>
+                <conf name="mergeSameProducts">
+                    <type><![CDATA[bool]]></type>
+                    <defaultvalue><![CDATA[1]]></defaultvalue>
+                </conf>
             </section>
 
             <section name="paymentsChangeable"/>
@@ -84,6 +88,30 @@
                     </text>
                     <icon>fa fa-shopping-basket</icon>
 
+                    <settings title="orderProcess" name="orderProcess">
+                        <title>
+                            <locale group="quiqqer/order" var="order.process.settings.title"/>
+                        </title>
+
+                        <input type="checkbox" conf="orderProcess.showArticleNumberInBasket">
+                            <text>
+                                <locale group="quiqqer/order"
+                                        var="order.settings.orderProcess.showArticleNumberInBasket"/>
+                            </text>
+                        </input>
+
+                        <input type="checkbox" conf="orderProcess.mergeSameProducts">
+                            <text>
+                                <locale group="quiqqer/order"
+                                        var="order.settings.orderProcess.mergeSameProducts"/>
+                            </text>
+                            <description>
+                                <locale group="quiqqer/order"
+                                        var="order.settings.orderProcess.mergeSameProducts.description"/>
+                            </description>
+                        </input>
+                    </settings>
+
                     <settings title="order" name="order">
                         <title>
                             <locale group="quiqqer/order" var="order.settings.title"/>
@@ -225,19 +253,6 @@
                         </input>
                     </settings>
 
-                    <settings title="orderProcess" name="orderProcess">
-                        <title>
-                            <locale group="quiqqer/order" var="order.process.settings.title"/>
-                        </title>
-
-                        <input type="checkbox" conf="orderProcess.showArticleNumberInBasket">
-                            <text>
-                                <locale group="quiqqer/order"
-                                        var="order.settings.orderProcess.showArticleNumberInBasket"/>
-                            </text>
-                        </input>
-                    </settings>
-
                     <settings title="order" name="order">
                         <title>
                             <locale group="quiqqer/order" var="order.settings.paymentsChangeable.title"/>
diff --git a/src/QUI/ERP/Order/Basket/BasketOrder.php b/src/QUI/ERP/Order/Basket/BasketOrder.php
index 948b70ac..e8e8078b 100644
--- a/src/QUI/ERP/Order/Basket/BasketOrder.php
+++ b/src/QUI/ERP/Order/Basket/BasketOrder.php
@@ -175,18 +175,30 @@ public function getProducts()
      * Add a product to the basket
      *
      * @param Product $Product
-     * @throws QUI\Exception
      */
     public function addProduct(Product $Product)
     {
-        $this->List->addProduct($Product);
+        /** @noinspection \QUI\Exception */
+        $Package = QUI::getPackage('quiqqer/order');
+        $Config  = $Package->getConfig();
+        $merge   = \boolval($Config->getValue('orderProcess', 'mergeSameProducts'));
+
+        if (!$merge) {
+            $this->List->addProduct($Product);
+        } else {
+            $Products = $this->List->getProducts();
+
+            foreach ($Products as $Product) {
+
+            }
+        }
 
         if ($this->hasOrder()) {
-            try {
+            if (!$merge) {
                 $this->getOrder()->addArticle($Product->toArticle());
-                $this->save();
-            } catch (QUI\Exception $Exception) {
             }
+
+            $this->save();
         }
     }
 
@@ -228,6 +240,64 @@ public function import($products = [])
             $products = [];
         }
 
+        $Package = QUI::getPackage('quiqqer/order');
+        $Config  = $Package->getConfig();
+        $merge   = \boolval($Config->getValue('orderProcess', 'mergeSameProducts'));
+
+        if ($merge) {
+            $newProductList = [];
+
+            $getCompareProductArray = function ($product) {
+                $compare = [];
+                $needles = [
+                    'id',
+                    'title',
+                    'articleNo',
+                    'description',
+                    'unitPrice',
+                    'displayPrice',
+                    'class',
+                    'customFields',
+                    'customData',
+                    'display_unitPrice'
+                ];
+
+                foreach ($needles as $f) {
+                    if (isset($product[$f])) {
+                        $compare[$f] = $product[$f];
+                    }
+                }
+
+                return $compare;
+            };
+
+            $getProductIndex = function ($product) use (&$newProductList, $getCompareProductArray) {
+                foreach ($newProductList as $index => $p) {
+                    $p1 = \serialize($getCompareProductArray($product));
+                    $p2 = \serialize($getCompareProductArray($p));
+
+                    if ($p1 == $p2) {
+                        return $index;
+                    }
+                }
+
+                return false;
+            };
+
+            foreach ($products as $product) {
+                $index = $getProductIndex($product);
+
+                if ($index !== false) {
+                    $newProductList[$index]['quantity'] = $newProductList[$index]['quantity'] + $product['quantity'];
+                    continue;
+                }
+
+                $newProductList[] = $product;
+            }
+
+            $products = $newProductList;
+        }
+
         $this->List = QUI\ERP\Order\Utils\Utils::importProductsToBasketList(
             $this->List,
             $products
-- 
GitLab