X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Fsearch%2Freport_tax.cgi;h=08b6d079698e9521675788b5016ba0a272a933e6;hp=ac76fad6e7ad50c2add0f8cb6a34a41cda96cb97;hb=8f6a34b553a7ca9b7fc9c9cf5802ce418e3a5296;hpb=8bbd039705bd2345d250788616ce17051a25fdb9 diff --git a/httemplate/search/report_tax.cgi b/httemplate/search/report_tax.cgi index ac76fad6e..08b6d0796 100755 --- a/httemplate/search/report_tax.cgi +++ b/httemplate/search/report_tax.cgi @@ -4,22 +4,136 @@ my $user = getotaker; $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/; -my $beginning = $1; +my $pbeginning = $1; +my $beginning = str2time($1) || 0; $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/; -my $ending = $1; +my $pending = $1; +my $ending = ( str2time($1) || 4294880896 ) + 86399; -print header('Tax Report Results'); +my($total, $exempt, $taxable, $tax) = ( 0, 0, 0, 0 ); +my $out = 'Out of taxable region(s)'; +my %regions; +foreach my $r ( qsearch('cust_main_county', {}) ) { + my $label; + if ( $r->tax == 0 ) { + $label = $out; + } elsif ( $r->taxname ) { + $label = $r->taxname; + } else { + $label = $r->country; + $label = $r->state.", $label" if $r->state; + $label = $r->county." county, $label" if $r->county; + } -open (REPORT, "freeside-tax-report -v -s $beginning -f $ending $user |"); + #match taxclass too? + + my $fromwhere = " + FROM cust_bill_pkg + JOIN cust_bill USING ( invnum ) + JOIN cust_main USING ( custnum ) + WHERE _date >= $beginning AND _date <= $ending + AND county = ? AND state = ? AND country = ? + "; + my $nottax = 'pkgnum != 0'; + + my $a = scalar_sql($r, + "SELECT SUM(setup+recur) $fromwhere AND $nottax" + ); + $total += $a; + $regions{$label}->{'total'} += $a; + + foreach my $e ( grep { $r->get($_.'tax') =~ /^Y/i } qw( setup recur ) ) { + my $x = scalar_sql($r, + "SELECT SUM($e) $fromwhere AND $nottax" + ); + $exempt += $x; + $regions{$label}->{'exempt'} += $x; + } + + foreach my $e ( grep { $r->get($_.'tax') !~ /^Y/i } qw( setup recur ) ) { + my $x = scalar_sql($r, + "SELECT SUM($e) $fromwhere AND $nottax" + ); + $taxable += $x; + $regions{$label}->{'taxable'} += $x; + } + + if ( defined($regions{$label}->{'rate'}) + && $regions{$label}->{'rate'} != $r->tax.'%' ) { + $regions{$label}->{'rate'} = 'variable'; + } else { + $regions{$label}->{'rate'} = $r->tax.'%'; + } + + #match itemdesc if necessary! + my $named_tax = $r->taxname ? 'AND itemdesc = '. dbh->quote($r->taxname) : ''; + my $x = scalar_sql($r, + "SELECT SUM(setup+recur) $fromwhere AND pkgnum = 0 $named_tax", + ); + $tax += $x; + $regions{$label}->{'tax'} += $x; + + $regions{$label}->{'label'} = $label; -print '
';
-while() {
-  print $_;
 }
-print '
'; -print ''; +#ordering +my @regions = map $regions{$_}, + sort { ( $b eq $out cmp $a eq $out ) || ( $a cmp $b ) } + keys %regions; + +push @regions, { + 'label' => 'Total', + 'total' => $total, + 'exempt' => $exempt, + 'taxable' => $taxable, + 'rate' => '', + 'tax' => $tax, +}; + +#-- + +#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) +sub scalar_sql { + my( $r, $sql ) = @_; + my $sth = dbh->prepare($sql) or die dbh->errstr; + $sth->execute( map $r->$_(), qw( county state country ) ) + or die "Unexpected error executing statement $sql: ". $sth->errstr; + $sth->fetchrow_arrayref->[0] || 0; +} %> +<%= header( "Sales Tax Report - $pbeginning through ".($pending||'now'), + menubar( 'Main Menu'=>$p, ) ) %> +<%= table() %> + + + Sales + Rate + Tax + + + Total + Non-taxable + Taxable + + <% foreach my $region ( @regions ) { %> + + <%= $region->{'label'} %> + $<%= $region->{'total'} %> + $<%= $region->{'exempt'} %> + $<%= $region->{'taxable'} %> + <%= $region->{'rate'} %> + $<%= $region->{'tax'} %> + + <% } %> + + + + + + +