From: ivan Date: Wed, 11 Aug 1999 20:41:28 +0000 (+0000) Subject: new bill script, X-Git-Tag: freeside_1_2_2~8 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=0b1f40cc85eee025f01dd14e155cc65837e3f9e5 new bill script, --- diff --git a/FS/FS/svc_domain.pm b/FS/FS/svc_domain.pm index 57fa47fa8..73cc3e340 100644 --- a/FS/FS/svc_domain.pm +++ b/FS/FS/svc_domain.pm @@ -8,7 +8,7 @@ use Carp; use Mail::Internet; use Mail::Header; use Date::Format; -use Net::Whois 1.001; +use Net::Whois 1.0; use FS::Record qw(fields qsearch qsearchs); use FS::Conf; use FS::svc_Common; @@ -393,7 +393,7 @@ sub submit_internic { =head1 VERSION -$Id: svc_domain.pm,v 1.2 1999-08-11 13:12:11 ivan Exp $ +$Id: svc_domain.pm,v 1.3 1999-08-11 20:41:27 ivan Exp $ =head1 BUGS diff --git a/FS/MANIFEST b/FS/MANIFEST index 37e19e890..e1b4413c6 100644 --- a/FS/MANIFEST +++ b/FS/MANIFEST @@ -45,3 +45,4 @@ MANIFEST.SKIP Makefile.PL test.pl README +bin/freeside-bill diff --git a/FS/Makefile.PL b/FS/Makefile.PL index 22b412d21..ab4c2281b 100644 --- a/FS/Makefile.PL +++ b/FS/Makefile.PL @@ -2,6 +2,7 @@ use ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( - 'NAME' => 'FS', + 'NAME' => 'FS', 'VERSION_FROM' => 'FS.pm', # finds $VERSION + 'EXE_FILES' => [ glob 'bin/*' ], ); diff --git a/FS/bin/freeside-bill b/FS/bin/freeside-bill new file mode 100755 index 000000000..8f2c32fb2 --- /dev/null +++ b/FS/bin/freeside-bill @@ -0,0 +1,122 @@ +#!/usr/bin/perl -Tw + +use strict; +use Fcntl qw(:flock); +use Date::Parse; +use Getopt::Std; +use FS::UID qw(adminsuidsetup swapuid); +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:"); +my $user = shift or die &usage; + +adminsuidsetup $user; + +my %bill_only = map { $_ => 1 } ( + @ARGV ? @ARGV : ( map $_->custnum, qsearch('cust_main', {} ) ) +); + +#we're at now now (and later). +my($time)= $main::opt_d ? str2time($main::opt_d) : $^T; + +# find packages w/ bill < time && cancel != '', and create corresponding +# customer objects + +my($cust_main,%saw); +foreach $cust_main ( + map { + if ( + ( $main::opt_a || ( ( $_->getfield('bill') || 0 ) <= $time ) ) + && $bill_only{ $_->custnum } + && !$saw{ $_->custnum }++ + ) { + qsearchs('cust_main',{'custnum'=> $_->custnum } ); + } else { + (); + } + } ( qsearch('cust_pkg', { 'cancel' => '' }), + qsearch('cust_pkg', { 'cancel' => 0 }), + ) +) { + + # and bill them + + print "Billing customer #" . $cust_main->getfield('custnum') . "\n"; + next; + + my($error); + + $error=$cust_main->bill('time'=>$time); + 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; + + #sleep 1; + + } + +} + +# subroutines + +sub untaint_argv { + foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV + $ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\""; + $ARGV[$_]=$1; + } +} + +sub usage { + die "Usage:\n\n bill [ -c [ i ] ] [ -d 'date' ] [ -b ] user\n"; +} + +=head1 NAME + +freeside-bill - Command line (crontab, script) interface to customer billing. + +=head1 SYNOPSIS + + freeside-bill [ -c [ -a ] [ -i ] ] [ -d 'date' ] user [ custnum custnum ... ] + +=head1 DESCRIPTION + +Bills customers. Searches for customers who are due for billing and calls +the bill and collect methods of a cust_main object. See L. + + -c: Turn on collecting (you probably want this). + + -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, + but be careful. + +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.1 1999-08-11 20:41:27 ivan Exp $ + +=head1 BUGS + +=head1 SEE ALSO + +L, config.html from the base documentation + +=cut + diff --git a/bin/bill b/bin/bill deleted file mode 100755 index 9553af966..000000000 --- a/bin/bill +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/perl -Tw - -use strict; -use Fcntl qw(:flock); -use Date::Parse; -use Getopt::Std; -use FS::UID qw(adminsuidsetup swapuid); -use FS::Record qw(qsearch qsearchs); -use FS::cust_main; - -&untaint_argv; #what it sounds like (eww) -use vars qw($opt_b $opt_c $opt_i $opt_d); -getopts("bcid:"); #switches -my $user = shift or die &usage; - -adminsuidsetup $user; - -#we're at now now (and later). -my($time)= $main::opt_d ? str2time($main::opt_d) : $^T; - -# find packages w/ bill < time && cancel != '', and create corresponding -# customer objects - -my($cust_main,%saw); -foreach $cust_main ( - map { - if ( ( $_->getfield('bill') || 0 ) <= $time && - !$saw{ $_->getfield('custnum') }++ ) { - qsearchs('cust_main',{'custnum'=> $_->getfield('custnum') } ); - } else { - (); - } - } ( qsearch('cust_pkg', { 'cancel' => '' }), - qsearch('cust_pkg', { 'cancel' => 0 }), - ) -) { - - # and bill them - - print "Billing customer #" . $cust_main->getfield('custnum') . "\n"; - - my($error); - - $error=$cust_main->bill('time'=>$time); - 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; - - #sleep 1; - - } - -} - -# subroutines - -sub untaint_argv { - foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV - $ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\""; - $ARGV[$_]=$1; - } -} - -sub usage { - die "Usage:\n\n bill [ -c [ i ] ] [ -d 'date' ] [ -b ] user\n"; -} - -=head1 NAME - -bill - Command line (crontab, script) interface to customer billing. - -=head1 SYNOPSIS - - bill [ -c [ i ] ] [ -d 'date' ] user - -=head1 DESCRIPTION - -Bills all customers. Searches for customers who are due for billing and calls -the bill and collect methods of a cust_main object. See L. - --c: Turn on collecting (you probably want this). - --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, - but be careful. - -user: From the mapsecrets file - see config.html from the base documentation - -=head1 VERSION - -$Id: bill,v 1.6 1998-11-15 02:53:00 ivan Exp $ - -=head1 BUGS - -=head1 SEE ALSO - -L, config.html from the base documentation - -=head1 HISTORY - -ivan@voicenet.com sep/oct 96 - -separated billing and collections, cleaned up code. -ivan@voicenet.com 96-nov-11 - -added -d option -ivan@voicenet.com 96-nov-13 - -added -v option and started to implement it, added 'd:' to getopts call - (oops!) -ivan@voicenet.com 97-jan-2 - -added more debug messages, moved some searches to fssearch.pl library (for -speed) -rewrote "all customer" finder to know about bill dates, for speed. -ivan@voicenet.com 97-jan-8 - -thought about it a while, and removed passing of the -d option to collect...? -ivan@voicenet.com 97-jan-14 - -make all -v stuff STDERR -ivan@voicenet.com 97-feb-4 - -added pkgnum as argument to program from /db/part_pkg, with kludge for the -"/bin/echo XX" 's already there. -ivan@voicenet.com 97-feb-23 - -- general cleanup -- customers who are suspended can still be billed for the setup fee -- cust_pkg record is re-read after the package setup fee program is run. - this way, - that program can modify the record (for example, to start accounts off - suspended) - (best to think four or five times before modifying anything else!) -ivan@voicenet.com 97-feb-26 - -don't bill recurring fee if its not time! (was removed) -ivan@voicenet.com 97-mar-6 - -added -b option, send batch when done billing. -ivan@voicenet.com 97-apr-4 - -insecure dependency on line 179ish below needs to be fixed before bill is -used setuid -ivan@voicenet.com 97-jun-2 - -removed running of setup program (depriciated) -ivan@voicenet.com 97-jul-21 - -rewrote for new API, removed option to specify custnums (use FS::Bill -instead), removed -v option (?) -ivan@voicenet.com 97-jul-22 - 23 - 25 -28 -(need to add back in email stuff, look in /home/ivan/old/dbin/collect) - -s/suidsetup/adminsuidsetup/, s/FS::Search/FS::Record/, added some batch -exporting stuff (which still needs to be generalized) and removed &idiot -ivan@sisd.com 98-may-27 - -$Log: bill,v $ -Revision 1.6 1998-11-15 02:53:00 ivan -afterthought - -Revision 1.4 1998/11/07 08:21:26 ivan -missing use - -=cut - -