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