From 7917f46a651000ff16e5ad2644d97552469c3013 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Wed, 6 May 2020 10:54:48 +0200
Subject: [PATCH] feat: runtime cache for user brutto/netto status

---
 src/QUI/ERP/Utils/User.php | 56 ++++++++++++++++++++++++++++----------
 1 file changed, 41 insertions(+), 15 deletions(-)

diff --git a/src/QUI/ERP/Utils/User.php b/src/QUI/ERP/Utils/User.php
index 3be79e2..ac0dd53 100644
--- a/src/QUI/ERP/Utils/User.php
+++ b/src/QUI/ERP/Utils/User.php
@@ -27,6 +27,13 @@ class User
      */
     const IS_BRUTTO_USER = 2;
 
+    /**
+     * Runtime cache for user brutt/netto status
+     *
+     * @var array
+     */
+    protected static $userBruttoNettoStatus = [];
+
     /**
      * Return the brutto netto status
      * is the user a netto or brutto user
@@ -36,15 +43,22 @@ class User
      */
     public static function getBruttoNettoUserStatus(UserInterface $User)
     {
+        $uid = $User->getId();
+
+        if (isset(self::$userBruttoNettoStatus[$uid])) {
+            return self::$userBruttoNettoStatus[$uid];
+        }
+
         if (QUI::getUsers()->isSystemUser($User)) {
-            return self::IS_NETTO_USER;
+            self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+            return self::$userBruttoNettoStatus[$uid];
         }
 
         if ($User instanceof QUI\ERP\User && $User->hasBruttoNettoStatus()) {
-            return $User->isNetto();
+            self::$userBruttoNettoStatus[$uid] = $User->isNetto();
+            return self::$userBruttoNettoStatus[$uid];
         }
 
-
         $nettoStatus = $User->getAttribute('quiqqer.erp.isNettoUser');
 
         if (\is_numeric($nettoStatus)) {
@@ -54,20 +68,23 @@ public static function getBruttoNettoUserStatus(UserInterface $User)
         switch ($nettoStatus) {
             case self::IS_NETTO_USER:
             case self::IS_BRUTTO_USER:
-                return $nettoStatus;
+                self::$userBruttoNettoStatus[$uid] = $nettoStatus;
+                return self::$userBruttoNettoStatus[$uid];
         }
 
         $euVatId = $User->getAttribute('quiqqer.erp.euVatId');
         $taxId   = $User->getAttribute('quiqqer.erp.taxId');
 
         if (!empty($euVatId) || !empty($taxId)) {
-            return self::IS_NETTO_USER;
+            self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+            return self::$userBruttoNettoStatus[$uid];
         }
 
         try {
             $Package = QUI::getPackage('quiqqer/tax');
         } catch (QUI\Exception $Exception) {
-            return self::IS_BRUTTO_USER;
+            self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
+            return self::$userBruttoNettoStatus[$uid];
         }
 
         try {
@@ -75,7 +92,8 @@ public static function getBruttoNettoUserStatus(UserInterface $User)
         } catch (QUI\Exception $Exception) {
             QUI\System\Log::writeDebugException($Exception);
 
-            return self::IS_NETTO_USER;
+            self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+            return self::$userBruttoNettoStatus[$uid];
         }
 
         // @todo quiqqer.erp.isNettoUser beachten, die eigenschaft ist besser, gab es damals noch nicht
@@ -88,10 +106,12 @@ public static function getBruttoNettoUserStatus(UserInterface $User)
                 && $Address->getAttribute('company')
             ) {
                 if ($Config->getValue('shop', 'companyForceBruttoPrice')) {
-                    return self::IS_BRUTTO_USER;
+                    self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
+                    return self::$userBruttoNettoStatus[$uid];
                 }
 
-                return self::IS_NETTO_USER;
+                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+                return self::$userBruttoNettoStatus[$uid];
             }
 
             if (\is_array($Address)
@@ -99,10 +119,12 @@ public static function getBruttoNettoUserStatus(UserInterface $User)
                 && $Address['company'] == 1
             ) {
                 if ($Config->getValue('shop', 'companyForceBruttoPrice')) {
-                    return self::IS_BRUTTO_USER;
+                    self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
+                    return self::$userBruttoNettoStatus[$uid];
                 }
 
-                return self::IS_NETTO_USER;
+                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+                return self::$userBruttoNettoStatus[$uid];
             }
         } catch (QUI\Exception $Exception) {
             // no address found
@@ -114,7 +136,8 @@ public static function getBruttoNettoUserStatus(UserInterface $User)
         $isNetto = $Config->getValue('shop', 'isNetto');
 
         if ($isNetto) {
-            return self::IS_NETTO_USER;
+            self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+            return self::$userBruttoNettoStatus[$uid];
         }
 
 
@@ -122,13 +145,16 @@ public static function getBruttoNettoUserStatus(UserInterface $User)
             $Tax = QUI\ERP\Tax\Utils::getTaxByUser($User);
 
             if ($Tax->getValue() == 0) {
-                return self::IS_NETTO_USER;
+                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+                return self::$userBruttoNettoStatus[$uid];
             }
         } catch (QUI\Exception $Exception) {
-            return self::IS_NETTO_USER;
+            self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
+            return self::$userBruttoNettoStatus[$uid];
         }
 
-        return self::IS_BRUTTO_USER;
+        self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
+        return self::$userBruttoNettoStatus[$uid];
     }
 
     /**
-- 
GitLab