From f209a96df50bcc002b65c4d936f1e957758e059a Mon Sep 17 00:00:00 2001
From: Henning Leutz <leutz@pcsg.de>
Date: Mon, 5 Aug 2019 10:46:34 +0200
Subject: [PATCH] fix: shipping validation if no shipping entry is valid

---
 .../controls/shippingRules/RuleWindow.js      |  1 +
 .../Methods/Standard/ShippingType.php         |  9 +++++--
 src/QUI/ERP/Shipping/Order/Shipping.php       |  4 ++-
 src/QUI/ERP/Shipping/Rules/ShippingRule.php   | 27 +++++++++----------
 src/QUI/ERP/Shipping/Types/ShippingEntry.php  | 27 +++++++++++++++++++
 5 files changed, 51 insertions(+), 17 deletions(-)

diff --git a/bin/backend/controls/shippingRules/RuleWindow.js b/bin/backend/controls/shippingRules/RuleWindow.js
index 55ad69f..536ab85 100644
--- a/bin/backend/controls/shippingRules/RuleWindow.js
+++ b/bin/backend/controls/shippingRules/RuleWindow.js
@@ -83,6 +83,7 @@ define('package/quiqqer/shipping/bin/backend/controls/shippingRules/RuleWindow',
             this.$Rule.update().then(function () {
                 self.Loader.hide();
                 self.fireEvent('updateEnd', [self]);
+                self.close();
             });
         }
     });
diff --git a/src/QUI/ERP/Shipping/Methods/Standard/ShippingType.php b/src/QUI/ERP/Shipping/Methods/Standard/ShippingType.php
index a2784b9..7a44b06 100644
--- a/src/QUI/ERP/Shipping/Methods/Standard/ShippingType.php
+++ b/src/QUI/ERP/Shipping/Methods/Standard/ShippingType.php
@@ -40,17 +40,22 @@ public function getIcon()
 
     /**
      * @param QUI\ERP\Order\OrderInterface $Order
-     * @param QUI\ERP\Shipping\Api\ShippingInterface $ShippingEntry
+     * @param QUI\ERP\Shipping\Types\ShippingEntry $ShippingEntry
      * @return bool
      */
     public function canUsedInOrder(
         QUI\ERP\Order\OrderInterface $Order,
-        QUI\ERP\Shipping\Api\ShippingInterface $ShippingEntry
+        QUI\ERP\Shipping\Types\ShippingEntry $ShippingEntry
     ) {
         if ($ShippingEntry->isActive() === false) {
             return false;
         }
 
+        if (!$ShippingEntry->isValid()) {
+            return false;
+        }
+
+
         // assignment
         $articles   = $ShippingEntry->getAttribute('articles');
         $categories = $ShippingEntry->getAttribute('categories');
diff --git a/src/QUI/ERP/Shipping/Order/Shipping.php b/src/QUI/ERP/Shipping/Order/Shipping.php
index fe86603..e176b48 100644
--- a/src/QUI/ERP/Shipping/Order/Shipping.php
+++ b/src/QUI/ERP/Shipping/Order/Shipping.php
@@ -66,7 +66,9 @@ public function getBody()
         foreach ($userShipping as $ShippingEntry) {
             $ShippingEntry->setOrder($Order);
 
-            if ($ShippingEntry->canUsedInOrder($Order) && $ShippingEntry->canUsedBy($User)) {
+            if ($ShippingEntry->isValid()
+                && $ShippingEntry->canUsedInOrder($Order)
+                && $ShippingEntry->canUsedBy($User)) {
                 $shippingList[] = $ShippingEntry;
             }
         }
diff --git a/src/QUI/ERP/Shipping/Rules/ShippingRule.php b/src/QUI/ERP/Shipping/Rules/ShippingRule.php
index 00f897c..b9c5311 100644
--- a/src/QUI/ERP/Shipping/Rules/ShippingRule.php
+++ b/src/QUI/ERP/Shipping/Rules/ShippingRule.php
@@ -89,20 +89,19 @@ public function __construct($id, Factory $Factory)
             }
 
             // purchase
-            if (empty($attributes['purchase_quantity_from'])) {
-                $attributes['purchase_quantity_from'] = null;
-            }
-
-            if (empty($attributes['purchase_quantity_to'])) {
-                $attributes['purchase_quantity_until'] = null;
-            }
-
-            if (empty($attributes['purchase_value_to'])) {
-                $attributes['purchase_value_until'] = null;
-            }
-
-            if (empty($attributes['purchase_value_to'])) {
-                $attributes['purchase_value_until'] = null;
+            $nullEmpty = [
+                'purchase_quantity_from',
+                'purchase_quantity_until',
+                'purchase_value_from',
+                'purchase_value_until',
+                'unit_value',
+                'unit'
+            ];
+
+            foreach ($nullEmpty as $k) {
+                if (empty($attributes[$k])) {
+                    $attributes[$k] = null;
+                }
             }
 
             // update for saving
diff --git a/src/QUI/ERP/Shipping/Types/ShippingEntry.php b/src/QUI/ERP/Shipping/Types/ShippingEntry.php
index 27d2bed..5183de1 100644
--- a/src/QUI/ERP/Shipping/Types/ShippingEntry.php
+++ b/src/QUI/ERP/Shipping/Types/ShippingEntry.php
@@ -594,6 +594,33 @@ public function getShippingRules()
         return $result;
     }
 
+    /**
+     * Can the shipping be used basically?
+     *
+     * @return bool
+     */
+    public function isValid()
+    {
+        if (!$this->isActive()) {
+            return false;
+        }
+
+        $shippingRules = $this->getAttribute('shipping_rules');
+        $shippingRules = \json_decode($shippingRules, true);
+
+        if (!\is_array($shippingRules)) {
+            return true;
+        }
+
+        $rules = $this->getShippingRules();
+
+        if (empty($rules)) {
+            return false;
+        }
+
+        return true;
+    }
+
     //endregion
 
     /**
-- 
GitLab