17 require_once(
"$admLibrary/aMemberSupport.i");
18 require_once(dirname(__FILE__) .
"/../../shared/library/hcuTranslate.i");
19 require_once(dirname(__FILE__) .
"/../../shared/library/hcuCommon.i");
24 "operation" => array(
"filter" => FILTER_SANITIZE_STRING),
25 "payload" => array(
"filter" => FILTER_SANITIZE_STRING),
26 "data" => array(
"filter" => FILTER_SANITIZE_STRING)
28 HCU_ImportVars($admVars,
"MEMBER_IMAGES", $admOk);
30 $iOperation = isset($admVars[
"MEMBER_IMAGES"][
"operation"]) ? $admVars[
"MEMBER_IMAGES"][
"operation"] :
null;
31 $iPayload = isset($admVars[
"MEMBER_IMAGES"][
"payload"]) ? $admVars[
"MEMBER_IMAGES"][
"payload"] :
null;
32 $iData = isset($admVars[
"MEMBER_IMAGES"][
"data"]) ? $admVars[
"MEMBER_IMAGES"][
"data"] :
null;
34 $iMember = $iPayload ?
35 MemberDecrypt($SYSENV, $Cu, $iPayload) :
38 $iContext = $iPayload ?
39 MemberContext($SYSENV, $Cu, $iMember[
'member']) :
40 MemberContext($SYSENV, $Cu);
45 switch ($iOperation) {
49 case "memberReadData":
50 header(
'Content-type: application/json');
56 $aryResult[
'data'][
'accounts'] = $iAccounts[
'accounts'];
57 $aryResult[
'data'][
'rtnumbers'] = $iRTNumbers[
'rtnumbers'];
58 $aryResult[
'data'][
'micrs'] = $iMicrs[
'micrs'];
59 MemberReply($aryResult, $aryReply, $iOperation);
61 case "memberReadImage":
62 $iCheck = MemberValidateCheck($SYSENV, $iContext, $iData);
63 $iVendor = MemberReadVendor($SYSENV, $dbh, $iContext);
64 $iImage = $iMember[
'member'][
'm_image'];
68 if ($iImage != $iVendor[
'vendor'][
'image']) {
69 $iImage = $iVendor[
'vendor'][
'image'];
73 if ($iImage ==
"NO") {
74 throw new Exception(
"Currently your credit union is not set up to view check images online.");
77 # pass micr as $sk (sortkey) 78 # for MidAt clients using tracenumber, not micr, for image retrieval 88 if ($iImage ==
'FEDIMAGE') {
89 $sk = $iCheck[
'check'];
90 } elseif ($iImage ==
'MAC') {
91 $sk = $iCheck[
'micr'];
96 $CKINFOPARTS =
"{$iContext['cu_code']}|{$iImage}|{$iCheck['check']}|{$iCheck['amount']}|{$iCheck['date']}|{$iCheck['rt']}|{$iCheck['micr']}|{$iContext['m_account']}|$sk";
97 $CKITEM = hcu_encrypturl($CKINFOPARTS, $chk_key);
98 $CKDMSKEY = sha1(
"{$iContext['cu_code']}{$iImage}{$iCheck['check']}{$iCheck['amount']}{$iCheck['date']}{$iCheck['rt']}{$iCheck['micr']}1{$iContext['m_account']}cierto");
99 $CKURL =
"{$http_scheme}://{$_SERVER['HTTP_HOST']}/banking/ImageSOLO.prg?cu=$Cu&CKITEM=$CKITEM&CKHASH=$CKDMSKEY&CKARCHIVE=1&adm=1";
101 $aryResult[
'data'][
'url'] = $CKURL;
102 MemberReply($aryResult, $aryReply, $iOperation);
105 throw new Exception(
"Unknown server request: " . $iOperation);
109 }
catch (Exception $e) {
110 $aryReply[
'errors'][] = $e->getMessage();
111 $aryResult[
'data'] = array();
112 $aryResult[
'info'] = array();
114 MemberReply($aryResult, $aryReply, $iOperation);
118 function MemberReadVendor($pEnv, $pDbh, $pContext) {
119 $cuTable = $pContext[
'cu_table'];
120 $cuCode = $pContext[
'cu_code'];
122 $sqlReturn = array();
124 SELECT TRIM(img) AS image, flagset 126 WHERE cu = '$cuCode'";
127 $sqlSelectRs = db_query($sqlSelect, $pDbh);
129 $pEnv[
'logger']->error(db_last_error());
130 throw new Exception(
"Failed to read check image vendor.");
133 $sqlReturn[
'vendor'] = db_fetch_all($sqlSelectRs)[0];
137 function MemberValidateCheck($pEnv, $pContext, $pCheck) {
139 $hCheck = html_entity_decode($pCheck, ENT_QUOTES);
140 $jCheck = HCU_JsonDecode($hCheck);
141 $jTime = strtotime($jCheck[
'date']);
144 "micr" => prep_save($jCheck[
'micr'], 17),
145 "check" => intval($jCheck[
'check']),
146 "amount" => number_format(floatval($jCheck[
'amount']), 2,
'.',
''),
147 "date" => date(
"m/d/Y", $jTime),
148 "rt" => prep_save($jCheck[
'rt'], 12)
155 $cuTable = $pContext[
'cu_table'];
156 $cuCode = $pContext[
'cu_code'];
157 $cuMember = $pContext[
'm_account'];
159 $sqlReturn = array();
161 ab.accounttype AS a_type, 162 ab.description AS a_desc, 163 ab.micraccount AS a_micr";
166 FROM {$cuTable}accountbalance ab 167 WHERE ab.accountnumber = '$cuMember' 168 AND ab.deposittype = 'Y' 169 ORDER BY ab.accounttype";
170 $sqlSelectRs = db_query($sqlSelect, $pDbh);
172 $pEnv[
'logger']->error(db_last_error());
173 throw new Exception(
"Failed to read member sub accounts.");
176 $sqlReturn[
'accounts'] = db_fetch_all($sqlSelectRs);
181 $cuTable = $pContext[
'cu_table'];
182 $cuCode = $pContext[
'cu_code'];
183 $cuMember = $pContext[
'm_account'];
185 $sqlReturn = array();
188 SELECT rt, 'P' AS pri FROM cuadmin WHERE cu ='$cuCode' 190 SELECT rt, 'X' AS pri FROM cualtroute WHERE cu ='$cuCode' 193 $sqlSelectRs = db_query($sqlSelect, $pDbh);
195 $pEnv[
'logger']->error(db_last_error());
196 throw new Exception(
"Failed to read member routing / transit numbers.");
199 $sqlReturn[
'rtnumbers'] = db_fetch_all($sqlSelectRs);
204 $cuTable = $pContext[
'cu_table'];
205 $cuCode = $pContext[
'cu_code'];
206 $cuMember = $pContext[
'm_account'];
208 $sqlReturn = array();
210 om.startcheck AS o_check, 212 om.micraccount AS o_micr, 213 om.accounttype AS o_type";
217 WHERE cu = '{$cuCode}' 218 AND om.accountnumber = '$cuMember'";
219 $sqlSelectRs = db_query($sqlSelect, $pDbh);
221 $pEnv[
'logger']->error(db_last_error());
222 throw new Exception(
"Failed to read member mict values.");
225 $sqlReturn[
'micrs'] = db_fetch_all($sqlSelectRs);
238 <div
id=
"status"></div>
240 <div
class=
"row hcuSpacer">
241 <div
class=
"col-sm-5">
242 <label
for=
"inpAcct">Sub-Account</label>
244 <div
class=
"col-sm-7">
245 <input type=
"text" id=
"inpAcct" class=
"hcu-all-100" 246 data-role=
"dropdownlist" 247 data-text-field=
"aView" 248 data-value-field=
"aType" 250 source: sourceAccounts, 252 events: { change: changeDropDown }">
257 data-bind=
"visible: sourceVisible">
258 <div
class=
"hcuSpacer">
259 <label
for=
"miGrid">MICR Override List</label>
263 { template: 'No MICR overrides were found for this account' } 268 { field: 'oCheck', title: 'Starting Check Number' }, 269 { field: 'oRt', title: 'Routing & Transit Number' }, 270 { field: 'oMicr', title: 'MICR Account Number' } 275 <div
class=
"row hcuSpacer">
276 <div
class=
"col-sm-5">
277 <label
for=
"inpMicr">MICR Account Number</label>
279 <div
class=
"col-sm-7">
280 <input type=
"text" class=
"hcu-all-100" 281 id=
"inpMicr" name=
"inpMicr" 283 data-role=
"numerictextbox" 284 data-spinners=
"false" 289 events: { change: changeInput }" 290 data-required-msg=
"MICR account number is required" 295 <div
class=
"row hcuSpacer">
296 <div
class=
"col-sm-5">
297 <label
for=
"inpCheckNumber">Check Number</label>
299 <div
class=
"col-sm-7">
300 <input type=
"text" class=
"hcu-all-100" 301 id=
"inpCheckNumber" name=
"inpCheckNumber" 303 data-role=
"numerictextbox" 304 data-spinners=
"false" 309 events: { change: changeInput }" 310 data-required-msg=
"Check number is required" 315 <div
class=
"row hcuSpacer">
316 <div
class=
"col-sm-5">
317 <label
for=
"inpCheckAmount">Check Amount</label>
319 <div
class=
"col-sm-7">
320 <input type=
"text" class=
"hcu-all-100" 321 id=
"inpCheckAmount" name=
"inpCheckAmount" 323 data-role=
"numerictextbox" 324 data-spinners=
"false" 329 events: { change: changeInput }" 330 data-required-msg=
"Check amount is required" 335 <div
class=
"row hcuSpacer">
336 <div
class=
"col-sm-5">
337 <label
for=
"inpCheckDate">Check Date</label>
339 <div
class=
"col-sm-7">
340 <input type=
"text" class=
"hcu-all-100" 341 id=
"inpCheckDate" name=
"inpCheckDate" 343 data-role=
"datepicker" 345 events: { change: changeInput }" 346 data-required-msg=
"Check date is required" 347 data-homecuCustomMatch-msg=
"Check Date is not the correct format" 352 <div
class=
"row hcuSpacer">
353 <div
class=
"col-sm-5">
354 <label
for=
"inpCheckRTNumber">Routing & Transit Number</label>
356 <div
class=
"col-sm-7">
357 <input type=
"text" class=
"hcu-all-100" 358 id=
"inpCheckRTNumber" name=
"inpCheckRTNumber" 359 data-role=
"dropdownlist" 360 data-text-field=
"rtNumber" 361 data-value-field=
"rtNumber" 363 source: sourceRTNumbers" 364 data-required-msg=
"Routing number is required" 370 <div
class=
"hcu-template">
371 <div
class=
"hcu-edit-buttons k-state-default">
372 <span
class=
"hcu-icon-delete">
373 <!--<a href=
"##" id=
"lnkDelete">
374 <i
class=
"fa fa-trash fa-lg"></i>
377 <a href=
"##" id=
"lnkCancel">Cancel</a>
379 <a href=
"##" id=
"btnUpdate" class=
"k-button k-primary">
380 <i
class=
"fa fa-search fa-lg"></i>
387 <div
id=
"miImageView"></div>
419 <script type=
"text/javascript">
421 var MemberImages =
function() {
422 var miCardContainer =
null;
423 var miCardWindows =
null;
425 var miPayload =
null;
431 var miImagesCancel =
null;
432 var miImagesSearch =
null;
433 var miObserve =
null;
435 var miDataSource =
null;
436 var miDataMicrs =
null;
437 var miDataAccounts =
null;
438 var miDataRTNumbers =
null;
440 var miImageView =
null;
442 var ShowCheckImage =
function(url) {
444 $(
"#miImageView").empty();
445 $(
"#miImageView").kendoWindow({
449 title:
"Check Image",
452 open: EventOpenWindow,
453 close: EventCloseWindow,
455 actions: [
'Print',
'Close']
458 $(
"#miImageView").data(
"kendoWindow").wrapper
459 .find(
".k-i-print").parent().off();
461 $(
"#miImageView").data(
"kendoWindow").wrapper
462 .find(
".k-i-print").parent().click(
function(e) {
465 miAction =
"checkPrint";
469 $(
"#miImageView").data(
"kendoWindow").center().open();
472 var DataBuildMicrs =
function(data) {
474 for (var i = 0; i < data.length; i++) {
477 micr.oType = data[i].o_type.trim();
478 micr.oRt = data[i].o_rt.trim();
479 micr.oMicr = data[i].o_micr.trim();
480 micr.oCheck = data[i].o_check.trim();
482 miDataMicrs.push(micr);
485 miObserve.set(
"sourceMicrs", miDataMicrs);
488 var DataBuildAccounts =
function(data) {
490 for (var i = 0; i < data.length; i++) {
493 acct.aDesc = data[i].a_desc.trim();
494 acct.aMicr = data[i].a_micr.trim();
495 acct.aType = data[i].a_type.trim();
496 acct.aView = acct.aType +
" - " + acct.aDesc;
498 miDataAccounts.push(acct);
501 miObserve.set(
"sourceAccounts", miDataAccounts);
502 miObserve.setUp(miDataAccounts[0]);
505 var DataBuildRTNumbers =
function(data) {
506 miDataRTNumbers = [];
507 for (var i = 0; i < data.length; i++) {
510 rtnum.rtNumber = data[i].rt.trim();
512 miDataRTNumbers.push(rtnum);
515 miObserve.set(
"sourceRTNumbers", miDataRTNumbers);
518 var EventSwapImages =
function(e) {
521 $(
"#miImageView").load($(
this).attr(
"href"),
function(e) {
522 $(
"#miImageView").find(
"a#ckViewBtn").off();
523 $(
"#miImageView").find(
"a#ckViewBtn").on(
"click", EventSwapImages);
527 var EventOpenWindow =
function(e) {
528 var windowElement = this.element[0];
529 var windowId = windowElement.id;
537 miCardWindows.push(
this);
540 var EventCloseWindow =
function(e) {
541 var windowElement = this.element[0];
542 var windowId = windowElement.id;
547 if ($.homecuValidator.validate()) {
549 micr: $(
"#inpMicr").data(
"kendoNumericTextBox").value(),
550 check: $(
"#inpCheckNumber").data(
"kendoNumericTextBox").value(),
551 amount: $(
"#inpCheckAmount").data(
"kendoNumericTextBox").value(),
552 date: $(
"#inpCheckDate").data(
"kendoDatePicker").value(),
553 rt: $(
"#inpCheckRTNumber").data(
"kendoDropDownList").value()
557 operation:
"memberReadImage",
559 data: JSON.stringify(memberData)
562 miDataSource.transport.read.type =
"POST";
563 miDataSource.read(request);
570 EventPopWindow(windowId);
573 $.homecuValidator.setup({
574 formStatusField:
"formStatus",
575 formValidate:
"cardContainerDiv" 583 var EventPopWindow =
function(windowId) {
585 for (var i = 0; i < miCardWindows.length; i++) {
586 var openWindow = miCardWindows[i].element[0];
587 var openId = openWindow.id;
589 if (openId == windowId) {
596 miCardWindows.splice(popIndex, 1);
600 var InitDataSources =
function() {
601 miDataSource =
new kendo.data.DataSource({
606 contentType:
"application/x-www-form-urlencoded",
614 requestStart:
function(request) {
617 requestEnd:
function(response) {
618 setTimeout(hideWaitWindow, 500);
620 if (response.hasOwnProperty(
"response")) {
621 if (response.response.hasOwnProperty(
"Results")) {
622 var results = response.response.Results;
624 if (results.hasOwnProperty(
"error")) {
625 $.homecuValidator.homecuResetMessage =
true;
626 $.homecuValidator.displayMessage(results.error, $.homecuValidator.settings.statusError);
627 }
else if (results.hasOwnProperty(
"info")) {
628 $.homecuValidator.homecuResetMessage =
true;
629 $.homecuValidator.displayMessage(results.info, $.homecuValidator.settings.statusSuccess);
632 $.homecuValidator.displayMessage(
"Error Parsing Server", $.homecuValidator.settings.statusError);
635 $.homecuValidator.displayMessage(
"Error Parsing Server", $.homecuValidator.settings.statusError);
639 parse:
function(response) {
642 var resultData =
null;
643 var resultOperation =
null;
645 if (response.hasOwnProperty(
"Results")) {
646 results = response.Results;
647 resultData = results.data;
648 resultOperation = results.operation;
653 if (results.hasOwnProperty(
"errors")) {
657 if (resultData == undefined || resultData ==
null) {
661 setTimeout(
function() {
662 switch (resultOperation) {
663 case "memberReadData":
664 DataBuildMicrs(resultData.micrs);
665 DataBuildRTNumbers(resultData.rtnumbers);
666 DataBuildAccounts(resultData.accounts);
668 miMember.cardTitle=
"View Check Images";
669 var
template= kendo.template($(
"#titleTemplate").html());
670 miImages.title(
template(miMember)).center().open();
672 case "memberReadImage":
673 ShowCheckImage(resultData.url);
684 var InitDataViews =
function() {
685 miImages = $(
"#miImages").kendoWindow({
686 title:
"View Check Image",
692 activate: EventOpenWindow,
693 close: EventCloseWindow,
694 open:
function(e) { this.wrapper.css({ top: 100 }); }
695 }).data(
"kendoWindow");
697 miImagesCancel = $(
"#lnkCancel");
698 miImagesSearch = $(
"#btnUpdate");
700 miObserve =
new kendo.observable({
705 sourceVisible:
false,
706 setUp:
function(account) {
708 this.
set(
"source", account);
709 this.
set(
"sourceVisible",
true);
711 var filter = { field:
"oType",
operator:
"eq", value: account.aType };
712 $(
"#miGrid").data(
"kendoGrid").dataSource.filter(filter);
715 changeDropDown:
function(e) {
716 var index = e.sender.selectedIndex;
717 var account = miDataAccounts[index];
720 changeInput:
function(e) {
721 if (!e.sender.value()) {
722 e.sender.wrapper.css(
"border",
"1px solid #d80000");
724 e.sender.wrapper.css(
"border",
"none");
729 kendo.bind(
"#miImages", miObserve);
730 miStatus = $(
"#miStatus");
734 var InitDataActions =
function() {
735 miImagesSearch.off();
736 miImagesSearch.on(
"click",
function(e) {
737 miAction =
"searchSubmit";
741 miImagesCancel.off();
742 miImagesCancel.on(
"click",
function(e) {
746 $(
"#inpCheckAmount").on(
"change",
function(e) {
748 var value = input.val();
749 var valueSplit = value.split(
".");
750 value = valueSplit[0].substring(0, 11);
754 value += valueSplit[1].substring(0, 2);
757 var kendoInput = $(
"#inpCheckAmount").data(
"kendoNumericTextBox");
758 kendoInput.value(value);
762 this.Data =
function(message, member) {
767 this.Open =
function(windowStack) {
769 $.homecuValidator.setup({
770 formStatusField:
"status",
771 formValidate:
"miImages" 774 miCardWindows = windowStack;
775 var memberRequest = {
776 operation:
"memberReadData",
780 miDataSource.transport.options.read.type =
"POST";
781 miDataSource.read(memberRequest);
784 this.Close =
function() {
785 $(
"#inpAcct").data(
"kendoDropDownList").destroy();
786 $(
"#inpCheckRTNumber").data(
"kendoDropDownList").destroy();
787 $(
"#inpCheckDate").data(
"kendoDatePicker").destroy();
789 if ($(
"#miImageView").data(
"kendoWindow")) {
790 $(
"#miImageView").data(
"kendoWindow").destroy();
796 this.Init =
function(hubCall, cardContainer) {
798 miCardContainer = cardContainer;
804 miCall(
"MemberImages",
this);