+<STYLE type="text/css">
+TD.sectionhead {
+ background-color: #777777;
+ color: #ffffff;
+ font-weight: bold;
+ text-align: left;
+}
+.grid TH { background-color: #cccccc; padding: 0px 3px 2px }
+.row0 TD { background-color: #eeeeee; padding: 0px 3px 2px; text-align: right}
+.row1 TD { background-color: #ffffff; padding: 0px 3px 2px; text-align: right}
+TD.rowhead { font-weight: bold; text-align: left }
+.bigmath { font-size: large; font-weight: bold; font: sans-serif; text-align: center }
+</STYLE>
+<& /elements/table-grid.html &>
+ <TR>
+ <TH ROWSPAN=3></TH>
+ <TH COLSPAN=5>Sales</TH>
+ <TH ROWSPAN=3></TH>
+ <TH ROWSPAN=3>Rate</TH>
+ <TH ROWSPAN=3></TH>
+ <TH ROWSPAN=3>Estimated tax</TH>
+ <TH ROWSPAN=3>Tax invoiced</TH>
+ <TH ROWSPAN=3></TH>
+ <TH ROWSPAN=3>Tax credited</TH>
+ <TH ROWSPAN=3></TH>
+ <TH ROWSPAN=3>Net tax due</TH>
+ </TR>
+
+ <TR>
+ <TH ROWSPAN=2>Total</TH>
+ <TH ROWSPAN=1>Non-taxable</TH>
+ <TH ROWSPAN=1>Non-taxable</TH>
+ <TH ROWSPAN=1>Non-taxable</TH>
+ <TH ROWSPAN=2>Taxable</TH>
+ </TR>
+
+ <TR STYLE="font-size:small">
+ <TH>(tax-exempt customer)</TH>
+ <TH>(tax-exempt package)</TH>
+ <TH>(monthly exemption)</TH>
+ </TR>
+
+% my $row = 0;
+% my $classlink = '';
+% my $descend;
+% $descend = sub {
+% my ($data, $label) = @_;
+% if ( ref $data eq 'ARRAY' ) {
+% # then we've reached the bottom
+% my (%taxnums, %values);
+% foreach (@$data) {
+% $taxnums{ $_->[0] } = $_->[1];
+% $values{ $_->[0] } = $_->[2];
+% }
+% # finally, output
+ <TR CLASS="row<% $row %>">
+% # Row label
+ <TD CLASS="rowhead"><% $label |h %></TD>
+% # Total Sales
+% my $sales = $money_sprintf->(
+% $values{taxable} +
+% $values{exempt_cust} +
+% $values{exempt_pkg} +
+% $values{exempt_monthly}
+% );
+% my %sales_taxnums;
+% foreach my $x (qw(taxable exempt_cust exempt_pkg exempt_monthly)) {
+% foreach (split(',', $taxnums{$x})) {
+% $sales_taxnums{$_} = 1;
+% }
+% }
+% my $sales_taxnums = join(',', keys %sales_taxnums);
+ <TD>
+ <A HREF="<% "$saleslink;$classlink;taxnum=$sales_taxnums" %>">
+ <% $sales %>
+ </A>
+ </TD>
+% # exemptions
+% foreach(qw(cust pkg)) {
+ <TD>
+ <A HREF="<% "$saleslink;$classlink;exempt_$_=Y;taxnum=".$taxnums{"exempt_$_"} %>">
+ <% $money_sprintf->($values{"exempt_$_"}) %>
+ </A>
+ </TD>
+% }
+ <TD>
+ <A HREF="<% "$exemptlink;$classlink;taxnum=".$taxnums{"exempt_monthly"} %>">
+ <% $money_sprintf->($values{"exempt_monthly"}) %>
+ </A>
+ </TD>
+% # taxable
+ <TD>
+ <A HREF="<% "$saleslink;$classlink;taxable=1;taxnum=$taxnums{taxable}" %>">
+ <% $money_sprintf->($values{taxable}) %>
+ </A>
+ </TD>
+% # tax rate
+% my $rate;
+% foreach(split(',', $taxnums{tax})) {
+% $rate ||= $taxrates{$_};
+% if ($rate != $taxrates{$_}) {
+% $rate = 'variable';
+% last;
+% }
+% }
+% $rate = sprintf('%.2f', $rate) . '%' if ($rate and $rate ne 'variable');
+ <TD CLASS="bigmath"> × </TD>
+ <TD><% $rate %></TD>
+% # estimated tax
+ <TD CLASS="bigmath"> = </TD>
+ <TD><% $rate eq 'variable'
+ ? ''
+ : $money_sprintf->( $values{taxable} * $rate / 100 ) %>
+ </TD>
+% # invoiced tax
+ <TD>
+ <A HREF="<% "$taxlink;$classlink;taxnum=$taxnums{taxable}" %>">
+ <% $money_sprintf->( $values{tax} ) %>
+ </A>
+ </TD>
+% # credited tax
+ <TD CLASS="bigmath"> − </TD>
+ <TD>
+ <A HREF="<% "$creditlink;$classlink;taxnum=$taxnums{credited}" %>">
+ <% $money_sprintf->( $values{credited} ) %>
+ </A>
+ </TD>
+% # net tax due
+ <TD CLASS="bigmath"> = </TD>
+ <TD><% $money_sprintf->( $values{tax} - $values{credited} ) %></TD>
+ </TR>
+
+% $row = $row ? 0 : 1;
+%
+% } else { # we're not at the lowest classification
+% my @keys = sort { $a <=> $b or $a cmp $b } keys(%$data);
+% foreach my $key (@keys) {
+% my $sublabel = join(', ', grep $_, $label, $key);
+% &{ $descend }($data->{$key}, $sublabel);
+% }
+% }
+% };
+
+% my @pkgclasses = sort { $a <=> $b } keys %data;
+% foreach my $pkgclass (@pkgclasses) {
+% my $class = FS::pkg_class->by_key($pkgclass) ||
+% FS::pkg_class->new({ classname => 'Unclassified' });
+ <TBODY>
+% if ( $breakdown{pkgclass} ) {
+ <TR>
+ <TD COLSPAN=19 CLASS="sectionhead"><% $class->classname %></TD>
+ </TR>
+% }
+% $row = 0;
+% $classlink = "classnum=".($pkgclass || 0) if $breakdown{pkgclass};
+% &{ $descend }( $data{$pkgclass}, '' );
+% # and now totals
+ </TBODY>
+ <TBODY CLASS="total">
+% &{ $descend }( $total{$pkgclass}, 'Total' );
+ </TBODY>
+% } # foreach $pkgclass
+</TABLE>
+
+<& /elements/footer.html &>
+<%init>
+
+die "access denied"
+ unless $FS::CurrentUser::CurrentUser->access_right('Financial reports');
+
+my $DEBUG = $cgi->param('debug') || 0;
+
+my $conf = new FS::Conf;
+
+my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi);
+
+my ($taxname, $country, %breakdown);
+
+if ( $cgi->param('taxname') =~ /^([\w\s]+)$/ ) {
+ $taxname = $1;
+} else {
+ die "taxname required"; # UI prevents this
+}