Odyssey
aMemberHub.prg
1 <?php
2 /**
3  * @package MemberHub
4  * @author MGHandy
5  *
6  * @uses admin users may search and select members. Upon selecting members, the admin user
7  * will have the options of viewing the member's related users, account settings, MemberMicrs,
8  * check images, e-statements, external keys as well as adding new mmber accounts.
9  *
10  * @uses payload entry point: pre-select a member account by sending an encrypted
11  * payload to the member hub from another script.
12  *
13  * @param $operation string: selected member hub operation, not currently needed.
14  * @param $payload string: encrypted data string holding member information
15  * to be displayed.
16  */
17 
18 require_once("$admLibrary/aMemberSupport.i");
19 
20 // There are permissions for these things.
21 // Handle it the same way as the other permissions: greyed out.
22 // Without this fix, there is some ugliness when trying to access.
23 $imagesPerm = checkPerm($Cn, "MemCheck", $Cu)[1] == 1;
24 $estatementPerm = checkPerm($Cn, "MemStatement", $Cu)[1] == 1;
25 
26 try {
27  $admVars = array();
28  $admOk = array(
29  "operation" => array("filter" => FILTER_SANITIZE_STRING),
30  "payload" => array("filter" => FILTER_SANITIZE_STRING)
31  );
32  HCU_ImportVars($admVars, "ACCOUNT_HUB", $admOk);
33 
34 
35  $mOperation = isset($admVars["ACCOUNT_HUB"]["operation"]) ? $admVars["ACCOUNT_HUB"]["operation"] : null;
36  $mPayload = isset($admVars["ACCOUNT_HUB"]["payload"]) ? $admVars["ACCOUNT_HUB"]["payload"] : null;
37 
38  // if a payload exists, decode into group array
39  $mMember = $mPayload ?
40  MemberDecrypt($SYSENV, $Cu, $mPayload) :
41  null;
42 
43  $mMember = HCU_JsonEncode($mMember);
44 
45  PrintMemberHub($mPayload, $mMember, $Cn == strtolower(trim($Cu)), $imagesPerm, $estatementPerm);
46 
47 } catch (Exception $e) {
48  $SYSENV['logger']->error($e->getMessage());
49  exit;
50 }
51 ?>
52 
53 <?php
54 /**
55  * @package PrintMemberHub
56  * @uses print neccessary html/javascript to run the member hub script
57  */
58 function PrintMemberHub($pPayload, $pMember, $isMasterUser, $imagesPerm, $estatementPerm) {
59  $isImagesDisabled = $imagesPerm ? "false" : "true";
60  $isEstatementDisabled = $estatementPerm ? "false" : "true";
61 ?>
62 
63 <script type="text/x-kendo-template" id="contentSearch">
64  <div class='search' data-name="#: name #" data-ft="#: ft #"><a href='\\#'><i class='fa #: icon # fa-3x'></i><br>#: text #</a></div>
65 </script>
66 
67 <script type="text/x-kendo-template" id="contentResults">
68 <div class="infoDiv">
69 # if (display) { #
70  <?php printHubLabelBlock(array("Member Account" => "# if (m_account == null) { # (None) # } else { # #: m_account # # } #",
71  "Bill Pay ID" => "# if (m_payid == null || m_payid == '') { # (Not Set) # } else { # #: m_payid # # } #",
72  "Restriction" => "# if (m_restr == 'L') { # Locked # } else if (m_restr == 'R') { # Read Only # } else { # Unlocked # } #",
73  "RDC Setting" => "# if (m_rdc == null) { # (Not Set) # } else { # #: m_rdc # # } #",
74  "eStatements" => "# if (m_stmnt == null) { # (Not Set) # } else if (m_stmnt.trim().toLowerCase() == 'y') { # Yes # } else { # No # } #")); ?>
75 # } else { #
76  <div class='noUserFound'><div>No Account Found</div></div>
77 # } #
78 </div>
79 </script>
80 
81 <script type="text/x-kendo-template" id="contentCards">
82  <div class="col-md-4 col-xs-6 cardDiv openFt aa #if(disabled){#vsgDisabled#}#" data-name="#: name #" data-ft="#: ft #">
83  <a href="\\#" class="goBtn">
84  <div class="features-column center col-md-12">
85  <div class="features-box-header">
86  <i class="fa fa-3x #: icon #"></i>
87  <h6 class='textSpan'>#: text #</h6>
88  </div>
89 
90  <div class="feature-box-content center col-md-11">
91  <p class="vsgSecondary hidden-xs hidden-sm">#= desc #</p>
92  </div>
93  </div>
94  </a>
95  </div>
96 </script>
97 <script id="titleTemplate" type="text/x-kendo-template">
98  Account Hub # if (cardTitle != null && cardTitle.trim() != "") { # / #: cardTitle # # } #
99  # if (m_account != null && m_account.trim() != "") { # / #: m_account # # } #
100 </script>
101 
102 <div id="cardContainerDiv">
103  <div class="well well-sm borderless">
104  <h2 class="hubTitle"><span class="hcu-breadcrumb">Account Hub</span></h2>
105  <div id="resultContainerDiv"></div>
106  </div>
107 </div>
108 <div id="cardContent"></div>
109 
110 <?php
111 /**
112  * @package MemberHub
113  * @uses this object is used to display and interact with the member hub and its features.
114  *
115  * @var Init public: public call to initialize data/view/action objects,
116  * @var Call public: callback for group modules to update display or encryption.
117  * This function facilitates updating/loading request modules with encrypted group data
118  * as well as display of selected group data.
119  *
120  * @var InitDataSources private: initialize all data sources/objects
121  * @var InitDataViews private: initialize all data views/objects
122  * @var InitDataActions private: initialize all user actions on html.
123  *
124  * @var EventCardClick private: send request to view the clicked module.
125  */
126 ?>
127 <script type="text/javascript">
128 //# sourceURL=memberHub.js
129 <?php getShowWaitFunctions(); ?>
130 var memberWindows = null;
131 var memberHub = null;
132 
133 var MemberHub = function() {
134  mhPayload = null;
135  mhMember = null;
136 
137  mhWindowContainer = null;
138  mhWindow = null;
139 
140  mhHeader = null;
141  mhHeaderContent = null;
142  mhHeaderResultsContent = null;
143  mhHeaderSearchView = null;
144  mhHeaderResultsView = null;
145 
146  mhCards = null;
147  mhCardsView = null;
148  mhCardsData = null;
149 
150  var EventCardClick = function(e) {
151  var card = $(this);
152  var cardFt = card.data("ft");
153  var cardName = card.data("name");
154 
155  if (mhCardsData[cardName].display.disabled) {
156  return;
157  }
158 
159  // close on the card object will call the kendo
160  // destory for every window and dialog for that card
161  // in order to keep the html clear and save memory.
162  if (mhWindow) {
163  mhWindow.Close();
164  }
165 
166  // clear out any left over html from the content div
167  // load the clicked card
168  $(mhWindowContainer).empty();
169  $(mhWindowContainer).load("main.prg?ft=" + cardFt, function(response) {
170  switch (cardName) {
171  case "MemberSearch":
172  mhWindow = new MemberSearch();
173  break;
174  case "MemberUsers":
175  mhWindow = new MemberUsers();
176  break;
177  case "MemberSettings":
178  mhWindow = new MemberSettings();
179  break;
180  case "MemberAccounts":
181  mhWindow = new MemberAccounts();
182  break;
183  case "MemberImages":
184  mhWindow = new MemberImages();
185  break;
186  case "MemberDelete":
187  mhWindow = new MemberDelete();
188  break;
189  case "MemberMicrs":
190  mhWindow = new MemberMicrs();
191  break;
192  case "MemberEStatements":
193  mhWindow = new MemberEStatements();
194  break;
195  case "MemberPurge":
196  mhWindow = new MemberPurge();
197  break;
198  }
199 
200  // give the card a fresh window stack
201  memberWindows = [];
202 
203  // initialize the card with the callback function
204  // to the hub.
205  // Open the card giving it the new window stack.
206  mhWindow.Init(memberHub.Call, mhWindowContainer);
207  mhWindow.Open(memberWindows);
208  });
209  }
210 
211  var InitDataSources = function() {
212  mhCardsData = {
213  /*"MemberAdd": {
214  display: {
215  ft: "",
216  name: "MemberAdd", desc: "Add a new member account.",
217  text: "Add Member", icon: "fa-plus", disabled: true }
218  },*/
219  "MemberUsers": {
220  display: {
221  ft: "103103",
222  name: "MemberUsers", desc: "Show users that can access this member account",
223  text: "Related Users", icon: "fa-sitemap", disabled: false }
224  },
225  "MemberAccounts": {
226  display: {
227  ft: "103105",
228  name: "MemberAccounts", desc: "Show all the accounts for users of this member account",
229  text: "Related Accounts", icon: "fa-arrows-alt", disabled: false }
230  },
231  "MemberSettings": {
232  display: {
233  ft: "103104",
234  name: "MemberSettings", desc: "Information and settings for this member account",
235  text: "Account Settings", icon: "fa-cogs", disabled: false }
236  },
237  "MemberMicrs": {
238  display: {
239  ft: "103106",
240  name: "MemberMicrs", desc: "MICR overrides for this member account",
241  text: "MICR", icon: "fa-wrench", disabled: false }
242  },
243  "MemberImages": {
244  display: {
245  ft: "103109",
246  name: "MemberImages", desc: "View check images for this member account",
247  text: "View Check Images", icon: "fa-image", disabled: <?php echo $isImagesDisabled; ?> }
248  },
249  "MemberEStatements": {
250  display: {
251  ft: "103108",
252  name: "MemberEStatements", desc: "View eStatements for this member account",
253  text: "View eStatements", icon: "fa-file-pdf-o", disabled: <?php echo $isEstatementDisabled; ?> }
254  },
255  // "MemberDelete": {
256  // display: {
257  // ft: "103107",
258  // name: "MemberDelete", desc: "Delete the transaction history for sub-accounts of this member account",
259  // text: "Delete Account History", icon: "fa-trash", disabled: false }
260  // },
261  "MemberPurge": {
262  display: {
263  ft: "103110",
264  name: "MemberPurge", desc: "Purge this member account from the system",
265  text: "Purge Account", icon: "fa-minus-circle", disabled: false }
266  },
267  "MemberSearch": {
268  display: {
269  ft: "103102",
270  name: "MemberSearch", desc: "",
271  text: "Search", icon: "fa-search", disabled: false }
272  }
273  };
274  }
275 
276  var InitDataViews = function() {
277  mhHeader = $("#resultContainerDiv");
278  mhHeaderSearchContent = kendo.template($("#contentSearch").html());
279  mhHeaderResultsContent = kendo.template($("#contentResults").html());
280  mhHeaderSearchView = mhHeaderSearchContent(mhCardsData["MemberSearch"].display);
281  mhHeaderResultsView = mhHeaderResultsContent({display: false});
282  mhHeader.append(mhHeaderSearchView);
283  mhHeader.append(mhHeaderResultsView);
284 
285  mhCards = $("#cardContainerDiv");
286  mhCardsContent = kendo.template($("#contentCards").html());
287  mhCards.find(".cardDiv").hide();
288 
289  mhWindowContainer = $("#cardContent");
290  }
291 
292  var InitDataActions = function() {
293  mhHeader.find(".search").off();
294  mhHeader.find(".search").on("click", EventCardClick);
295  mhCards.find(".cardDiv").off();
296  mhCards.find(".cardDiv").on("click", EventCardClick);
297  }
298 
299  this.Call = function(action, data) {
300  // Populate breadcrumb at top of hub page
301  if (data.member != null)
302  {
303  var template= kendo.template($("#titleTemplate").html());
304  $(".hubTitle").html(template({m_account: data.member.m_account, cardTitle: null}));
305  }
306 
307  switch (action) {
308  case "updateMemberInfo":
309  // unencrypted member data for display to the member hub
310  // data is the member information to be displayed
311  // empty the display, put new data in
312  mhMember = data.member;
313  mhMember.m_account = mhMember.m_account == null ? "" : mhMember.m_account.trim();
314  mhMember.m_stmnt = mhMember.m_stmnt.trim();
315  mhMember.m_payid = mhMember.m_payid == null ? null : mhMember.m_payid.trim();
316  mhMember.m_rdc = mhMember.m_rdc == null ? null : mhMember.m_rdc;
317  mhMember.m_restr = mhMember.m_restr == null ? "" : mhMember.m_restr.trim();
318  mhMember.m_image = mhMember.m_image == null ? "" : mhMember.m_image.trim();
319  mhMember.display = true;
320 
321  mhHeader.empty();
322  mhHeaderSearchView = mhHeaderSearchContent(mhCardsData["MemberSearch"].display);
323  mhHeaderResultsView = mhHeaderResultsContent(mhMember);
324  mhHeader.append(mhHeaderSearchView);
325  mhHeader.append(mhHeaderResultsView);
326 
327  mhCardsView = "";
328  for(var key in mhCardsData) {
329  if (key == "MemberSearch") { continue; }
330  <?php if ($imagesPerm) { ?>
331  if (key == "MemberImages") {
332  if (mhMember.m_image == "NO") {
333  mhCardsData[key].display.disabled = true;
334  } else {
335  mhCardsData[key].display.disabled = false;
336  }
337  }
338  <?php } ?>
339  <?php if ($estatementPerm) { ?>
340  if (key == "MemberEStatements") {
341  var thisDisabled = false;
342  <?php if (!$isMasterUser) { ?>
343  thisDisabled = thisDisabled || mhMember.m_employee === "Y";
344  <?php } ?>
345  thisDisabled = thisDisabled || mhMember.m_stmnt !== "Y";
346  mhCardsData[key].display.disabled = thisDisabled;
347  }
348  <?php } ?>
349  mhCardsView += mhCardsContent(mhCardsData[key].display);
350  }
351  mhCards.find(".cardDiv").remove();
352  mhCards.append(mhCardsView);
353  mhCards.show();
354 
355  InitDataActions();
356  break;
357  case "updateMemberEncrypt":
358 
359  // data is the updated member encryption payload.
360  // this will be given to each card as it is opened.
361  mhPayload = data;
362  break;
363  default:
364 
365  // loaded card needs to get payload and member info
366  // data is the actual javascript card object,
367  // Data is the public function we pass the payload and member info
368  // for saving to the object
369  data.Data(mhPayload, mhMember);
370  break;
371  }
372  }
373 
374  this.Init = function(payload, member) {
375  InitDataSources();
376  InitDataViews();
377  InitDataActions();
378 
379  if (payload && member.member) {
380  this.Call("updateMemberEncrypt", payload);
381  this.Call("updateMemberInfo", member);
382  } else {
383  mhHeader.find(".search").trigger("click");
384  }
385  }
386 }
387 
388 $(document).ready(function() {
389  var payload = "<?php echo $pPayload ?>";
390  var member = <?php echo $pMember ?>;
391 
392  memberWindows = [];
393  memberHub = new MemberHub();
394  memberHub.Init(payload, member);
395 });
396 
397 $(document).on("click", ".k-overlay", function() {
398  if (memberWindows.length > 0) {
399  var openWindow = memberWindows[memberWindows.length - 1];
400  openWindow.close();
401  }
402 });
403 
404 </script>
405 <?php }