14 require_once(dirname(__FILE__) .
'/../library/permissions.i');
15 require_once(dirname(__FILE__) .
'/../library/hcuACH.i');
19 $serviceShowInfo =
true;
20 $serviceLoadMenu =
true;
21 $serviceShowMenu =
true;
24 require_once(dirname(__FILE__) .
'/../library/hcuService.i');
29 require_once(dirname(__FILE__) .
'/../includes/hcuPreContent.i');
32 $achEnabled = Check_ACHEnabled( $dbh, $HB_ENV );
33 if ( $achEnabled ===
false ) {
35 throw new Exception( HCU_JsonEncode( $MC->msg(
'Option not set', HCU_DISPLAY_AS_HTML) ), 915 );
38 $achPartnerTypes = array(
39 array(
"type" => ACH_PARTNER_TYPE_PAYEE,
"display" => $MC->msg(
"ACH Payee", HCU_DISPLAY_AS_HTML) ),
40 array(
"type" => ACH_PARTNER_TYPE_PAYOR,
"display" => $MC->msg(
"ACH Payor", HCU_DISPLAY_AS_HTML) ),
41 array(
"type" => ACH_PARTNER_TYPE_PAYROLL,
"display" => $MC->msg(
"ACH Payroll", HCU_DISPLAY_AS_HTML) ),
42 array(
"type" => ACH_PARTNER_TYPE_UNASSIGNED,
"display" => $MC->msg(
"ACH Unassigned", HCU_DISPLAY_AS_HTML) )
47 $achAccountTypes = array(
48 array(
"type" => ACCOUNT_TYPE_CHECKING,
"display" => $MC->msg(
"ACH Checking", HCU_DISPLAY_AS_HTML) ),
49 array(
"type" => ACCOUNT_TYPE_SAVINGS,
"display" => $MC->msg(
"ACH Savings", HCU_DISPLAY_AS_HTML) )
52 PrintPartnerEditor($HB_ENV);
53 }
catch (Exception $ex) {
56 $serviceErrorMsg = HCU_JsonDecode($ex->getMessage());
58 $serviceErrorCode = $ex->getCode();
60 require_once(dirname(__FILE__) .
'/../includes/hcuErrorPage.i');
64 <script type=
"text/javascript">
66 var pWindowStack =
null;
68 var pDataSource =
null;
69 var pDataFilter =
null;
75 var pMultiData =
null;
85 var pStateData =
null;
89 var InitDataSources =
function() {
92 pMultiData = <?php echo HCU_JsonEncode($achPartnerTypes); ?>;
93 pAcctData = <?php echo HCU_JsonEncode($achAccountTypes); ?>;
94 pStateData = <?php echo HCU_JsonEncode( GetStateList() ); ?>;
95 pDataSource =
new kendo.data.DataSource({
98 url:
"hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
99 contentType:
"application/json",
104 action:
"get_ach_partners" 109 url:
"hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
110 contentType:
"application/x-www-form-urlencoded",
114 action:
"add_ach_partner" 119 url:
"hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
120 contentType:
"application/x-www-form-urlencoded",
124 action:
"update_ach_partner" 129 url:
"hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
130 contentType:
"application/x-www-form-urlencoded",
134 action:
"delete_ach_partner" 137 parameterMap:
function(data, type) {
138 if (type !=
"read") {
139 data.email_notify = data.email_notify ? 1 : 0;
140 data.ach_name = data.ach_name ?
152 partner_id: { type:
"number" },
153 ach_name: { type:
"string" },
154 display_name: { type:
"string" },
155 partner_type: { type:
"string" },
156 ach_batch: { type:
"boolean", defaultValue:
false },
157 email_notify: { type:
"boolean", defaultValue:
false },
158 email: { type:
"string" },
159 address1: { type:
"string" },
160 address2: { type:
"string" },
161 city: { type:
"string" },
162 state: { type:
"string" },
163 zip: { type:
"string" },
164 country: { type:
"string" },
165 dfi_routing: { type:
"string" },
166 dfi_account: { type:
"string" },
167 dfi_account_confirm: { type:
"string" },
168 dfi_account_type: { type:
"string" }
171 parse:
function(data) {
173 var resultsData =
null;
175 if (data.hasOwnProperty(
"Results")) {
176 results = data.Results;
177 resultsData = results.homecuData;
180 if (results == undefined || results ==
null) {
184 if (results.hasOwnProperty(
"homecuErrors")) {
188 if (pAction ==
"read") {
190 for (var i = 0; i < resultsData.partners.length; i++) {
191 var partner = resultsData.partners[i];
192 var partnerSetup = SetupPartner(partner,
false);
193 pGridData.push(partnerSetup);
195 pGrid.dataSource.data(pGridData);
199 var partnerSetup =
null;
203 if (pAction ==
"create" || pAction ==
"update") {
204 partner = resultsData.partner_data;
205 partnerSetup = SetupPartner(partner,
true);
207 partner = pObserve.sourcePartner;
208 partnerSetup = SetupPartner(partner,
true);
212 if (pAction ==
"update" || pAction ==
"destroy") {
213 var partnerIndex = -1;
215 for(var i = 0; i < pGridData.length; i++) {
216 if (pGridData[i].partner_id == partnerSetup.partner_id) {
227 if (pAction ==
"create") {
228 pGridData.push(partnerSetup);
229 }
else if (pAction ==
"update") {
231 partnerSetup.ach_batch = pGridData[partnerIndex].ach_batch;
232 pGridData.splice(partnerIndex, 1, partnerSetup);
233 }
else if (pAction ==
"destroy") {
234 pGridData.splice(partnerIndex, 1);
238 pGrid.dataSource.data(pGridData);
246 requestStart:
function(request) {
247 $.homecuValidator.hideMessage();
251 requestEnd:
function(response) {
252 pAction = response.type;
255 if (response.hasOwnProperty(
"response")) {
256 if (response.response.hasOwnProperty(
"Results")) {
258 var results = response.response.Results;
259 if (results.hasOwnProperty(
"homecuErrors")) {
261 throw results.homecuErrors;
263 $.homecuValidator.settings.formStatusField =
"formStatus";
264 $.homecuValidator.settings.formInfoTitle =
"";
265 $.homecuValidator.displayMessage(results.homecuInfo);
268 throw "Error Parsing Server";
271 throw "Error Parsing Server";
274 $.homecuValidator.displayMessage(error, $.homecuValidator.settings.statusError );
277 pDataSource.cancelChanges();
278 pDataSource.data(pGridData);
283 field:
"display_name",
292 { field:
"partner_type",
operator:
"eq", value:
"$" },
293 { field:
"partner_type",
operator:
"eq", value:
"e" },
294 { field:
"partner_type",
operator:
"eq", value:
"r" },
295 { field:
"partner_type",
operator:
"eq", value:
"" }
298 { field:
"display_name",
operator:
"contains", value:
"" }
303 var InitDataViews =
function() {
304 pMulti = $(
"#partnerFilter").kendoMultiSelect({
305 placeholder:
"<?php echo $MC->msg("ACH Select Types
", HCU_DISPLAY_AS_JS); ?>",
306 dataTextField:
"display",
307 dataValueField:
"type",
308 dataSource: pMultiData,
309 itemTemplate:
"#= display #",
310 tagTemplate:
"#= display #",
311 dataBound:
function() {
312 this.value([
"$",
"e",
"r",
""]);
315 var filterValues = this.value();
319 pDataFilter.filters[0].filters = [];
323 if (filterValues.length == 0) {
324 pDataFilter.filters[0].filters = [];
325 pDataFilter.filters[0].filters.push({
326 field:
"partner_type",
operator:
"eq", value:
"none" 330 for (var i = 0; i < filterValues.length; i++) {
331 pDataFilter.filters[0].filters.push({
332 field:
"partner_type",
operator:
"eq", value: filterValues[i]
336 pGrid.dataSource.filter(pDataFilter);
338 }).data(
"kendoMultiSelect");
340 pGrid = $(
"#partnerGrid").kendoGrid({
341 toolbar: kendo.template($(
"#templateGridTool").html()),
353 title:
"<?php echo $MC->msg("Name
", HCU_DISPLAY_AS_HTML) ?>",
354 template: kendo.template($(
"#templateGridName").html()) },
355 { field:
"partner_type",
356 title:
"<?php echo $MC->msg("Type
", HCU_DISPLAY_AS_HTML) ?>", width:
"100px",
357 template: kendo.template($(
"#templateGridType").html()) },
358 { title:
"<?php echo $MC->msg("Partner
", HCU_DISPLAY_AS_HTML) ?>",
359 template: kendo.template($(
"#templateGridMobile").html()) }
362 var partner = this.select();
363 var partnerSelect = this.dataItem(partner);
364 var partnerIndex = -1;
365 var partnerSource = pDataSource.data();
367 for (var i = 0; i < partnerSource.length; i++) {
368 if (partnerSource[i].partner_id === partnerSelect.partner_id) {
374 OpenPartnerEditor(partnerSource[partnerIndex]);
377 partner.removeClass(
"k-state-selected");
379 }).data(
"kendoGrid");
381 var maxHeight = parseInt($(window).height() * .85, 10);
382 var pWindowHtml = $(
"#achPartnerEditorTmp").html();
383 pWindow = $(pWindowHtml).kendoWindow({
387 maxHeight: maxHeight,
391 activate: OpenWindow,
393 }).data(
"kendoWindow");
395 var pDiscardHtml = $(
"#achPartnerDiscardTmp").html();
396 pDiscard = $(pDiscardHtml).kendoDialog({
397 title:
"<?php echo $MC->msg("ACH Discard Changes?
", HCU_DISPLAY_AS_HTML) ?>",
404 { text:
"<?php echo $MC->msg("No
", HCU_DISPLAY_AS_HTML) ?>", action:
function() {} },
405 { text:
"<?php echo $MC->msg("Yes
", HCU_DISPLAY_AS_HTML) ?>", primary:
true,
406 action:
function() { pAction =
"partnerDiscard"; }
409 }).data(
"kendoDialog");
411 var pDeleteHtml = $(
"#achPartnerDeleteTmp").html();
412 pDelete = $(pDeleteHtml).kendoDialog({
413 title:
"<?php echo $MC->msg("ACH Remove Partner
", HCU_DISPLAY_AS_HTML) ?>",
420 { text:
"<?php echo $MC->msg("No
", HCU_DISPLAY_AS_HTML) ?>", action:
function() {} },
421 { text:
"<?php echo $MC->msg("Yes
", HCU_DISPLAY_AS_HTML) ?>", primary:
true,
422 action:
function() { pAction =
"partnerDelete"; }
425 }).data(
"kendoDialog");
427 pObserve =
new kendo.observable({
430 sourceDirtyInfo:
false,
431 sourceDirtyAddr:
false,
432 sourceDirtyAcct:
false,
433 listPartnerTypes: pMultiData,
434 listAccountTypes: pAcctData,
435 listStates: pStateData,
437 showDeleteWarn:
false,
438 init:
function(partner) {
439 this.
set(
"sourcePartner", partner);
440 this.
set(
"sourceDirty", partner.partner_id == 0);
441 this.
set(
"showDelete", !partner.ach_batch && partner.partner_id > 0);
442 this.
set(
"showDeleteWarn", partner.ach_batch);
443 kendo.bind($(
"#achPartnerEditor"),
this);
446 this.
set(
"sourcePartner",
null);
447 this.
set(
"sourceDirty",
false);
448 this.
set(
"sourceDirtyInfo",
false);
449 this.
set(
"sourceDirtyAddr",
false);
450 this.
set(
"sourceDirtyAcct",
false);
451 kendo.unbind($(
"#achPartnerEditor"));
457 this.sourcePartner.dirty =
true;
461 var otherErrors = [];
462 if (this.sourcePartner.zip !=
"") {
464 var zip = this.sourcePartner.zip;
465 var zipReplace = zip.replace(/_/g,
"");
466 var zipSplit = zipReplace.split(
"-");
467 var zipConstruct =
"";
470 if (zipSplit[0].length < 5) {
471 otherErrors.push(
"<?php echo $MC->msg("Zip Code Invalid
", HCU_DISPLAY_AS_JS) ?>");
472 }
else if (zipSplit[1]) {
474 if (zipSplit[1].length > 0 && zipSplit[1].length < 4) {
475 otherErrors.push(
"<?php echo $MC->msg("Zip Code Invalid
", HCU_DISPLAY_AS_JS) ?>");
481 zipConstruct += zipSplit[0] +
"-" + zipSplit[1];
483 zipConstruct += zipSplit[0];
486 this.
set(
"sourcePartner.zip", zipConstruct);
489 if (this.sourcePartner.dfi_routing !=
"") {
491 var routing = this.sourcePartner.dfi_routing;
492 var routingReplace = routing.replace(/_/g,
"");
494 if (routingReplace.length < 9) {
495 otherErrors.push(
"<?php echo $MC->msg("ACH Routing number 9 digits
", HCU_DISPLAY_AS_HTML); ?>");
498 this.
set(
"sourcePartner.dfi_routing", routingReplace);
501 if (this.sourceDirty) {
502 $.homecuValidator.validate();
503 var totalErrors = $.homecuValidator.homecuKendoValidator.errors();
506 for (var i = 0; i < otherErrors.length; i++) {
507 if ($.inArray(otherErrors[i], totalErrors) == -1) {
508 totalErrors.push(otherErrors[i]);
512 if (totalErrors.length > 0) {
513 $.homecuValidator.displayMessage(totalErrors, $.homecuValidator.settings.statusError);
514 $(
"#achPartnerEditor").scrollTop(0);
528 change:
function(e) {
530 var accordion =
null;
532 e.hasOwnProperty(
"sender") ?
533 target = $(e.sender.element[0]) :
534 target = $(e.target);
537 $(target).parent().attr(
"for") ==
"achPartnerNotify" ||
538 $(target).attr(
"name") ==
"achPartnerNotify" ?
539 this.
set(
"sourcePartner.email_notify", !this.sourcePartner.email_notify) :
542 accordion = target.closest(
".achAccordionContent");
543 accordionIndex = accordion.data(
"accordion-index");
545 switch (accordionIndex) {
546 case 0: this.
set(
"sourceDirtyInfo",
true);
break;
547 case 1: this.
set(
"sourceDirtyAddr",
true);
break;
548 case 2: this.
set(
"sourceDirtyAcct",
true);
break;
551 this.
set(
"sourceDirty",
true);
555 kendo.data.binders.required = kendo.data.Binder.extend({
556 refresh:
function() {
557 var required = this.bindings.required.get();
559 this.element.setAttribute(
"required",
"required");
561 this.element.removeAttribute(
"required");
566 pSearch = $(
"#partnerSearch");
567 pSearch.on(
"input",
function() {
570 pDataFilter.filters[1].value = $(
this).val();
571 pGrid.dataSource.filter(pDataFilter);
574 pCreate = $(
"#partnerAdd");
575 pCreate.on(
"click",
function() {
578 OpenPartnerEditor(pDataSource.data()[0]);
582 $(
"input[name=\"achPartnerZip\"]").kendoMaskedTextBox({
584 clearPromptChar:
true 587 $(
"input[name=\"achPartnerRouting\"]").kendoMaskedTextBox({
589 clearPromptChar:
true 594 "<?php echo $MC->msg("ACH Notify Info Init
", HCU_DISPLAY_AS_JS); ?> " +
595 "<?php echo $MC->msg("ACH Notify Info Partner
", HCU_DISPLAY_AS_JS); ?>" 599 var CreateAddressString =
function(partner) {
601 if ( partner.city.length > 0 ||
602 partner.state.length > 0 ||
603 partner.zip.length > 0 ) {
604 showString = partner.city.trim();
605 if ( showString.length > 0 &&
606 (partner.state.length > 0 ||
607 partner.zip.length > 0) ) {
608 showString = showString +
", " + partner.state +
" " + partner.zip;
609 showString = showString.trim();
613 if ( partner.address1.length > 0 ) {
614 if ( showString.length > 0 ) {
615 showString = partner.address1 +
" / " + showString;
617 showString = partner.address1;
624 var SetupPartner =
function(partner, update) {
626 partner_id: parseInt(partner.id),
627 ach_batch: partner.ach_batch ? true :
false,
628 ach_name: partner.ach_name ?
630 partner.display_name,
631 display_name: partner.display_name,
632 partner_type: partner.partner_type,
633 email_notify: (partner.email_notify ==
"t" || partner.email_notify ==
true) ?
637 partner.address.email,
640 partner.address.address1,
643 partner.address.address2,
646 partner.address.city,
649 partner.address.state,
655 partner.address.country,
656 dfi_routing: update ?
657 partner.dfi_routing :
658 partner.dfi_data.dfi_routing,
659 dfi_account: update ?
660 partner.dfi_account :
661 partner.dfi_data.dfi_account,
662 dfi_account_confirm: update ?
663 partner.dfi_account :
664 partner.dfi_data.dfi_account,
665 dfi_account_type: update ?
666 partner.dfi_account_type :
667 partner.dfi_data.dfi_account_type
673 var OpenWindow =
function(e) {
674 var windowElement = this.element[0];
675 var windowId = windowElement.id;
678 case "achPartnerEditor":
679 $(
"#achPartnerEditor").scrollTop(0);
684 pWindowStack.push(
this);
687 var CloseWindow =
function(e) {
688 var windowElement = this.element[0];
689 var windowId = windowElement.id;
692 case "partnerDiscard":
695 pDataSource.cancelChanges();
699 case "partnerDelete":
702 pDataSource.remove(pObserve.sourcePartner);
707 if (windowId ==
"achPartnerEditor") {
708 if (pObserve.sourceDirty) {
721 var PopWindow =
function(windowId) {
723 for (var i = 0; i < pWindowStack.length; i++) {
724 var openWindow = pWindowStack[i].element[0];
725 var openId = openWindow.id;
727 if (openId == windowId) {
734 pWindowStack.splice(popIndex, 1);
738 var OpenPartnerEditor =
function(partner) {
739 $.homecuValidator.hideMessage();
740 $.homecuValidator.setup({
741 formValidate:
"achPartnerEditor",
742 formStatusField:
"achPartnerStatus",
743 formErrorTitle:
"<?php echo $MC->msg("Error Occurred
", HCU_DISPLAY_AS_JS) ?>" 747 pObserve.init(partner);
749 pWindow.title(partner.id == 0 ?
750 "<?php echo $MC->msg("ACH Add New Partner
", HCU_DISPLAY_AS_JS) ?>" :
751 "<?php echo $MC->msg("ACH Edit Partner
", HCU_DISPLAY_AS_JS) ?>" +
": " + partner.display_name);
756 var ResizeGrid =
function() {
757 if ($(window).width() > 768) {
768 $(document).ready(
function() {
775 $(window).resize(
function() {
782 $(document).on(
"click",
".k-overlay",
function (e) {
783 if (pWindowStack.length > 0) {
784 var wnd = pWindowStack[pWindowStack.length - 1];
790 <!-- TEMPLATE: grid toolbar -->
791 <script type=
"text/x-kendo-template" id=
"templateGridTool">
792 <button
id=
"partnerAdd" class=
"k-button">
793 <span
class=
"fa fa-plus"></span>
794 <span> <?php echo $MC->msg(
"ACH Add Partner", HCU_DISPLAY_AS_HTML) ?></span>
798 <!-- TEMPLATE: grid mobile view -->
799 <script type=
"text/x-kendo-template" id=
"templateGridMobile">
800 <div>#= display_name #</div>
802 #if(partner_type == "$"){# 803 <span><?php echo $MC->msg(
"ACH Payroll", HCU_DISPLAY_AS_JS); ?></span>
804 #}else if(partner_type == "e"){# 805 <span><?php echo $MC->msg(
"ACH Payee", HCU_DISPLAY_AS_JS); ?></span>
806 #}else if(partner_type == "r"){# 807 <span><?php echo $MC->msg(
"ACH Payor", HCU_DISPLAY_AS_JS); ?></span>
809 <span><?php echo $MC->msg(
"ACH Unassigned", HCU_DISPLAY_AS_JS); ?></span>
812 <div>#= CreateAddressString(data)
#</div> 815 <!-- TEMPLATE: grid name column -->
816 <script type=
"text/x-kendo-template" id=
"templateGridName">
817 <div
class=
"hcu-bs-no-padding">
818 <div
class=
"col-sm-6">#= display_name #</div>
819 <div
class=
"col-sm-6 text-right">#= CreateAddressString(data)
#</div> 823 <!-- TEMPLATE: grid type column -->
824 <script type=
"text/x-kendo-template" id=
"templateGridType">
825 #if(partner_type == "$"){# 826 <span><?php echo $MC->msg(
"ACH Payroll", HCU_DISPLAY_AS_JS); ?></span>
827 #}else if(partner_type == "e"){# 828 <span><?php echo $MC->msg(
"ACH Payee", HCU_DISPLAY_AS_JS); ?></span>
829 #}else if(partner_type == "r"){# 830 <span><?php echo $MC->msg(
"ACH Payor", HCU_DISPLAY_AS_JS); ?></span>
832 <span><?php echo $MC->msg(
"ACH Unassigned", HCU_DISPLAY_AS_JS); ?></span>
837 <style type=
"text/css">
838 .k-grid tbody tr:hover {
842 .k-grid td:nth-child(2) {
843 border-left-width: 0;
849 margin-bottom: 7.5px;
852 @media (max-width: 1023px) {
860 <div
class=
"container-fluid">
861 <div
class=
"well well-sm col-xs-12">
863 <h3><?php echo $MC->msg(
"ACH Partner Title", HCU_DISPLAY_AS_HTML) ?></h3>
865 <div
class=
"col-xs-12 col-md-7 achFieldMargin">
866 <label
for=
"partnerFilter"><?php echo $MC->msg(
"ACH Partner Type Filter", HCU_DISPLAY_AS_HTML) ?></label><br>
867 <input
id=
"partnerFilter" class=
"hcu-all-100"/>
870 <div
class=
"col-xs-12 col-md-5 achFieldMargin">
871 <label
for=
"partnerSearch"><?php echo $MC->msg(
"ACH Partner Name Filter", HCU_DISPLAY_AS_HTML) ?></label><br>
872 <input type=
"text" name=
"partnerSearch" id=
"partnerSearch" class=
"k-textbox k-input hcu-all-100" 873 placeholder=
"<?php echo $MC->msg("Type to filter
", HCU_DISPLAY_AS_HTML) ?>" />
876 <div
class=
"col-xs-12 achFieldMargin">
877 <div
id=
"partnerGrid" class=
""></div>
884 require_once(dirname(__FILE__) .
'/../includes/hcuPostContent.i');