self-service keepalives
[freeside.git] / FS / bin / freeside-bill
index 417df76..49ad4a7 100755 (executable)
@@ -1,16 +1,18 @@
+#!/usr/bin/perl -w
+# don't take any world-facing input
 #!/usr/bin/perl -Tw
 
 use strict;
 use Fcntl qw(:flock);
 use Date::Parse;
 use Getopt::Std;
-use FS::UID qw(adminsuidsetup swapuid);
+use FS::UID qw(adminsuidsetup);
 use FS::Record qw(qsearch qsearchs);
 use FS::cust_main;
 
 &untaint_argv; #what it sounds like  (eww)
-use vars qw($opt_a $opt_c $opt_i $opt_d);
-getopts("acid:");
+use vars qw($opt_a $opt_c $opt_d $opt_p);
+getopts("acd:p");
 my $user = shift or die &usage;
 
 adminsuidsetup $user;
@@ -20,7 +22,7 @@ my %bill_only = map { $_ => 1 } (
 );
 
 #we're at now now (and later).
-my($time)= $main::opt_d ? str2time($main::opt_d) : $^T;
+my($time)= $opt_d ? str2time($opt_d) : $^T;
 
 # find packages w/ bill < time && cancel != '', and create corresponding
 # customer objects
@@ -32,7 +34,7 @@ foreach $cust_main (
       $saw{ $_->custnum } = 0; # to avoid 'use of uninitialized value' errors
     }
     if (
-      ( $main::opt_a || ( ( $_->getfield('bill') || 0 ) <= $time ) )
+      ( $opt_a || ( ( $_->getfield('bill') || 0 ) <= $time ) )
       && $bill_only{ $_->custnum }
       && !$saw{ $_->custnum }++
     ) {
@@ -55,15 +57,17 @@ foreach $cust_main (
   warn "Error billing,  customer #" . $cust_main->getfield('custnum') . 
     ":" . $error if $error;
 
-  if ($main::opt_c) {
-    $error=$cust_main->collect('invoice_time'=>$time,
-                               'batch_card' => $main::opt_i ? 'no' : 'yes',
-                              );
-    warn "Error collecting customer #" . $cust_main->getfield('custnum') .
-      ":" . $error if $error;
+  if ($opt_p) {
+    $cust_main->apply_payments;
+    $cust_main->apply_credits;
+  }
 
-  #sleep 1;
+  if ($opt_c) {
+    $error=$cust_main->collect( 'invoice_time' => $time);
+    warn "Error collecting from customer #" . $cust_main->custnum.  ":$error"
+      if $error;
 
+    #sleep 1;
   }
 
 }
@@ -72,13 +76,15 @@ foreach $cust_main (
 
 sub untaint_argv {
   foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
-    $ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
+    #$ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
+    # Date::Parse
+    $ARGV[$_] =~ /^(.*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
     $ARGV[$_]=$1;
   }
 }
 
 sub usage {
-  die "Usage:\n\n  bill [ -c [ i ] ] [ -d 'date' ] [ -b ] user\n";
+  die "Usage:\n\n  freeside-bill [ -c [ -p ] ] [ -d 'date' ] user [ custnum custnum ... ]\n";
 }
 
 =head1 NAME
@@ -87,22 +93,24 @@ freeside-bill - Command line (crontab, script) interface to customer billing.
 
 =head1 SYNOPSIS
 
-  freeside-bill [ -c [ -a ] [ -i ] ] [ -d 'date' ] user [ custnum custnum ... ]
+  freeside-bill [ -c [ -p ] [ -a ] ] [ -d 'date' ] user [ custnum custnum ... ]
 
 =head1 DESCRIPTION
 
+This script is deprecated in 1.4.0.  You should use freeside-daily instead.
+
 Bills customers.  Searches for customers who are due for billing and calls
 the bill and collect methods of a cust_main object.  See L<FS::cust_main>.
 
   -c: Turn on collecting (you probably want this).
 
+  -p: Apply unapplied payments and credits before collecting (you probably want
+      this too)
+
   -a: Call collect even if there isn't a new invoice (probably a bad idea for
       daily use)
 
-  -i: real-time billing (as opposed to batch billing).  only relevant
-      for credit cards.
-
-  -d: Pretent it's 'date'.  Date is in any format Date::Parse is happy with,
+  -d: Pretend it's 'date'.  Date is in any format Date::Parse is happy with,
       but be careful.
 
 user: From the mapsecrets file - see config.html from the base documentation
@@ -110,15 +118,11 @@ user: From the mapsecrets file - see config.html from the base documentation
 custnum: if one or more customer numbers are specified, only bills those
 customers.  Otherwise, bills all customers.
 
-=head1 VERSION
-
-$Id: freeside-bill,v 1.3 1999-10-04 08:23:26 ivan Exp $
-
 =head1 BUGS
 
 =head1 SEE ALSO
 
-L<FS::cust_main>, config.html from the base documentation
+L<freeside-daily>, L<FS::cust_main>, config.html from the base documentation
 
 =cut