stray closing /TABLE in the no-ticket case
[freeside.git] / FS / bin / freeside-ipifony-download
index 12c2dc6..10faa74 100644 (file)
@@ -13,7 +13,7 @@ use File::Copy qw(copy);
 use Text::CSV;
 
 my %opt;
-getopts('va:P:C:e:', \%opt);
+getopts('vqNa:P:C:e:', \%opt);
 
 # Product codes that are subject to flat rate E911 charges.  For these 
 # products, the'quantity' field represents the number of lines.
@@ -31,6 +31,8 @@ sub HELP_MESSAGE { '
   Usage:
       freeside-ipifony-download 
         [ -v ]
+        [ -q ]
+        [ -N ]
         [ -a archivedir ]
         [ -P port ]
         [ -C category ]
@@ -117,7 +119,7 @@ die "failed to connect to '$sftpuser\@$host'\n(".$sftp->error.")\n"
 
 $sftp->setcwd($path) if $path;
 
-my $files = $sftp->ls('.', wanted => qr/\.csv$/, names_only => 1);
+my $files = $sftp->ls('ready', wanted => qr/\.csv$/, names_only => 1);
 if (!@$files) {
   print STDERR "No charge files found.\n" if $opt{v};
   exit(-1);
@@ -130,23 +132,23 @@ my %is_e911 = map {$_ => 1} @E911_CODES;
 
 FILE: foreach my $filename (@$files) {
   print STDERR "Retrieving $filename\n" if $opt{v};
-  $sftp->get("$filename", "$tmpdir/$filename");
+  $sftp->get("ready/$filename", "$tmpdir/$filename");
   if($sftp->error) {
     warn "failed to download $filename\n";
     next FILE;
   }
 
   # make sure server archive dir exists
-  if ( !$sftp->stat('Archive') ) {
-    print STDERR "Creating $path/Archive\n" if $opt{v};
-    $sftp->mkdir('Archive');
+  if ( !$sftp->stat('done') ) {
+    print STDERR "Creating $path/done\n" if $opt{v};
+    $sftp->mkdir('done');
     if($sftp->error) {
       # something is seriously wrong
       die "failed to create archive directory on server:\n".$sftp->error."\n";
     }
   }
   #move to server archive dir
-  $sftp->rename("$filename", "Archive/$filename");
+  $sftp->rename("ready/$filename", "done/$filename");
   if($sftp->error) {
     warn "failed to archive $filename on server:\n".$sftp->error."\n";
   } # process it anyway, I guess/
@@ -183,14 +185,31 @@ FILE: foreach my $filename (@$files) {
       if $opt{v};
 
     my $amount = sprintf('%.2f',$hash{quantity} * $hash{unit_price});
+
+    # bill the charge on the customer's next bill date, if that's within
+    # the current calendar month; otherwise bill it immediately
+    # (see RT#24325)
+    my $next_bill_date = $cust_main->next_bill_date;
+    if ( $next_bill_date ) {
+      my ($bill_month, $bill_year) = (localtime($next_bill_date))[4, 5];
+      my ($this_month, $this_year) = (localtime(time))[4, 5];
+      if ( $opt{N} or 
+           $this_month == $bill_month and $this_year == $bill_year ) {
+        $cust_main->set('charge_date', $next_bill_date);
+      }
+    }
+
     # construct arguments for $cust_main->charge
     my %charge_opt = (
-      amount      => $amount,
+      amount      => $hash{unit_price},
       quantity    => $hash{quantity},
-      start_date  => $cust_main->next_bill_date,
+      start_date  => $cust_main->get('charge_date'),
       pkg         => $hash{date_desc},
       taxclass    => $TAXCLASSES{ $hash{taxclass} },
     );
+    if ( $opt{q} ) {
+      $charge_opt{pkg} .= ' (' . $hash{quantity} . ' @ $' . $hash{unit_price} . ' ea)';
+    }
     if (my $classname = $hash{classname}) {
       if (!exists($classnum_of{$classname}) ) {
         # then look it up
@@ -222,7 +241,7 @@ FILE: foreach my $filename (@$files) {
       $num_errors++;
     } else {
       $num_charges++;
-      $sum_charges += $hash{amount};
+      $sum_charges += $amount;
     }
 
     if ( $opt{e} and $is_e911{$hash{classname}} ) {
@@ -243,7 +262,7 @@ foreach my $custnum ( keys (%e911_qty) ) {
   my $cust_pkg = FS::cust_pkg->new({
       pkgpart     => $opt{e},
       custnum     => $custnum,
-      start_date  => $cust_main->next_bill_date,
+      start_date  => $cust_main->get('charge_date'),
       quantity    => $quantity,
   });
   my $error = $cust_main->order_pkg({ cust_pkg => $cust_pkg });
@@ -278,6 +297,8 @@ freeside-ipifony-download - Download and import invoice items from IPifony.
 
       freeside-ipifony-download 
         [ -v ]
+        [ -q ]
+        [ -N ]
         [ -a archivedir ]
         [ -P port ]
         [ -C category ]
@@ -294,10 +315,19 @@ have an authorization key to connect as that user.
 
 I<hostname>: the SFTP server.
 
+I<path>: the path on the server to the working directory. The working
+directory is the one containing the "ready/" and "done/" subdirectories.
+
 =head1 OPTIONAL PARAMETERS
 
 -v: Be verbose.
 
+-q: Include the quantity and unit price in the charge description.
+
+-N: Always bill the charges on the customer's next bill date, if they have
+one. Otherwise, charges will be billed on the next bill date only if it's
+within the current calendar month.
+
 -a I<archivedir>: Save a copy of the downloaded file to I<archivedir>.
 
 -P I<port>: Connect to that TCP port.