adjust EFT Canada processing delay based on time of day, and warn the user, #20384
authorMark Wells <mark@freeside.biz>
Fri, 15 Aug 2014 02:42:11 +0000 (19:42 -0700)
committerMark Wells <mark@freeside.biz>
Fri, 15 Aug 2014 02:42:11 +0000 (19:42 -0700)
FS/FS/pay_batch/eft_canada.pm
httemplate/misc/xmlhttp-pay_batch-note.html [new file with mode: 0644]
httemplate/search/elements/cust_pay_batch_top.html

index 64fd2f9..3c1d219 100644 (file)
@@ -66,23 +66,9 @@ my %holiday = (
       @config = $conf->config('batchconfig-eft_canada');
     }
     # SFTP login, password, trans code, delay time
-    my $process_delay;
-    ($trans_code, $process_delay) = @config[2,3];
-    $process_delay ||= 1; # days
-
-    my $pt = time + ($process_delay * 86400);
-    my @lt = localtime($pt);
-    while (    $lt[6] == 0 #Sunday
-            || $lt[6] == 6 #Saturday
-            || $holiday_yearly{ $lt[4]+1 }{ $lt[3] }
-            || $holiday{ $lt[5]+1900 }{ $lt[4]+1 }{ $lt[3] }
-          )
-    {
-      $pt += 86400;
-      @lt = localtime($pt);
-    }
+    ($trans_code) = $config[2];
 
-    $process_date = time2str('%D', $pt);
+    $process_date = time2str('%D', process_date($conf, $agentnum));
   },
 
   delimiter => '', # avoid blank lines for header/footer
@@ -124,4 +110,54 @@ my %holiday = (
 
 );
 
+sub download_note { # is a class method
+  my $class = shift;
+  my $pay_batch = shift;
+  my $conf = FS::Conf->new;
+  my $agentnum = $pay_batch->agentnum;
+  my $tomorrow = (localtime(time))[2] >= 10;
+  my $upload_date = time;
+  $upload_date += 86400 if $tomorrow;
+  my $process_date = process_date($conf, $agentnum);
+  my $date_format = $conf->config('date_format') || '%D';
+
+  'Upload this file before 11:00 AM '.
+    ($tomorrow ? 'tomorrow' : 'today') .
+    ' (' . time2str($date_format, $upload_date) . '). '.
+    'Payments will be processed on '.
+    time2str($date_format, $process_date) . '.';
+}
+
+sub process_date {
+  my ($conf, $agentnum) = @_;
+  my @config;
+  if ( $conf->exists('batch-spoolagent') ) {
+    @config = $conf->config('batchconfig-eft_canada', $agentnum);
+  } else {
+    @config = $conf->config('batchconfig-eft_canada');
+  }
+
+  my $process_delay = $config[3] || 1;
+
+  if ( (localtime(time))[2] >= 10 ) {
+    # If downloading the batch after 10:00 local time, it likely won't make
+    # the cutoff for next-day turnaround, and EFT will reject it.
+    $process_delay++;
+  }
+
+  my $pt = time + ($process_delay * 86400);
+  my @lt = localtime($pt);
+  while (    $lt[6] == 0 #Sunday
+          || $lt[6] == 6 #Saturday
+          || $holiday_yearly{ $lt[4]+1 }{ $lt[3] }
+          || $holiday{ $lt[5]+1900 }{ $lt[4]+1 }{ $lt[3] }
+        )
+  {
+    $pt += 86400;
+    @lt = localtime($pt);
+  }
+
+  $pt;
+}
+
 1;
