+ #let us open the temp file early
+ my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc;
+ my $report = new File::Temp( TEMPLATE => 'report.tax.liability.XXXXXXXX',
+ DIR => $dir,
+ UNLINK => 0, # not so temp
+ ) or die "can't open report file: $!\n";
+
+ my $conf = new FS::Conf;
+ my $money_char = $conf->config('money_char') || '$';
+
+ my $join_cust = "
+ JOIN cust_bill USING ( invnum )
+ LEFT JOIN cust_main USING ( custnum )
+ ";
+
+ my $join_loc =
+ "LEFT JOIN cust_bill_pkg_tax_rate_location USING ( billpkgnum )";
+ my $join_tax_loc = "LEFT JOIN tax_rate_location USING ( taxratelocationnum )";
+
+ my $addl_from = " $join_cust $join_loc $join_tax_loc ";
+
+ my $where = "WHERE _date >= $args{beginning} AND _date <= $args{ending} ";
+
+ my $agentname = '';
+ if ( $args{agentnum} =~ /^(\d+)$/ ) {
+ my $agent = qsearchs('agent', { 'agentnum' => $1 } );
+ die "agent not found" unless $agent;
+ $agentname = $agent->agent;
+ $where .= ' AND cust_main.agentnum = '. $agent->agentnum;
+ }
+
+ #my @taxparam = ( 'itemdesc', 'tax_rate_location.state', 'tax_rate_location.county', 'tax_rate_location.city', 'cust_bill_pkg_tax_rate_location.locationtaxid' );
+ my @taxparams = qw( city county state locationtaxid );
+ my @params = ('itemdesc', @taxparams);
+
+ my $select = 'DISTINCT itemdesc,locationtaxid,tax_rate_location.state,tax_rate_location.county,tax_rate_location.city';
+
+ #false laziness w/FS::Report::Table::Monthly (sub should probably be moved up
+ #to FS::Report or FS::Record or who the fuck knows where)
+ my $scalar_sql = sub {
+ my( $r, $param, $sql ) = @_;
+ my $sth = dbh->prepare($sql) or die dbh->errstr;
+ $sth->execute( map $r->$_(), @$param )
+ or die "Unexpected error executing statement $sql: ". $sth->errstr;
+ $sth->fetchrow_arrayref->[0] || 0;
+ };
+
+ my $tax = 0;
+ my $credit = 0;
+ my %taxes = ();
+ my %basetaxes = ();
+ my $calculated = 0;
+
+ # get all distinct tuples of (tax name, state, county, city, locationtaxid)
+ # for taxes that have been charged
+ # (state, county, city are from tax_rate_location, not from customer data)
+ my @tax_and_location = qsearch({ table => 'cust_bill_pkg',
+ select => $select,
+ hashref => { pkgpart => 0 },
+ addl_from => $addl_from,
+ extra_sql => $where,
+ debug => 1,
+ });
+ $count = scalar(@tax_and_location);
+ foreach my $t ( @tax_and_location ) {
+
+ if ( $args{job} ) {
+ if ( time - $min_sec > $last ) {
+ $args{job}->update_statustext( int( 100 * $calculated / $count ).
+ ",Calculating"
+ );
+ $last = time;