13 require_once(
"$admLibrary/aMemberSupport.i");
18 "operation" => array(
"filter" => FILTER_SANITIZE_STRING),
19 "payload" => array(
"filter" => FILTER_SANITIZE_STRING)
21 HCU_ImportVars($admVars,
"MEMBER_PURGE", $admOk);
23 $dOperation = isset($admVars[
"MEMBER_PURGE"][
"operation"]) ? $admVars[
"MEMBER_PURGE"][
"operation"] :
null;
24 $dPayload = isset($admVars[
"MEMBER_PURGE"][
"payload"]) ? $admVars[
"MEMBER_PURGE"][
"payload"] :
null;
29 $dMember = $dPayload ? MemberDecrypt($SYSENV, $Cu, $dPayload) : null;
32 $dContext = $dPayload ? MemberContext($SYSENV, $Cu, $dMember[
'member']) : MemberContext($SYSENV, $Cu);
37 switch ($dOperation) {
42 header(
'Content-type: application/json');
44 $mPurge = MemberPurge($SYSENV, $dbh, $dContext);
45 $aryResult[
'data'][
'member'] = $mPurge[
'member'];
46 $aryResult[
'info'] = $mPurge[
'message'];
47 MemberReply($aryResult, $aryReply, $dOperation);
51 throw new Exception(
"Unknown server request: " . $dOperation);
56 }
catch (Exception $e) {
57 $aryReply[
'errors'][] = $e->getMessage();
58 $aryResult[
'data'] = array();
59 $aryResult[
'info'] = array();
60 MemberReply($aryResult, $aryReply, $dOperation);
77 function MemberPurge($pEnv, $pDbh, $pContext) {
79 $dHistory = MemberReadHistory($pEnv, $pDbh, $pContext);
80 $dValidateHistory = MemberValidateHistory($pEnv, $pContext, $dHistory);
81 $dDelete = MemberDeleteHistory($pEnv, $pDbh, $pContext, $dValidateHistory);
84 if ($dDelete[
'message'] ==
"Success") {
85 $sqlReturn[
'member'] = $pContext[
'm_account'];
86 $sqlReturn[
'message'] =
"The following member account has been deleted successfully: " . $pContext[
'm_account'];
88 $pEnv[
'logger']->error(db_last_error());
89 throw new Exception(
"Failed to delete member account.");
95 function MemberReadHistory($pEnv, $pDbh, $pContext) {
96 $cuTable = $pContext[
'cu_table'];
97 $cuMember = $pContext[
'm_account'];
103 DISTINCT ON (lb.loannumber) lb.loannumber AS a_type, 104 lb.accountnumber AS a_number, 105 lb.description AS a_desc, 109 FROM {$cuTable}loanhistory lh 110 WHERE lh.accountnumber = '$cuMember' 111 AND lh.loannumber = lb.loannumber";
113 SELECT $sqlColumns, ($sqlSub) AS a_count 114 FROM {$cuTable}loanbalance lb 115 WHERE lb.accountnumber = '$cuMember'";
116 $sqlSelectRs = db_query($sqlSelect, $pDbh);
118 $pEnv[
'logger']->error(db_last_error());
119 throw new Exception(
"Failed to read transaction history for loan accounts.");
121 $sqlData[
'loan'] = db_fetch_all($sqlSelectRs);
125 DISTINCT ON (ab.accounttype) ab.accounttype AS a_type, 126 ab.accountnumber AS a_number, 127 ab.description AS a_desc, 128 'Deposit' AS a_record";
131 FROM {$cuTable}accounthistory ah 132 WHERE ah.accountnumber = '$cuMember' 133 AND ah.accounttype = ab.accounttype";
135 SELECT $sqlColumns, ($sqlSub) AS a_count 136 FROM {$cuTable}accountbalance ab 137 WHERE ab.accountnumber = '$cuMember'";
138 $sqlSelectRs = db_query($sqlSelect, $pDbh);
140 $pEnv[
'logger']->error(db_last_error());
141 throw new Exception(
"Failed to read transaction history for deposit accounts.");
143 $sqlData[
'deposit'] = db_fetch_all($sqlSelectRs);
147 DISTINCT ON (tr.accounttype) tr.accounttype AS a_type, 148 tr.accountnumber AS a_number, 150 'Transaction' AS a_record";
153 FROM {$cuTable}transdtl td 154 WHERE td.transhdr_id = tr.id";
156 SELECT $sqlColumns, ($sqlSub) AS a_count 157 FROM {$cuTable}transhdr tr 158 WHERE tr.accountnumber = '$cuMember'";
159 $sqlSelectRs = db_query($sqlSelect, $pDbh);
161 $pEnv[
'logger']->error(db_last_error());
162 throw new Exception(
"Failed to read transaction history for accounts.");
164 $sqlData[
'transactions'] = db_fetch_all($sqlSelectRs);
168 DISTINCT ON (ca.accounttype) ca.accounttype AS a_type, 169 ca.accountnumber AS a_number, 170 ca.description AS a_desc, 171 'CrossAccount' AS a_record";
174 FROM {$cuTable}crossaccounts 175 WHERE accountnumber = '$cuMember'";
177 SELECT $sqlColumns, ($sqlSub) AS a_count 178 FROM {$cuTable}crossaccounts ca 179 WHERE ca.accountnumber = '$cuMember'";
180 $sqlSelectRs = db_query($sqlSelect, $pDbh);
182 $pEnv[
'logger']->error(db_last_error());
183 throw new Exception(
"Failed to read crossaccounts.");
185 $sqlData[
'crossaccounts'] = db_fetch_all($sqlSelectRs);
190 ma.accountnumber AS a_number, 192 'MemberAccount' AS a_record";
195 FROM {$cuTable}memberacctrights mr 196 WHERE mr.accountnumber = '$cuMember'";
198 SELECT $sqlColumns, ($sqlSub) AS a_count 199 FROM {$cuTable}memberacct ma 200 WHERE ma.accountnumber = '$cuMember'";
201 $sqlSelectRs = db_query($sqlSelect, $pDbh);
203 $pEnv[
'logger']->error(db_last_error());
204 throw new Exception(
"Failed to read transaction history for deposit accounts.");
206 $sqlData[
'memberacct'] = db_fetch_all($sqlSelectRs);
210 DISTINCT ON (h.accounttype) h.accounttype AS a_type, 211 h.accountnumber AS a_number, 212 h.description AS a_desc, 213 'Holds' AS a_record";
217 WHERE accountnumber = '$cuMember'";
219 SELECT $sqlColumns, ($sqlSub) AS a_count 220 FROM {$cuTable}holds h 221 WHERE h.accountnumber = '$cuMember'";
222 $sqlSelectRs = db_query($sqlSelect, $pDbh);
224 $pEnv[
'logger']->error(db_last_error());
225 throw new Exception(
"Failed to read holds.");
227 $sqlData[
'holds'] = db_fetch_all($sqlSelectRs);
229 $sqlReturn = $sqlData;
234 function MemberValidateHistory($pEnv, $pContext, $pHistory) {
235 $dValidate = array();
236 foreach ($pHistory as $action => $set) {
237 if (is_array($set)) {
238 $dValidate[$action] = array();
239 foreach ($set as $key => $value) {
240 $dValidate[$action][] = array(
241 "_action" =>
"delete",
242 "accounttype" => prep_save($value[
'a_type'], 25),
243 "record" => prep_save($value[
'a_record'], 25)
252 function MemberDeleteHistory($pEnv, $pDbh, $pContext, $pHistory) {
254 $cuTable = $pContext[
'cu_table'];
255 $cuMember = $pContext[
'm_account'];
257 $cuHistoryLoan = HCU_array_key_exists(
'loan', $pHistory) ? $pHistory[
'loan'] : [];
258 $cuHistoryDeposit = HCU_array_key_exists(
'deposit', $pHistory) ? $pHistory[
'deposit'] : [];
259 $cuHistoryTransaction = HCU_array_key_exists(
'transactions', $pHistory) ? $pHistory[
'transactions'] : [];
260 $cuHistoryCrossAccounts = HCU_array_key_exists(
'crossaccounts', $pHistory) ? $pHistory[
'crossaccounts'] : [];
261 $cuHistoryMemberAcct = HCU_array_key_exists(
'memberacct', $pHistory) ? $pHistory[
'memberacct'] : [];
262 $cuHistoryHolds = HCU_array_key_exists(
'holds', $pHistory) ? $pHistory[
'holds'] : [];
264 $sqlReturn = array();
272 $sqlTrans =
"BEGIN TRANSACTION";
273 $sqlTransRs = db_query($sqlTrans, $pDbh);
276 if (count($cuHistoryDeposit) > 0) {
277 foreach ($cuHistoryDeposit as $key => $value) {
279 DELETE FROM {$cuTable}accounthistory 280 WHERE accountnumber = '$cuMember' 281 AND accounttype = '{$value['accounttype']}';";
284 DELETE FROM {$cuTable}accountbalance 285 WHERE accountnumber = '$cuMember' 286 AND accounttype = '{$value['accounttype']}';";
291 if (count($cuHistoryLoan) > 0) {
292 foreach ($cuHistoryLoan as $key => $value) {
294 DELETE FROM {$cuTable}loanhistory 295 WHERE accountnumber = '$cuMember' 296 AND loannumber = '{$value['accounttype']}';";
299 DELETE FROM {$cuTable}loanbalance 300 WHERE accountnumber = '$cuMember' 301 AND loannumber = '{$value['accounttype']}';";
306 if (count($cuHistoryTransaction) > 0) {
307 foreach ($cuHistoryTransaction as $key => $value) {
310 FROM {$cuTable}transhdr 311 WHERE accountnumber = '$cuMember';";
313 $sqlSelectRs = db_query($sqlSelect, $pDbh);
315 $pEnv[
'logger']->error(db_last_error());
316 throw new Exception(
"Failed to read transaction header records.");
319 $sqlData[
'transdtlids'] = db_fetch_all($sqlSelectRs);
320 foreach($sqlData[
'transdtlids'] as $hdr => $dtl) {
323 DELETE FROM {$cuTable}transdtl 324 WHERE transhdr_id = $hdrid;";
329 DELETE FROM {$cuTable}transhdr 330 WHERE accountnumber = '$cuMember';";
336 if (count($cuHistoryCrossAccounts) > 0) {
337 foreach ($cuHistoryCrossAccounts as $key => $value) {
339 DELETE FROM {$cuTable}crossaccounts 340 WHERE accountnumber = '$cuMember' 341 AND accounttype = '{$value['accounttype']}';";
347 if (count($cuHistoryMemberAcct) > 0) {
348 foreach ($cuHistoryMemberAcct as $key => $value) {
350 DELETE FROM {$cuTable}memberacctrights 351 WHERE accountnumber = '$cuMember';";
354 DELETE FROM {$cuTable}memberacct 355 WHERE accountnumber = '$cuMember';";
361 if (count($cuHistoryHolds) > 0) {
362 foreach ($cuHistoryHolds as $key => $value) {
364 DELETE FROM {$cuTable}holds 365 WHERE accountnumber = '$cuMember' 366 AND accounttype = '{$value['accounttype']}';";
372 $sqlDeleteRs = db_query($sqlDelete, $pDbh);
374 $pEnv[
'logger']->error(db_last_error());
375 throw new Exception(
"Failed to delete account records.");
379 $sqlTrans =
"COMMIT TRANSACTION";
380 $sqlTransRs = db_query($sqlTrans, $pDbh);
382 }
catch (Exception $e) {
384 $pEnv[
'logger']->error(db_last_error());
387 $sqlTrans =
"ROLLBACK TRANSACTION";
388 $sqlTransRs = db_query($sqlTrans, $pDbh);
389 throw new Exception($e->getMessage());
393 $sqlReturn[
'message'] =
"Success";
400 <?php
function PrintMemberPurge() { ?>
403 <div
class=
"hcu-template">
404 <div
class=
"hcu-edit-buttons k-state-default">
405 <span
class=
"hcu-icon-delete">
407 <a href=
"##" id=
"lnkCancel">Cancel</a>
409 <a href=
"##" id=
"btnUpdate" class=
"k-button k-primary">
410 <i
class=
"fa fa-trash fa-lg"></i>
417 <div
id=
"gdInfo"></div>
419 <div
id=
"confirmationWindow"></div>
421 <script type=
"text/x-kendo-template" id=
"gdOrphaned">
422 <div
class=
"col-sm-12" id=
"deleteDiv">
423 <p>You are about to
remove this member account and all its history records from the system.</p>
424 <p>Do you wish to
continue?</p>
428 <script type=
"text/x-kendo-template" id=
"gdFull">
429 <div
class=
"col-sm-12">
430 <p>There are existing users with
this account.</p>
431 <p>Member accounts cannot be deleted
if there are users.
432 Use the Related Users card to view which users
433 are still
using this member account.</p>
437 <script
id=
"confirmationTemplateDelete" type=
"text/x-kendo-template">
438 <div
id=
"confirmationStatus"></div>
439 <div
id=
"responseDiv">
440 <div
class=
"local-transfer-msg">
446 <script type=
"text/javascript">
448 var MemberPurge =
function() {
449 var gdCardContainer =
null;
450 var gdCardWindows =
null;
454 var gdPayload =
null;
457 var gdDataSource =
null;
461 var EventOpenWindow =
function(e) {
462 var windowElement = this.element[0];
463 var windowId = windowElement.id;
468 gdCardWindows.push(
this);
471 var EventCloseWindow =
function(e) {
472 var windowElement = this.element[0];
473 var windowId = windowElement.id;
476 case "deleteConfirm":
477 EventPopWindow(windowId);
478 var memberRequest = {
479 operation:
"memberPurge",
483 gdDataSource.transport.options.read.type =
"POST";
484 gdDataSource.read(memberRequest);
487 EventPopWindow(windowId);
495 var EventPopWindow =
function(windowId) {
497 for (var i = 0; i < gdCardWindows.length; i++) {
498 var openWindow = gdCardWindows[i].element[0];
500 var openId = openWindow.id;
502 if (openId == windowId) {
509 gdCardWindows.splice(popIndex, 1);
513 var InitDataSources =
function() {
514 gdDataSource =
new kendo.data.DataSource({
519 contentType:
"application/x-www-form-urlencoded",
532 Results: { field:
"Results" }
536 requestStart:
function(e) {
539 requestEnd:
function(e) {
543 if (e.response.hasOwnProperty(
"Results")) {
544 results = e.response.Results;
545 resultData = results.info;
546 ShowSuccess(resultData);
548 gdInfo.content(
"Error Parsing Server");
556 var InitDataViews =
function() {
557 gdPurge = $(
"#gdPurge").kendoWindow({
558 title:
"Delete Member",
564 activate: EventOpenWindow,
565 close: EventCloseWindow
566 }).data(
"kendoWindow");
568 gdInfo = $(
"#gdInfo").kendoDialog({
569 title:
"Delete Member",
575 show: EventOpenWindow,
576 close: EventCloseWindow,
578 { text:
"Ok", primary:
true }
580 }).data(
"kendoDialog");
583 $(
"#confirmationWindow").kendoDialog({
598 window.location =
'main.prg?ft=103101';
600 }).data(
"kendoDialog");
604 var InitDataActions =
function() {
605 $(
"#btnUpdate").off();
606 $(
"#btnUpdate").on(
"click",
function(e) {
608 if (gdMember.m_count == 0) {
609 gdAction =
"deleteConfirm";
614 $(
"#lnkCancel").off();
615 $(
"#lnkCancel").on(
"click",
function(e) {
617 gdAction =
"deleteDeny";
622 var ShowSuccess =
function(message) {
623 var confirmationData = { message: message };
624 var confirmationTemplate = kendo.template($(
"#confirmationTemplateDelete").html());
625 $(
"#confirmationWindow").data(
"kendoDialog").content(confirmationTemplate(confirmationData));
626 $(
"#confirmationWindow").data(
"kendoDialog").open().toFront().center();
629 this.Open =
function(windowStack) {
630 gdCardWindows = windowStack;
632 if (gdMember.m_count == 0) {
633 $(
"#gdPurge").prepend(
634 $(
"#gdOrphaned").html()
636 $(
"#btnUpdate").show();
638 $(
"#gdPurge").prepend(
641 $(
"#btnUpdate").hide();
644 var
template= kendo.template($(
"#titleTemplate").html());
645 gdMember.cardTitle=
"Delete Member";
646 gdPurge.title(
template(gdMember));
651 this.Close =
function() {
656 this.Data =
function(payload, member) {
661 this.Init =
function(hubCall, carContainer) {
663 gdCardContainer = carContainer;
669 gdCall(
"MemberPurge",
this);
675 getShowWaitFunctions(); ?>