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