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