[freeside] Useful script for voiding invoices
ivan
ivan at 420.am
Wed Feb 7 11:24:15 PST 2001
On Sat, Feb 03, 2001 at 11:15:58PM -0600, Brian wrote:
> It's been quite sometime since I've read this list. Tonight however I
> wasn't just reading the list but actually searching for a script to get
> myself out of hot water. I was trying to trick the system to bill a
> customer a few days earlier so I could get him for both the current
> month of service as well as the next month of service when we do the
> regular cycle billing tomorrow.
May I suggest the `-d' option to freeside-bill ?
> This whole problem can be attributed to
> another I hack I made which actually causes freeside to bill in a true
> monthly fashion so everybody's account aniversary is on the first of the
> month.
>
> Any how, thanks to a Id10T error I messed up the date and trigger a cron
> job which started the cycle billing for next month. The only problem was
> I did this twice before I noticed and caused a big mess with about 1000
> invoices billed incorrectly.
>
> A quick check of the mail archives didn't reveal any scripts or
> additions to the code that provided a void or delete function. Needless
> to say I didn't cherish the idea of manually deleting 1000 invoices by
> hand through phpMyAdmin.
>
>
> Here's the logic to my script.
>
> First you have to decide if you want a record of the invoice, if so
> uncomment the lines in clear_invoice that update the cust_bill and
> cust_bill_pkg tables. Don't forget to comment out the lines above them
> that actually delete the records from those tables
>
> The script first clears out any entries you have for the bad invoice in
> cust_pay_batch. If you aren't batching your charges this is pretty
> useless. I guess you might need to create an interface to the
> appropriate CCVS system calls to void the charge in a real time system.
>
> Next the script does the really important part. It removes the Next Bill
> date, and if neccessary clears the setup date as well from the cust_pkg
> table. This should allow the next billing run to properly bill the
> package and not miss the valuable setup charges.
>
> Finally the script goes after the actual invoice, it all depends on what
> you choose in the script whether it will delete or actually void.
>
>
>
> I thought this would be a good little script to post to the list. Ivan,
> maybe it can even be added as a script in the next distro.
Perhaps if you rewrite it as you describe below.
> Hopefully
> someone can take the logic I've started with and actually integrate it
> with the freeside interface and the cust_*.pm module. At the very least
> folks can use this to clear out a misbilled invoice without having to
> use phpMyAdmin or raw SQL.
>
>
> --
> Brian
>
>
>
>
>
>
> ---Script-----
>
>
> #!/usr/bin/perl
>
> # I hacked this together one night when I accidently billed customers 2
> times in a row due to a date
> # change I had done to bill 1 customer in the rear by a few days.
>
> # Brian Walters <brian at mylinuxisp.com>
>
> # Don't ask for support, this was done to get me out of hot water it may
> not work in all cases, it might not
> # work in your case particularly. Use at your own risk!!!!
>
> use strict;
> use DBI;
>
>
> my $database = "freeside";
> my $user = "root";
> my $password = "";
>
> # I like things like db handles to be global, it's just me.
> my $dbh;
>
>
> sub delete_cc_trans {
> # I'm not checking for the existence. If there's no transaction
> nothing is going to happen
>
> my ($invoicenum) = @_;
> $dbh->do("delete from cust_pay_batch where invnum=$invoicenum");
>
> }
>
>
> sub clear_bill_dates {
> # I have to clear the next bill date and possibly the setup date if
> it was billed too
>
> my ($invoicenum) = @_;
> my ($pkgnum,$recur,$setup,$sqlstring);
>
>
> my $sth = $dbh->prepare("select pkgnum, recur, setup from
> cust_bill_pkg where invnum=$invoicenum");
>
> $sth->execute;
>
> my $ary_ref = $sth->fetch;
>
> while ($ary_ref) {
> $pkgnum = $$ary_ref[0];
> $recur = $$ary_ref[1];
> $setup = $$ary_ref[2];
>
> # we have to make sure we don't get the sales tax entry
> if ($pkgnum!=0) {
>
> $sqlstring = "UPDATE cust_pkg SET ";
>
> if ($setup > 0) {
> $sqlstring = $sqlstring . "setup=0,";
> }
> $sqlstring = $sqlstring . "bill=0";
>
> $sqlstring = $sqlstring . " WHERE pkgnum=$pkgnum";
> $dbh->do($sqlstring);
> }
> $ary_ref = $sth->fetch;
> }
>
> }
>
> sub clear_invoice {
> # I have to clear the next bill date and possibly the setup date if
> it was billed too
>
> my ($invoicenum) = @_;
>
> # If you actually want to delete the invoice completely!
> $dbh->do("delete from cust_bill_pkg where invnum=$invoicenum");
> $dbh->do("delete from cust_bill where invnum=$invoicenum");
>
> # If you simply want to void it but keep a record.
> # $dbh->do("update cust_bill_pkg SET recur=0,setup=0 where
> invnum=$invoicenum");
> # $dbh->do("update cust_bill SET charged=0, owed=0 where
> invnum=$invoicenum");
>
> }
>
>
> # MAIN CODE
>
>
> # This line should probably be rewritten if you plan to run the script
> from another host.
> $dbh = DBI->connect("DBI:mysql:$database", $user, $password)
> or die "Can't connect to $database: $DBI::errstr\n";
>
> my $invoicenum = $ARGV[0];
>
>
> # ___VERY___ limited argument checking
> $invoicenum>0 or die "Bad invoice number!!\n";
>
>
> print "Deleting invoice number $invoicenum\n";
>
> delete_cc_trans ($invoicenum);
> clear_bill_dates ($invoicenum);
> clear_invoice ($invoicenum);
>
> $dbh->disconnect;
>
--
meow
_ivan
More information about the freeside-users
mailing list