(untested eek) freeside-overdue script & cust_main balance_date & total_owed_date...
[freeside.git] / FS / bin / freeside-overdue
1 #!/usr/bin/perl
2
3 use strict;
4 use vars qw( $days_to_pay $cust_main $cust_pkg 
5              $cust_svc $svc_acct );
6 use Getopt::Std;
7 use FS::cust_main;
8 use FS::cust_pkg;
9 use FS::cust_svc;
10 use FS::svc_acct;
11 use FS::Record qw(qsearch qsearchs);
12 use FS::UID qw(adminsuidsetup);
13
14 &untaint_argv;
15 my %opt;
16 getopts('ed:qpsc', \%opt);
17 my $user = shift or die &usage;
18
19 adminsuidsetup $user;
20
21 my $now = time;
22 my ($sec,$min,$hour,$mday,$mon,$year) =
23   (localtime($now) )[0,1,2,3,4,5];
24 $mon++;
25 $year += 1900;
26
27 foreach $cust_main ( qsearch('cust_main',{} ) ) {
28
29   my ( $eyear, $emon, $eday ) = ( 2037, 12, 31 );
30   if ( $cust_main->paydate =~ /^(\d{4})\-(\d{1,2})\-(\d{1,2})$/
31        && $cust_main->payby eq 'BILL') {
32     ( $eyear, $emon, $eday ) = ( $1, $2, $3 );
33   }
34
35   if ( ( $opt{d}
36            && $cust_main->balance_date(time - $opt{d} * 86400) > 0
37            && qsearchs( 'cust_pkg', { 'custnum' => $cust_main->custnum,
38                                       'susp' => "" } ) )
39        || ( $opt{e}
40             && $cust_main->payby eq 'BILL'
41             && ( $eyear < $year
42                  || ( $eyear == $year && $emon < $mon ) ) )
43   ) { 
44
45     unless ( $opt{q} ) {
46       print $cust_main->custnum, "\t",
47             $cust_main->last, "\t", $cust_main->first, "\t",
48             $cust_main->balance_date(time-$opt{d} * 86400);
49     }
50
51     foreach $cust_pkg ( qsearch( 'cust_pkg', 
52                                  { 'custnum' => $cust_main->custnum } ) ) {
53
54       if ($opt{p} && ! grep { $_ eq 'POST' } $cust_main->invoicing_list ) {
55         print "\n\tAdding postal invoicing" unless $opt{q};
56         my @invoicing_list = $cust_main->invoicing_list;
57         push @invoicing_list, 'POST';
58         $cust_main->invoicing_list(\@invoicing_list);
59       }
60
61       if ($opt{s}) {
62         print "\n\tSuspending pkgnum " . $cust_pkg->pkgnum unless $opt{q};
63         $cust_pkg->suspend;
64       }
65
66       if ($opt{c}) {
67         print "\n\tCancelling pkgnum " . $cust_pkg->pkgnum unless $opt{q};
68         $cust_pkg->cancel;
69       }
70
71     }
72
73     print "\n" unless $opt{q};
74
75   }
76
77 }
78
79 sub untaint_argv {
80   foreach $_ ( $[ .. $#ARGV ) { 
81     $ARGV[$_] =~ /^([\w\-\/]*)$/ || die "Illegal arguement \"$ARGV[$_]\"";
82     $ARGV[$_]=$1;
83   }
84 }
85
86 sub usage {
87   die "Usage:\n\n  freeside-overdue [ -e ] [ -d days ] [ -q ] [ -p ] [ -s ] [ -c ] user\n";
88 }
89
90
91 =head1 NAME
92
93 freeside-overdue - Perform actions on overdue and/or expired accounts.
94
95 =head1 SYNOPSIS
96
97   freeside-overdue [ -e ] [ -d days ] [ -q ] [ -p ] [ -s ] [ -c ] user
98
99 =head1 DESCRIPTION
100
101 Performs actions on overdue and/or expired accounts.
102
103 Selection options (at least one selection option is required):
104
105   -d:   Customers with a balance due on invoices older than the supplied number
106         of days.  Requires an integer argument.
107
108   -e:   Customers with a billing expiration date in the past.
109
110 Action options: 
111
112   -q:   Be quiet (by default, suspended accounts are printed).
113
114   -p:   Add postal invoicing to the relevant customers.
115
116   -s:   Suspend accounts.
117
118   -c:   Cancel accounts.
119
120   user: From the mapsecrets file - see config.html from the base documentation
121
122 =head1 CRONTAB
123
124 Example crontab entries:
125
126 20 4,16 * * * freeside-overdue -e -s user
127 20 4,16 * * * freeside-overdue -d 30 -p -q user
128 20 4,16 * * * freeside-overdue -d 60 user
129 20 4,16 * * * freeside-overdue -d 90 -s user
130 20 4,16 * * * freeside-overdue -d 120 -c user
131
132 =head1 ORIGINAL AUTHORS
133
134 Original disable-overdue version by mw/kwh: Mark W.? and Kristian Hoffmann ?
135
136 =cut
137
138 1;
139