Odyssey
MBLPAY_TEST.i
1 <?php
2 
3 // This file is used to test the higher level code. It just returns hard-coded information.
4 // Writes will return success.
5 //
6 // If specific errors are needed, then they must be added manually.
7 //
8 define( "MP_TEST_ERROR_CODE", "2BAD" );
9 function fake_dates() {
10  $fake_dates = array();
11  $today = time();
12  $fake_dates['cutoff'] = date("Y-m-d",$today);
13  $fake_dates['sched1'] = date("Y-m-d",$today + (3 * 86400));
14  $fake_dates['sched2'] = date("Y-m-d",$today + (14 * 86400));
15  $fake_dates['early1'] = date("Y-m-d",$today + (1 * 86400));
16  $fake_dates['early2'] = date("Y-m-d",$today + (3 * 86400));
17  $fake_dates['next1'] = date("Y-m-d",$today + (2 * 86400));
18  $fake_dates['next2'] = date("Y-m-d",$today + (6 * 86400));
19  $fake_dates['hist1'] = date("Y-m-d",$today - (109 * 86400));
20  $fake_dates['hist2'] = date("Y-m-d",$today - (118 * 86400));
21  $fake_dates['hist3'] = date("Y-m-d",$today - (139 * 86400));
22  $fake_dates['hist4'] = date("Y-m-d",$today - (151 * 86400));
23  $fake_dates['hist5'] = date("Y-m-d",$today - (167 * 86400));
24  $fake_dates['hist6'] = date("Y-m-d",$today - (179 * 86400));
25  return $fake_dates;
26 }
27 
28 /**
29  * @param $parms
30  * @return array
31  */
32 function bpAuth($parms) {
33  try {
34  $return = [
35  'status'=>
36  [
37  'response' => 'true',
38  'code' => '000',
39  'message' =>'success'
40  ],
41  'data' => [
42  'MoblPayName' => (isset($parms['MoblPayName']) && (trim($parms['MoblPayName']) != '')) ?
43  htmlentities($parms['MoblPayName']) :
44  htmlentities('Pay Bills'),
45  ]
46  ];
47 
48  // PSCU does not have an 'is user authorized' call - just get bank accounts
49  // If no bank accounts, not authorized. Set current date/timestamp as token,
50  // later we'll use is as the correlation ID
51  $parms['Token'] = time();
52 
53  $reqdata['status']['response'] = "true";
54 
55  if ($reqdata['status']['response'] != 'true') {
56  throw new Exception($reqdata['status']['message']);
57  }
58 
59  // $return['data']['gettokenresult']=time();
60  $return['data']['Token'] = time();
61  $return['data']['BillpayId'] = (isset($parms['BillpayId']))? $parms['BillpayId'] : 0;
62  $return['data']['DateModel'] = "PayeeProcess";
63  $return['data']['Extras'] = htmlentities("Transfer=0&Recur=0&PayeeMaint=0&AccountMaint=0");
64 
65  } catch (Exception $e) {
66  $return['response'] = 'false';
67  $return['message'] = $e->getMessage();
68  $return['code'] = '999';
69  $return['data'] = ['Token' => '0'];
70  }
71  return $return;
72 }
73 
74 function bpHist($parms) {
75  try {
76  $fdates = fake_dates();
77  $response = '{"data":[{"amount":136.1,"automaticPayment":false,"confirmationNumber":"J20DP-943L5","detailAvailable":true,"payee":{"accountNumber":"093725462300001","id":"00000000001","nickName":null,"payeeName":"Verizon Wireless"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['hist1'] . 'T00:00:00-04:00","recurringPayment":true,"status":"PROCESSED","transactionID":"20150319020829044960"},
78  {"amount":30.34,"automaticPayment":false,"confirmationNumber":"3FR5Q-3KE5R","detailAvailable":true,"payee":{"accountNumber":"7433 70 001 0064898","id":"00000000003","nickName":null,"payeeName":"Big Dog Internet"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['hist2'] . 'T00:00:00-04:00","recurringPayment":true,"status":"PROCESSED","transactionID":"20150225043403281274"},
79  {"amount":177.07,"automaticPayment":false,"confirmationNumber":"JEFJW-KW7E4","detailAvailable":true,"payee":{"accountNumber":"093725462300001","id":"00000000001","nickName":null,"payeeName":"Verizon Wireless"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['hist3'] . 'T00:00:00-04:00","recurringPayment":true,"status":"PROCESSED","transactionID":"20150218080412085690"},
80  {"amount":30.34,"automaticPayment":false,"confirmationNumber":"MW4J9-L2DXQ","detailAvailable":true,"payee":{"accountNumber":"7433 70 001 0064898","id":"00000000003","nickName":null,"payeeName":"Big Dog Internet"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['hist4'] . 'T00:00:00-04:00","recurringPayment":true,"status":"PROCESSED","transactionID":"20150128041732200614"},
81  {"amount":135.92,"automaticPayment":false,"confirmationNumber":"J4E32-L4JJR","detailAvailable":true,"payee":{"accountNumber":"093725462300001","id":"00000000001","nickName":null,"payeeName":"Verizon Wireless"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['hist5'] . 'T00:00:00-04:00","recurringPayment":true,"status":"PROCESSED","transactionID":"20150119070241523913"},
82  {"amount":30.34,"automaticPayment":false,"confirmationNumber":"KR39Y-MR4TW","detailAvailable":true,"payee":{"accountNumber":"7433 70 001 0064898","id":"00000000003","nickName":null,"payeeName":"Big Dog Internet"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['hist6'] . 'T00:00:00-04:00","recurringPayment":true,"status":"PROCESSED","transactionID":"20141227023331318759"}],
83  "success":true,"meta":{}}';
84  $response = json_decode($response, true);
85  $reqdata["status"]["response"] = "true";
86  $reqdata["status"]["message"] = 'success';
87  $reqdata["data"] = $response['data'];
88 
89  if ($reqdata['status']['response'] != 'true') {
90  throw new Exception($reqdata['status']['message'] . print_r( $reqdata, true ));
91  }
92  foreach ($reqdata['data'] as $pkey => $payment) {
93  $item = array();
94  foreach ($payment as $key => $value) {
95  switch ($key) {
96  case 'transactionID':
97  $item['TxnId'] = $value;
98  break;
99  case 'payee':
100  $item['ToName'] = $value['payeeName'];
101  break;
102  case 'amount':
103  $item['Amount'] = sprintf('%0.2f',$value);
104  break;
105  case 'paymentDate':
106  $item['Date'] = substr($value, 0, 10);
107  break;
108  case 'confirmationNumber':
109  $item['AdditionalInfo']['Confirmation'] = $value;
110  break;
111  case "paymentAccount":
112  $item['AdditionalInfo']['Paid_From'] = implode("|", $value);
113  break;
114  case "automaticPayment":
115  $item['AdditionalInfo']['Automatic'] = ($value ? 'True' : 'False');
116  break;
117  case "recurringPayment":
118  $item['AdditionalInfo']['Recurring'] = ($value ? 'True' : 'False');
119  break;
120  case "status":
121  $item['AdditionalInfo']['Status'] = $value;
122  break;
123  }
124  }
125  $item['Type']='Payment';
126  $return['data'][]=$item;
127  }
128 
129  if (is_array($return['data'])) {
130  usort($return['data'], "histSort");
131  }
132 
133  $return["status"]["code"] = "000";
134  $return["status"]["response"] = "true";
135 
136 // $return['data']['raw']=print_r($reqdata,true);
137  } catch (Exception $e) {
138  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
139  }
140  return $return;
141 }
142 
143 function bpSched($parms) {
144  try {
145  $return=array('status'=>array('response'=>'true','message'=>'success'));
146  $fdates = fake_dates();
147  $response = '{"data":[{"amount":30.34,"automaticPayment":false,"confirmationNumber":"KEF34-TH0RS","detailAvailable":true,"payee":{"accountNumber":"7433 70 001 0064898","id":"00000000003","nickName":null,"payeeName":"Rise Internet"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['sched1'] . 'T00:00:00-04:00","recurringPayment":true,"status":"INPROCESS","transactionID":"20150627024648523995"},
148  {"amount":136.11,"automaticPayment":false,"confirmationNumber":"2BAD2-UPY0R","detailAvailable":true,"payee":{"accountNumber":"093725462300001","id":"00000000001","nickName":null,"payeeName":"Verizon Wireless"},"paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"paymentDate":"' . $fdates['sched2'] . 'T00:00:00-04:00","recurringPayment":true,"status":"PENDING","transactionID":"20150719070147766106"}],
149  "success":true,"meta":{}}';
150  $response = json_decode($response, true);
151  $reqdata["status"]["response"] = "true";
152  $reqdata["status"]["message"] = 'success';
153  $reqdata["data"] = $response['data'];
154 
155  if ($reqdata['status']['response'] != 'true') {
156  throw new Exception($reqdata['status']['message']);
157  }
158  foreach ($reqdata['data'] as $pkey => $payment) {
159  $item = array();
160  foreach ($payment as $key => $value) {
161  switch ($key) {
162  case 'transactionID':
163  $item['TxnId'] = $value;
164  break;
165  case 'payee':
166  $item['ToName'] = $value['payeeName'];
167  $item['ToId'] = $value['id'];
168  break;
169  case 'amount':
170  $item['Amount'] = sprintf('%0.2f',$value);
171  break;
172  case 'paymentDate':
173  $item['Date'] = substr($value, 0, 10);
174  break;
175  case "paymentAccount":
176  # PSCU doesn't use a separate fromID, set both id & name
177  $item['FromId'] = implode("|", $value);
178  $item['AdditionalInfo']['Pay_From'] = implode("|", $value);
179  break;
180  case 'confirmationNumber':
181  $item['AdditionalInfo']['Confirmation'] = $value;
182  break;
183  case "automaticPayment":
184  $item['AdditionalInfo']['Automatic'] = ($value ? 'True' : 'False');
185  break;
186  case "recurringPayment":
187  $item['AdditionalInfo']['Recurring'] = ($value ? 'True' : 'False');
188  break;
189  case "status":
190  $item['AdditionalInfo']['Status'] = $value;
191  break;
192  }
193  }
194  $item['Type']='Payment';
195  $return['data'][]=$item;
196  }
197  if (is_array($return['data'])) {
198  usort($return['data'], "schedSort");
199  }
200 
201  $return["status"]["code"] = "000";
202  $return["status"]["response"] = "true";
203 
204  } catch (Exception $e) {
205  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
206  }
207  return $return;
208 }
209 
210 function bpSourceAccts($parms) {
211  try {
212  $return=array('status'=>array('response'=>'true','message'=>'success'));
213 
214  $response = '{"data":[{"bankingEnabled":false,"options":null,"billPaymentEnabled":true,"billingAccount":"true","businessName":null,"financialViewEnabled":false,"nickName":"Main","paymentAccount":{"accountNumber":"003478002356","accountType":"CHECKING_ACCOUNT","routingNumber":"379065431"},"preferredAccount":"true","primaryAccountOwner":null,"secondaryAccountOwner":null}],
215  "success":true,"meta":{}}';
216  $response = json_decode($response, true);
217  $reqdata["status"]["response"] = "true";
218  $reqdata["status"]["message"] = 'success';
219  $reqdata["data"] = $response['data'];
220 
221  if ($reqdata['status']['response'] != 'true') {
222  throw new Exception($reqdata['status']['message']);
223  }
224  $hasAtLeastOneAccount = false;
225  foreach ($reqdata['data'] as $akey => $account) {
226  $item = array();
227  foreach ($account as $key => $value) {
228  switch ($key) {
229  case 'businessName':
230  case 'nickName':
231  if (trim($value) > '') {
232  $item['Name'] = trim(HCU_array_key_value('Name', $item)) . "$value ";
233  }
234  break;
235  case "paymentAccount":
236  $item['FromId'] = implode("|", $value);
237  $hasAtLeastOneAccount = true;
238  break;
239  case 'preferredAccount':
240  $item['AdditionalInfo']['Preferred_Account'] = (is_null($value) ? 0 : 1);
241  break;
242  case 'primaryAccountOwner':
243  if (trim($value) > '') {
244  $item['AdditionalInfo']['Primary_Owner'] = $value;
245  }
246  break;
247  }
248  }
249  // make sure we have a name for the account
250  if ( strlen( $item["Name"] ) == 0 &&
251  strlen( $item["FromId"] ) > 0 ) {
252  $parts = explode( "|", $item["FromId"] );
253  $item["Name"] = $parts[0];
254  }
255 
256  $item['CanRush']=0;
257  $return['data'][]=$item;
258  }
259 
260  if ( !$hasAtLeastOneAccount ) {
261  throw new Exception("No source accounts received from vendor.");
262  }
263  } catch (Exception $e) {
264  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
265  }
266  return $return;
267 }
268 
269 function bpDestAccts($parms) {
270  # PSCU doesn't do transfers, so this is always Payees
271  try {
272  $return=array('status'=>array('response'=>'true','message'=>'success'));
273  $fdates = fake_dates();
274  $response = '{"data":[{"accountNumber":"093725462300001","addressAvailable":false,"autopayEnabled":true,"category":"Cellular","cutoffTime":"' . $fdates['cutoff'] . 'T22:00:00-04:00","earliestPaymentDt":"' . $fdates['early1'] . 'T00:00:00-04:00","ebillCapable":true,"ebillEnabled":true,"id":"00000000001","leadDays":2,"name":"Verizon Wireless","nextPaymentDt":"' . $fdates['next1'] . 'T00:00:00-04:00","paperPaymentsEnabled":false,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"800.922.0204","recurringModelEnabled":false},
275  {"accountNumber":"115-05648R","addressAvailable":true,"autopayEnabled":false,"category":"Uncategorized","cutoffTime":"' . $fdates['cutoff'] . 'T15:00:00-04:00","earliestPaymentDt":"' . $fdates['early2'] . 'T00:00:00-04:00","ebillCapable":false,"ebillEnabled":false,"id":"00000000002","leadDays":4,"name":"Les Schwab Tire Center","nextPaymentDt":"' . $fdates['next2'] . 'T00:00:00-04:00","paperPaymentsEnabled":true,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"208-238-7442","recurringModelEnabled":false},
276  {"accountNumber":"7433 70 001 0064898","addressAvailable":true,"autopayEnabled":false,"category":"Internet","cutoffTime":"' . $fdates['cutoff'] . 'T15:00:00-04:00","earliestPaymentDt":"' . $fdates['early2'] . 'T00:00:00-04:00","ebillCapable":false,"ebillEnabled":false,"id":"00000000003","leadDays":4,"name":"Rise Internet","nextPaymentDt":"' . $fdates['next2'] . 'T00:00:00-04:00","paperPaymentsEnabled":true,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"8554234638","recurringModelEnabled":true},
277  {"accountNumber":"74241","addressAvailable":true,"autopayEnabled":false,"category":"Uncategorized","cutoffTime":"' . $fdates['cutoff'] . 'T15:00:00-04:00","earliestPaymentDt":"' . $fdates['early2'] . 'T00:00:00-04:00","ebillCapable":false,"ebillEnabled":false,"id":"00000000005","leadDays":4,"name":"Blackrock Dental, PLLC","nextPaymentDt":"' . $fdates['next2'] . 'T00:00:00-04:00","paperPaymentsEnabled":true,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"208-232-5294","recurringModelEnabled":false}],
278  "success":true,"meta":{}}';
279  $response = json_decode($response, true);
280  $reqdata["status"]["response"] = "true";
281  $reqdata["status"]["message"] = 'success';
282  $reqdata["data"] = $response['data'];
283 
284  if ($reqdata['status']['response'] != 'true') {
285  throw new Exception($reqdata['status']['message']);
286  }
287  $hasAtLeastOneAccount = false;
288  foreach ($reqdata['data'] as $akey => $account) {
289  $item = array();
290  foreach ($account as $key => $value) {
291  switch ($key) {
292  case "id":
293  $item['ToId'] = $value;
294  $hasAtLeastOneAccount = true;
295  break;
296  case 'name':
297  $item['Name'] = $value;
298  break;
299  case 'preferredAccount':
300  $item['AdditionalInfo']['Preferred_Account'] = (is_null($value) ? 0 : 1);
301  break;
302  case 'primaryAccountOwner':
303  if (trim($value) > '') {
304  $item['AdditionalInfo']['Primary_Owner'] = $value;
305  }
306  break;
307  case 'accountNumber':
308  if (trim($value) > '') {
309  $item['AdditionalInfo']['Account_Number'] = $value;
310  }
311  case 'category':
312  if (trim($value) > '') {
313  $item['AdditionalInfo']['Category'] = $value;
314  }
315  case 'earliestPaymentDt':
316  if (strtotime($value)) {
317  $item['FirstPayDate'] = gmdate( "Y-m-d", strtotime( $value ) );
318  }
319  case 'nextPaymentDt':
320  if (strtotime($value)) {
321  $item['NextPayDate'] = gmdate( "Y-m-d", strtotime( $value ) );
322  }
323  break;
324  }
325  }
326  $item['CanRush']=0;
327  $return['data'][]=$item;
328  }
329 
330  if ( !$hasAtLeastOneAccount ) {
331  throw new Exception("No destination accounts received from vendor.");
332  }
333  } catch (Exception $e) {
334  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
335  }
336  return $return;
337 }
338 
339 function bpPmtAdd($parms) {
340  try {
341  $return=array('status'=>array('response'=>'true','message'=>'success'));
342  if (HCU_array_key_value('pilot', $parms) == 1) {
343  $parms['serviceurl'] = $parms['piloturl'];
344  } else {
345  $parms['serviceurl'] = HCU_array_key_value('produrl', $parms);
346  }
347  list($acctno,$accttype,$rt) = explode("|",$parms['passwith']['FromId']);
348  $parms['Token']=$parms['passwith']['Token'];
349  $parms['PayeeId'] = $parms['passwith']['ToId'];
350  $parms['AcctNo'] = $acctno;
351  $parms['AcctType'] = $accttype;
352  $parms['rt'] = $rt;
353  $parms['PayDate'] = $parms['passwith']['Date'];
354  $parms['Amount'] = $parms['passwith']['Amount'];
355  # PSCU mobile doesn't support rush payments
356  $parms['DelMethod'] = 'REGULAR_PAYMENT';
357 
358  $reqdata = array();
359  $reqdata["data"]["confirmationNumber"] = "123456abcdef";
360  $reqdata['data']['transactionID'] = date( "Ymdhis" );
361  $reqdata["status"]["response"] = "true";
362 
363  if ($reqdata['status']['response'] != 'true') {
364  throw new Exception($reqdata['status']['message']);
365  }
366 
367  $return['data']['Confirmation']=$reqdata['data']['confirmationNumber'];
368  $return['data']['TransactionId']=$reqdata['data']['transactionID'];
369  $return['data']['EstimatedArrival']='';
370 
371  } catch (Exception $e) {
372  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
373  }
374  return $return;
375 }
376 
377 function bpTrnAdd($parms) {
378  try {
379  $return=array('status'=>array('response'=>'true','message'=>'success'),'data'=>array());
380  # PSCU has no Transfer functionality - just return error
381  throw new Exception('Feature Unavailable');
382  } catch (Exception $e) {
383  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
384  }
385  return $return;
386 }
387 
388 function bpPmtEdit($parms) {
389  try {
390  $return=array('status'=>array('response'=>'true','message'=>'success'));
391  if ($parms['pilot'] == 1) {
392  $parms['serviceurl'] = $parms['piloturl'];
393  } else {
394  $parms['serviceurl'] = $parms['produrl'];
395  }
396 
397  list($acctno,$accttype,$rt) = explode("|",$parms['passwith']['FromId']);
398  $parms['Token']=$parms['passwith']['Token'];
399  $parms['txnID'] = $parms['passwith']['TxnId'];
400  $parms['PayeeId'] = $parms['passwith']['ToId'];
401  $parms['AcctNo'] = $acctno;
402  $parms['AcctType'] = $accttype;
403  $parms['rt'] = $rt;
404  $parms['PayDate'] = $parms['passwith']['Date'];
405  $parms['Amount'] = $parms['passwith']['Amount'];
406  # PSCU mobile doesn't support rush payments
407  $parms['DelMethod'] = 'REGULAR_PAYMENT';
408 
409  $reqdata = array();
410  $reqdata["data"]["confirmationNumber"] = "123456abcdef";
411  $reqdata['data']['transactionID'] = date( "Ymdhis" );
412  $reqdata["status"]["response"] = "true";
413 
414  if ($reqdata['status']['response'] != 'true') {
415  throw new Exception($reqdata['status']['message']);
416  }
417 
418  $return['data']['Confirmation']=$reqdata['data']['confirmationNumber'];
419  $return['data']['TransactionId']=$reqdata['data']['transactionID'];
420  $return['data']['EstimatedArrival']='';
421 
422 
423  } catch (Exception $e) {
424  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
425  }
426  return $return;
427 }
428 
429 function bpPmtStop($parms) {
430  try {
431  $return=array('status'=>array('response'=>'true','message'=>'success'));
432  if ($parms['pilot'] == 1) {
433  $parms['serviceurl'] = $parms['piloturl'];
434  } else {
435  $parms['serviceurl'] = $parms['produrl'];
436  }
437 
438  $parms['Token']=$parms['passwith']['Token'];
439  $parms['txnID'] = $parms['passwith']['TxnId'];
440 
441  $reqdata = array();
442  $reqdata["data"]["confirmationNumber"] = "123456abcdef";
443  $reqdata['data']['transactionID'] = date( "Ymdhis" );
444  $reqdata["status"]["response"] = "true";
445 
446  if ($reqdata['status']['response'] != 'true') {
447  throw new Exception($reqdata['status']['message']);
448  }
449  $return['data']['StopResult']=1;
450 
451  } catch (Exception $e) {
452  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
453  }
454  return $return;
455 }
456 
457 function bpGetPaymentDates($parms) {
458  try {
459  $return=array('status'=>array('response'=>'true','message'=>'success'));
460  $fdates = fake_dates();
461  $response = '{"data":[{"accountNumber":"093725462300001","addressAvailable":false,"autopayEnabled":true,"category":"Cellular","cutoffTime":"' . $fdates['cutoff'] . 'T22:00:00-04:00","earliestPaymentDt":"' . $fdates['early1'] . 'T00:00:00-04:00","ebillCapable":true,"ebillEnabled":true,"id":"00000000001","leadDays":2,"name":"Verizon Wireless","nextPaymentDt":"' . $fdates['next1'] . 'T00:00:00-04:00","paperPaymentsEnabled":false,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"800.922.0204","recurringModelEnabled":false},
462  {"accountNumber":"115-05648R","addressAvailable":true,"autopayEnabled":false,"category":"Uncategorized","cutoffTime":"' . $fdates['cutoff'] . 'T15:00:00-04:00","earliestPaymentDt":"' . $fdates['early2'] . 'T00:00:00-04:00","ebillCapable":false,"ebillEnabled":false,"id":"00000000002","leadDays":4,"name":"Les Schwab Tire Center","nextPaymentDt":"' . $fdates['next2'] . 'T00:00:00-04:00","paperPaymentsEnabled":true,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"208-238-7442","recurringModelEnabled":false},
463  {"accountNumber":"7433 70 001 0064898","addressAvailable":true,"autopayEnabled":false,"category":"Internet","cutoffTime":"' . $fdates['cutoff'] . 'T15:00:00-04:00","earliestPaymentDt":"' . $fdates['early2'] . 'T00:00:00-04:00","ebillCapable":false,"ebillEnabled":false,"id":"00000000003","leadDays":4,"name":"Rise Internet","nextPaymentDt":"' . $fdates['next2'] . 'T00:00:00-04:00","paperPaymentsEnabled":true,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"8554234638","recurringModelEnabled":true},
464  {"accountNumber":"74241","addressAvailable":true,"autopayEnabled":false,"category":"Uncategorized","cutoffTime":"' . $fdates['cutoff'] . 'T15:00:00-04:00","earliestPaymentDt":"' . $fdates['early2'] . 'T00:00:00-04:00","ebillCapable":false,"ebillEnabled":false,"id":"00000000005","leadDays":4,"name":"Blackrock Dental, PLLC","nextPaymentDt":"' . $fdates['next2'] . 'T00:00:00-04:00","paperPaymentsEnabled":true,"paymentServices":[{"paymentServiceType":"OVERNIGHT_CHECK","sponsorEnabled":true}],"phoneNumber":"208-232-5294","recurringModelEnabled":false}],
465  "success":true,"meta":{}}';
466  $response = json_decode($response, true);
467  $reqdata["status"]["response"] = "true";
468  $reqdata["status"]["message"] = 'success';
469  $reqdata["data"] = $response['data'];
470 
471  foreach ($reqdata['data'] as $payee) {
472  if ($payee['id'] == HCU_array_key_value('PayeeId', $parms)) {
473  # this is the $account we want, break out of foreach(reqdata['data']);
474  break;
475  }
476  }
477  $lead = $payee['leadDays'];
478  $firstpay = $payee['earliestPaymentDt'];
479  $nextpay = $payee['nextPaymentDt'];
480  $cutoff = $payee['cutoffTime'];
481 
482  $datelist=array();
483  # test $firstpay to make sure it is a date?
484  $defaultTZ=date_default_timezone_get(); # so we can put it back
485  date_default_timezone_set('UTC');
486  $now=time();
487  if($now > strtotime( $cutoff )) {
488  $Start = strtotime( $nextpay );
489  } else {
490  $Start = strtotime( $firstpay );
491  }
492  # if Start is false (strtotime failed) use current time
493  $Start = ($Start ? $Start : $now);
494  $End = $Start + (90 * 24 * 60 * 60);
495  $holidays = ListHolidays(date('Y',$Start),date('Y',$End));
496  for ($i=$Start; $i<=$End; $i+=86400) {
497  $i=GetNextBusiness($i);
498  $item=array();
499  $idate = gmdate('Y-m-d',$i);
500  if (!in_array($idate,$holidays)) {
501  $item['Proc'] = gmdate('Y-m-d',$i);
502  if (isset($parms['datemodel']) && strtoupper($parms['datemodel']) == 'DUE') {
503  $item['Due'] = gmdate('Y-m-d',GetNextBusiness($i+($lead*86400)));
504  }
505 
506  $datelist[]=$item;
507  }
508  }
509 
510  date_default_timezone_set($defaultTZ);
511 
512  $return['data']['EarliestPay'] = $firstpay;
513  $return['data']['NextPay'] = $nextpay;
514  $return['data']['Cutoff'] = $cutoff;
515  $return['data']['LeadDays'] = $lead;
516  # build RushOptions list like this:
517 // $return['data']['RushOptions'][]=array('Display'=>'Overnight','Value'=>'OVERNIGHT_CHECK','Price'=>'14.95');
518  $return['data']['RushOptions']=array();
519  $return['data']['PaymentDates']=$datelist;
520  } catch (Exception $e) {
521  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
522  }
523  return $return;
524 }
525 
526 function bpGetTerms($parms) {
527  try {
528  // randomly get the terms
529  $randVal = rand( 0, 100 );
530  if ( $randVal < 10 ) {
531  $randomTerms = 'These are the terms.';
532  } else {
533  $randomTerms = "";
534  }
535 
536  $return=array('status'=>array('response'=>'true','message'=>'success'),'data'=>array('Terms'=>$randomTerms));
537  } catch (Exception $e) {
538  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
539  }
540  return $return;
541 }
542 
543 function bpGetRushOptions($parms) {
544  try {
545  # PSCU has no Rush Options functionality - just return empty success
546  $return=array('status'=>array('response'=>'true','message'=>'success'),'data'=>array());
547  } catch (Exception $e) {
548  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_PSCU_ERROR_CODE,'data'=>array());
549  }
550  return $return;
551 }
552 
553 /**
554  * @param $parms not used
555  * @return array
556  */
557 function bpAcceptTerms($parms) {
558 
559  try {
560  # PSCU has no Accept Terms functionality - just return empty success
561  $return = [
562  'status' => [
563  'response' => 'true',
564  'message' =>'success',
565  'code' => '000'
566  ],
567  'data' => []
568  ];
569  } catch (Exception $e) {
570  $return = [
571  'status' => [
572  'response' => 'false',
573  'message' => $e->getMessage()
574  ],
575  'code' => MP_PSCU_ERROR_CODE,
576  'data'=> []
577  ];
578  }
579 
580  return $return;
581 }
582 
583 /**
584  * @param $parms (not used)
585  * @return array
586  */
587 function bpGetFeatureList($parms) {
588 
589  try {
590  # Need to decide what the data looks like here -- string list of available features
591  # maybe something out of trusteddetail (which comes to this function in $parms)
592  # to allow customizing by cu
593  $return = [
594  'status' => [
595  'response' => 'true',
596  'message' => 'success'
597  ],
598  'data' => [
599  'featurelist' => "Payment|History|Scheduled",
600  'extras' => '',
601  ]
602  ];
603  } catch (Exception $e) {
604  $return = [
605  'status' => [
606  'response' => 'false',
607  'message' => $e->getMessage()
608  ],
609  'code' => MP_PSCU_ERROR_CODE,
610  'data' => []
611  ];
612  }
613 
614  return $return;
615 }
616 
617 function schedSort($a, $b)
618 {
619  $atime = strtotime($a['Date']);
620  $btime = strtotime($b['Date']);
621  if ($atime == $btime) {
622  if ($a['ToName'] == $b['ToName']) {
623  return 0;
624  }
625  return ($a['ToName'] < $b['ToName']) ? -1 : 1;
626  }
627  return ($atime < $btime) ? -1 : 1;
628 }
629 
630 function histSort($a, $b) {
631  $atime = strtotime($a['Date']);
632  $btime = strtotime($b['Date']);
633  if ($atime == $btime) {
634  if ($a['ToName'] == $b['ToName']) {
635  return 0;
636  }
637  return ($a['ToName'] < $b['ToName']) ? -1 : 1;
638  }
639  return ($atime > $btime) ? -1 : 1;
640 }
641 
642 function ListHolidays($Start, $End) {
643 //================================================= ================
644 //This function programmatically determines Federal Holidays landing
645 // between the given start and end YY
646 // adapted from code Written by Jana Bauer,
647 // which was adapted from code obtained at
648 //http://www.tek-tips.com/faqs.cfm?fid=6003
649 //================================================= ================
650 
651  $holidays = array();
652  for ($i = $Start; $i <= $End; $i++) {
653  for ($m = 1; $m <= 12; $m++) {
654  switch ($m) {
655  case 3:
656  case 4:
657  case 6:
658  case 8:
659 // No holidays in these months
660  break;
661 
662  case 1:
663  // New Year's Day 1/1 or Following Monday
664  $dtHoliday = mktime(12, 0, 0, 1, 1, $i);
665 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
666  $holidays[] = date('Y-m-d',$dtHoliday);
667  // MLK Day 3rd Monday in January
668  $dow = idate('w', $dtHoliday);
669  # find first Monday
670  switch ($dow) {
671  case 0: #Sunday
672  $dtHoliday += 86400;
673  break;
674  case 1: #already Monday
675  break;
676  case 2:
677  $dtHoliday += (86400 * 6);
678  break;
679  case 3:
680  $dtHoliday += (86400 * 5);
681  break;
682  case 4:
683  $dtHoliday += (86400 * 4);
684  break;
685  case 5:
686  $dtHoliday += (86400 * 3);
687  break;
688  case 6:
689  $dtHoliday += (86400 * 2);
690  break;
691  }
692  $dtHoliday += (86400 * 14); # add 2 weeks to get 3rd Monday
693  $holidays[] = date('Y-m-d',$dtHoliday);
694  break;
695 
696  case 2:
697  // President's Day 3rd Monday in February
698  $dtHoliday = mktime(12, 0, 0, 2, 1, $i);
699  $dow = idate('w', $dtHoliday);
700  # find first Monday
701  switch ($dow) {
702  case 0: #Sunday
703  $dtHoliday += 86400;
704  break;
705  case 1: #already Monday
706  break;
707  case 2:
708  $dtHoliday += (86400 * 6);
709  break;
710  case 3:
711  $dtHoliday += (86400 * 5);
712  break;
713  case 4:
714  $dtHoliday += (86400 * 4);
715  break;
716  case 5:
717  $dtHoliday += (86400 * 3);
718  break;
719  case 6:
720  $dtHoliday += (86400 * 2);
721  break;
722  }
723  $dtHoliday += (86400 * 14); # add 2 weeks to get 3rd Monday
724  $holidays[] = date('Y-m-d',$dtHoliday);
725  break;
726 
727  case 5:
728  // Memorial Day Last Monday in May
729  $dtHoliday = mktime(12, 0, 0, 5, 31, $i);
730  $dow = idate('w', $dtHoliday);
731  # find last day & back up
732  switch ($dow) {
733  case 0: #Sunday
734  $dtHoliday -= (86400 * 6);
735  break;
736  case 1: #already Monday
737  break;
738  case 2:
739  $dtHoliday -= 86400;
740  break;
741  case 3:
742  $dtHoliday -= (86400 * 2);
743  break;
744  case 4:
745  $dtHoliday -= (86400 * 3);
746  break;
747  case 5:
748  $dtHoliday -= (86400 * 4);
749  break;
750  case 6:
751  $dtHoliday -= (86400 * 5);
752  break;
753  }
754  $holidays[] = date('Y-m-d',$dtHoliday);
755  break;
756 
757  case 7:
758  // Independence Day 7/4 or Following Monday
759  $dtHoliday = mktime(12, 0, 0, 7, 4, $i);
760 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
761  $holidays[] = date('Y-m-d',$dtHoliday);
762 
763  break;
764 
765  case 9:
766  // Labor Day 1st Monday in September
767  $dtHoliday = mktime(12, 0, 0, 9, 1, $i);
768  $dow = idate('w', $dtHoliday);
769  # find first Monday
770  switch ($dow) {
771  case 0: #Sunday
772  $dtHoliday += 86400;
773  break;
774  case 1: #already Monday
775  break;
776  case 2:
777  $dtHoliday += (86400 * 6);
778  break;
779  case 3:
780  $dtHoliday += (86400 * 5);
781  break;
782  case 4:
783  $dtHoliday += (86400 * 4);
784  break;
785  case 5:
786  $dtHoliday += (86400 * 3);
787  break;
788  case 6:
789  $dtHoliday += (86400 * 2);
790  break;
791  }
792  $holidays[] = date('Y-m-d',$dtHoliday);
793  break;
794 
795  case 10:
796  // Columbus Day 2nd Monday in October
797  $dtHoliday = mktime(12, 0, 0, 10, 1, $i);
798  $dow = idate('w', $dtHoliday);
799  # find first Monday
800  switch ($dow) {
801  case 0: #Sunday
802  $dtHoliday += 86400;
803  break;
804  case 1: #already Monday
805  break;
806  case 2:
807  $dtHoliday += (86400 * 6);
808  break;
809  case 3:
810  $dtHoliday += (86400 * 5);
811  break;
812  case 4:
813  $dtHoliday += (86400 * 4);
814  break;
815  case 5:
816  $dtHoliday += (86400 * 3);
817  break;
818  case 6:
819  $dtHoliday += (86400 * 2);
820  break;
821  }
822  $dtHoliday += (86400 * 7); # add 1 week to get 2nd Monday
823  $holidays[] = date('Y-m-d',$dtHoliday);
824  break;
825 
826  case 11:
827  // Veteran's Day 11/11 or Following Monday
828  $dtHoliday = mktime(12, 0, 0, 11, 11, $i);
829 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
830  $holidays[] = date('Y-m-d',$dtHoliday);
831 
832  // Thanksgiving Day 4th Thursday in November
833  $dtHoliday = mktime(12, 0, 0, 11, 1, $i);
834  $dow = idate('w', $dtHoliday);
835  # find first Thursday
836  switch ($dow) {
837  case 0: #Sunday
838  $dtHoliday += (86400 * 4);
839  break;
840  case 1: #Monday
841  $dtHoliday += (86400 * 3);
842  break;
843  case 2:
844  $dtHoliday += (86400 * 2);
845  break;
846  case 3:
847  $dtHoliday += 86400;
848  break;
849  case 4:
850  break;
851  case 5:
852  $dtHoliday += (86400 * 6);
853  break;
854  case 6:
855  $dtHoliday += (86400 * 5);
856  break;
857  }
858  $dtHoliday += (86400 * 21); # add 3 weeks to get 4th Thursday
859  $holidays[] = date('Y-m-d',$dtHoliday);
860  break;
861 
862  case 12:
863  // Christmas Day 12/25 or Following Monday
864  $dtHoliday = mktime(12, 0, 0, 12, 25, $i);
865 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
866  $holidays[] = date('Y-m-d',$dtHoliday);
867 
868  break;
869  }
870  }
871  }
872 
873  return $holidays;
874 }
875 
876 //------------------------------------------------------------------------------------------------------------
877 Function GetNearestWeekday($dtTimeStamp) {
878 // Not currently called - if holiday falls on weekend leave it be
879 //Note Sunday = 0, Saturday = 6
880  $intWeekday = idate('w', $dtTimeStamp);
881  switch ($intWeekday) {
882  case 0: #Sunday - move forward to Monday
883  $dtTimeStamp += 86400;
884  break;
885  case 6: #Saturday - move back to Friday
886  $dtTimeStamp -= 86400;
887  break;
888  case 1: # Monday - Friday - do nothing
889  case 2:
890  case 3:
891  case 4:
892  case 5:
893  default:
894  break;
895  }
896  return $dtTimeStamp;
897 }
898 
899 Function GetNextBusiness($dtTimeStamp) {
900 // Not currently called - if holiday falls on weekend leave it be
901 //Note Sunday = 0, Saturday = 6
902  $intWeekday = idate('w', $dtTimeStamp);
903  switch ($intWeekday) {
904  case 0: #Sunday - move forward to Monday
905  $dtTimeStamp += 86400;
906  break;
907  case 6: #Saturday - move forward to Monday
908  $dtTimeStamp += (86400*2);
909  break;
910  case 1: # Monday - Friday - do nothing
911  case 2:
912  case 3:
913  case 4:
914  case 5:
915  default:
916  break;
917  }
918  return $dtTimeStamp;
919 }