From 1e42ef8f9487539a81035a08b12b9e518074c023 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Mon, 17 Jul 2017 12:54:28 +0200
Subject: [PATCH] feat: Save product ID in MembershipUser

---
 database.xml                                 |  3 ++
 src/QUI/Memberships/Events.php               | 39 ++++++++++++++++++++
 src/QUI/Memberships/Membership.php           | 10 ++++-
 src/QUI/Memberships/Users/Handler.php        |  3 +-
 src/QUI/Memberships/Users/MembershipUser.php |  4 ++
 5 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/database.xml b/database.xml
index f667b60..54ad5a6 100644
--- a/database.xml
+++ b/database.xml
@@ -36,6 +36,9 @@
             <field type="VARCHAR(255) NULL">archiveReason</field>
             <field type="MEDIUMTEXT NULL">history</field>
             <field type="MEDIUMTEXT NULL">extraData</field>
+
+            <!-- quiqqer/products fields -->
+            <field type="BIGINT(20) NULL">productId</field>
         </table>
     </global>
 
diff --git a/src/QUI/Memberships/Events.php b/src/QUI/Memberships/Events.php
index 3edbbe2..cab4ee2 100644
--- a/src/QUI/Memberships/Events.php
+++ b/src/QUI/Memberships/Events.php
@@ -5,10 +5,12 @@
 use QUI;
 use QUI\Package\Package;
 use QUI\Memberships\Handler as MembershipsHandler;
+use QUI\Memberships\Users\Handler as MembershipUsersHandler;
 use QUI\Memberships\Products\MembershipField;
 use QUI\ERP\Products\Handler\Fields as ProductFields;
 use QUI\ERP\Products\Handler\Categories as ProductCategories;
 use QUI\ERP\Products\Handler\Search as ProductSearchHandler;
+use QUI\ERP\Products\Product\Product;
 
 /**
  * Class Events
@@ -45,6 +47,43 @@ public static function onPackageSetup(Package $Package)
         }
     }
 
+    /**
+     * quiqqer/products: onQuiqqerProductsProductDelete
+     *
+     * @param Product $Product
+     * @return void
+     */
+    public static function onQuiqqerProductsProductDelete(Product $Product)
+    {
+        // check if Product is assigned to a Membership
+        $membershipId = $Product->getFieldValue(MembershipField::FIELD_ID);
+
+        if (empty($membershipId)) {
+            return;
+        }
+
+        // delete Product ID from MembershipUsers
+        try {
+            $Membership      = MembershipsHandler::getInstance()->getChild($membershipId);
+            $MembershipUsers = MembershipUsersHandler::getInstance();
+
+            $membershipUserIds = $Membership->searchUsers(array(
+                'productId' => $Product->getId()
+            ));
+
+            foreach ($membershipUserIds as $membershipUserId) {
+                $MembershipUser = $MembershipUsers->getChild($membershipUserId);
+                $MembershipUser->setAttribute('productId', null);
+                $MembershipUser->update();
+            }
+        } catch (\Exception $Exception) {
+            QUI\System\Log::addError(
+                self::class . ' :: onQuiqqerProductsProductDelete -> '
+                . $Exception->getMessage()
+            );
+        }
+    }
+
     /**
      * quiqqer/products
      *
diff --git a/src/QUI/Memberships/Membership.php b/src/QUI/Memberships/Membership.php
index 608f7c3..12a1287 100644
--- a/src/QUI/Memberships/Membership.php
+++ b/src/QUI/Memberships/Membership.php
@@ -314,6 +314,14 @@ public function searchUsers($searchParams, $archivedOnly = false, $countOnly = f
             $where[] = '(' . implode(' OR ', $whereOR) . ')';
         }
 
+        if (!empty($searchParams['productId'])) {
+            $where[]            = '`musers`.productId = :productId';
+            $binds['productId'] = array(
+                'value' => (int)$searchParams['productId'],
+                'type'  => \PDO::PARAM_INT
+            );
+        }
+
         // build WHERE query string
         if (!empty($where)) {
             $sql .= " WHERE " . implode(" AND ", $where);
@@ -440,7 +448,7 @@ public function getProducts()
         try {
             $result = $Search->search(array(
                 'fields' => array(
-                    MembershipField::FIELD_ID => "$this->id"
+                    MembershipField::FIELD_ID => "$this->id" // has to be string
                 )
             ));
         } catch (QUI\Permissions\Exception $Exception) {
diff --git a/src/QUI/Memberships/Users/Handler.php b/src/QUI/Memberships/Users/Handler.php
index 787d7e7..af7fe5b 100644
--- a/src/QUI/Memberships/Users/Handler.php
+++ b/src/QUI/Memberships/Users/Handler.php
@@ -226,7 +226,8 @@ public function getChildAttributes()
             'cancelled',
             'archiveReason',
             'archiveDate',
-            'extraData'
+            'extraData',
+            'productId'
         );
     }
 
diff --git a/src/QUI/Memberships/Users/MembershipUser.php b/src/QUI/Memberships/Users/MembershipUser.php
index cd8f3ac..2fc95bb 100644
--- a/src/QUI/Memberships/Users/MembershipUser.php
+++ b/src/QUI/Memberships/Users/MembershipUser.php
@@ -448,6 +448,10 @@ public function addHistoryEntry($type, $msg = "")
             $msg = "";
         }
 
+        if (is_array($msg)) {
+            $msg = json_encode($msg);
+        }
+
         $User = QUI::getUserBySession();
 
         $history[] = array(
-- 
GitLab