diff --git a/httemplate/misc/xmlhttp-pay_batch-note.html b/httemplate/misc/xmlhttp-pay_batch-note.html
new file mode 100644 (file)
index 0000000..ef59016
--- /dev/null
@@ -0,0 +1,18 @@
+<% $note %>\
+<%init>
+
+my ($batchnum, $format) = $cgi->param('arg');
+
+my $note = '';
+if ( $batchnum =~ /^(\d+)$/ ) {
+  my $pay_batch = FS::pay_batch->by_key($batchnum);
+  if ( $pay_batch and $format =~ /^(\w+)$/ ) {
+    my $class = "FS::pay_batch::$format";
+    if ( $class->can('download_note') ) {
+      # now we can actually do something
+      $note = $class->download_note($pay_batch);
+    }
+  }
+}
+
+</%init>
index bf30477..c502aa9 100644 (file)
@@ -1,24 +1,42 @@
+<& /elements/xmlhttp.html,
+  'url'   => $p.'misc/xmlhttp-pay_batch-note.html',
+  'subs'  => [ 'get_note' ]
+&>
+<script type="text/javascript">
+function format_changed() {
+  var form = document.forms['download'];
+  get_note( <% $batchnum %>, form.elements['format'].value,
+    //callback
+    function(text) {
+      document.getElementById('download_note').textContent = text;
+    }
+  );
+}
+</script>
 % # Download batch
 % if ( $status eq 'O'
 %   or ( $status eq 'I' and $curuser->access_right('Reprocess batches') )
 %   or ( $status eq 'R' and $curuser->access_right('Redownload resolved batches') )
 %   ) {
-<TABLE>
-<TR><FORM ACTION="<%$p%>misc/download-batch.cgi" METHOD="POST">
-<INPUT TYPE="hidden" NAME="batchnum" VALUE="<%$batchnum%>">
+<FORM ACTION="<%$p%>misc/download-batch.cgi" NAME="download" METHOD="POST">
+    <INPUT TYPE="hidden" NAME="batchnum" VALUE="<%$batchnum%>">
 %   if ( $fixed ) {
-<INPUT TYPE="hidden" NAME="format" VALUE="<%$fixed%>">
+    <INPUT TYPE="hidden" NAME="format" VALUE="<%$fixed%>">
 %   }
 %   else {
-Download batch in format <SELECT NAME="format">
+    Download batch in format <SELECT NAME="format" onchange="format_changed()">
 %     foreach ( keys %download_formats ) {
-<OPTION VALUE="<%$_%>"><% $download_formats{$_} %></OPTION>
+      <OPTION VALUE="<%$_%>"><% $download_formats{$_} %></OPTION>
 %     }
-</SELECT> 
-<& .select_gateway &>
+    </SELECT> 
+    <BR>
+    <DIV STYLE="color:#ff0000" ID="download_note"></DIV>
+    <& .select_gateway &>
 %   }
-<INPUT TYPE="submit" VALUE="Download"></FORM><BR><BR></TR>
+    <INPUT TYPE="submit" VALUE="Download">
 % } # end of download
+</FORM>
+<BR>
 
 % # Upload batch
 % if ( $pay_batch->status eq 'I'
@@ -27,44 +45,42 @@ Download batch in format <SELECT NAME="format">
 %     and $conf->exists('batch-manual_approval')
 %   ) 
 % ) {
-<TR>
-<% include('/elements/form-file_upload.html',
+<& /elements/form-file_upload.html,
               'name'      => 'FileUpload',
               'action'    => "${p}misc/upload-batch.cgi",
               'num_files' => 1,
               'fields'    => [ 'batchnum', 'format', 'gatewaynum' ],
               'url'       => $cgi->self_url,
               'message'   => 'Batch results uploaded.',
-) %>
-Upload results<BR></TR>
-<TR>
-<% include('/elements/file-upload.html',
+&>
+  Upload results<BR>
+  <& /elements/file-upload.html,
               'field'     => 'file',
               'label'     => 'Filename',
               'no_table'  => 1,
-) %>
-<INPUT TYPE="hidden" NAME="batchnum" VALUE="<% $batchnum %>">
-<BR></TR>
+  &>
+  <INPUT TYPE="hidden" NAME="batchnum" VALUE="<% $batchnum %>">
+  <BR>
 %   if ( $fixed ) {
 %     if ( $fixed eq 'td_eft1464' ) { # special case
-<TR>Upload in format <SELECT NAME="format">
-<OPTION VALUE="td_eftack264">TD EFT Acknowledgement</OPTION>
-<OPTION VALUE="td_eftret80">TD EFT Returned Items</OPTION>
-</SELECT> </TR>
+  Upload in format <SELECT NAME="format">
+    <OPTION VALUE="td_eftack264">TD EFT Acknowledgement</OPTION>
+    <OPTION VALUE="td_eftret80">TD EFT Returned Items</OPTION>
+  </SELECT>
 %     }
 %     else {
-<INPUT TYPE="hidden" NAME="format" VALUE="<% $fixed %>">
+  <INPUT TYPE="hidden" NAME="format" VALUE="<% $fixed %>">
 %     }
 %   }
 %   else {
-<TR>Upload in format <SELECT NAME="format">
+  Upload in format <SELECT NAME="format">
 %     foreach ( keys(%upload_formats) ) {
-<OPTION VALUE="<%$_%>"><% $upload_formats{$_} %></OPTION>
+    <OPTION VALUE="<%$_%>"><% $upload_formats{$_} %></OPTION>
 %     }
-</SELECT>
-<& .select_gateway &>
+  </SELECT>
+  <& .select_gateway &>
 %   } # if $fixed
-<TR><INPUT TYPE="submit" VALUE="Upload"></TR>
+  <INPUT TYPE="submit" VALUE="Upload">
 </FORM><BR>
 % } # end upload
 
