From ed68aefbe994ff39f464d85b1fbc595cfa7b46a5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Patrick=20M=C3=BCller?= <p.mueller@pcsg.de>
Date: Thu, 13 Jul 2017 09:52:43 +0200
Subject: [PATCH] =?UTF-8?q?feat:=20Extra-Daten=20f=C3=BCr=20Mitgliedschaft?=
 =?UTF-8?q?s-Benutzer?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 bin/controls/users/MembershipUserHistory.css  |  8 ++
 bin/controls/users/MembershipUserHistory.html |  1 +
 bin/controls/users/MembershipUserHistory.js   | 49 +++++++++++-
 database.xml                                  |  1 +
 locale.xml                                    | 16 +++-
 .../Memberships/Products/MembershipField.php  | 39 +---------
 .../Memberships/Users/CancelVerification.php  |  5 ++
 src/QUI/Memberships/Users/Handler.php         |  4 +-
 src/QUI/Memberships/Users/MembershipUser.php  | 74 ++++++++++++++++---
 9 files changed, 144 insertions(+), 53 deletions(-)

diff --git a/bin/controls/users/MembershipUserHistory.css b/bin/controls/users/MembershipUserHistory.css
index 9f8bcdc..865c708 100644
--- a/bin/controls/users/MembershipUserHistory.css
+++ b/bin/controls/users/MembershipUserHistory.css
@@ -10,6 +10,14 @@
     width: 100%;
 }
 
