[freeside-commits] branch master updated. 57f4886b44bc370a06550c22b83990ada079eece

Ivan ivan at 420.am
Mon Dec 16 16:53:31 PST 2013


The branch, master has been updated
       via  57f4886b44bc370a06550c22b83990ada079eece (commit)
       via  ae42717bf75d986d5ea2585a2d657c902bd4c303 (commit)
      from  16e4d124e582098b658ef544b5f550f2055b7b4f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 57f4886b44bc370a06550c22b83990ada079eece
Merge: ae42717 16e4d12
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Mon Dec 16 16:53:23 2013 -0800

    Merge branch 'master' of git.freeside.biz:/home/git/freeside


commit ae42717bf75d986d5ea2585a2d657c902bd4c303
Author: Ivan Kohler <ivan at freeside.biz>
Date:   Mon Dec 16 16:53:15 2013 -0800

    adding another one-off script for correcting overtaxation, RT#24884

diff --git a/bin/cust_bill-credit_ship2 b/bin/cust_bill-credit_ship2
new file mode 100755
index 0000000..c4d5169
--- /dev/null
+++ b/bin/cust_bill-credit_ship2
@@ -0,0 +1,301 @@
+#!/usr/bin/perl -w
+
+use strict;
+use vars qw( $opt_d $opt_f $opt_s $opt_p $opt_m $opt_c $opt_e $opt_r $opt_k );
+use Getopt::Std;
+use Date::Parse qw(str2time);
+use FS::UID qw( dbh adminsuidsetup );
+use FS::Record qw( qsearch qsearchs );
+use FS::cust_main_county;
+use FS::cust_bill;
+use FS::msg_template;
+use FS::cust_credit;
+use FS::cust_credit_bill;
+
+getopts('d:f:s:pm:c:erk');
+
+my $user = shift or &usage;
+adminsuidsetup $user;
+
+#i should be an option
+my $taxname = 'HST, ON';
+my $rate = '13';
+                                                                                
+my $oldAutoCommit = $FS::UID::AutoCommit;
+local $FS::UID::AutoCommit = 0;
+my $dbh = dbh;
+
+###
+# find tax classes with double taxes
+##
+
+#my $sql = "select distinct taxclass from cust_main_county where taxname = '$taxname';";
+#my $sth = dbh->prepare($sql) or die dbh->errstr;
+#$sth->execute or die $sth->errstr;
+#my @taxclasses = map $_->[0], @{ $sth->fetchall_arrayref() };
+#
+#my %taxclass = map {
+#                my $taxclass = $_;
+#                my @cust_main_county = qsearch('cust_main_county', {
+#                                         'taxclass' => $taxclass,
+#                                         'taxname'  => $taxname,
+#                                         'tax'      => { op=>'>', value=>'0' },
+#                                       });
+#
+#                $taxclass => ( scalar(@cust_main_county) > 1 );
+#
+#              } @taxclasses;
+
+my %taxclass = map { $_ => 1 } (
+  'InternetService',
+  'ComputerSetup-Remote',
+  'Config File- Static IPs',
+  'GST',
+  'GST + PST',
+  'GST ONLY',
+  'HST ONLY',
+  'HardwareRental',
+  'HardwareSale',
+  'HardwareSale_WEx',
+  'InternetService_WEx',
+  'LondDistanceFixedRate',
+  'LondDistanceVariableRate',
+  'PST',
+  'SARA-ONLY-GSTPayable',
+  'SetupInternet',
+  'SetupVoice',
+  'Shipping',
+  'SoftwareLicenseToUse',
+  'TDMPRI',
+  'TDMPRI_WEx',
+  'WarrantyCoverageHardware',
+  'WarrantyCoverageSoftware',
+  'WebHosting',
+  'federal and qst',
+  'telephoneNumber',
+  'LongDistanceFixedRate_WEx',
+  'LongDistanceVariableRate_WEx',
+);
+
+my %h;
+$FS::Record::nowarn_classload = 1;
+$FS::Record::nowarn_classload = 1;
+
+###
+# find invoices
+###
+
+#my $extra_sql = $opt_s ? " AND cust_main.state = '$opt_s' " : '';
+
+my $start_date = $opt_d ? str2time($opt_d) : 0;
+my $end_date = $opt_f ? str2time($opt_f) - 1 : 1375471643;
+
+my @cust_bill = qsearch({
+  'select'    => 'cust_bill.*',
+  'table'     => 'cust_bill',
+  'addl_from' => 'LEFT JOIN cust_main USING ( custnum )',
+  'hashref'   => { '_date' => { op=>'>', value=>$start_date } },
+  'extra_sql' => " AND _date < $end_date ",
+#  'extra_sql' => $extra_sql,
+});
+
+my( @billpkgnums, @setuprecurs, @amounts );
+
+foreach my $cust_bill ( @cust_bill ) {
+
+  my $tax = $cust_bill->tax;
+
+  my $cust_main = $cust_bill->cust_main;
+
+  next if $cust_bill->charged == 0
+       or $tax == 0
+       or $cust_main->tax eq 'Y';
+
+  my $credit = 0;
+
+  @billpkgnums = ();
+  @setuprecurs = ();
+  @amounts = ();
+
+  foreach my $cust_bill_pkg ( $cust_bill->cust_bill_pkg ) {
+    my $cust_pkg = $cust_bill_pkg->cust_pkg or next;
+
+#    #my $loc = $cust_pkg->cust_location_or_main;
+#    #next if $opt_s && $loc->state ne $opt_s;
+#    next if $cust_pkg->cust_location; #we did these already
+#    next if $opt_s && $cust_main->ship_state ne $opt_s;
+#    next if $opt_s && $cust_main->state eq $opt_s; #we did these already too
+#
+    if ( $opt_s ) {
+      if ( my $loc = $cust_pkg->cust_location ) {
+        next if $loc->state ne $opt_s;
+      } else {
+        next if ($cust_main->ship_state || $cust_main->state) ne $opt_s;
+      }
+    }
+
+    my $part_pkg = $cust_pkg->part_pkg;
+
+    #these were changed already
+    # next unless $taxclass{ $part_pkg->taxclass };
+
+    my $h = $h{$part_pkg->pkgpart} ||= qsearchs({
+      'table'     => 'h_part_pkg', 
+      'hashref'   => { 'pkgpart'      => $part_pkg->pkgpart,
+                       'history_date' => { op=>'<', value=>$cust_bill->_date },
+                     },
+      'extra_sql' => "AND history_action IN ( 'insert', 'replace_new' )",
+      'order_by'  => 'ORDER BY HISTORYNUM DESC LIMIT 1',
+    });
+    if ( !$h ) {
+      warn "can't find history record for pkgpart ". $part_pkg->pkgpart.
+           " (invoice ". $cust_bill->invnum. ")\n";
+      #well, we have no idea what the mystery package was, so, we have no idea
+      # if we need to credit it or not.
+      next; #assuming, not...
+    }
+    next unless $taxclass{ $h->taxclass }
+             || ( $h->taxclass eq 'AllTaxesApply' && $cust_bill->_date < 1371750732 ) ;
+
+    #my $amount = $cust_bill_pkg->setup + $cust_bill_pkg->recur;
+    #$credit += $rate * $amount / 100;
+
+    if ( $cust_bill_pkg->setup ) {
+      my $scredit = sprintf('%.2f', ($rate * $cust_bill_pkg->setup / 100) + 0.00000001);
+      $credit += $scredit;
+      push @setuprecurs, 'setup';
+      push @billpkgnums, $cust_bill_pkg->billpkgnum;
+      push @amounts, $scredit;
+    } 
+
+    if ( $cust_bill_pkg->recur ) {
+      my $rcredit = sprintf('%.2f', ($rate * $cust_bill_pkg->recur / 100) + 0.00000001);
+      $credit += $rcredit;
+      push @setuprecurs, 'recur';
+      push @billpkgnums, $cust_bill_pkg->billpkgnum;
+      push @amounts, $rcredit;
+    }
+
+  }
+
+  $credit = sprintf('%.2f', $credit + 0.00000001);
+
+  next if $credit == 0;
+
+  #$credit = sprintf('%.2f', $credit + 0.00000001);
+
+  warn "invoice ". $cust_bill->invnum. ": credit of $credit is more than orignally taxed ($tax)\n" if $credit > $tax;
+
+  warn "invoice ". $cust_bill->invnum. ": credit of $credit is more than 50% of originally taxed ($tax)\n" if $credit-0.01 > $tax/2;
+
+  #my $cr_percent = sprintf('%.1f', 100 * $credit / $tax);
+
+  my $cur_cr = 0;
+  $cur_cr += $_->amount foreach $cust_bill->cust_credited;
+  $cur_cr = '' if $cur_cr == 0;
+  if ( $opt_p ) {
+    #print $cust_bill->invnum. ','. $cust_bill->custnum. ",$tax,$credit,$cr_percent%\n";
+    print $cust_bill->invnum. ','. $cust_bill->custnum. ',"'.
+          $cust_bill->cust_main->name. '",'. "$tax,$credit,$cur_cr\n";
+  }
+
+  next if $cur_cr > 0 && $opt_k;
+
+#COMMENTING OUT ALL DANGEROUS STUFF
+#
+#  if ( $opt_m && ! $opt_r ) {
+#
+#    my $msg_template = qsearchs('msg_template', { 'msgnum' => $opt_m } )
+#        or die "Template $opt_m not found";
+#    my $error = $msg_template->send(
+#      'cust_main' => $cust_main,
+#      'object'    => $cust_main,
+#    );
+#    if ( $error ) {
+#      warn "error sending email for invnum ". $cust_bill->invnum. ','.
+#           " custnum ". $cust_bill->custnum. ": $error\n";
+#    }
+#  }
+#
+#  if ( $opt_c ) {
+#    my $cust_credit = new FS::cust_credit {
+#      'custnum'   => $cust_main->custnum,
+#      'amount'    => $credit,
+#      'reasonnum' => $opt_c,
+#    };
+#    my $error = $cust_credit->insert;
+#    if ( $error ) {
+#      warn "error inserting credit: $error\n";
+#    }
+#    my $cust_credit_bill = new FS::cust_credit_bill {
+#      'crednum' => $cust_credit->crednum,
+#      'invnum'  => $cust_bill->invnum,
+#      'amount'  => $credit,
+#    };
+#    my $aerror = $cust_credit_bill->insert;
+#    if ( $aerror ) {
+#      warn "error applying credit to invnum ". $cust_bill->invnum. ": $aerror\n";
+#    }
+#  }
+#
+#  if ( $opt_e && ! $opt_r ) {
+#    eval { $cust_bill->email };
+#    if ( $@ ) {
+#      warn "error sending invnum ". $cust_bill->invnum. ','.
+#         " custnum ". $cust_bill->custnum. ": $@\n";
+#    }
+#  }
+
+}
+
+if ( $opt_r ) {
+  $dbh->rollback or die $dbh->errstr; #if $oldAutoCommit;
+} else {
+  $dbh->commit or die $dbh->errstr; #if $oldAutoCommit;
+}
+
+sub usage {                                                                     
+  die "usage:  cust_bill-credit [ -d date ] [ -s state ] [ -p ] [ -m templatenum ] [ -c reasonnum ] [ -e ] [ -r ] employee_username\n";
+}                                                                               
+                                                                                
+=head1 NAME                                                                     
+                                                                                
+cust_bill-credit
+                                                                                
+=head1 SYNOPSIS                                                                 
+                                                                                
+  cust_bill-credit [ -d date ] [ -s state ] [ -p ] [ -m templatenum ] [ -c reasonnum ] [ -e ] employee_username   
+                                                                                
+=head1 DESCRIPTION
+
+Command-line tool to search for and credit invoices.
+
+-d: Search for invoices starting from this date
+
+-f: Search for invoice finishing on this date
+
+-s: Search for invoices for packages within this state
+
+-p: Print an informational line for each invoice with invnum, custnum, original tax amount, calculate credit, and credit percentage of original.
+
+-m: Send an email to the customer with this message template.
+
+-c: Credit the invoice for one-half of the taxation amount, using this reason.
+
+-k: But, don't credit if the customer already has a credit applied against this invoice
+
+-e: re-Email invoice
+
+-r: dRy run
+
+employee_username
+
+=head1 BUGS
+
+=head1 SEE ALSO
+
+L<FS::part_pkg>
+
+=cut
+
+1;

-----------------------------------------------------------------------

Summary of changes:
 ...ust_bill-credit_ship => cust_bill-credit_ship2} |   49 +++++++++++++++-----
 1 files changed, 37 insertions(+), 12 deletions(-)
 copy bin/{cust_bill-credit_ship => cust_bill-credit_ship2} (83%)




More information about the freeside-commits mailing list