Odyssey
aMemberUsers.prg
1 <?php
2 /**
3  * @package MemberHub
4  * @author MGHandy
5  *
6  * @uses this script facilitates in viewing users related to the selected
7  * member account along with all sub-accounts.
8  *
9  * @uses view and select users in the user hub
10  * @uses view and selected user accounts in the member hub
11  *
12  * @param operation string: requested operation for this script
13  * @param payload string: encryption for the selected member
14  * @param mAccount string: operation= select member account, this
15  * is the requested member account to selected in the member hub.
16  *
17  * @return json
18  */
19 require_once("$admLibrary/aMemberSupport.i");
20 require_once("$admLibrary/userSearch.i");
21 
22 try {
23  $admVars = array();
24  $admOk = array(
25  "operation" => array("filter" => FILTER_SANITIZE_STRING),
26  "payload" => array("filter" => FILTER_SANITIZE_STRING),
27  "mSelect" => array("filter" => FILTER_SANITIZE_STRING)
28  );
29  HCU_ImportVars($admVars, "MEMBER_USERS", $admOk);
30 
31  $rOperation = isset($admVars["MEMBER_USERS"]["operation"]) ? $admVars["MEMBER_USERS"]["operation"] : null;
32  $rPayload = isset($admVars["MEMBER_USERS"]["payload"]) ? $admVars["MEMBER_USERS"]["payload"] : null;
33  $rSelect = isset($admVars["MEMBER_USERS"]["mSelect"]) ? $admVars["MEMBER_USERS"]["mSelect"] : null;
34 
35  $rMember = $rPayload ?
36  MemberDecrypt($SYSENV, $Cu, $rPayload) :
37  null;
38 
39  $rContext = $rPayload ?
40  MemberContext($SYSENV, $Cu, $rMember['member']) :
41  MemberContext($SYSENV, $Cu);
42 
43  $aryResult = array();
44  $aryReply = array();
45 
46  switch ($rOperation) {
47  case "":
49  break;
50  case "readMemberUsers":
51  header('Content-type: application/json');
52 
53  $rRelated = readMemberUsers($SYSENV, $dbh, $rContext);
54  $aryResult['data']['users'] = $rRelated['users'];
55  MemberReply($aryResult, $aryReply, $rOperation);
56  break;
57  default:
58  throw new Exception("Unknown server request: " . $rOperation);
59  break;
60  }
61 
62 } catch (Exception $e) {
63  $aryReply['errors'][] = $e->getMessage();
64  $aryResult['data'] = array();
65  $aryResult['info'] = array();
66 
67  MemberReply($aryResult, $aryReply, $rOperation);
68  exit;
69 }
70 
71 /**
72  * readMemberUsers:
73  * @uses read all users which have access to this member account in some way.
74  *
75  * @param array $pEnv: evironment object for debugging
76  * @param object $pDbh: database access variable
77  * @param array $pContext: array of data needed for multiple member hub functions:
78  * @throws Exception
79  * in this case the member accountnumber.
80  *
81  * @return array $sqlReturn: list of related users
82  */
83 function readMemberUsers($pEnv, $pDbh, $pContext) {
84  $cuTable = $pContext['cu_table'];
85  $cuCode = $pContext['cu_code'];
86  $cuAccount = $pContext['m_account'];
87 
88  $sqlReturn = [
89  'users' => []
90  ];
91 
92  //$sqlReturn = array();
93  $sqlColumns = "
94  u.user_name AS u_name,
95  u.is_group_primary AS u_primary,
96  ua.accounttype AS a_type,
97  ua.recordtype AS a_record,
98  ua.view_balances AS a_balances,
99  ua.view_transactions AS a_transactions";
100 
101  // main query will grab all sub accounts related to each user with
102  // access to this member account
103  $sqlSelect = "
104  SELECT $sqlColumns
105  FROM {$cuTable}useraccounts ua
106  INNER JOIN {$cuTable}user u ON u.user_id = ua.user_id
107  WHERE ua.accountnumber = '$cuAccount'
108  ORDER BY u.user_name, ua.accounttype";
109  $sqlSelectRs = db_query($sqlSelect, $pDbh);
110  if (!$sqlSelectRs) {
111  $pEnv['logger']->error(db_last_error());
112  throw new Exception("Failed to read related users.");
113  }
114 
115  $sqlData = [];
116  $result_arr = db_fetch_all($sqlSelectRs);
117 
118  if (! $result_arr) {
119  return $sqlReturn;
120  }
121 
122  foreach ($result_arr as $key => $value) {
123  $sqlData[$key] = $value;
124 
125  // add payload for each user name
126  // when user name is clicked, it will go to the user hub.
127  $sqlPayload = readUserSearch($pDbh, $cuCode, array(
128  "a" => array ("username"=>$value['u_name'])
129  ));
130 
131  // must url encode or spaces will appear and break
132  // the user hub script
133  $sqlPayload = urlencode($sqlPayload['encryption']);
134 
135  // add payload to user data
136  $sqlData[$key]['u_payload'] = $sqlPayload;
137  }
138 
139  $sqlReturn['users'] = $sqlData;
140  return $sqlReturn;
141 }
142 ?>
143 
144 <?php
145 /**
146  * @package PrintMemberUsers
147  * @uses print neccessary html/javascript to run the selected card
148  */
149 function PrintMemberUsers() { ?>
150 <div id="related">
151  <div id="status">
152 
153  </div>
154  <div class="hcu-secondary">
155  <div class="small vsgSecondary">
156  <span>The <span class="fa fa-asterisk"></span> means that the user is primary for a group.</span>
157  <br>
158  <span>Click a User's name to select that user in the User Hub.</span>
159  </div>
160  </div>
161  <div id="relatedGrid"></div>
162 
163  <div class="hcu-template">
164  <div class="hcu-edit-buttons k-state-default">
165  <span class="hcu-icon-delete">
166  </span>
167  <a href="##" id="lnkCancel">Cancel</a>
168  </div>
169  </div>
170 </div>
171 
172 <?php
173 /**
174  * @package MemberRelated
175  * @uses this object is used to display and interact with the member related users
176  * feature.
177  *
178  * @var Init public: call to initialize data/view/action objects
179  * @var Open public: call to open the mamber search module/window
180  * @var Close public: call to close the member search module/window
181  * @var Data public: call to load payload and member display into
182  * MemberRelated object for later use.
183  *
184  * @var InitDataSources private: initialize all data sources/objects
185  * @var InitDataViews private: initialize all data views/objects
186  * @var InitDataActions private: initialize all user actions on html.
187  *
188  * @var EventOpenWindow private: open kendoDialog/kendoWindow objects
189  * @var EventCloseWindow private: close kendoDialog/kendoWindow objects
190  * @var EventPopWindow private: remove the correct window from the window stack.
191  *
192  * @var Info* private: success/error message display.
193  *
194  * @var Event* private: other event functions explained by name.
195  * Some are entensions of kendo objects, others just help with events of html objects.
196  *
197  * @var Validate* private: validation functions for fors and other user
198  * input interactions.
199  *
200  * @var Action* private: these functions are calls from kendoDialog
201  * actions, each explained by function name.
202  */
203 
204 ?>
205 
206 <script type="text/javascript">
207 //# sourceURL=memberUsers.js
208 var MemberUsers = function() {
209  var mrCardContainer = null;
210  var mrCardWindows = null;
211 
212  var mrPayload = null;
213  var mrMember = null;
214  var mrCall = null;
215  var mrAction = null;
216 
217  var mrDataSource = null;
218 
219  var mrRelated = null;
220  var mrRelatedGrid = null;
221  var mrRelatedGridData = null;
222 
223  var mrCancel = null;
224 
225  var DataBuildUsers = function(data) {
226  mrRelatedGridData = [];
227 
228  var row = 0;
229  var currName = null;
230  var nextName = null;
231 
232  for (var i = 0; i < data.length; i++) {
233  if (currName != data[i].u_name) {
234  currName = data[i].u_name;
235  row = 0;
236  } else {
237  row ++;
238  }
239 
240  var user = {
241  u_row: row,
242  u_payload: data[i].u_payload.trim(),
243  u_name: data[i].u_name.trim(),
244  u_primary: data[i].u_primary == "t" ? true : false,
245  a_type: data[i].a_type.trim(),
246  a_record: data[i].a_record.trim(),
247  a_balances: data[i].a_balances == "t" ? "Y" : "N",
248  a_transactions: data[i].a_transactions == "t" ? "Y" : "N"
249  };
250 
251  mrRelatedGridData.push(user);
252  }
253 
254  mrRelatedGrid.dataSource.data(mrRelatedGridData);
255  }
256 
257  var EventMemberSelect = function(member) {
258  var memberRequest = {
259  operation: "selectMemberRelated",
260  mSelect: JSON.stringify(member)
261  };
262 
263  mrDataSource.transport.options.read.type = "POST";
264  mrDataSource.read(memberRequest);
265  }
266 
267  var EventOpenWindow = function(e) {
268  var windowElement = this.element[0];
269  var windowId = windowElement.id;
270 
271  switch (windowId) {
272 
273  }
274 
275  mrCardWindows.push(this);
276  }
277 
278  var EventCloseWindow = function(e) {
279  var windowElement = this.element[0];
280  var windowId = windowElement.id;
281 
282  switch (mrAction) {
283  default:
284  EventPopWindow(windowId);
285  break;
286  }
287 
288  mrAction = null;
289  }
290 
291  var EventPopWindow = function(windowId) {
292  var popIndex = -1;
293  for (var i = 0; i < mrCardWindows.length; i++) {
294  var openWindow = mrCardWindows[i].element[0];
295  var openId = openWindow.id;
296 
297  if (openId == windowId) {
298  popIndex = i;
299  break;
300  }
301  }
302 
303  if (popIndex > -1) {
304  mrCardWindows.splice(popIndex, 1);
305  }
306  }
307 
308  var InitDataSources = function() {
309  mrDataSource = new kendo.data.DataSource({
310  transport: {
311  read: {
312  url: "main.prg",
313  dataType: "json",
314  contentType: "application/x-www-form-urlencoded",
315  type: "GET",
316  data: {
317  ft: "103103"
318  },
319  cache: false
320  }
321  },
322  requestStart: function(request) {
323  showWaitWindow();
324  },
325  requestEnd: function(response) {
326  setTimeout(hideWaitWindow, 500);
327 
328  if (response.hasOwnProperty("response")) {
329  if (response.response.hasOwnProperty("Results")) {
330  var results = response.response.Results;
331 
332  if (results.hasOwnProperty("error")) {
333  $.homecuValidator.homecuResetMessage = true;
334  $.homecuValidator.displayMessage(results.error, $.homecuValidator.settings.statusError);
335  } else if (results.hasOwnProperty("info")) {
336  $.homecuValidator.homecuResetMessage = true;
337  $.homecuValidator.displayMessage(results.info, $.homecuValidator.settings.statusSuccess);
338  }
339  } else {
340  $.homecuValidator.displayMessage("Error Parsing Server", $.homecuValidator.settings.statusError);
341  }
342  } else {
343  $.homecuValidator.displayMessage("Error Parsing Server", $.homecuValidator.settings.statusError);
344  }
345  },
346  schema: {
347  parse: function(response) {
348  var results = null;
349  var resultData = null;
350  var resultOperation = null;
351 
352  if (response.hasOwnProperty("Results")) {
353  results = response.Results;
354  resultData = results.data;
355  resultOperation = results.operation;
356  }
357 
358  if (results.hasOwnProperty("errors")) {
359  return [];
360  }
361 
362  if (resultData == undefined || resultData == null) {
363  return [];
364  }
365 
366  setTimeout(function() {
367  switch (resultOperation) {
368  case "readMemberUsers":
369  DataBuildUsers(resultData.users);
370  mrMember.cardTitle= "Group Info";
371  var template= kendo.template($("#titleTemplate").html());
372  mrRelated.title(template(mrMember)).center().open();
373  break;
374  }
375  }, 500);
376  return [];
377  }
378  }
379  });
380  }
381 
382  var InitDataViews = function() {
383  mrRelated = mrCardContainer.find("#related").kendoWindow({
384  title: "Related Users",
385  minWidth: 300,
386  maxWidth: 768,
387  maxHeight: 900,
388  modal: true,
389  visible: false,
390  resizable: false,
391  activate: EventOpenWindow,
392  close: EventCloseWindow,
393  open: function(e) {
394  this.wrapper.css({ top: 100 });
395  }
396  }).data("kendoWindow");
397 
398  var restrictionTemplate= kendo.template("<span>\\# if (#: code # == 'Y') { \\# <div class='restriction allow readonly hcu-all-100'><i class='fa fa-check'></i></div> "
399  + "\\# } else { \\#<div class='restriction ban readonly hcu-all-100'><i class='fa fa-ban'></i></div> \\# } \\#</span>");
400 
401  mrRelatedGrid = $("#relatedGrid").kendoGrid({
402  dataSource: {
403  data: mrRelatedGridData
404  },
405  noRecords: {
406  template: "<span class=\"hcu-secondary\"><span class=\"vsgSecondary\">No Records Found</span></span>"
407  },
408  columns: [
409  { title: " ", width: "35px",
410  template: "#if(u_primary && u_row == 0){#<span class=\"fa fa-asterisk\"></span>#}#" },
411  { field: "u_name", title: "User Name",
412  template: "#if(u_row == 0) {#<a href=\"main.prg?ft=22&payload=#=u_payload#\">#= u_name #<i class=\"fa fa-user fa-fw\"></i></span>#}#" },
413  { field: "a_type", title: "Account",
414  template: "<span>#= a_type #</span>" },
415  { field: "a_record", title: "Type",
416  template: "<span># if(a_record == \"L\"){# Loan #}else{# Deposit #}#</span>" },
417  { field: "a_balances", title: "Balances",
418  template: restrictionTemplate({code: "a_balances"}) },
419  { field: "a_transactions", title: "History",
420  template: restrictionTemplate({code: "a_transactions"}) }
421  ]
422  }).data("kendoGrid");
423 
424  mrCancel = $("#lnkCancel");
425  mrInfoBar = $("#relatedInfo");
426  mrInfoBar.hide();
427  }
428 
429  var InitDataActions = function() {
430  mrCancel.off();
431  mrCancel.on("click", function() {
432  mrRelated.close();
433  });
434  }
435 
436  this.Data = function(message, member) {
437  mrPayload = message;
438  mrMember = member;
439  }
440 
441  this.Open = function(windowStack) {
442  // setup validator
443  $.homecuValidator.setup({
444  formStatusField: "status",
445  formValidate: "related"
446  });
447 
448  mrCardWindows = windowStack;
449  var memberRequest = {
450  operation: "readMemberUsers",
451  payload: mrPayload
452  };
453 
454  mrDataSource.transport.options.read.type = "POST";
455  mrDataSource.read(memberRequest);
456  }
457 
458  this.Close = function() {
459  mrRelated.destroy();
460 
461  // reset validator for hub cript
462  $.homecuValidator.setup({
463  formStatusField: "formStatus",
464  formValidate: "cardContainerDiv"
465  });
466  }
467 
468  this.Init = function(hubCall, cardContainer) {
469  mrCall = hubCall;
470  mrCardContainer = cardContainer;
471 
472  InitDataSources();
473  InitDataViews();
474  InitDataActions();
475 
476  mrCall("MemberUsers", this);
477  }
478 }
479 </script>
480 <?php }
Definition: User.php:7