19 require_once(
"$admLibrary/aMemberSupport.i");
24 "operation" => array(
"filter" => FILTER_SANITIZE_STRING),
25 "payload" => array(
"filter" => FILTER_SANITIZE_STRING),
26 "mHistory" => array(
"filter" => FILTER_SANITIZE_STRING)
28 HCU_ImportVars($admVars,
"MEMBER_DELETE", $admOk);
30 $dOperation = isset($admVars[
"MEMBER_DELETE"][
"operation"]) ? $admVars[
"MEMBER_DELETE"][
"operation"] :
null;
31 $dPayload = isset($admVars[
"MEMBER_DELETE"][
"payload"]) ? $admVars[
"MEMBER_DELETE"][
"payload"] :
null;
32 $dHistory = isset($admVars[
"MEMBER_DELETE"][
"mHistory"]) ? $admVars[
"MEMBER_DELETE"][
"mHistory"] :
null;
34 $dMember = $dPayload ?
35 MemberDecrypt($SYSENV, $Cu, $dPayload) :
38 $dContext = $dPayload ?
39 MemberContext($SYSENV, $Cu, $dMember[
'member']) :
40 MemberContext($SYSENV, $Cu);
45 switch ($dOperation) {
49 case "memberReadHistory":
50 header(
'Content-type: application/json');
52 $dHistory = MemberReadHistory($SYSENV, $dbh, $dContext);
53 $aryResult[
'data'][
'history'] = $dHistory[
'history'];
54 MemberReply($aryResult, $aryReply, $dOperation);
56 case "memberDeleteHistory":
57 header(
'Content-type: application/json');
59 $dValidateHistory = MemberValidateHistory($SYSENV, $dContext, $dHistory);
60 $dDelete = MemberDeleteHistory($SYSENV, $dbh, $dContext, $dValidateHistory);
61 $dHistory = MemberReadHistory($SYSENV, $dbh, $dContext);
63 $aryResult[
'info'] = isset($dDelete[
'message']) ? $dDelete[
'message'] :
"";
64 $aryResult[
'data'][
'history'] = $dHistory[
'history'];
65 MemberReply($aryResult, $aryReply, $dOperation);
68 throw new Exception(
"Unknown server request: " . $dOperation);
72 }
catch (Exception $e) {
73 $aryReply[
'errors'][] = $e->getMessage();
74 $aryResult[
'data'] = array();
75 $aryResult[
'info'] = array();
77 MemberReply($aryResult, $aryReply, $dOperation);
81 function MemberValidateHistory($pEnv, $pContext, $pHistory) {
82 $cuMember = $pContext[
'm_account'];
84 $sList = html_entity_decode($pHistory, ENT_QUOTES);
85 $dList = HCU_JsonDecode($sList);
88 foreach ($dList as $action => $set) {
89 $dValidate[$action] = array();
91 foreach ($set as $key => $value) {
92 $dValidate[$action][] = array(
93 "_action" =>
"delete",
94 "accounttype" => prep_save($value[
'aType'], 25)
102 function MemberDeleteHistory($pEnv, $pDbh, $pContext, $pHistory) {
104 $cuTable = $pContext[
'cu_table'];
105 $cuCode = $pContext[
'cu_code'];
106 $cuMember = $pContext[
'm_account'];
108 $cuHistoryLoan = $pHistory[
'loan'];
109 $cuHistoryDeposit = $pHistory[
'deposit'];
111 $sqlReturn = array();
119 $sqlTrans =
"BEGIN TRANSACTION";
120 $sqlTransRs = db_query($sqlTrans, $pDbh);
123 if (count($cuHistoryDeposit) > 0) {
124 foreach ($cuHistoryDeposit as $key => $value) {
126 DELETE FROM {$cuTable}accounthistory 127 WHERE accountnumber = '$cuMember' 128 AND accounttype = '{$value['accounttype']}';";
133 if (count($cuHistoryLoan) > 0) {
134 foreach ($cuHistoryLoan as $key => $value) {
136 DELETE FROM {$cuTable}loanhistory 137 WHERE accountnumber = '$cuMember' 138 AND loannumber = '{$value['accounttype']}';";
143 $sqlDeleteRs = db_query($sqlDelete, $pDbh);
145 $pEnv[
'logger']->error(db_last_error());
146 throw new Exception(
"Failed to delete sub-account history.");
150 $sqlTrans =
"COMMIT TRANSACTION";
151 $sqlTransRs = db_query($sqlTrans, $pDbh);
153 }
catch (Exception $e) {
155 $pEnv[
'logger']->error(db_last_error());
158 $sqlTrans =
"ROLLBACK TRANSACTION";
159 $sqlTransRs = db_query($sqlTrans, $pDbh);
160 throw new Exception($e->getMessage());
164 if (count($cuHistoryDeposit) > 0) { $sqlReturn[
'message'][] =
"Deposit account history has been deleted successfully."; }
165 if (count($cuHistoryLoan) > 0) { $sqlReturn[
'message'][] =
"Loan account history has been deleted successfully.";}
169 function MemberReadHistory($pEnv, $pDbh, $pContext) {
170 $cuTable = $pContext[
'cu_table'];
171 $cuCode = $pContext[
'cu_code'];
172 $cuMember = $pContext[
'm_account'];
174 $sqlReturn = array();
177 DISTINCT ON (lb.loannumber) lb.loannumber AS a_type, 178 lb.accountnumber AS a_number, 179 lb.description AS a_desc, 183 FROM {$cuTable}loanhistory lh 184 WHERE lh.accountnumber = '$cuMember' 185 AND lh.loannumber = lb.loannumber";
187 SELECT $sqlColumns, ($sqlSub) AS a_count 188 FROM {$cuTable}loanbalance lb 189 WHERE lb.accountnumber = '$cuMember'";
190 $sqlSelectRs = db_query($sqlSelect, $pDbh);
192 $pEnv[
'logger']->error(db_last_error());
193 throw new Exception(
"Failed to read transaction history for loan accounts.");
195 $sqlData[
'loan'] = db_fetch_all($sqlSelectRs);
198 DISTINCT ON (ab.accounttype) ab.accounttype AS a_type, 199 ab.accountnumber AS a_number, 200 ab.description AS a_desc, 201 'Deposit' AS a_record";
204 FROM {$cuTable}accounthistory ah 205 WHERE ah.accountnumber = '$cuMember' 206 AND ah.accounttype = ab.accounttype";
208 SELECT $sqlColumns, ($sqlSub) AS a_count 209 FROM {$cuTable}accountbalance ab 210 WHERE ab.accountnumber = '$cuMember'";
211 $sqlSelectRs = db_query($sqlSelect, $pDbh);
213 $pEnv[
'logger']->error(db_last_error());
214 throw new Exception(
"Failed to read transaction history for deposit accounts.");
216 $sqlData[
'deposit'] = db_fetch_all($sqlSelectRs);
217 $sqlData[
'history'] = array();
219 if (is_array($sqlData[
'deposit'])) { $sqlData[
'history'] = array_merge($sqlData[
'history'], $sqlData[
'deposit']); }
220 if (is_array($sqlData[
'loan'])) { $sqlData[
'history'] = array_merge($sqlData[
'history'], $sqlData[
'loan']); }
222 $sqlReturn[
'history'] = $sqlData[
'history'];
235 <div
id=
"status"></div>
237 <h3>Deposit Accounts</h3>
238 <div
id=
"mdGridDeposit"></div>
240 <h3>Loan Accounts</h3>
241 <div
id=
"mdGridLoan"></div>
243 <div
class=
"hcu-template">
244 <div
class=
"hcu-edit-buttons k-state-default">
245 <span
class=
"hcu-icon-delete">
247 <a href=
"##" id=
"lnkCancel">Cancel</a>
249 <a href=
"##" id=
"btnUpdate" class=
"k-button k-primary">
250 <i
class=
"fa fa-trash fa-lg"></i>
258 <p>You are about to
delete the transaction history
for the selected accounts.</p>
259 <p>Do you wish to
continue?</p>
295 <script type=
"text/javascript">
296 var MemberDelete =
function() {
297 var mdCardContainer =
null;
298 var mdCardWindows =
null;
300 var mdPayload =
null;
304 var mdDataSource =
null;
305 var mdHistory =
null;
306 var mdGridLoan =
null;
307 var mdGridDeposit =
null;
308 var mdGridDataLoan =
null;
309 var mdGridDataDeposit =
null;
310 var mdTooltip =
null;
312 var mdConfirm =
null;
316 var ValidateHistoryDirty =
function() {
319 data = mdGridDeposit.dataSource.data();
320 for (var i = 0; i < data.length; i++) {
321 if (data[i].aDelete) {
return true; }
324 data = mdGridLoan.dataSource.data();
325 for (var i = 0; i < data.length; i++) {
326 if (data[i].aDelete) {
return true; }
332 var DataAccountsSort =
function(data) {
333 if (data.length < 2) {
337 var middle = Math.floor(data.length / 2);
338 var left = data.slice(0, middle);
339 var right = data.slice(middle);
341 return DataAccountsMerge(DataAccountsSort(left), DataAccountsSort(right));
344 var DataAccountsMerge =
function(left, right) {
349 while (xLeft < left.length && xRight < right.length) {
350 if (left[xLeft].aType < right[xRight].aType) {
351 sort.push(left[xLeft++]);
353 sort.push(right[xRight++]);
357 return sort.concat(left.slice(xLeft), right.slice(xRight));
360 var DataBuildHistory =
function(data) {
362 mdGridDataDeposit = [];
363 for (var i = 0; i < data.length; i++) {
365 aCount: parseInt(data[i].a_count),
366 aDesc: data[i].a_desc ? data[i].a_desc.trim() :
null,
367 aNumber: data[i].a_number ? data[i].a_number.trim() :
null,
368 aRecord: data[i].a_record ? data[i].a_record.trim() :
null,
369 aType: data[i].a_type ? data[i].a_type.trim() :
null,
373 if (account.aRecord ==
"Loan") {
374 mdGridDataLoan.push(account);
376 mdGridDataDeposit.push(account);
380 mdGridDataLoan = DataAccountsSort(mdGridDataLoan);
381 mdGridDataDeposit = DataAccountsSort(mdGridDataDeposit);
382 mdGridLoan.dataSource.data(mdGridDataLoan);
383 mdGridDeposit.dataSource.data(mdGridDataDeposit);
384 $(
"#dp_DFT").prop(
"checked",
false);
385 $(
"#ln_DFT").prop(
"checked",
false);
388 var EventCheckBoxChange =
function(e) {
389 var box = $(e.target);
390 var boxId = box.attr(
"id");
391 var boxGrid = boxId.substring(0, 2);
392 var boxType = boxId.substring(3, boxId.length);
393 var boxValue = box.prop(
"checked");
396 $(
"input[id=" + boxGrid +
"_DFT]").prop(
"checked",
false);
399 if (boxType ==
"DFT") {
400 $(
"input[id^=" + boxGrid +
"_]:not(:disabled)").each(
function(e) {
402 $(
this).prop(
"checked", boxValue);
403 $(
this).trigger(
"change");
407 var row = box.closest(
"tr");
408 var rowItem = boxGrid ==
"dp" ?
409 mdGridDeposit.dataItem(row) :
410 mdGridLoan.dataItem(row);
412 rowItem.aDelete = boxValue;
415 var rowCheckAll =
true;
416 $(
"input[id^=" + boxGrid +
"_]").closest(
".k-grid").find(
"tr").each(
function(i) {
418 var rowItem = boxGrid ==
"dp" ?
419 mdGridDeposit.dataItem(row) :
420 mdGridLoan.dataItem(row);
422 if (!rowItem.aDelete && rowItem.aCount > 0) { rowCheckAll =
false; }
426 $(
"#" + boxGrid +
"_DFT").prop(
"checked",
true);
430 var EventOpenWindow =
function(e) {
431 var windowElement = this.element[0];
432 var windowId = windowElement.id;
438 mdCardWindows.push(
this);
441 var EventCloseWindow =
function(e) {
442 var windowElement = this.element[0];
443 var windowId = windowElement.id;
446 case "historyDelete":
448 if (ValidateHistoryDirty()) {
452 case "deleteConfirm":
459 data = mdGridDeposit.dataSource.data();
460 for (var i = 0; i < data.length; i++) {
463 memberData.deposit.push(item);
467 data = mdGridLoan.dataSource.data();
468 for (var i = 0; i < data.length; i++) {
471 memberData.loan.push(item);
475 var memberRequest = {
476 operation:
"memberDeleteHistory",
478 mHistory: JSON.stringify(memberData)
481 mdDataSource.transport.options.read.type =
"POST";
482 mdDataSource.read(memberRequest);
484 EventPopWindow(windowId);
487 EventPopWindow(windowId);
488 if (windowId ===
"mdDelete") {
490 $.homecuValidator.setup({
491 formStatusField:
"formStatus" 500 var EventPopWindow =
function(windowId) {
502 for (var i = 0; i < mdCardWindows.length; i++) {
503 var openWindow = mdCardWindows[i].element[0];
504 var openId = openWindow.id;
506 if (openId == windowId) {
513 mdCardWindows.splice(popIndex, 1);
517 var InitDataSources =
function() {
518 mdDataSource =
new kendo.data.DataSource({
523 contentType:
"application/x-www-form-urlencoded",
531 requestStart:
function(request) {
534 requestEnd:
function(response) {
535 setTimeout(hideWaitWindow, 500);
537 if (response.hasOwnProperty(
"response")) {
538 if (response.response.hasOwnProperty(
"Results")) {
539 var results = response.response.Results;
541 if (results.hasOwnProperty(
"error")) {
542 $.homecuValidator.homecuResetMessage =
true;
543 $.homecuValidator.displayMessage(results.error, $.homecuValidator.settings.statusError);
544 }
else if (results.hasOwnProperty(
"info")) {
545 $.homecuValidator.homecuResetMessage =
true;
546 $.homecuValidator.displayMessage(results.info, $.homecuValidator.settings.statusSuccess);
549 $.homecuValidator.displayMessage(
"Error Parsing Server", $.homecuValidator.settings.statusError);
552 $.homecuValidator.displayMessage(
"Error Parsing Server", $.homecuValidator.settings.statusError);
556 parse:
function(response) {
558 var resultData =
null;
559 var resultOperation =
null;
561 if (response.hasOwnProperty(
"Results")) {
562 results = response.Results;
563 resultData = results.data;
564 resultOperation = results.operation;
567 if (results.hasOwnProperty(
"errors")) {
571 if (resultData == undefined || resultData ==
null) {
575 setTimeout(
function() {
576 switch (resultOperation) {
577 case "memberReadHistory":
578 DataBuildHistory(resultData.history);
579 mdMember.cardTitle=
"Delete Account History";
580 var
template= kendo.template($(
"#titleTemplate").html());
581 mdHistory.title(
template(mdMember)).center().open();
583 case "memberDeleteHistory":
584 DataBuildHistory(resultData.history);
594 var InitDataViews =
function() {
595 mdHistory = $(
"#mdHistory").kendoWindow({
596 title:
"Delete History",
603 activate: EventOpenWindow,
604 close: EventCloseWindow,
606 this.wrapper.css({ top: 100 });
608 }).data(
"kendoWindow");
610 mdGridDeposit = $(
"#mdGridDeposit").kendoGrid({
614 dataBound:
function() {
615 $(
"#mdGridDeposit input[id^=dp_]").off();
616 $(
"#mdGridDeposit input[id^=dp_]").on(
"change", EventCheckBoxChange);
617 $(this.tbody).find(
"tr").each(
function(i) {
618 var rowData = mdGridDeposit.dataItem(
this);
619 var rowColumns = $(
this).find(
"td");
621 $(
this).css(
"cursor",
"pointer");
622 $(
this).css(
"background",
"transparent");
624 if (rowData.aCount == 0) {
625 $(rowColumns[0]).find(
"input").attr(
"disabled",
true);
626 $(rowColumns[0]).addClass(
"vsgDisabled");
627 $(rowColumns[1]).addClass(
"vsgDisabled");
628 $(rowColumns[2]).addClass(
"vsgDisabled");
629 $(rowColumns[3]).addClass(
"vsgDisabled");
634 var row = $(this.select());
635 row.removeClass(
"k-state-selected");
636 row.find(
"input[id^=dp_]").trigger(
"click");
640 template:
"<span class=\"hcu-secondary\"><span class=\"vsgSecondary\">No Records Found</span></span>" 643 { field:
"aDelete", width:
"25px",
644 template:
"<input type=\"checkbox\" style=\"margin-top:-2px;\" id=\"dp_#=aType#\"/>",
645 headerTemplate:
"<input type=\"checkbox\" style=\"margin-top: -2px;\" id=\"dp_DFT\"/>" },
646 { field:
"aType", title:
"Account", width:
"150px" },
647 { field:
"aDesc", title:
"Description",
648 template:
"#if(aDesc){# <span>#=aDesc#</span> #}else{# <span>(no description)</span> #}#" }
650 }).data(
"kendoGrid");
652 mdGridLoan = $(
"#mdGridLoan").kendoGrid({
656 dataBound:
function() {
657 $(
"#mdGridLoan input[id^=ln_]").off();
658 $(
"#mdGridLoan input[id^=ln_]").on(
"change", EventCheckBoxChange);
659 $(this.tbody).find(
"tr").each(
function(i) {
660 var rowData = mdGridLoan.dataItem(
this);
661 var rowColumns = $(
this).find(
"td");
663 $(
this).css(
"cursor",
"pointer");
664 $(
this).css(
"background",
"transparent");
666 if (rowData.aCount == 0) {
667 $(rowColumns[0]).find(
"input").attr(
"disabled",
true);
668 $(rowColumns[0]).addClass(
"vsgDisabled");
669 $(rowColumns[1]).addClass(
"vsgDisabled");
670 $(rowColumns[2]).addClass(
"vsgDisabled");
671 $(rowColumns[3]).addClass(
"vsgDisabled");
676 var row = $(this.select());
677 row.removeClass(
"k-state-selected");
678 row.find(
"input[id^=ln_]").trigger(
"click");
682 template:
"<span class=\"hcu-secondary\"><span class=\"vsgSecondary\">No Records Found</span></span>" 685 { field:
"aDelete", width:
"25px",
686 template:
"<input type=\"checkbox\" style=\"margin-top:-2px;\" id=\"ln_#=aType#\"/>",
687 headerTemplate:
"<input type=\"checkbox\" style=\"margin-top: -2px;\" id=\"ln_DFT\"/>" },
688 { field:
"aType", title:
"Account", width:
"150px" },
689 { field:
"aDesc", title:
"Description",
690 template:
"#if(aDesc){# <span>#=aDesc#</span> #}else{# <span>(no description)</span> #}#" }
692 }).data(
"kendoGrid");
694 mdTooltip = homecuTooltip.defaults;
695 mdTooltip.filter =
".vsgDisabled";
696 mdTooltip.content =
"This sub-account has no transaction history";
697 $(
"#mdGridDeposit").kendoTooltip(mdTooltip);
698 $(
"#mdGridLoan").kendoTooltip(mdTooltip);
700 mdConfirm = $(
"#mdConfirm").kendoDialog({
701 title:
"Confirm Delete",
706 show: EventOpenWindow,
707 close: EventCloseWindow,
710 action:
function() { mdAction =
"deleteDeny"; }
712 { text:
"Yes", primary:
true,
713 action:
function() { mdAction =
"deleteConfirm"; }
716 }).data(
"kendoDialog");
718 mdCancel = $(
"#lnkCancel");
719 mdDelete = $(
"#btnUpdate");
720 mdStatus = $(
"#mdStatus");
724 var InitDataActions =
function() {
726 mdCancel.on(
"click",
function() { mdAction =
"historyCancel"; mdHistory.close(); });
728 mdDelete.on(
"click",
function() { mdAction =
"historyDelete"; mdHistory.close(); });
731 this.Data =
function(message, member) {
736 this.Open =
function(windowStack) {
738 $.homecuValidator.setup({
739 formStatusField:
"status",
742 mdCardWindows = windowStack;
743 var memberRequest = {
744 operation:
"memberReadHistory",
748 mdDataSource.transport.options.read.type =
"POST";
749 mdDataSource.read(memberRequest);
752 this.Close =
function() {
757 this.Init =
function(hubCall, cardContainer) {
759 mdCardContainer = cardContainer;
765 mdCall(
"MemberDelete",
this);