% if ( $row ) { %# pretty minimal report <& /elements/header.html, 'E911 Fee Report' &> <& /elements/table-grid.html &> <% $legend %> E911 access lines: <% $row->{quantity} || 0 %> Total fees charged: <% $money_char.sprintf('%.2f', $row->{charged_amount}) %> Fee payments collected: <% $money_char.sprintf('%.2f', $row->{paid_amount}) %> Administrative fee (1%): <% $money_char.sprintf('%.2f', $row->{paid_amount} * $admin_fee) %> Amount due: <% $money_char.sprintf('%.2f', $row->{paid_amount} * (1-$admin_fee) ) %> <& /elements/footer.html &> % } else { # no data % $cgi->param('error' => 'No paid E911 fees found.'); <& /elements/errorpage.html &> % } <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Financial reports'); my $money_char = FS::Conf->new->config('money_char') || '$'; my($begin, $end) = FS::UI::Web::parse_beginning_ending($cgi); $cgi->param('e911pkgpart') =~ /^(\d+)$/; my $pkgpart = $1 or die 'bad e911pkgpart'; $cgi->param('agentnum') =~ /^(\d*)$/; my $agentnum = $1; # This has the potential to become as nightmarish as the old tax report. # If we end up doing multiple rows for some reason (date intervals, # package classes, etc.), do NOT simply loop through this and do a # bazillion scalar_sql queries. Use a properly grouped aggregate query. my $select = 'SELECT cust_bill_pkg.billpkgnum, cust_bill_pkg.quantity, '. 'cust_bill_pkg.setup, SUM(cust_bill_pay_pkg.amount) AS paid_amount'; my $from = 'FROM cust_pkg JOIN cust_bill_pkg USING (pkgnum) JOIN cust_bill USING (invnum) LEFT JOIN cust_bill_pay_pkg USING (billpkgnum) LEFT JOIN cust_bill_pay USING (billpaynum) '; # going by payment application date here, which should be # max(invoice date, payment date) my $where = "WHERE cust_pkg.pkgpart = $pkgpart AND ( (cust_bill_pay._date >= $begin AND cust_bill_pay._date < $end) OR cust_bill_pay.paynum IS NULL )"; if ( $agentnum ) { $from .= ' JOIN cust_main ON (cust_pkg.custnum = cust_main.custnum)'; $where .= "\n AND cust_main.agentnum = $agentnum"; } my $subquery = "$select $from $where GROUP BY cust_bill_pkg.billpkgnum, cust_bill_pkg.quantity"; # This has one row for each E911 line item that has any payments applied. # Fields are the billpkgnum of the item (currently unused), the number of # E911 charges, and the total amount paid (always > 0). # now sum those rows. my $sql = "SELECT SUM(quantity) AS quantity, SUM(setup) AS charged_amount, SUM(paid_amount) AS paid_amount FROM ($subquery) AS paid_fees"; # no grouping my $sth = dbh->prepare($sql); $sth->execute; my $row = $sth->fetchrow_hashref; my $admin_fee = 0.01; # 1% admin fee, allowed in Texas $end = '' if $end == 4294967295; my $legend = ''; if ( $agentnum ) { $legend = FS::agent->by_key($agentnum)->agent . ', '; } if ( $begin and $end ) { $legend .= time2str('%h %o %Y', $begin) . '—' . time2str('%h %o %Y', $end); } elsif ( $begin ) { $legend .= time2str('after %h %o %Y', $begin); } elsif ( $end ) { $legend .= time2str('before %h %o %Y', $end); } else { $legend .= 'any time'; } $legend = ucfirst($legend);