Odyssey
hcuACHPartners.prg
1 <?php
2  /*
3  * File: hcuACHSingle.prg
4  *
5  * Purpose: To let the user do ACH operations - single payments and collections.
6  *
7  * Steps:
8  * 1) Show the ACH partner screen. Can create/edit a partner.
9  * 2) Fill in DFI account, amounts and addenda.
10  * 3) Specify the local account for the payment or collection.
11  * 4) Submit
12  *
13  */
14  require_once(dirname(__FILE__) . '/../library/permissions.i');
15  require_once(dirname(__FILE__) . '/../library/hcuACH.i');
16 
17 
18  // ** SET SCRIPT LEVEL VARIABLES
19  $serviceShowInfo = true;
20  $serviceLoadMenu = true;
21  $serviceShowMenu = true;
22 
23  // ** INCLUDE MAIN GLOBAL SCRIPT -- Handles security / global variable values
24  require_once(dirname(__FILE__) . '/../library/hcuService.i');
25 
26  try {
27 
28  // ** INCLUDE PRE CONTENT
29  require_once(dirname(__FILE__) . '/../includes/hcuPreContent.i');
30 
31  // ** VERIFY ACH features are enabled for the credit union
32  $achEnabled = Check_ACHEnabled( $dbh, $HB_ENV );
33  if ( $achEnabled === false ) {
34  // * Feature NOT set
35  throw new Exception( HCU_JsonEncode( $MC->msg('Option not set', HCU_DISPLAY_AS_HTML) ), 915 );
36  }
37 
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) )
43  );
44 
45  // option labels do not work correctly with mvvm
46  // so we must add a default item to the list.
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) )
50  );
51 
52  PrintPartnerEditor($HB_ENV);
53  } catch (Exception $ex) {
54  // * Include the Error page and then end the content
55  // NOTE: this is for when the page is first loading
56  $serviceErrorMsg = HCU_JsonDecode($ex->getMessage());
57 
58  $serviceErrorCode = $ex->getCode(); // this chooses which error page to show
59 
60  require_once(dirname(__FILE__) . '/../includes/hcuErrorPage.i');
61  }
62 ?>
63 
64 <script type="text/javascript">
65 
66  var pWindowStack = null;
67  var pAction = null;
68  var pDataSource = null;
69  var pDataFilter = null;
70  var pDataSort = null;
71  var pGrid = null;
72  var pGridData = null;
73 
74  var pMulti = null;
75  var pMultiData = null;
76  var pSearch = null;
77  var pCreate = null;
78 
79  var pWindow = null;
80  var pDiscard = null;
81  var pDelete = null;
82 
83  var pObserve = null;
84  var pAcctData = null;
85  var pStateData = null;
86 
87  var pError = false;
88 
89  var InitDataSources = function() {
90  pWindowStack = [];
91  pGridData = [];
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({
96  transport: {
97  read: {
98  url: "hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
99  contentType: "application/json",
100  dataType: "json",
101  type: "GET",
102  cache: false,
103  data: {
104  action: "get_ach_partners"
105  }
106  },
107  create: {
108  type: "POST",
109  url: "hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
110  contentType: "application/x-www-form-urlencoded",
111  dataType: "json",
112  cache: false,
113  data: {
114  action: "add_ach_partner"
115  }
116  },
117  update: {
118  type: "POST",
119  url: "hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
120  contentType: "application/x-www-form-urlencoded",
121  dataType: "json",
122  cache: false,
123  data: {
124  action: "update_ach_partner"
125  }
126  },
127  destroy: {
128  type: "POST",
129  url: "hcuACH.data?cu=<?php echo $HB_ENV['cu']; ?>",
130  contentType: "application/x-www-form-urlencoded",
131  dataType: "json",
132  cache: false,
133  data: {
134  action: "delete_ach_partner"
135  }
136  },
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 ?
141  data.ach_name :
142  data.display_name;
143  }
144 
145  return data;
146  }
147  },
148  schema: {
149  model: {
150  id: "partner_id",
151  fields: {
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" }
169  }
170  },
171  parse: function(data) {
172  var results = null;
173  var resultsData = null;
174 
175  if (data.hasOwnProperty("Results")) {
176  results = data.Results;
177  resultsData = results.homecuData;
178  }
179 
180  if (results == undefined || results == null) {
181  return [];
182  }
183 
184  if (results.hasOwnProperty("homecuErrors")) {
185  return [];
186  }
187 
188  if (pAction == "read") {
189  pGridData = [];
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);
194  }
195  pGrid.dataSource.data(pGridData);
196  return pGridData;
197  } else {
198  var partner = null;
199  var partnerSetup = null;
200 
201  // get updated data
202  // delete just grab current partner
203  if (pAction == "create" || pAction == "update") {
204  partner = resultsData.partner_data;
205  partnerSetup = SetupPartner(partner, true);
206  } else {
207  partner = pObserve.sourcePartner;
208  partnerSetup = SetupPartner(partner, true);
209  }
210 
211  // find updated partner in grid datasource
212  if (pAction == "update" || pAction == "destroy") {
213  var partnerIndex = -1;
214 
215  for(var i = 0; i < pGridData.length; i++) {
216  if (pGridData[i].partner_id == partnerSetup.partner_id) {
217  partnerIndex = i;
218  break;
219  }
220  }
221  }
222 
223  // splice array with updated data
224  // for create: add partner
225  // for update: replace current partner
226  // for delete: remove current partner
227  if (pAction == "create") {
228  pGridData.push(partnerSetup);
229  } else if (pAction == "update") {
230  // must reset batch flag
231  partnerSetup.ach_batch = pGridData[partnerIndex].ach_batch;
232  pGridData.splice(partnerIndex, 1, partnerSetup);
233  } else if (pAction == "destroy") {
234  pGridData.splice(partnerIndex, 1);
235  }
236 
237  // update grid source
238  pGrid.dataSource.data(pGridData);
239  pObserve.reset();
240  pWindow.close();
241 
242  return partnerSetup;
243  }
244  }
245  },
246  requestStart: function(request) {
247  $.homecuValidator.hideMessage();
248  ShowWaitWindow();
249  pError = false;
250  },
251  requestEnd: function(response) {
252  pAction = response.type;
253  CloseWaitWindow();
254  try {
255  if (response.hasOwnProperty("response")) {
256  if (response.response.hasOwnProperty("Results")) {
257 
258  var results = response.response.Results;
259  if (results.hasOwnProperty("homecuErrors")) {
260  pError = true;
261  throw results.homecuErrors;
262  } else {
263  $.homecuValidator.settings.formStatusField = "formStatus";
264  $.homecuValidator.settings.formInfoTitle = "";
265  $.homecuValidator.displayMessage(results.homecuInfo);
266  }
267  } else {
268  throw "Error Parsing Server";
269  }
270  } else {
271  throw "Error Parsing Server";
272  }
273  } catch (error) {
274  $.homecuValidator.displayMessage(error, $.homecuValidator.settings.statusError );
275 
276  //reset datasource with current data
277  pDataSource.cancelChanges();
278  pDataSource.data(pGridData);
279  }
280  }
281  });
282  pDataSort = {
283  field: "display_name",
284  dir: "asc"
285  };
286  pDataFilter = {
287  logic: "and",
288  filters: [
289  {
290  logic: "or",
291  filters: [
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: "" }
296  ]
297  },
298  { field: "display_name", operator: "contains", value: "" }
299  ]
300  };
301  }
302 
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", ""]);
313  },
314  change: function() {
315  var filterValues = this.value();
316 
317  // filter by partner type, get the first filters object
318  // reset to empty
319  pDataFilter.filters[0].filters = [];
320 
321  // if none are selected, set to "none" this will filter
322  // the grid to show none of the possible types
323  if (filterValues.length == 0) {
324  pDataFilter.filters[0].filters = [];
325  pDataFilter.filters[0].filters.push({
326  field: "partner_type", operator: "eq", value: "none"
327  });
328  } else {
329  // if types have been selected add them to the filter
330  for (var i = 0; i < filterValues.length; i++) {
331  pDataFilter.filters[0].filters.push({
332  field: "partner_type", operator: "eq", value: filterValues[i]
333  });
334  }
335  }
336  pGrid.dataSource.filter(pDataFilter);
337  }
338  }).data("kendoMultiSelect");
339 
340  pGrid = $("#partnerGrid").kendoGrid({
341  toolbar: kendo.template($("#templateGridTool").html()),
342  selectable: "row",
343  pageable: true,
344  dataSource: {
345  data: pGridData,
346  filter: pDataFilter,
347  sort: pDataSort,
348  page: 1,
349  pageSize: 10
350  },
351  columns: [
352  { field: "name",
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()) }
360  ],
361  change: function() {
362  var partner = this.select();
363  var partnerSelect = this.dataItem(partner);
364  var partnerIndex = -1;
365  var partnerSource = pDataSource.data();
366 
367  for (var i = 0; i < partnerSource.length; i++) {
368  if (partnerSource[i].partner_id === partnerSelect.partner_id) {
369  partnerIndex = i;
370  break;
371  }
372  }
373 
374  OpenPartnerEditor(partnerSource[partnerIndex]);
375 
376  // remove selected class
377  partner.removeClass("k-state-selected");
378  }
379  }).data("kendoGrid");
380 
381  var maxHeight = parseInt($(window).height() * .85, 10);
382  var pWindowHtml = $("#achPartnerEditorTmp").html();
383  pWindow = $(pWindowHtml).kendoWindow({
384  width: "85%",
385  minWidth: 300,
386  maxWidth: 750,
387  maxHeight: maxHeight,
388  modal: true,
389  visible: false,
390  resizable: false,
391  activate: OpenWindow,
392  close: CloseWindow
393  }).data("kendoWindow");
394 
395  var pDiscardHtml = $("#achPartnerDiscardTmp").html();
396  pDiscard = $(pDiscardHtml).kendoDialog({
397  title: "<?php echo $MC->msg("ACH Discard Changes?", HCU_DISPLAY_AS_HTML) ?>",
398  modal: true,
399  visible: false,
400  resizable: false,
401  show: OpenWindow,
402  close: CloseWindow,
403  actions: [
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"; }
407  }
408  ]
409  }).data("kendoDialog");
410 
411  var pDeleteHtml = $("#achPartnerDeleteTmp").html();
412  pDelete = $(pDeleteHtml).kendoDialog({
413  title: "<?php echo $MC->msg("ACH Remove Partner", HCU_DISPLAY_AS_HTML) ?>",
414  modal: true,
415  visible: false,
416  resizable: false,
417  show: OpenWindow,
418  close: CloseWindow,
419  actions: [
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"; }
423  }
424  ]
425  }).data("kendoDialog");
426 
427  pObserve = new kendo.observable({
428  sourcePartner: null,
429  sourceDirty: false,
430  sourceDirtyInfo: false,
431  sourceDirtyAddr: false,
432  sourceDirtyAcct: false,
433  listPartnerTypes: pMultiData,
434  listAccountTypes: pAcctData,
435  listStates: pStateData,
436  showDelete: false,
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);
444  },
445  reset: function() {
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"));
452  },
453  save: function() {
454  // reset sourcePartner to dirty if errors have been
455  // this will allow the user to hit save again if they have changed anything.
456  if (pError) {
457  this.sourcePartner.dirty = true;
458  }
459 
460  // check for other errors
461  var otherErrors = [];
462  if (this.sourcePartner.zip != "") {
463  // must validate zip code
464  var zip = this.sourcePartner.zip;
465  var zipReplace = zip.replace(/_/g, "");
466  var zipSplit = zipReplace.split("-");
467  var zipConstruct = "";
468 
469  // validate section 1, must be 5 digits
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]) {
473  // validate section 2 must be 4 digits
474  if (zipSplit[1].length > 0 && zipSplit[1].length < 4) {
475  otherErrors.push("<?php echo $MC->msg("Zip Code Invalid", HCU_DISPLAY_AS_JS) ?>");
476  }
477  }
478 
479  // reconstruct zip code
480  if (zipSplit[1]) {
481  zipConstruct += zipSplit[0] + "-" + zipSplit[1];
482  } else {
483  zipConstruct += zipSplit[0];
484  }
485 
486  this.set("sourcePartner.zip", zipConstruct);
487  }
488 
489  if (this.sourcePartner.dfi_routing != "") {
490  // must vlalidate routing number
491  var routing = this.sourcePartner.dfi_routing;
492  var routingReplace = routing.replace(/_/g, "");
493 
494  if (routingReplace.length < 9) {
495  otherErrors.push("<?php echo $MC->msg("ACH Routing number 9 digits", HCU_DISPLAY_AS_HTML); ?>");
496  }
497 
498  this.set("sourcePartner.dfi_routing", routingReplace);
499  }
500 
501  if (this.sourceDirty) {
502  $.homecuValidator.validate();
503  var totalErrors = $.homecuValidator.homecuKendoValidator.errors();
504 
505  // cannot concat errors together because there may be duplicate errors
506  for (var i = 0; i < otherErrors.length; i++) {
507  if ($.inArray(otherErrors[i], totalErrors) == -1) {
508  totalErrors.push(otherErrors[i]);
509  }
510  }
511 
512  if (totalErrors.length > 0) {
513  $.homecuValidator.displayMessage(totalErrors, $.homecuValidator.settings.statusError);
514  $("#achPartnerEditor").scrollTop(0);
515  } else {
516  pDataSource.sync();
517  }
518  } else {
519  pWindow.close();
520  }
521  },
522  delete: function() {
523  pDelete.open();
524  },
525  cancel: function() {
526  pWindow.close();
527  },
528  change: function(e) {
529  var target = null;
530  var accordion = null;
531 
532  e.hasOwnProperty("sender") ?
533  target = $(e.sender.element[0]) :
534  target = $(e.target);
535 
536  // check if checkbox or label has been clicked
537  $(target).parent().attr("for") == "achPartnerNotify" ||
538  $(target).attr("name") == "achPartnerNotify" ?
539  this.set("sourcePartner.email_notify", !this.sourcePartner.email_notify) :
540  "";
541 
542  accordion = target.closest(".achAccordionContent");
543  accordionIndex = accordion.data("accordion-index");
544 
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;
549  }
550 
551  this.set("sourceDirty", true);
552  }
553  });
554 
555  kendo.data.binders.required = kendo.data.Binder.extend({
556  refresh: function() {
557  var required = this.bindings.required.get();
558  if (required) {
559  this.element.setAttribute("required", "required");
560  } else {
561  this.element.removeAttribute("required");
562  }
563  }
564  });
565 
566  pSearch = $("#partnerSearch");
567  pSearch.on("input", function() {
568  // filter by name, get the second filters object
569  // from pDataFilters and set its value.
570  pDataFilter.filters[1].value = $(this).val();
571  pGrid.dataSource.filter(pDataFilter);
572  });
573 
574  pCreate = $("#partnerAdd");
575  pCreate.on("click", function() {
576  // use data source to create new partner
577  pDataSource.add();
578  OpenPartnerEditor(pDataSource.data()[0]);
579  });
580 
581  // set up masks this way because mvvm mask for digits doesn't work
582  $("input[name=\"achPartnerZip\"]").kendoMaskedTextBox({
583  mask: "00000-9999",
584  clearPromptChar: true
585  });
586 
587  $("input[name=\"achPartnerRouting\"]").kendoMaskedTextBox({
588  mask: "000000000",
589  clearPromptChar: true
590  });
591 
592  homecuTooltip.bind({
593  achPartnerNotifyTip:
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); ?>"
596  });
597  }
598 
599  var CreateAddressString = function(partner) {
600  var showString = "";
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();
610  }
611  }
612 
613  if ( partner.address1.length > 0 ) {
614  if ( showString.length > 0 ) {
615  showString = partner.address1 + " / " + showString;
616  } else {
617  showString = partner.address1;
618  }
619  }
620 
621  return showString;
622  }
623 
624  var SetupPartner = function(partner, update) {
625  var partnerSetup = {
626  partner_id: parseInt(partner.id),
627  ach_batch: partner.ach_batch ? true : false,
628  ach_name: partner.ach_name ?
629  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) ?
634  true : false,
635  email: update ?
636  partner.email :
637  partner.address.email,
638  address1: update ?
639  partner.address1 :
640  partner.address.address1,
641  address2: update ?
642  partner.address2 :
643  partner.address.address2,
644  city: update ?
645  partner.city :
646  partner.address.city,
647  state: update ?
648  partner.state :
649  partner.address.state,
650  zip: update ?
651  partner.zip :
652  partner.address.zip,
653  country: update ?
654  partner.country :
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
668  };
669 
670  return partnerSetup;
671  }
672 
673  var OpenWindow = function(e) {
674  var windowElement = this.element[0];
675  var windowId = windowElement.id;
676 
677  switch (windowId) {
678  case "achPartnerEditor":
679  $("#achPartnerEditor").scrollTop(0);
680  break;
681  }
682 
683  pAction = null;
684  pWindowStack.push(this);
685  }
686 
687  var CloseWindow = function(e) {
688  var windowElement = this.element[0];
689  var windowId = windowElement.id;
690 
691  switch (pAction) {
692  case "partnerDiscard":
693  PopWindow(windowId);
694  pAction = null;
695  pDataSource.cancelChanges();
696  pObserve.reset();
697  pWindow.close();
698  break;
699  case "partnerDelete":
700  PopWindow(windowId);
701  pAction = null;
702  pDataSource.remove(pObserve.sourcePartner);
703  pDataSource.sync();
704  //pWindow.close();
705  break;
706  default:
707  if (windowId == "achPartnerEditor") {
708  if (pObserve.sourceDirty) {
709  e.preventDefault();
710  pDiscard.open();
711  } else {
712  PopWindow(windowId);
713  }
714  } else {
715  PopWindow(windowId);
716  }
717  break;
718  }
719  }
720 
721  var PopWindow = function(windowId) {
722  var popIndex = -1;
723  for (var i = 0; i < pWindowStack.length; i++) {
724  var openWindow = pWindowStack[i].element[0];
725  var openId = openWindow.id;
726 
727  if (openId == windowId) {
728  popIndex = i;
729  break;
730  }
731  }
732 
733  if (popIndex > -1) {
734  pWindowStack.splice(popIndex, 1);
735  }
736  }
737 
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) ?>"
744  });
745 
746  pObserve.reset();
747  pObserve.init(partner);
748 
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);
752  pWindow.center();
753  pWindow.open();
754  }
755 
756  var ResizeGrid = function() {
757  if ($(window).width() > 768) {
758  pGrid.hideColumn(2);
759  pGrid.showColumn(1);
760  pGrid.showColumn(0);
761  } else {
762  pGrid.showColumn(2);
763  pGrid.hideColumn(1);
764  pGrid.hideColumn(0);
765  }
766  }
767 
768  $(document).ready(function() {
769  InitDataSources();
770  InitDataViews();
771 
772  pDataSource.read();
773 
774  ResizeGrid();
775  $(window).resize(function() {
776  ResizeGrid();
777  pWindow.center();
778  });
779  });
780 
781  // close window on overlay click
782  $(document).on("click", ".k-overlay", function (e) {
783  if (pWindowStack.length > 0) {
784  var wnd = pWindowStack[pWindowStack.length - 1];
785  wnd.close();
786  }
787  });
788 </script>
789 
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>&nbsp;<?php echo $MC->msg("ACH Add Partner", HCU_DISPLAY_AS_HTML) ?></span>
795  </button>
796 </script>
797 
798 <!-- TEMPLATE: grid mobile view -->
799 <script type="text/x-kendo-template" id="templateGridMobile">
800  <div>#= display_name #</div>
801  <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>
808  #}else{#
809  <span><?php echo $MC->msg("ACH Unassigned", HCU_DISPLAY_AS_JS); ?></span>
810  #}#
811  </div>
812  <div>#= CreateAddressString(data) #</div>
813 </script>
814 
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>
820  </div>
821 </script>
822 
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>
831  #}else{#
832  <span><?php echo $MC->msg("ACH Unassigned", HCU_DISPLAY_AS_JS); ?></span>
833  #}#
834 </script>
835 
836 <!-- STYLES -->
837 <style type="text/css">
838  .k-grid tbody tr:hover {
839  cursor: pointer;
840  }
841 
842  .k-grid td:nth-child(2) {
843  border-left-width: 0;
844 
845  }
846 
847  .achFieldMargin {
848  margin-top: 7.5px;
849  margin-bottom: 7.5px;
850  }
851 
852  @media (max-width: 1023px) {
853  ul.k-pager-numbers {
854  margin-left: 11px;
855  }
856  }
857 </style>
858 
859 <!-- MAIN HTML -->
860 <div class="container-fluid">
861  <div class="well well-sm col-xs-12">
862 
863  <h3><?php echo $MC->msg("ACH Partner Title", HCU_DISPLAY_AS_HTML) ?></h3>
864 
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"/>
868  </div>
869 
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) ?>" />
874  </div>
875 
876  <div class="col-xs-12 achFieldMargin">
877  <div id="partnerGrid" class=""></div>
878  </div>
879  </div>
880 </div>
881 
882 <?php
883  // ** INCLUDE POST CONTENT SCRIPT
884  require_once(dirname(__FILE__) . '/../includes/hcuPostContent.i');
885 ?>