@@ -74,12 +90,12 @@ Upload results<BR></TR>
 %   and $payby eq 'CHEK'
 %   and $conf->exists('batch-manual_approval')
 %   ) {
-<TR><INPUT TYPE="button" VALUE="Manually approve" onclick="
+<INPUT TYPE="button" VALUE="Manually approve" onclick="
 if ( confirm('Approve all remaining payments in this batch?') ) 
   window.location.href='<%$p%>misc/process/pay_batch-approve.cgi?batchnum=<%$batchnum%>';
-"></TR>
+">
+<BR>
 % } # end manual approval
-</TABLE>
 
 % # summary info
 Batch is <% $statustext{$status} %><BR>
@@ -119,19 +135,19 @@ my $batchnum = $pay_batch->batchnum;
 my $fixed = $conf->config("batch-fixed_format-$payby");
 
 tie my %download_formats, 'Tie::IxHash', (
-'' => 'Default batch mode',
-'NACHA' => '94 byte NACHA',
-'csv-td_canada_trust-merchant_pc_batch' => 
-              'CSV file for TD Canada Trust Merchant PC Batch',
-'csv-chase_canada-E-xactBatch' =>
-              'CSV file for Chase Canada E-xactBatch',
-'PAP' => '80 byte file for TD Canada Trust PAP Batch',
-'BoM' => 'Bank of Montreal ECA batch',
-'ach-spiritone' => 'Spiritone ACH batch',
-'paymentech' => 'XML file for Chase Paymentech',
-'RBC' => 'Royal Bank of Canada PDS batch',
-'td_eft1464' => '1464 byte file for TD Commercial Banking EFT',
-'eft_canada' => 'EFT Canada CSV batch',
+  '' => 'Default batch mode',
+  'NACHA' => '94 byte NACHA',
+  'csv-td_canada_trust-merchant_pc_batch' => 
+                'CSV file for TD Canada Trust Merchant PC Batch',
+  'csv-chase_canada-E-xactBatch' =>
+                'CSV file for Chase Canada E-xactBatch',
+  'PAP' => '80 byte file for TD Canada Trust PAP Batch',
+  'BoM' => 'Bank of Montreal ECA batch',
+  'ach-spiritone' => 'Spiritone ACH batch',
+  'paymentech' => 'XML file for Chase Paymentech',
+  'RBC' => 'Royal Bank of Canada PDS batch',
+  'td_eft1464' => '1464 byte file for TD Commercial Banking EFT',
+  'eft_canada' => 'EFT Canada CSV batch',
 # insert new batch formats here
 );
 
@@ -150,4 +166,5 @@ my $count_query = "SELECT COUNT(*) FROM cust_pay_batch WHERE batchnum=$batchnum"
 my $count = FS::Record->scalar_sql($count_query);
 my $sum_query = "SELECT SUM(amount) FROM cust_pay_batch WHERE batchnum=$batchnum";
 my $total = sprintf("%.2f", FS::Record->scalar_sql($sum_query));
+
 </%init>