%# still not a good way to do rows grouped by some field in a search.html %# report % if ( $type eq 'xls' ) { <% $data %>\ % } else { <& /elements/header.html, $title &>

Download full results
as Excel spreadsheet


<& /elements/table-grid.html &> Package Sales Percentage Commission % my ($custnum, $sales, $commission, $row, $bgcolor) = (0, 0, 0, 0); % foreach my $cust_pkg ( @cust_pkg ) { % if ( $custnum ne $cust_pkg->custnum ) { % # start of a new customer section % my $cust_main = $cust_pkg->cust_main; % $bgcolor = 0; <% $cust_main->display_custnum %>: <% $cust_main->name |h %> % } <% $cust_pkg->pkg_label %> <% sprintf('%.2f', $cust_pkg->sum_charged) %> <% $cust_pkg->percent %>% <% sprintf('%.2f', $cust_pkg->sum_charged * $cust_pkg->percent / 100) %> % $sales += $cust_pkg->sum_charged; % $commission += $cust_pkg->sum_charged * $cust_pkg->percent / 100; % $row++; % $bgcolor = 1-$bgcolor; % $custnum = $cust_pkg->custnum; % } <% emt('[quant,_1,package] with commission', $row) %> <% sprintf('%.2f', $sales) %> <% sprintf('%.2f', $commission) %> <& /elements/footer.html &> % } <%init> #pretty bad false laziness w/agent_commission.html, lots of s/agent/sales/ :/ # everything above is completely untouched die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Financial reports'); my ($begin, $end) = FS::UI::Web::parse_beginning_ending($cgi); $cgi->param('salesnum') =~ /^(\d+)$/ or die "No sales person selected"; #better error handling of this case (or, better javascript that doesn't let you submit) my $salesnum = $1; my $sales = FS::sales->by_key($salesnum); my $title = $sales->salesperson . ' commissions'; my $sum_charged = '(SELECT SUM(setup + recur) FROM cust_bill_pkg JOIN cust_bill USING (invnum)'. 'WHERE cust_bill_pkg.pkgnum = cust_pkg.pkgnum AND '. "cust_bill._date >= $begin AND cust_bill._date < $end)"; my @select = ( 'cust_pkg.*', 'sales_pkg_class.commission_percent AS percent', "$sum_charged AS sum_charged", ); my $query = { 'table' => 'cust_pkg', 'select' => join(',', @select), 'addl_from' => ' JOIN cust_main USING (custnum) JOIN part_pkg USING (pkgpart) JOIN sales_pkg_class ON ( COALESCE(cust_pkg.salesnum,cust_main.salesnum) = sales_pkg_class.salesnum AND ( sales_pkg_class.classnum = part_pkg.classnum OR (sales_pkg_class IS NULL AND part_pkg.classnum IS NULL) ) ) ', 'extra_sql' => " WHERE COALESCE(cust_pkg.salesnum,cust_main.salesnum) = $salesnum AND sales_pkg_class.commission_percent > 0 AND $sum_charged > 0 ", 'order_by' => 'ORDER BY cust_pkg.custnum ASC', }; my @cust_pkg = qsearch($query); my $money_char = FS::Conf->new->config('money_char') || '$'; my $data = ''; my $type = $cgi->param('_type'); if ( $type eq 'xls') { # some false laziness with the above... my $format = $FS::CurrentUser::CurrentUser->spreadsheet_format; my $filename = 'sales_commission_pkg' . $format->{extension}; http_header('Content-Type' => $format->{mime_type}); http_header('Content-Disposition' => qq!attachment;filename="$filename"!); my $XLS = IO::Scalar->new(\$data); my $workbook = $format->{class}->new($XLS); my $worksheet = $workbook->add_worksheet(substr($title, 0, 31)); my $cust_head_format = $workbook->add_format( bold => 1, underline => 1, text_wrap => 0, bg_color => 'white', ); my $col_head_format = $workbook->add_format( bold => 1, align => 'center', bg_color => 'silver' ); my @format; foreach (0, 1) { my %bg = (bg_color => $_ ? 'white' : 'silver'); $format[$_] = { 'text' => $workbook->add_format(%bg), 'money' => $workbook->add_format(%bg, num_format => $money_char.'#0.00'), 'percent' => $workbook->add_format(%bg, num_format => '0.00%'), }; } my $total_format = $workbook->add_format( bg_color => 'yellow', num_format => $money_char.'#0.00', top => 1 ); my ($r, $c) = (0, 0); foreach (qw(Package Sales Percentage Commission)) { $worksheet->write($r, $c++, $_, $col_head_format); } $r++; my ($custnum, $sales, $commission, $row, $bgcolor) = (0, 0, 0, 0); my $label_length = 0; foreach my $cust_pkg ( @cust_pkg ) { if ( $custnum ne $cust_pkg->custnum ) { # start of a new customer section my $cust_main = $cust_pkg->cust_main; my $label = $cust_main->custnum . ': '. $cust_main->name; $bgcolor = 0; $worksheet->set_row($r, 20); $worksheet->merge_range($r, 0, $r, 3, $label, $cust_head_format); $r++; } $c = 0; my $percent = $cust_pkg->percent / 100; $worksheet->write($r, $c++, $cust_pkg->pkg_label, $format[$bgcolor]{text}); $worksheet->write($r, $c++, $cust_pkg->sum_charged, $format[$bgcolor]{money}); $worksheet->write($r, $c++, $percent, $format[$bgcolor]{percent}); $worksheet->write($r, $c++, ($cust_pkg->sum_charged * $percent), $format[$bgcolor]{money}); $label_length = max($label_length, length($cust_pkg->pkg_label)); $sales += $cust_pkg->sum_charged; $commission += $cust_pkg->sum_charged * $cust_pkg->percent / 100; $row++; $bgcolor = 1-$bgcolor; $custnum = $cust_pkg->custnum; $r++; } $c = 0; $label_length = max($label_length, 20); $worksheet->set_column($c, $c, $label_length); $worksheet->write($r, $c++, mt('[quant,_1,package] with commission', $row), $total_format); $worksheet->set_column($c, $c + 2, 11); $worksheet->write($r, $c++, $sales, $total_format); $worksheet->write($r, $c++, '', $total_format); $worksheet->write($r, $c++, $commission, $total_format); $workbook->close; }