summaryrefslogtreecommitdiff
path: root/FS/bin
diff options
context:
space:
mode:
authorcvs2git <cvs2git>2002-08-12 06:17:10 +0000
committercvs2git <cvs2git>2002-08-12 06:17:10 +0000
commit160be29a0dc62e79a4fb95d2ab8c0c7e5996760e (patch)
tree94ebadb17321b138fd7bfd9a5c379eec97c5d328 /FS/bin
parent3ef62a0570055da710328937e7f65dbb2c027c62 (diff)
This commit was manufactured by cvs2svn to create branch 'BESTPRACTICAL'.
Diffstat (limited to 'FS/bin')
-rw-r--r--FS/bin/freeside-adduser57
-rwxr-xr-xFS/bin/freeside-apply-credits21
-rwxr-xr-xFS/bin/freeside-bill128
-rwxr-xr-xFS/bin/freeside-cc-receipts-report270
-rwxr-xr-xFS/bin/freeside-credit-report224
-rwxr-xr-xFS/bin/freeside-daily99
-rwxr-xr-xFS/bin/freeside-email61
-rwxr-xr-xFS/bin/freeside-expiration-alerter224
-rwxr-xr-xFS/bin/freeside-overdue196
-rw-r--r--FS/bin/freeside-queued254
-rwxr-xr-xFS/bin/freeside-receivables-report217
-rw-r--r--FS/bin/freeside-reexport62
-rw-r--r--FS/bin/freeside-setinvoice42
-rwxr-xr-xFS/bin/freeside-sqlradius-reset74
-rwxr-xr-xFS/bin/freeside-tax-report292
15 files changed, 0 insertions, 2221 deletions
diff --git a/FS/bin/freeside-adduser b/FS/bin/freeside-adduser
deleted file mode 100644
index 9d42463..0000000
--- a/FS/bin/freeside-adduser
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/perl -w
-#
-# $Id: freeside-adduser,v 1.4 2002-02-06 14:58:05 ivan Exp $
-
-use strict;
-use vars qw($opt_h $opt_c $opt_s);
-use Getopt::Std;
-
-my $FREESIDE_CONF = "/usr/local/etc/freeside";
-
-getopts("ch:s:");
-die &usage if $opt_c && ! $opt_h;
-my $user = shift or die &usage;
-
-if ( $opt_h ) {
- my @args = ( 'htpasswd' );
- push @args, '-c' if $opt_c;
- push @args, $opt_h, $user;
- system(@args) == 0 or die "htpasswd failed: $?";
-}
-
-my $secretfile = $opt_s || 'secrets';
-
-open(MAPSECRETS,">>$FREESIDE_CONF/mapsecrets")
- or die "can't open $FREESIDE_CONF/mapsecrets: $!";
-print MAPSECRETS "$user $secretfile\n";
-close MAPSECRETS or die "can't close $FREESIDE_CONF/mapsecrets: $!";
-
-sub usage {
- die "Usage:\n\n freeside-adduser [ -h htpasswd_file [ -c ] ] [ -s secretfile ] username"
-}
-
-=head1 NAME
-
-freeside-adduser - Command line interface to add (freeside) users.
-
-=head1 SYNOPSIS
-
- freeside-adduser [ -h htpasswd_file [ -c ] ] [ -s secretfile ] username
-
-=head1 DESCRIPTION
-
-Adds a user to the Freeside billing system. This is for adding users (internal
-sales/tech folks) to the web interface, not for adding customer accounts.
-
- -h: Also call htpasswd for this user with the given filename
-
- -c: Passed to htpasswd
-
- -s: Specify an alternate secret file
-
-=head1 SEE ALSO
-
-L<htpasswd>, base Freeside documentation
-
-=cut
-
diff --git a/FS/bin/freeside-apply-credits b/FS/bin/freeside-apply-credits
deleted file mode 100755
index ea6a7bd..0000000
--- a/FS/bin/freeside-apply-credits
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/perl -Tw
-
-use strict;
-use vars qw( $user $cust_main @customers );
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch);
-use FS::cust_main;
-
-$user = shift or die &usage;
-&adminsuidsetup( $user );
-
-my @customers = qsearch('cust_main', {} );
-die "No customers" unless (scalar(@customers) > 0);
-
-foreach $cust_main (@customers) {
- print "Applying credits for customer #". $cust_main->custnum;
- $cust_main->apply_credits;
-}
-
-
-
diff --git a/FS/bin/freeside-bill b/FS/bin/freeside-bill
deleted file mode 100755
index 49ad4a7..0000000
--- a/FS/bin/freeside-bill
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/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);
-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_d $opt_p);
-getopts("acd:p");
-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)= $opt_d ? str2time($opt_d) : $^T;
-
-# find packages w/ bill < time && cancel != '', and create corresponding
-# customer objects
-
-my($cust_main,%saw);
-foreach $cust_main (
- map {
- unless ( exists $saw{ $_->custnum } && defined $saw{ $_->custnum} ) {
- $saw{ $_->custnum } = 0; # to avoid 'use of uninitialized value' errors
- }
- if (
- ( $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";
-
- my($error);
-
- $error=$cust_main->bill('time'=>$time);
- warn "Error billing, customer #" . $cust_main->getfield('custnum') .
- ":" . $error if $error;
-
- if ($opt_p) {
- $cust_main->apply_payments;
- $cust_main->apply_credits;
- }
-
- if ($opt_c) {
- $error=$cust_main->collect( 'invoice_time' => $time);
- warn "Error collecting from customer #" . $cust_main->custnum. ":$error"
- if $error;
-
- #sleep 1;
- }
-
-}
-
-# subroutines
-
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- #$ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- # Date::Parse
- $ARGV[$_] =~ /^(.*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-bill [ -c [ -p ] ] [ -d 'date' ] user [ custnum custnum ... ]\n";
-}
-
-=head1 NAME
-
-freeside-bill - Command line (crontab, script) interface to customer billing.
-
-=head1 SYNOPSIS
-
- 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)
-
- -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
-
-custnum: if one or more customer numbers are specified, only bills those
-customers. Otherwise, bills all customers.
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<freeside-daily>, L<FS::cust_main>, config.html from the base documentation
-
-=cut
-
diff --git a/FS/bin/freeside-cc-receipts-report b/FS/bin/freeside-cc-receipts-report
deleted file mode 100755
index 06e3aba..0000000
--- a/FS/bin/freeside-cc-receipts-report
+++ /dev/null
@@ -1,270 +0,0 @@
-#!/usr/bin/perl -Tw
-
-
-use strict;
-use Date::Parse;
-use Time::Local;
-use Getopt::Std;
-use Text::Template;
-use Net::SMTP;
-use Mail::Header;
-use Mail::Internet;
-use FS::Conf;
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch qsearchs);
-use FS::cust_pay;
-use FS::cust_pay_batch;
-
-
-&untaint_argv; #what it sounds like (eww)
-use vars qw($opt_v $opt_p $opt_m $opt_e $opt_t $opt_s $opt_f $report_lines $report_template @buf $header);
-getopts("vpmef:s:"); #switches
-
-#we're at now now (and later).
-my($_finishdate)= $opt_f ? str2time($main::opt_f) : $^T;
-my($_startdate)= $opt_s ? str2time($main::opt_s) : $^T;
-
-# Get the current month
-my ($ssec,$smin,$shour,$smday,$smon,$syear) =
- (localtime($_startdate) )[0,1,2,3,4,5];
-$smon++;
-$syear += 1900;
-
-# Get the current month
-my ($fsec,$fmin,$fhour,$fmday,$fmon,$fyear) =
- (localtime($_finishdate) )[0,1,2,3,4,5];
-$fmon++;
-$fyear += 1900;
-
-# Login to the database
-my $user = shift or die &usage;
-adminsuidsetup $user;
-
-# Get the needed configuration files
-my $conf = new FS::Conf;
-my $lpr = $conf->config('lpr');
-my $email = $conf->config('email');
-my $smtpmachine = $conf->config('smtpmachine');
-my $mail_sender = $conf->exists('invoice_from') ? $conf->config('invoice_from') :
- 'postmaster';
-my @report_template = $conf->config('report_template')
- or die "cannot load config file report_template";
-$report_lines = 0;
-foreach ( grep /report_lines\(\d+\)/, @report_template ) { #kludgy :/
- /report_lines\((\d+)\)/;
- $report_lines += $1;
-}
-die "no report_lines() functions in template?" unless $report_lines;
-$report_template = new Text::Template (
- TYPE => 'ARRAY',
- SOURCE => [ map "$_\n", @report_template ],
-) or die "can't create new Text::Template object: $Text::Template::ERROR";
-
-
-my(@cust_pays)=qsearch('cust_pay',{});
-if (scalar(@cust_pays) == 0)
-{
- exit 1;
-}
-
-# Open print and email pipes
-# $lpr and opt_p for printing
-# $email and opt_m for email
-
-if ($lpr && $main::opt_p)
-{
- open(LPR, "|$lpr");
-}
-
-if ($email && $main::opt_m)
-{
- $ENV{MAILADDRESS} = $mail_sender;
- $header = new Mail::Header ( [
- "From: Account Processor",
- "To: $email",
- "Sender: $mail_sender",
- "Reply-To: $mail_sender",
- "Subject: Credit Card Receipts",
- ] );
-}
-
-my $uninvoiced = 0;
-my $total = 0;
-my $taxed = 0;
-my $untaxed = 0;
-my $total_tax = 0;
-
-# Now I can start looping
-foreach my $cust_pay (@cust_pays)
-{
- my $_date = $cust_pay->getfield('_date');
- my $invnum = $cust_pay->getfield('invnum');
- my $paid = $cust_pay->getfield('paid');
- my $payby = $cust_pay->getfield('payby');
-
-
- if ($_date >= $_startdate && $_date <= $_finishdate && $payby =~ 'CARD') {
- $total += $paid;
-
- $uninvoiced += $cust_pay->unapplied;
- my @cust_bill_pays = $cust_pay->cust_bill_pay;
- foreach my $cust_bill_pay (@cust_bill_pays) {
- my $invoice_amt =0;
- my $invoice_tax =0;
- my(@cust_bill_pkgs)= $cust_bill_pay->cust_bill->cust_bill_pkg;
- foreach my $cust_bill_pkg (@cust_bill_pkgs) {
-
- my $recur = $cust_bill_pkg->getfield('recur');
- my $setup = $cust_bill_pkg->getfield('setup');
- my $pkgnum = $cust_bill_pkg->getfield('pkgnum');
-
- if ($pkgnum == 0) {
- $invoice_tax += $recur;
- $invoice_tax += $setup;
- } else {
- $invoice_amt += $recur;
- $invoice_amt += $setup;
- }
-
- }
-
- if ($invoice_tax > 0) {
- if ($invoice_amt != $paid) {
- # attempt to prorate partially paid invoices
- $total_tax += $paid / ($invoice_amt + $invoice_tax) * $invoice_tax;
- $taxed += $paid / ($invoice_amt + $invoice_tax) * $invoice_amt;
- } else {
- $total_tax += $invoice_tax;
- $taxed += $invoice_amt;
- }
- } else {
- $untaxed += $paid;
- }
-
- }
-
- }
-
-}
-
-push @buf, sprintf(qq{\n%25s%14.2f\n}, "Uninvoiced", $uninvoiced);
-push @buf, sprintf(qq{%25s%14.2f\n}, "Untaxed", $untaxed);
-push @buf, sprintf(qq{%25s%14.2f\n}, "Taxed", $taxed);
-push @buf, sprintf(qq{%25s%14.2f\n}, "Tax", $total_tax);
-push @buf, sprintf(qq{\n%39s\n%39.2f\n}, "=========", $total);
-
-sub FS::cc_receipts_report::_template::report_lines {
- my $lines = shift;
- map {
- scalar(@buf) ? shift @buf : '' ;
- }
- ( 1 .. $lines );
-}
-
-$FS::cc_receipts_report::_template::title = qq~CREDIT CARD RECEIPTS for period $smon/$smday/$syear through $fmon/$fmday/$fyear~;
-$FS::cc_receipts_report::_template::title = $opt_t if $opt_t;
-$FS::cc_receipts_report::_template::page = 1;
-$FS::cc_receipts_report::_template::date = $^T;
-$FS::cc_receipts_report::_template::date = $^T;
-$FS::cc_receipts_report::_template::fdate = $_finishdate;
-$FS::cc_receipts_report::_template::fdate = $_finishdate;
-$FS::cc_receipts_report::_template::sdate = $_startdate;
-$FS::cc_receipts_report::_template::sdate = $_startdate;
-$FS::cc_receipts_report::_template::total_pages =
- int( scalar(@buf) / $report_lines);
-$FS::cc_receipts_report::_template::total_pages++ if scalar(@buf) % $report_lines;
-
-my @report;
-while (@buf) {
- push @report, split("\n",
- $report_template->fill_in( PACKAGE => 'FS::cc_receipts_report::_template' )
- );
- $FS::cc_receipts_report::_template::page++;
-}
-
-if ($opt_v) {
- print map "$_\n", @report;
-}
-if($lpr && $opt_p)
-{
- print LPR map "$_\n", @report;
- print LPR "\f" if $opt_e;
- close LPR || die "Could not close printer: $lpr\n";
-}
-if($email && $opt_m)
-{
- my $message = new Mail::Internet (
- 'Header' => $header,
- 'Body' => [ (@report) ],
- );
- $!=0;
- $message->smtpsend( Host => "$smtpmachine" )
- or die "can't send report to $email via $smtpmachine: $!";
-}
-
-
-# subroutines
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- $ARGV[$_] =~ /^([\w\-\/ :]*)$/ || die "Illegal argument \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-cc-receipts-report [-v] [-p] [-e] user\n";
-}
-
-=head1 NAME
-
-freeside-cc-receipts-report - Prints or emails total credit card receipts in a given period.
-
-=head1 SYNOPSIS
-
- freeside-cc-receipts-report [-v] [-p] [-m] [-e] [-t "title"] [-s date] [-f date] user
-
-=head1 DESCRIPTION
-
-Prints or emails sales taxes invoiced in a given period.
-
--v: Verbose - Prints records to STDOUT.
-
--p: Print to printer lpr as found in the conf directory.
-
--m: Email output to user found in the Conf email file.
-
--e: Print a final form feed to the printer.
-
--t: supply a title for the top of each page.
-
--s: starting date for inclusion
-
--f: final date for inclusion
-
-user: From the mapsecrets file - see config.html from the base documentation
-
-=head1 VERSION
-
-$Id: freeside-cc-receipts-report,v 1.4 2002-03-07 19:50:23 jeff Exp $
-
-=head1 BUGS
-
-Yes..... Use at your own risk. No guarantees or warrantees of any
-kind apply to this program. Parts of this program are hacked from
-other GNU licensed software created mainly by Ivan Kohler.
-
-This is released under the GNU Public License. See www.gnu.org
-for more information regarding this license.
-
-=head1 SEE ALSO
-
-L<FS::cust_main>, config.html from the base documentation
-
-=head1 AUTHOR
-
-Jeff Finucane <jeff@cmh.net>
-
-based on print-batch by Joel Griffiths <griff@aver-computer.com>
-
-=cut
-
diff --git a/FS/bin/freeside-credit-report b/FS/bin/freeside-credit-report
deleted file mode 100755
index 7699daf..0000000
--- a/FS/bin/freeside-credit-report
+++ /dev/null
@@ -1,224 +0,0 @@
-#!/usr/bin/perl -Tw
-
-
-use strict;
-use Date::Parse;
-use Time::Local;
-use Getopt::Std;
-use Text::Template;
-use Net::SMTP;
-use Mail::Header;
-use Mail::Internet;
-use FS::Conf;
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch);
-use FS::cust_credit;
-
-
-&untaint_argv; #what it sounds like (eww)
-use vars qw($opt_v $opt_p $opt_m $opt_e $opt_t $opt_s $opt_f $report_lines $report_template @buf $header);
-getopts("vpmef:s:"); #switches
-
-#we're at now now (and later).
-my($_finishdate)= $opt_f ? str2time($main::opt_f) : $^T;
-my($_startdate)= $opt_s ? str2time($main::opt_s) : $^T;
-
-# Get the current month
-my ($ssec,$smin,$shour,$smday,$smon,$syear) =
- (localtime($_startdate) )[0,1,2,3,4,5];
-$smon++;
-$syear += 1900;
-
-# Get the current month
-my ($fsec,$fmin,$fhour,$fmday,$fmon,$fyear) =
- (localtime($_finishdate) )[0,1,2,3,4,5];
-$fmon++;
-$fyear += 1900;
-
-# Login to the database
-my $user = shift or die &usage;
-adminsuidsetup $user;
-
-# Get the needed configuration files
-my $conf = new FS::Conf;
-my $lpr = $conf->config('lpr');
-my $email = $conf->config('email');
-my $smtpmachine = $conf->config('smtpmachine');
-my $mail_sender = $conf->exists('invoice_from') ? $conf->config('invoice_from') :
- 'postmaster';
-my @report_template = $conf->config('report_template')
- or die "cannot load config file report_template";
-$report_lines = 0;
-foreach ( grep /report_lines\(\d+\)/, @report_template ) { #kludgy :/
- /report_lines\((\d+)\)/;
- $report_lines += $1;
-}
-die "no report_lines() functions in template?" unless $report_lines;
-$report_template = new Text::Template (
- TYPE => 'ARRAY',
- SOURCE => [ map "$_\n", @report_template ],
-) or die "can't create new Text::Template object: $Text::Template::ERROR";
-
-
-my(@cust_credits)=qsearch('cust_credit',{});
-if (scalar(@cust_credits) == 0)
-{
- exit 1;
-}
-
-# Open print and email pipes
-# $lpr and opt_p for printing
-# $email and opt_m for email
-
-if ($lpr && $main::opt_p)
-{
- open(LPR, "|$lpr");
-}
-
-if ($email && $main::opt_m)
-{
- $ENV{MAILADDRESS} = $mail_sender;
- $header = new Mail::Header ( [
- "From: Account Processor",
- "To: $email",
- "Sender: $mail_sender",
- "Reply-To: $mail_sender",
- "Subject: In House Credits",
- ] );
-}
-
-my $uninvoiced = 0;
-my $total = 0;
-my $taxed = 0;
-my $untaxed = 0;
-my $total_tax = 0;
-
-# Now I can start looping
-foreach my $cust_credit (@cust_credits)
-{
- my $_date = $cust_credit->getfield('_date');
- my $amount = $cust_credit->getfield('amount');
-
- if ($_date >= $_startdate && $_date <= $_finishdate) {
- $total += $amount;
- }
-}
-
-push @buf, sprintf(qq{\n%25s%14.2f\n}, "Credits Offered", $total);
-push @buf, sprintf(qq{\n%39s\n%39.2f\n}, "=========", $total);
-
-sub FS::credit_report::_template::report_lines {
- my $lines = shift;
- map {
- scalar(@buf) ? shift @buf : '' ;
- }
- ( 1 .. $lines );
-}
-
-$FS::credit_report::_template::title = qq~IN HOUSE CREDITS for $smon/$smday/$syear through $fmon/$fmday/$fyear~;
-$FS::credit_report::_template::title = $opt_t if $opt_t;
-$FS::credit_report::_template::page = 1;
-$FS::credit_report::_template::date = $^T;
-$FS::credit_report::_template::date = $^T;
-$FS::credit_report::_template::fdate = $_finishdate;
-$FS::credit_report::_template::fdate = $_finishdate;
-$FS::credit_report::_template::sdate = $_startdate;
-$FS::credit_report::_template::sdate = $_startdate;
-$FS::credit_report::_template::total_pages =
- int( scalar(@buf) / $report_lines);
-$FS::credit_report::_template::total_pages++ if scalar(@buf) % $report_lines;
-
-my @report;
-while (@buf) {
- push @report, split("\n",
- $report_template->fill_in( PACKAGE => 'FS::credit_report::_template' )
- );
- $FS::credit_report::_template::page++;
-}
-
-if ($opt_v) {
- print map "$_\n", @report;
-}
-if($lpr && $opt_p)
-{
- print LPR map "$_\n", @report;
- print LPR "\f" if $opt_e;
- close LPR || die "Could not close printer: $lpr\n";
-}
-if($email && $opt_m)
-{
- my $message = new Mail::Internet (
- 'Header' => $header,
- 'Body' => [ (@report) ],
- );
- $!=0;
- $message->smtpsend( Host => "$smtpmachine" )
- or die "can't send report to $email via $smtpmachine: $!";
-}
-
-
-# subroutines
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- $ARGV[$_] =~ /^([\w\-\/ :]*)$/ || die "Illegal argument \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-credit-report [-v] [-p] [-e] user\n";
-}
-
-=head1 NAME
-
-freeside-credit-report - Prints or emails total credit memos in a given period.
-
-=head1 SYNOPSIS
-
- freeside-credit-report [-v] [-p] [-m] [-e] [-t "title"] [-s date] [-f date] user
-
-=head1 DESCRIPTION
-
-Prints or emails total credit memos in a given period.
-
--v: Verbose - Prints records to STDOUT.
-
--p: Print to printer lpr as found in the conf directory.
-
--m: Email output to user found in the Conf email file.
-
--e: Print a final form feed to the printer.
-
--t: supply a title for the top of each page.
-
--s: starting date for inclusion
-
--f: final date for inclusion
-
-user: From the mapsecrets file - see config.html from the base documentation
-
-=head1 VERSION
-
-$Id: freeside-credit-report,v 1.4 2002-03-07 19:50:24 jeff Exp $
-
-=head1 BUGS
-
-Yes..... Use at your own risk. No guarantees or warrantees of any
-kind apply to this program. Parts of this program are hacked from
-other GNU licensed software created mainly by Ivan Kohler.
-
-This is released under the GNU Public License. See www.gnu.org
-for more information regarding this license.
-
-=head1 SEE ALSO
-
-L<FS::cust_main>, config.html from the base documentation
-
-=head1 AUTHOR
-
-Jeff Finucane <jeff@cmh.net>
-
-based on print-batch by Joel Griffiths <griff@aver-computer.com>
-
-=cut
-
diff --git a/FS/bin/freeside-daily b/FS/bin/freeside-daily
deleted file mode 100755
index 142b0c7..0000000
--- a/FS/bin/freeside-daily
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use Fcntl qw(:flock);
-use Date::Parse;
-use Getopt::Std;
-use FS::UID qw(adminsuidsetup driver_name dbh);
-use FS::Record qw(qsearch qsearchs);
-use FS::cust_main;
-
-&untaint_argv; #what it sounds like (eww)
-use vars qw($opt_d $opt_v);
-getopts("d:v");
-my $user = shift or die &usage;
-
-adminsuidsetup $user;
-
-$FS::cust_main::Debug = 1 if $opt_v;
-
-my @cust_main = @ARGV
- ? map { qsearchs('cust_main', { custnum => $_ } ) } @ARGV
- : qsearch('cust_main', {} )
-;
-
-#we're at now now (and later).
-my($time)= $opt_d ? str2time($opt_d) : $^T;
-
-my($cust_main,%saw);
-foreach $cust_main ( @cust_main ) {
-
- my $error;
-
- $error = $cust_main->bill( 'time' => $time );
- warn "Error billing, custnum ". $cust_main->custnum. ": $error" if $error;
-
- $cust_main->apply_payments;
- $cust_main->apply_credits;
-
- $error=$cust_main->collect( 'invoice_time' => $time );
- warn "Error collecting, custnum". $cust_main->custnum. ": $error" if $error;
-
-}
-
-if ( driver_name eq 'Pg' ) {
- foreach my $statement ( 'vacuum', 'vacuum analyze' ) {
- my $sth = dbh->prepare($statement) or die dbh->errstr;
- $sth->execute or die $sth->errstr;
- }
-}
-
-# subroutines
-
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- #$ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- # Date::Parse
- $ARGV[$_] =~ /^(.*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-daily [ -d 'date' ] user [ custnum custnum ... ]\n";
-}
-
-=head1 NAME
-
-freeside-daily - Run daily billing and invoice collection events.
-
-=head1 SYNOPSIS
-
- freeside-daily [ -d 'date' ] user [ custnum custnum ... ]
-
-=head1 DESCRIPTION
-
-Bills customers and runs invoice collection events. Should be run from
-crontab daily.
-
-This script replaces freeside-bill from 1.3.1.
-
-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>.
-
- -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
-
-custnum: if one or more customer numbers are specified, only bills those
-customers. Otherwise, bills all customers.
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-L<FS::cust_main>, config.html from the base documentation
-
-=cut
-
diff --git a/FS/bin/freeside-email b/FS/bin/freeside-email
deleted file mode 100755
index c7ff411..0000000
--- a/FS/bin/freeside-email
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/perl -Tw
-
-use strict;
-use FS::UID qw(adminsuidsetup);
-use FS::Conf;
-use FS::Record qw(qsearch);
-use FS::svc_acct;
-
-&untaint_argv; #what it sounds like (eww)
-my $user = shift or die &usage;
-
-adminsuidsetup $user;
-
-my $conf = new FS::Conf;
-my $domain = $conf->config('domain');
-
-my @svc_acct = qsearch('svc_acct', {});
-my @usernames = map $_->username, @svc_acct;
-my @emails = map "$_\@$domain", @usernames;
-
-print join("\n", @emails), "\n";
-
-# subroutines
-
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- #$ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- # Date::Parse
- $ARGV[$_] =~ /^(.*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-email user\n";
-}
-
-=head1 NAME
-
-freeside-email - Prints email addresses of all users on STDOUT
-
-=head1 SYNOPSIS
-
- freeside-email user
-
-=head1 DESCRIPTION
-
-Prints the email addresses of all customers on STDOUT, separated by newlines.
-
-user: From the mapsecrets file - see config.html from the base documentation
-
-=head1 VERSION
-
-$Id: freeside-email,v 1.1 2001-05-15 07:52:34 ivan Exp $
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-=cut
-
diff --git a/FS/bin/freeside-expiration-alerter b/FS/bin/freeside-expiration-alerter
deleted file mode 100755
index ee3c1fb..0000000
--- a/FS/bin/freeside-expiration-alerter
+++ /dev/null
@@ -1,224 +0,0 @@
-#!/usr/bin/perl -Tw
-
-use strict;
-use Date::Format;
-use Time::Local;
-use Text::Template;
-use Getopt::Std;
-use Net::SMTP;
-use Mail::Header;
-use Mail::Internet;
-use FS::Conf;
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch);
-use FS::cust_main;
-
-use vars qw($smtpmachine @body);
-
-#hush, perl!
-$FS::alerter::_template::first = "";
-$FS::alerter::_template::last = "";
-$FS::alerter::_template::company = "";
-$FS::alerter::_template::payby = "";
-$FS::alerter::_template::expdate = "";
-
-# Set the mail program and other variables
-my $mail_sender = "billing\@mydomain.tld"; # or invoice_from if available
-my $failure_recipient = "postmaster"; # or invoice_from if available
-my $warning_time = 30 * 24 * 60 * 60;
-my $urgent_time = 15 * 24 * 60 * 60;
-my $panic_time = 5 * 24 * 60 * 60;
-my $window_time = 24 * 60 * 60;
-
-&untaint_argv; #what it sounds like (eww)
-
-#we're at now now (and later).
-my($_date)= $^T;
-
-# Get the current month
-my ($sec,$min,$hour,$mday,$mon,$year) =
- (localtime($_date) )[0,1,2,3,4,5];
-$mon++;
-
-# Login to the database
-my $user = shift or die &usage;
-adminsuidsetup $user;
-
-# Get the needed configuration files
-my $conf = new FS::Conf;
-$smtpmachine = $conf->config('smtpmachine');
-$mail_sender = $conf->config('invoice_from')
- if $conf->exists('invoice_from');
-$failure_recipient = $conf->config('invoice_from')
- if $conf->exists('invoice_from');
-
-
-my(@customers)=qsearch('cust_main',{});
-if (scalar(@customers) == 0)
-{
- exit 1;
-}
-
-# Prepare for sending email
-
-$ENV{MAILADDRESS} = $mail_sender;
-my $header = new Mail::Header ( [
- "From: Account Processor",
- "To: $failure_recipient",
- "Sender: $mail_sender",
- "Reply-To: $mail_sender",
- "Subject: Unnotified Billing Arrangement Expirations",
-] );
-
-my @alerter_template = $conf->config('alerter_template')
- or die "cannot load config file alerter_template";
-
-my $alerter = new Text::Template (TYPE => 'ARRAY', SOURCE => [ map "$_\n", @alerter_template ])
- or die "can't create new Text::Template object: Text::Template::ERROR";
-$alerter->compile() or die "can't compile template: Text::Template::ERROR";
-
-# Now I can start looping
-foreach my $customer (@customers)
-{
- my $custnum = $customer->getfield('custnum');
- my $first = $customer->getfield('first');
- my $last = $customer->getfield('last');
- my $company = $customer->getfield('company');
- my $payby = $customer->getfield('payby');
- my $payinfo = $customer->getfield('payinfo');
- my $paydate = $customer->getfield('paydate');
- my $daytime = $customer->getfield('daytime');
- my $night = $customer->getfield('night');
-
- my ($payyear,$paymonth,$payday) = split (/-/,$paydate);
-
- my $expire_time = timelocal(0,0,0,$payday,--$paymonth,$payyear);
-
- #credit cards expire at the end of the month/year of their exp date
- if ($payby eq 'CARD') {
- ($paymonth < 11) ? $paymonth++ : ($paymonth=0, $payyear++);
- $expire_time = timelocal(0,0,0,$payday,$paymonth,$payyear);
- $expire_time--;
- }
-
- if (($expire_time < $_date + $warning_time &&
- $expire_time > $_date + $warning_time - $window_time) ||
- ($expire_time < $_date + $urgent_time &&
- $expire_time > $_date + $urgent_time - $window_time) ||
- ($expire_time < $_date + $panic_time &&
- $expire_time > $_date + $panic_time - $window_time)) {
-
-
-
- my @packages = $customer->ncancelled_pkgs;
- if (scalar(@packages) != 0) {
- my @invoicing_list = $customer->invoicing_list;
- if ( grep { $_ ne 'POST' } @invoicing_list ) {
- my $header = new Mail::Header ( [
- "From: $mail_sender",
- "To: ". join(', ', grep { $_ ne 'POST' } @invoicing_list ),
- "Sender: $mail_sender",
- "Reply-To: $mail_sender",
- "Date: ". time2str("%a, %d %b %Y %X %z", time),
- "Subject: Billing Arrangement Expiration",
- ] );
- $FS::alerter::_template::first = $first;
- $FS::alerter::_template::last = $last;
- $FS::alerter::_template::company = $company;
- if ($payby eq 'CARD') {
- $FS::alerter::_template::payby = "credit card (" .
- substr($payinfo, 0, 2) . "xxxxxxxxxx" .
- substr($payinfo, -4) . ")";
- }elsif ($payby eq 'COMP') {
- $FS::alerter::_template::payby = "complimentary account";
- }else{
- $FS::alerter::_template::payby = "current method";
- }
- $FS::alerter::_template::expdate = $expire_time;
-
- my $message = new Mail::Internet (
- 'Header' => $header,
- 'Body' => [ $alerter->fill_in( PACKAGE => 'FS::alerter::_template' ) ],
- );
- $!=0;
- $message->smtpsend( Host => $smtpmachine )
- or $message->smtpsend( Host => $smtpmachine, Debug => 1 )
- or die "Can't send expiration email: $!";
-
- } elsif ( ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list ) {
- push @body, sprintf(qq{%5d %-32.32s %4s %10s %12s %12s},
- $custnum,
- $first . " " . $last . " " . $company,
- $payby,
- $paydate,
- $daytime,
- $night);
- }
- }
- }
-}
-
-# Now I need to send EMAIL
-if (scalar(@body)) {
- my $message = new Mail::Internet (
- 'Header' => $header,
- 'Body' => [ (@body) ],
- );
- $!=0;
- $message->smtpsend( Host => $smtpmachine )
- or $message->smtpsend( Host => $smtpmachine, Debug => 1 )
- or die "can't send alerter failure email to $failure_recipient".
- " via server $smtpmachine with SMTP: $!";
-}
-
-# subroutines
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- $ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal argument \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-expiration-alerter user\n";
-}
-
-=head1 NAME
-
-freeside-expiration-alerter - Emails notifications of credit card expirations.
-
-=head1 SYNOPSIS
-
- freeside-expiration-alerter user
-
-=head1 DESCRIPTION
-
-Emails customers notice that their credit card or other billing arrangement
-is about to expire. Usually run as a cron job.
-
-user: From the mapsecrets file - see config.html from the base documentation
-
-=head1 VERSION
-
-$Id: freeside-expiration-alerter,v 1.3 2002-04-16 09:38:19 ivan Exp $
-
-=head1 BUGS
-
-Yes..... Use at your own risk. No guarantees or warrantees of any
-kind apply to this program. Parts of this program are hacked from
-other GNU licensed software created mainly by Ivan Kohler.
-
-This is released under the GNU Public License. See www.gnu.org
-for more information regarding this license.
-
-=head1 SEE ALSO
-
-L<FS::cust_main>, config.html from the base documentation
-
-=head1 AUTHOR
-
-Jeff Finucane <jeff@cmh.net>
-
-=cut
-
-
diff --git a/FS/bin/freeside-overdue b/FS/bin/freeside-overdue
deleted file mode 100755
index 116245f..0000000
--- a/FS/bin/freeside-overdue
+++ /dev/null
@@ -1,196 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use vars qw( $days_to_pay $cust_main $cust_pkg
- $cust_svc $svc_acct );
-use Getopt::Std;
-use FS::cust_main;
-use FS::cust_pkg;
-use FS::cust_svc;
-use FS::svc_acct;
-use FS::Record qw(qsearch qsearchs);
-use FS::UID qw(adminsuidsetup);
-
-&untaint_argv;
-my %opt;
-getopts('ed:qpl:scbyoi', \%opt);
-my $user = shift or die &usage;
-
-adminsuidsetup $user;
-
-my $now = time; #eventually take a time option like freeside-bill
-my ($sec,$min,$hour,$mday,$mon,$year) =
- (localtime($now) )[0,1,2,3,4,5];
-$mon++;
-$year += 1900;
-
-foreach $cust_main ( qsearch('cust_main',{} ) ) {
-
- my ( $eyear, $emon, $eday ) = ( 2037, 12, 31 );
- if ( $cust_main->paydate =~ /^(\d{4})\-(\d{1,2})\-(\d{1,2})$/
- && $cust_main->payby eq 'BILL') {
- ( $eyear, $emon, $eday ) = ( $1, $2, $3 );
- }
-
- if ( ( $opt{d}
- && $cust_main->balance_date(time - $opt{d} * 86400) > 0
- && qsearchs( 'cust_pkg', { 'custnum' => $cust_main->custnum,
- 'susp' => "" } ) )
- || ( $opt{e}
- && $cust_main->payby eq 'BILL'
- && ( $eyear < $year
- || ( $eyear == $year && $emon < $mon ) ) )
- ) {
-
- unless ( $opt{q} ) {
- print $cust_main->custnum, "\t",
- $cust_main->last, "\t", $cust_main->first, "\t",
- $cust_main->balance_date(time-$opt{d} * 86400);
- }
-
- if ( $opt{p} && ! grep { $_ eq 'POST' } $cust_main->invoicing_list ) {
- print "\n\tAdding postal invoicing" unless $opt{q};
- my @invoicing_list = $cust_main->invoicing_list;
- push @invoicing_list, 'POST';
- $cust_main->invoicing_list(\@invoicing_list);
- }
-
- if ( $opt{l} ) {
- print "\n\tCharging late fee of \$$opt{l}" unless $opt{q};
- my $error = $cust_main->charge($opt{l}, 'Late fee');
- # comment or plandata with info so we don't redo the same late fee every
- # day
- }
-
- foreach $cust_pkg ( qsearch( 'cust_pkg',
- { 'custnum' => $cust_main->custnum } ) ) {
-
- if ($opt{s}) {
- print "\n\tSuspending pkgnum " . $cust_pkg->pkgnum unless $opt{q};
- $cust_pkg->suspend;
- }
-
- if ($opt{c}) {
- print "\n\tCancelling pkgnum " . $cust_pkg->pkgnum unless $opt{q};
- $cust_pkg->cancel;
- }
-
- }
-
- if ( $opt{b} ) {
- print "\n\tBilling" unless $opt{q};
- my $error = $cust_main->bill('time'=>$now);
- warn "Error billing, customer #" . $cust_main->custnum .
- ":" . $error if $error;
- }
-
- if ( $opt{y} ) {
- print "\n\tApplying outstanding payments and credits" unless $opt{q};
- $cust_main->apply_payments;
- $cust_main->apply_credits;
- }
-
- if ( $opt{o} ) {
- print "\n\tCollecting" unless $opt{q};
- my $error = $cust_main->collect(
- 'invoice_time' => $now,
- 'batch_card' => $opt{i} ? 'no' : 'yes',
- 'force_print' => 'yes',
- );
- warn "Error collecting from customer #" . $cust_main->custnum. ":$error"
- if $error;
- }
-
- print "\n" unless $opt{q};
-
- }
-
-}
-
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) {
- $ARGV[$_] =~ /^([\w\-\/\.]*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-overdue [ -e ] [ -d days ] [ -q ] [ -p ] [ -l amount ] [ -s ] [ -c ] [ -b ] [ -y ] [ -o [ -i ] ] user\n";
-}
-
-
-=head1 NAME
-
-freeside-overdue - Perform actions on overdue and/or expired accounts.
-
-=head1 SYNOPSIS
-
- freeside-overdue [ -e ] [ -d days ] [ -q ] [ -p ] [ -l amount ] [ -s ] [ -c ] [ -b ] [ -y ] [ -o [ -i ] ] user
-
-=head1 DESCRIPTION
-
-This script is deprecated in 1.4.0. You should use freeside-daily and invoice
-events instead.
-
-Performs actions on overdue and/or expired accounts.
-
-Selection options (at least one selection option is required):
-
- -d: Customers with a balance due on invoices older than the supplied number
- of days. Requires an integer argument.
-
- -e: Customers with a billing expiration date in the past.
-
-Action options:
-
- -q: Be quiet (by default, selected accounts are printed).
-
- -p: Add postal invoicing to the relevant customers.
-
- -l: Add a charge of the given amount to the relevant customers.
-
- -s: Suspend accounts.
-
- -c: Cancel accounts.
-
- -b: Bill customers (create invoices)
-
- -y: Apply unapplied payments and credits
-
- -o: Collect from customers (charge cards, print invoices)
-
- -i: real-time billing (as opposed to batch billing). only relevant
- for credit cards.
-
- user: From the mapsecrets file - see config.html from the base documentation
-
-=head1 CRONTAB
-
-Example crontab entries:
-
-# suspend expired accounts
-20 4 * * * freeside-overdue -e -s user
-
-# quietly add postal invoicing to customers over 30 days past due
-20 4 * * * freeside-overdue -d 30 -p -q user
-
-# suspend accounts and charge a $10.23 fee for customers over 60 days past due
-20 4 * * * freeside-overdue -d 60 -s -l 10.23 user
-
-# cancel accounts over 90 days past due
-20 4 * * * freeside-overdue -d 90 -c user
-
-=head1 ORIGINAL AUTHORS
-
-Original disable-overdue version by mw/kwh: Mark W.? and Kristian Hoffmann ?
-
-Ivan seems to be turning it into the "do-everything" CLI.
-
-=head1 BUGS
-
-Hell now that this is the do-everything CLI it should have --longoptions
-
-=cut
-
-1;
-
diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued
deleted file mode 100644
index 83074b9..0000000
--- a/FS/bin/freeside-queued
+++ /dev/null
@@ -1,254 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use vars qw( $log_file $sigterm $sigint $kids $max_kids );
-use subs qw( _die _logmsg );
-use Fcntl qw(:flock);
-use POSIX qw(setsid);
-use Date::Format;
-use IO::File;
-use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh);
-use FS::Record qw(qsearch qsearchs);
-use FS::queue;
-use FS::queue_depend;
-
-# no autoloading just yet
-use FS::cust_main;
-use FS::svc_acct;
-use Net::SSH 0.06;
-use FS::part_export;
-
-$max_kids = '10'; #guess it should be a config file...
-$kids = 0;
-
-my $user = shift or die &usage;
-
-#my $pid_file = "/var/run/freeside-queued.$user.pid";
-my $pid_file = "/var/run/freeside-queued.pid";
-
-&daemonize1;
-
-sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; }
-$SIG{CHLD} = \&REAPER;
-
-$sigterm = 0;
-$sigint = 0;
-$SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; };
-$SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; };
-
-my $freeside_gid = scalar(getgrnam('freeside'))
- or die "can't setgid to freeside group\n";
-$) = $freeside_gid;
-$( = $freeside_gid;
-#if freebsd can't setuid(), presumably it can't setgid() either. grr fleabsd
-($(,$)) = ($),$();
-$) = $freeside_gid;
-
-$> = $FS::UID::freeside_uid;
-$< = $FS::UID::freeside_uid;
-#freebsd is sofa king broken, won't setuid()
-($<,$>) = ($>,$<);
-$> = $FS::UID::freeside_uid;
-
-$ENV{HOME} = (getpwuid($>))[7]; #for ssh
-adminsuidsetup $user;
-
-$log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc;
-
-&daemonize2;
-
-$SIG{__DIE__} = \&_die;
-$SIG{__WARN__} = \&_logmsg;
-
-warn "freeside-queued starting\n";
-
-my $warnkids=0;
-while (1) {
-
- #prevent runaway forking
- if ( $kids >= $max_kids ) {
- warn "WARNING: maximum $kids children reached\n" unless $warnkids++;
- sleep 1; #waiting for signals is cheap
- next;
- }
- $warnkids=0;
-
- my $nodepend = driver_name eq 'mysql'
- ? ''
- : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'.
- ' WHERE queue_depend.jobnum = queue.jobnum ) ';
-
- #my($job, $ljob);
- #{
- # my $oldAutoCommit = $FS::UID::AutoCommit;
- # local $FS::UID::AutoCommit = 0;
- $FS::UID::AutoCommit = 0;
- my $dbh = dbh;
-
- my $job = qsearchs(
- 'queue',
- { 'status' => 'new' },
- '',
- driver_name eq 'mysql'
- ? "$nodepend ORDER BY jobnum LIMIT 1 FOR UPDATE"
- : "$nodepend ORDER BY jobnum FOR UPDATE LIMIT 1"
- ) or do {
- $dbh->commit or die $dbh->errstr; #if $oldAutoCommit;
- sleep 5; #connecting to db is expensive
- next;
- };
-
- if ( driver_name eq 'mysql'
- && qsearch('queue_depend', { 'jobnum' => $job->jobnum } ) ) {
- $dbh->commit or die $dbh->errstr; #if $oldAutoCommit;
- sleep 5; #would be better if mysql could do everything in query above
- next;
- }
-
- my %hash = $job->hash;
- $hash{'status'} = 'locked';
- my $ljob = new FS::queue ( \%hash );
- my $error = $ljob->replace($job);
- die $error if $error;
-
- $dbh->commit or die $dbh->errstr; #if $oldAutoCommit;
-
- $FS::UID::AutoCommit = 1;
- #}
-
- my @args = $ljob->args;
-
- defined( my $pid = fork ) or do {
- warn "WARNING: can't fork: $!\n";
- my %hash = $job->hash;
- $hash{'status'} = 'failed';
- $hash{'statustext'} = "[freeside-queued] can't fork: $!";
- my $ljob = new FS::queue ( \%hash );
- my $error = $ljob->replace($job);
- die $error if $error;
- next; #don't increment the kid counter
- };
-
- if ( $pid ) {
- $kids++;
- } else { #kid time
-
- #get new db handle
- $FS::UID::dbh->{InactiveDestroy} = 1;
-
- forksuidsetup($user);
-
- #auto-use export classes...
- if ( $ljob->job =~ /(FS::part_export::\w+)::/ ) {
- my $class = $1;
- eval "use $class;";
- if ( $@ ) {
- warn "job use $class failed";
- my %hash = $ljob->hash;
- $hash{'status'} = 'failed';
- $hash{'statustext'} = $@;
- my $fjob = new FS::queue( \%hash );
- my $error = $fjob->replace($ljob);
- die $error if $error;
- exit; #end-of-kid
- };
- }
-
- my $eval = "&". $ljob->job. '(@args);';
- warn "running $eval";
- eval $eval; #throw away return value? suppose so
- if ( $@ ) {
- warn "job $eval failed";
- my %hash = $ljob->hash;
- $hash{'status'} = 'failed';
- $hash{'statustext'} = $@;
- my $fjob = new FS::queue( \%hash );
- my $error = $fjob->replace($ljob);
- die $error if $error;
- } else {
- $ljob->delete;
- }
-
- exit;
- #end-of-kid
- }
-
-} continue {
- if ( $sigterm ) {
- warn "received TERM signal; exiting\n";
- exit;
- }
- if ( $sigint ) {
- warn "received INT signal; exiting\n";
- exit;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-queued user\n";
-}
-
-sub _die {
- my $msg = shift;
- unlink $pid_file if -e $pid_file;
- _logmsg($msg);
-}
-
-sub _logmsg {
- chomp( my $msg = shift );
- my $log = new IO::File ">>$log_file";
- flock($log, LOCK_EX);
- seek($log, 0, 2);
- print $log "[". time2str("%a %b %e %T %Y",time). "] [$$] $msg\n";
- flock($log, LOCK_UN);
- close $log;
-}
-
-sub daemonize1 {
-
- chdir "/" or die "Can't chdir to /: $!";
- open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
- defined(my $pid = fork) or die "Can't fork: $!";
- if ( $pid ) {
- print "freeside-queued started with pid $pid\n"; #logging to $log_file\n";
- exit unless $pid_file;
- my $pidfh = new IO::File ">$pid_file" or exit;
- print $pidfh "$pid\n";
- exit;
- }
- #open STDOUT, '>/dev/null'
- # or die "Can't write to /dev/null: $!";
- #setsid or die "Can't start a new session: $!";
- #open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
-
-}
-
-sub daemonize2 {
- open STDOUT, '>/dev/null'
- or die "Can't write to /dev/null: $!";
- setsid or die "Can't start a new session: $!";
- open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
-}
-
-=head1 NAME
-
-freeside-queued - Job queue daemon
-
-=head1 SYNOPSIS
-
- freeside-queued user
-
-=head1 DESCRIPTION
-
-Job queue daemon. Should be running at all times.
-
-user: from the mapsecrets file - see config.html from the base documentation
-
-=head1 VERSION
-
-=head1 BUGS
-
-=head1 SEE ALSO
-
-=cut
-
diff --git a/FS/bin/freeside-receivables-report b/FS/bin/freeside-receivables-report
deleted file mode 100755
index b5a4903..0000000
--- a/FS/bin/freeside-receivables-report
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/usr/bin/perl -Tw
-
-use strict;
-use Date::Parse;
-use Time::Local;
-use Getopt::Std;
-use Text::Template;
-use Net::SMTP;
-use Mail::Header;
-use Mail::Internet;
-use FS::Conf;
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch);
-use FS::cust_main;
-
-
-&untaint_argv; #what it sounds like (eww)
-use vars qw($opt_v $opt_p $opt_m $opt_e $opt_t $report_lines $report_template @buf $header);
-getopts("vpmet:"); #switches
-
-#we're at now now (and later).
-my($_date)= $^T;
-
-# Get the current month
-my ($sec,$min,$hour,$mday,$mon,$year) =
- (localtime($_date) )[0,1,2,3,4,5];
-$mon++;
-$year += 1900;
-
-# Login to the database
-my $user = shift or die &usage;
-adminsuidsetup $user;
-
-# Get the needed configuration files
-my $conf = new FS::Conf;
-my $lpr = $conf->config('lpr');
-my $email = $conf->config('email');
-my $smtpmachine = $conf->config('smtpmachine');
-my $mail_sender = $conf->exists('invoice_from') ? $conf->config('invoice_from') :
- 'postmaster';
-my @report_template = $conf->config('report_template')
- or die "cannot load config file report_template";
-$report_lines = 0;
- foreach ( grep /report_lines\(\d+\)/, @report_template ) { #kludgy :/
- /report_lines\((\d+)\)/;
- $report_lines += $1;
-}
-die "no report_lines() functions in template?" unless $report_lines;
-$report_template = new Text::Template (
- TYPE => 'ARRAY',
- SOURCE => [ map "$_\n", @report_template ],
-) or die "can't create new Text::Template object: $Text::Template::ERROR";
-
-
-my(@customers)=qsearch('cust_main',{});
-if (scalar(@customers) == 0)
-{
- exit 1;
-}
-
-# Open print and email pipes
-# $lpr and opt_p for printing
-# $email and opt_m for email
-
-if ($lpr && $opt_p)
-{
- open(LPR, "|$lpr");
-}
-
-if ($email && $opt_m)
-{
- $ENV{MAILADDRESS} = $mail_sender;
- $header = new Mail::Header ( [
- "From: Account Processor",
- "To: $email",
- "Sender: $mail_sender",
- "Reply-To: $mail_sender",
- "Subject: Receivables",
- ] );
-}
-
-my $total = 0;
-
-
-# Now I can start looping
-foreach my $customer (@customers)
-{
- my $custnum = $customer->getfield('custnum');
- my $first = $customer->getfield('first');
- my $last = $customer->getfield('last');
- my $company = $customer->getfield('company');
- my $daytime = $customer->getfield('daytime');
- my $balance = $customer->balance;
-
-
- if ($balance != 0) {
- $total += $balance;
- push @buf, sprintf(qq{%8d %-32.32s %12s %9.2f},
- $custnum,
- $first . " " . $last . " " . $company,
- $daytime,
- $balance);
-
- }
-
-}
-
-push @buf, ('', sprintf(qq{%61s}, "========="), sprintf(qq{%61.2f}, $total));
-
-sub FS::receivables_report::_template::report_lines {
- my $lines = shift;
- map {
- scalar(@buf) ? shift @buf : '' ;
- }
- ( 1 .. $lines );
-}
-
-$FS::receivables_report::_template::title = " R E C E I V A B L E S ";
-$FS::receivables_report::_template::title = $opt_t if $opt_t;
-$FS::receivables_report::_template::page = 1;
-$FS::receivables_report::_template::date = $_date;
-$FS::receivables_report::_template::date = $_date;
-$FS::receivables_report::_template::total_pages =
- int( scalar(@buf) / $report_lines);
-$FS::receivables_report::_template::total_pages++ if scalar(@buf) % $report_lines;
-
-my @report;
-while (@buf) {
- push @report, split("\n",
- $report_template->fill_in( PACKAGE => 'FS::receivables_report::_template' )
- );
- $FS::receivables_report::_template::page++;
-}
-
-if ($opt_v) {
- print map "$_\n", @report;
-}
-if($lpr && $opt_p)
-{
- print LPR map "$_\n", @report;
- print LPR "\f" if $opt_e;
- close LPR || die "Could not close printer: $lpr\n";
-}
-if($email && $opt_m)
-{
- my $message = new Mail::Internet (
- 'Header' => $header,
- 'Body' => [ (@report) ],
- );
- $!=0;
- $message->smtpsend( Host => "$smtpmachine" )
- or die "can't send report to $email via $smtpmachine: $!";
-}
-
-
-# subroutines
-
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- $ARGV[$_] =~ /^([\w\-\/ ]*)$/ || die "Illegal argument \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-receivables-report [-v] [-p] [-e] user\n";
-}
-
-=head1 NAME
-
-freeside-receivables-report - Prints or emails outstanding receivables.
-
-=head1 SYNOPSIS
-
- freeside-receivables-report [-v] [-p] [-m] [-e] [-t "title"] user
-
-=head1 DESCRIPTION
-
-Prints or emails outstanding receivables
-
-B<-v>: Verbose - Prints records to STDOUT.
-
-B<-p>: Print to printer lpr as found in the conf directory.
-
-B<-m>: Mail output to user found in the Conf email file.
-
-B<-e>: Print a final form feed to the printer.
-
-B<-t>: supply a title for the top of each page.
-
-user: From the mapsecrets file - see config.html from the base documentation
-
-=head1 VERSION
-
-$Id: freeside-receivables-report,v 1.5 2002-03-07 19:50:24 jeff Exp $
-
-=head1 BUGS
-
-Yes..... Use at your own risk. No guarantees or warrantees of any
-kind apply to this program. Parts of this program are hacked from
-other GNU licensed software created mainly by Ivan Kohler.
-
-This is released under the GNU Public License. See www.gnu.org
-for more information regarding this license.
-
-=head1 SEE ALSO
-
-L<FS::cust_main>, config.html from the base documentation
-
-=head1 AUTHOR
-
-Jeff Finucane <jeff@cmh.net>
-
-based on print-batch by Joel Griffiths <griff@aver-computer.com>
-
-=cut
-
diff --git a/FS/bin/freeside-reexport b/FS/bin/freeside-reexport
deleted file mode 100644
index b5c50a4..0000000
--- a/FS/bin/freeside-reexport
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/perl -Tw
-
-use strict;
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch qsearchs);
-use FS::part_export;
-use FS::svc_acct;
-use FS::cust_svc;
-
-my $user = shift or die &usage;
-adminsuidsetup $user;
-
-my $export_x = shift or die &usage;
-my @part_export;
-if ( $export_x =~ /^(\d+)$/ ) {
- @part_export = qsearchs('part_export', { exportnum=>$1 } )
- or die "exportnum $export_x not found\n";
-} else {
- @part_export = qsearch('part_export', { exporttype=>$export_x } )
- or die "no exports of type $export_x found\n";
-}
-
-my $svc_something = shift or die &usage;
-my $svc_x;
-if ( $svc_something =~ /^(\d+)$/ ) {
- my $cust_svc = qsearchs('cust_svc', { svcnum=>$1 } )
- or die "svcnum $svc_something not found\n";
- $svc_x = $cust_svc->svc_x;
-} else {
- $svc_x = qsearchs('svc_acct', { username=>$svc_something } )
- or die "username $svc_something not found\n";
-}
-
-foreach my $part_export ( @part_export ) {
- my $error = $part_export->export_insert($svc_x);
- die $error if $error;
-}
-
-
-sub usage {
- die "Usage:\n\n freeside-reexport user exportnum|exporttype svcnum|username\n";
-}
-
-=head1 NAME
-
-freeside-reexport - Command line tool to re-trigger export jobs for existing services
-
-=head1 SYNOPSIS
-
- freeside-reexport user exportnum|exporttype svcnum|username
-
-=head1 DESCRIPTION
-
- Re-queues the export job for the specified exportnum or exporttype(s) and
- specified service (selected by svcnum or username).
-
-=head1 SEE ALSO
-
-L<freeside-sqlradius-reset>, L<FS::part_export>
-
-=cut
-
diff --git a/FS/bin/freeside-setinvoice b/FS/bin/freeside-setinvoice
deleted file mode 100644
index 708e2fa..0000000
--- a/FS/bin/freeside-setinvoice
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use FS::UID qw(adminsuidsetup);
-use FS::Conf;
-use FS::Record qw(qsearch qsearchs);
-use FS::cust_main;
-use FS::svc_acct;
-
-&untaint_argv; #what it sounds like (eww)
-my $user = shift or die &usage;
-
-adminsuidsetup $user;
-
-foreach my $cust_main (
- grep { ! scalar($_->invoicing_list) }
- qsearch( 'cust_main', {} )
-) {
- my @dest;
- my @cust_pkg = $cust_main->ncancelled_pkgs;
- foreach my $cust_pkg ( @cust_pkg ) {
- foreach my $cust_svc ( $cust_pkg->cust_svc ) {
- my $svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $cust_svc->svcnum } );
- push @dest, $svc_acct->svcnum if $svc_acct;
- }
- }
- push @dest, 'POST' unless @dest;
- $cust_main->invoicing_list(\@dest);
-}
-
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- $ARGV[$_] =~ /^(.*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-setinvoice user\n";
-}
-
-
diff --git a/FS/bin/freeside-sqlradius-reset b/FS/bin/freeside-sqlradius-reset
deleted file mode 100755
index 9d3a6a7..0000000
--- a/FS/bin/freeside-sqlradius-reset
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/perl -Tw
-
-use strict;
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch qsearchs);
-use FS::part_export;
-use FS::svc_acct;
-use FS::cust_svc;
-
-my $user = shift or die &usage;
-adminsuidsetup $user;
-
-#my $machine = shift or die &usage;
-
-my @exports = qsearch('part_export', { 'exporttype' => 'sqlradius' } );
-
-foreach my $export ( @exports ) {
- my $icradius_dbh = DBI->connect(
- map { $export->option($_) } qw( datasrc username password )
- ) or die $DBI::errstr;
- for my $table (qw( radcheck radreply usergroup )) {
- my $sth = $icradius_dbh->prepare("DELETE FROM $table");
- $sth->execute or die "Can't reset $table table: ". $sth->errstr;
- }
- $icradius_dbh->disconnect;
-}
-
-foreach my $export ( @exports ) {
-
- #my @svcparts = map { $_->svcpart } $export->export_svc;
-
- my @svc_acct =
- map { qsearchs('svc_acct', { 'svcnum' => $_->svcnum } ) }
- map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
- grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
- $export->export_svc;
-
- foreach my $svc_acct ( @svc_acct ) {
-
- #false laziness with FS::svc_acct::insert (like it matters)
- my $error = $export->export_insert($svc_acct);
- die $error if $error;
-
- }
-}
-
-sub usage {
- #die "Usage:\n\n sqlradius_reset user machine\n";
- die "Usage:\n\n freeside-sqlradius-reset user\n";
-}
-
-=head1 NAME
-
-freeside-sqlradius-reset - Command line interface to reset and recreate RADIUS SQL tables
-
-=head1 SYNOPSIS
-
- freeside-sqlradius-reset username
-
-=head1 DESCRIPTION
-
-Deletes the radcheck, radreply and usergroup tables and repopulates them from
-the Freeside database, for all sqlradius exports.
-
-B<username> is a username added by freeside-adduser.
-
-=head1 SEE ALSO
-
-L<freeside-reexport>, L<FS::part_export>, L<FS::part_export::sqlradius>
-
-=cut
-
-
-
diff --git a/FS/bin/freeside-tax-report b/FS/bin/freeside-tax-report
deleted file mode 100755
index 8d50213..0000000
--- a/FS/bin/freeside-tax-report
+++ /dev/null
@@ -1,292 +0,0 @@
-#!/usr/bin/perl -Tw
-
-
-use strict;
-use Date::Parse;
-use Time::Local;
-use Getopt::Std;
-use Text::Template;
-use Net::SMTP;
-use Mail::Header;
-use Mail::Internet;
-use FS::Conf;
-use FS::UID qw(adminsuidsetup);
-use FS::Record qw(qsearch);
-use FS::cust_bill;
-use FS::cust_bill_pay;
-use FS::cust_pay;
-
-
-&untaint_argv; #what it sounds like (eww)
-use vars qw($opt_v $opt_p $opt_m $opt_e $opt_t $opt_s $opt_f $report_lines $report_template @buf $header);
-getopts("vpmef:s:"); #switches
-
-#we're at now now (and later).
-my($_finishdate)= $opt_f ? str2time($main::opt_f) : $^T;
-my($_startdate)= $opt_s ? str2time($main::opt_s) : $^T;
-
-# Get the current month
-my ($ssec,$smin,$shour,$smday,$smon,$syear) =
- (localtime($_startdate) )[0,1,2,3,4,5];
-$smon++;
-$syear += 1900;
-
-# Get the current month
-my ($fsec,$fmin,$fhour,$fmday,$fmon,$fyear) =
- (localtime($_finishdate) )[0,1,2,3,4,5];
-$fmon++;
-$fyear += 1900;
-
-# Login to the database
-my $user = shift or die &usage;
-adminsuidsetup $user;
-
-# Get the needed configuration files
-my $conf = new FS::Conf;
-my $lpr = $conf->config('lpr');
-my $email = $conf->config('email');
-my $smtpmachine = $conf->config('smtpmachine');
-my $mail_sender = $conf->exists('invoice_from') ? $conf->config('invoice_from') :
- 'postmaster';
-my @report_template = $conf->config('report_template')
- or die "cannot load config file report_template";
-$report_lines = 0;
-foreach ( grep /report_lines\(\d+\)/, @report_template ) { #kludgy :/
- /report_lines\((\d+)\)/;
- $report_lines += $1;
-}
-die "no report_lines() functions in template?" unless $report_lines;
-$report_template = new Text::Template (
- TYPE => 'ARRAY',
- SOURCE => [ map "$_\n", @report_template ],
-) or die "can't create new Text::Template object: $Text::Template::ERROR";
-
-
-my(@cust_bills)=qsearch('cust_bill',{});
-if (scalar(@cust_bills) == 0)
-{
- exit 1;
-}
-
-# Open print and email pipes
-# $lpr and opt_p for printing
-# $email and opt_m for email
-
-if ($lpr && $main::opt_p)
-{
- open(LPR, "|$lpr");
-}
-
-if ($email && $main::opt_m)
-{
- $ENV{MAILADDRESS} = $mail_sender;
- $header = new Mail::Header ( [
- "From: Account Processor",
- "To: $email",
- "Sender: $mail_sender",
- "Reply-To: $mail_sender",
- "Subject: Sales Taxes Invoiced",
- ] );
-}
-
-my $comped = 0;
-my $comped_tax = 0;
-my $other = 0;
-my $other_tax = 0;
-my $total = 0;
-my $taxed = 0;
-my $untaxed = 0;
-my $total_tax = 0;
-
-# Now I can start looping
-foreach my $cust_bill (@cust_bills)
-{
- my $_date = $cust_bill->getfield('_date');
- my $invnum = $cust_bill->getfield('invnum');
- my $charged = $cust_bill->getfield('charged');
-
- if ($_date >= $_startdate && $_date <= $_finishdate) {
- $total += $charged;
-
- # The following lines were used to produce rather verbose reports
- #my ($sec,$min,$hour,$mday,$mon,$year) =
- # (localtime($_date) )[0,1,2,3,4,5];
- #$mon++;
- #$year -= 100 if $year >= 100;
- #$year = "0" . $year if $year < 10;
-
- my $invoice_amt =0;
- my $invoice_tax =0;
- my $invoice_comped =0;
- my(@cust_bill_pkgs)= $cust_bill->cust_bill_pkg;
- foreach my $cust_bill_pkg (@cust_bill_pkgs) {
-
- my $recur = $cust_bill_pkg->getfield('recur');
- my $setup = $cust_bill_pkg->getfield('setup');
- my $pkgnum = $cust_bill_pkg->getfield('pkgnum');
-
- if ($pkgnum == 0) {
- # The following line was used to produce rather verbose reports
- # push @buf, ('', sprintf(qq{%10s%15s%14.2f}, "$mon/$mday/$year", "Tax $invnum", $recur+$setup));
- $invoice_tax += $recur;
- $invoice_tax += $setup;
- } else {
- # The following line was used to produce rather verbose reports
- # push @buf, ('', sprintf(qq{%10s%15s%14.2f}, "$mon/$mday/$year", "Inv $invnum", $recur+$setup));
- $invoice_amt += $recur;
- $invoice_amt += $setup;
- }
-
- }
-
- my(@cust_bill_pays)= $cust_bill->cust_bill_pay;
- foreach my $cust_bill_pay (@cust_bill_pays) {
- my $payby = $cust_bill_pay->cust_pay->payby;
- my $paid = $cust_bill_pay->getfield('amount');
- if ($payby =~ 'COMP') {
- $invoice_comped += $paid;
- }
- }
-
- if (abs($invoice_comped - ($invoice_amt + $invoice_tax)) < 0.0001){
- $comped += $invoice_amt;
- $comped_tax += $invoice_tax;
- } elsif ($invoice_comped > 0) {
- push @buf, sprintf(qq{\nInvoice %10d has inexpliciable complimentary payments of %14.9f\n}, $invnum, $invoice_comped);
- $other += $invoice_amt;
- $other_tax += $invoice_tax;
- } elsif ($invoice_tax > 0) {
- $total_tax += $invoice_tax;
- $taxed += $invoice_amt;
- } else {
- $untaxed += $invoice_amt;
- }
-
- }
-
-}
-
-push @buf, ('', sprintf(qq{%25s%14.2f}, "Complimentary", $comped));
-push @buf, sprintf(qq{%25s%14.2f}, "Complimentary Tax", $comped_tax);
-push @buf, sprintf(qq{%25s%14.2f}, "Other", $other);
-push @buf, sprintf(qq{%25s%14.2f}, "Other Tax", $other_tax);
-push @buf, sprintf(qq{%25s%14.2f}, "Untaxed", $untaxed);
-push @buf, sprintf(qq{%25s%14.2f}, "Taxed", $taxed);
-push @buf, sprintf(qq{%25s%14.2f}, "Tax", $total_tax);
-push @buf, ('', sprintf(qq{%39s}, "========="), sprintf(qq{%39.2f}, $total));
-
-sub FS::tax_report::_template::report_lines {
- my $lines = shift;
- map {
- scalar(@buf) ? shift @buf : '' ;
- }
- ( 1 .. $lines );
-}
-
-$FS::tax_report::_template::title = qq~SALES TAXES INVOICED for $smon/$smday/$syear through $fmon/$fmday/$fyear~;
-$FS::tax_report::_template::title = $opt_t if $opt_t;
-$FS::tax_report::_template::page = 1;
-$FS::tax_report::_template::date = $^T;
-$FS::tax_report::_template::date = $^T;
-$FS::tax_report::_template::fdate = $_finishdate;
-$FS::tax_report::_template::fdate = $_finishdate;
-$FS::tax_report::_template::sdate = $_startdate;
-$FS::tax_report::_template::sdate = $_startdate;
-$FS::tax_report::_template::total_pages =
- int( scalar(@buf) / $report_lines);
-$FS::tax_report::_template::total_pages++ if scalar(@buf) % $report_lines;
-
-my @report;
-while (@buf) {
- push @report, split("\n",
- $report_template->fill_in( PACKAGE => 'FS::tax_report::_template' )
- );
- $FS::tax_report::_template::page++;
-}
-
-if ($opt_v) {
- print map "$_\n", @report;
-}
-if($lpr && $opt_p)
-{
- print LPR map "$_\n", @report;
- print LPR "\f" if $opt_e;
- close LPR || die "Could not close printer: $lpr\n";
-}
-if($email && $opt_m)
-{
- my $message = new Mail::Internet (
- 'Header' => $header,
- 'Body' => [ (@report) ],
- );
- $!=0;
- $message->smtpsend( Host => "$smtpmachine" )
- or die "can't send report to $email via $smtpmachine: $!";
-}
-
-
-# subroutines
-sub untaint_argv {
- foreach $_ ( $[ .. $#ARGV ) { #untaint @ARGV
- $ARGV[$_] =~ /^([\w\-\/ :]*)$/ || die "Illegal argument \"$ARGV[$_]\"";
- $ARGV[$_]=$1;
- }
-}
-
-sub usage {
- die "Usage:\n\n freeside-tax-report [-v] [-p] [-e] user\n";
-}
-
-=head1 NAME
-
-freeside-tax-report - Prints or emails sales taxes invoiced in a given period.
-
-=head1 SYNOPSIS
-
- freeside-tax-report [-v] [-p] [-m] [-e] [-t "title"] [-s date] [-f date] user
-
-=head1 DESCRIPTION
-
-Prints or emails sales taxes invoiced in a given period.
-
--v: Verbose - Prints records to STDOUT.
-
--p: Print to printer lpr as found in the conf directory.
-
--m: Email output to user found in the Conf email file.
-
--e: Print a final form feed to the printer.
-
--t: supply a title for the top of each page.
-
--s: starting date for inclusion
-
--f: final date for inclusion
-
-user: From the mapsecrets file - see config.html from the base documentation
-
-=head1 VERSION
-
-$Id: freeside-tax-report,v 1.4 2002-03-07 19:50:24 jeff Exp $
-
-=head1 BUGS
-
-Yes..... Use at your own risk. No guarantees or warrantees of any
-kind apply to this program. Parts of this program are hacked from
-other GNU licensed software created mainly by Ivan Kohler.
-
-This is released under the GNU Public License. See www.gnu.org
-for more information regarding this license.
-
-=head1 SEE ALSO
-
-L<FS::cust_main>, config.html from the base documentation
-
-=head1 AUTHOR
-
-Jeff Finucane <jeff@cmh.net>
-
-based on print-batch by Joel Griffiths <griff@aver-computer.com>
-
-=cut
-