+.quiqqer-memberships-membershipuserhistory-user {
+    float: left;
+}
+
+.quiqqer-memberships-membershipuserhistory-extrabtn {
+    float: right;
+}
+
 .quiqqer-memberships-membershipuserhistory-history-entry {
     float: left;
     width: 100%;
diff --git a/bin/controls/users/MembershipUserHistory.html b/bin/controls/users/MembershipUserHistory.html
index 6452871..979ac84 100644
--- a/bin/controls/users/MembershipUserHistory.html
+++ b/bin/controls/users/MembershipUserHistory.html
@@ -6,4 +6,5 @@
         {{membershipLabel}}: {{membership}}
     </span>
 </div>
+<div class="quiqqer-memberships-membershipuserhistory-extrabtn"></div>
 <div class="quiqqer-memberships-membershipuserhistory-history"></div>
\ No newline at end of file
diff --git a/bin/controls/users/MembershipUserHistory.js b/bin/controls/users/MembershipUserHistory.js
index d5a5672..337133d 100644
--- a/bin/controls/users/MembershipUserHistory.js
+++ b/bin/controls/users/MembershipUserHistory.js
@@ -18,6 +18,8 @@
 define('package/quiqqer/memberships/bin/controls/users/MembershipUserHistory', [
 
     'qui/controls/Control',
+    'qui/controls/buttons/Button',
+    'qui/controls/windows/Confirm',
     'qui/controls/loader/Loader',
 
     'package/quiqqer/memberships/bin/MembershipUsers',
@@ -29,7 +31,7 @@ define('package/quiqqer/memberships/bin/controls/users/MembershipUserHistory', [
     'text!package/quiqqer/memberships/bin/controls/users/MembershipUserHistory.html',
     'css!package/quiqqer/memberships/bin/controls/users/MembershipUserHistory.css'
 
-], function (QUIControl, QUILoader, MembershipUsersHandler,
+], function (QUIControl, QUIButton, QUIConfirm, QUILoader, MembershipUsersHandler,
              QUILocale, QUIAjax, Mustache, template) {
     "use strict";
 
@@ -43,7 +45,8 @@ define('package/quiqqer/memberships/bin/controls/users/MembershipUserHistory', [
         Binds: [
             '$onInject',
             '$onCreate',
-            '$load'
+            '$load',
+            '$showExtraData'
         ],
 
         options: {
@@ -142,7 +145,7 @@ define('package/quiqqer/memberships/bin/controls/users/MembershipUserHistory', [
 
                     try {
                         var Message = JSON.decode(Entry.msg);
-                        msg = JSON.stringify(Message, null, 2);
+                        msg         = JSON.stringify(Message, null, 2);
                     } catch (e) {
                         // nothing, msg is not JSON formatted
                     }
@@ -153,6 +156,46 @@ define('package/quiqqer/memberships/bin/controls/users/MembershipUserHistory', [
                     }).inject(EntryElm);
                 }
             });
+
+            if (!Object.getLength(this.$MembershipUser.extraData)) {
+                return;
+            }
+
+            // extra btn
+            new QUIButton({
+                text     : QUILocale.get(lg, 'controls.users.membershipuserhistory.btn.extraData'),
+                textimage: 'fa fa-file',
+                events   : {
+                    onClick: this.$showExtraData
+                }
+            }).inject(
+                this.$Elm.getElement(
+                    '.quiqqer-memberships-membershipuserhistory-extrabtn'
+                )
+            );
+        },
+
+        $showExtraData: function () {
+            var extraData = JSON.stringify(this.$MembershipUser.extraData, null, 2);
+
+            new QUIConfirm({
+                maxHeight  : 600,
+                maxWidth   : 600,
+                'autoclose': true,
+
+                'information': '<pre>' + extraData + '</pre>',
+                'title'      : QUILocale.get(lg,
+                    'controls.membershipuserhistory.extraData.popup.title'
+                ),
+                'texticon'   : 'fa fa-file',
+                'icon'       : 'fa fa-file',
+
+                cancel_button: false,
+                ok_button    : {
+                    text     : 'OK',
+                    textimage: 'icon-ok fa fa-check'
+                }
+            }).open();
         }
     });
 });
diff --git a/database.xml b/database.xml
index cb97677..f667b60 100644
--- a/database.xml
+++ b/database.xml
@@ -35,6 +35,7 @@
             <field type="DATETIME NULL DEFAULT NULL">archiveDate</field>
             <field type="VARCHAR(255) NULL">archiveReason</field>
             <field type="MEDIUMTEXT NULL">history</field>
+            <field type="MEDIUMTEXT NULL">extraData</field>
         </table>
     </global>
 
diff --git a/locale.xml b/locale.xml
index 9daf514..470e8e9 100644
--- a/locale.xml
+++ b/locale.xml
@@ -539,10 +539,22 @@
             <de><![CDATA[Aufhebung der Kündigung durch Administrator]]></de>
             <en><![CDATA[Revocation of termination by administrator]]></en>
         </locale>
+        <locale name="controls.users.membershipuserhistory.entry.type.misc">
+            <de><![CDATA[Sonstige Information]]></de>
+            <en><![CDATA[Miscellaneous information]]></en>
+        </locale>
         <locale name="controls.users.membershipuserhistory.entry.type.cancel_abort">
             <de><![CDATA[Kündigung zurückgezogen]]></de>
             <en><![CDATA[Cancellation withdrawn]]></en>
         </locale>
+        <locale name="controls.users.membershipuserhistory.btn.extraData">
+            <de><![CDATA[Extra-Daten]]></de>
+            <en><![CDATA[Extra data]]></en>
+        </locale>
+        <locale name="controls.membershipuserhistory.extraData.popup.title">
+            <de><![CDATA[Extra-Daten]]></de>
+            <en><![CDATA[Extra data]]></en>
+        </locale>
 
         <!-- Control: users/MembershipUserHistoryPopup -->
         <locale name="controls.users.membershipuserhistorypopup.title">
@@ -924,8 +936,8 @@
             <en><![CDATA[Product title]]></en>
         </locale>
         <locale name="controls.products.membershipprouducts.create.popup.information" html="true">
-            <de><![CDATA[Sind Sie sicher, dass sie ein neues Produkt für die Mitgliedschaft <b>[title]</b> erstellen möchten?]]></de>
-            <en><![CDATA[Are you sure you want to create new product for the membership <b>[title]</b>?]]></en>
+            <de><![CDATA[Sind Sie sicher, dass sie ein neues Produkt für die Mitgliedschaft <b>[title]</b> erstellen möchten? Der Titel und die Kurzbeschreibung dieser Mitgliedschaft werden automatisch für das Produkt übernommen.]]></de>
+            <en><![CDATA[Are you sure you want to create new product for the membership <b>[title]</b>? Title and short description of this membership will be set automatically to the product.]]></en>
         </locale>
         <locale name="controls.products.membershipprouducts.create.popup.title">
             <de><![CDATA[Neues Produkt erstellen]]></de>
diff --git a/src/QUI/Memberships/Products/MembershipField.php b/src/QUI/Memberships/Products/MembershipField.php
index 118417e..d9f9189 100644
--- a/src/QUI/Memberships/Products/MembershipField.php
+++ b/src/QUI/Memberships/Products/MembershipField.php
@@ -13,6 +13,8 @@
 /**
  * Class MembershipField
  *
+ * This field represents the assignment of a Membership to a Product
+ *
  * @author www.pcsg.de (Patrick Müller)
  */
 class MembershipField extends Products\Field\Field
@@ -87,41 +89,4 @@ public function getJavaScriptControl()
     {
         return 'package/quiqqer/memberships/bin/controls/products/MembershipField';
     }
-
-    /**
-     * Return the view
-     *
-     * @return \QUI\ERP\Products\Field\View
-     */
-    public function getFrontendView()
-    {
-        return new FieldFrontendView($this->getFieldDataForView());
-    }
-
-//    /**
-//     * Return the field data for a view
-//     *
-//     * @return array
-//     */
-//    protected function getFieldDataForView()
-//    {
-//        $attributes = $this->getAttributes();
-//
-//        $tags     = $this->getValue();
-//        $viewTags = array();
-//
-//        foreach ($tags as $lang => $langTags) {
-//            if (!isset($viewTags[$lang])) {
-//                $viewTags[$lang] = array();
-//            }
-//
-//            foreach ($langTags as $tagData) {
-//                $viewTags[$lang][] = $tagData['tag'];
-//            }
-//        }
-//
-//        $attributes['value'] = $viewTags;
-//
-//        return $attributes;
-//    }
 }
diff --git a/src/QUI/Memberships/Users/CancelVerification.php b/src/QUI/Memberships/Users/CancelVerification.php
index 9b4d8e1..da50b2a 100644
--- a/src/QUI/Memberships/Users/CancelVerification.php
+++ b/src/QUI/Memberships/Users/CancelVerification.php
@@ -7,6 +7,11 @@
 use QUI\Verification\Verifier;
 use QUI;
 
+/**
+ * Class CancelVerification
+ *
+ * Verification process for MembershipUser cancellation by frontend user
+ */
 class CancelVerification implements VerificationInterface
 {
     /**
diff --git a/src/QUI/Memberships/Users/Handler.php b/src/QUI/Memberships/Users/Handler.php
index f669302..787d7e7 100644
--- a/src/QUI/Memberships/Users/Handler.php
+++ b/src/QUI/Memberships/Users/Handler.php
@@ -23,6 +23,7 @@ class Handler extends Factory
     const HISTORY_TYPE_DELETED          = 'deleted';
     const HISTORY_TYPE_ARCHIVED         = 'archived';
     const HISTORY_TYPE_EXTENDED         = 'extended';
+    const HISTORY_TYPE_MISC             = 'misc';
 
     const ARCHIVE_REASON_CANCELLED    = 'cancelled';
     const ARCHIVE_REASON_EXPIRED      = 'expired';
@@ -224,7 +225,8 @@ public function getChildAttributes()
             'cancelDate',
             'cancelled',
             'archiveReason',
-            'archiveDate'
+            'archiveDate',
+            'extraData'
         );
     }
 
diff --git a/src/QUI/Memberships/Users/MembershipUser.php b/src/QUI/Memberships/Users/MembershipUser.php
index 6eae92a..79b9128 100644
--- a/src/QUI/Memberships/Users/MembershipUser.php
+++ b/src/QUI/Memberships/Users/MembershipUser.php
@@ -114,7 +114,8 @@ protected function sendAutoExtendMail()
         }
 
         $subject = $this->getUser()->getLocale()->get(
-            'quiqqer/memberships', 'templates.mail.autoextend.subject'
+            'quiqqer/memberships',
+            'templates.mail.autoextend.subject'
         );
 
         $this->sendMail($subject, dirname(__FILE__, 5) . '/templates/mail_autoextend.html');
@@ -137,7 +138,8 @@ public function sendManualExtendMail()
         }
 
         $subject = $this->getUser()->getLocale()->get(
-            'quiqqer/memberships', 'templates.mail.manualextend.subject'
+            'quiqqer/memberships',
+            'templates.mail.manualextend.subject'
         );
 
         $this->sendMail($subject, dirname(__FILE__, 5) . '/templates/mail_manualextend.html');
@@ -440,13 +442,7 @@ public function getUser()
      */
     public function addHistoryEntry($type, $msg = "")
     {
-        $history = $this->getAttribute('history');
-
-        if (empty($history)) {
-            $history = array();
-        } else {
-            $history = json_decode($history, true);
-        }
+        $history = $this->getHistory();
 
         if (empty($msg)) {
             $msg = "";
@@ -578,7 +574,8 @@ public function getBackendViewData()
             'archived'        => $this->isArchived(),
             'archiveReason'   => $this->getAttribute('archiveReason'),
             'archiveDate'     => $this->getAttribute('archiveDate'),
-            'cancelled'       => $this->isCancelled()
+            'cancelled'       => $this->isCancelled(),
+            'extraData'       => $this->getExtraData()
         );
     }
 
@@ -634,4 +631,61 @@ protected function sendMail($subject, $templateFile, $templateVars = array())
         $Mailer->setBody($template);
         $Mailer->send();
     }
+
+    /**
+     * Set any extra text data to the MembershipUser
+     *
+     * This is meant for extra information that is not already covered by the history.
+     *
+     * @param string $key
+     * @param string $value
+     */
+    public function setExtraData($key, $value)
+    {
+        $extraData = $this->getExtraData();
+
+        $User       = QUI::getUserBySession();
+        $userString = $User->getUsername() . ' (' . $User->getId() . ')';
+        $editString = Utils::getFormattedTimestamp() . ' - ' . $userString;
+
+        if (isset($extraData[$key])) {
+            $extraData[$key]['edit']  = $editString;
+            $extraData[$key]['value'] = $value;
+        } else {
+            $extraData[$key] = array(
+                'value' => $value,
+                'add'   => $editString,
+                'edit'  => '-'
+            );
+        }
+
+        $this->setAttribute('extraData', json_encode($extraData));
+    }
+
+    /**
+     * Get extra data of this MembershipUser
+     *
+     * @param string $key (optional) - If omitted return all extra data
+     * @return array|string|false
+     */
+    public function getExtraData($key = null)
+    {
+        $extraData = $this->getAttribute('extraData');
+
+        if (empty($extraData)) {
+            $extraData = array();
+        } else {
+            $extraData = json_decode($extraData, true);
+        }
+
+        if (is_null($key)) {
+            return $extraData;
+        }
+
+        if (!array_key_exists($key, $extraData)) {
+            return false;
+        }
+
+        return $extraData[$key]['value'];
+    }
 }
-- 
GitLab