<& search.html, %opt &> <%doc> <& elements/commission.html, name_singular => 'sales person', # or 'agent', 'employee', etc. header => [ 'Sales person' ], # 'One-Time Sales', 'Recurring Sales', # 'Commission' will be appended fields => [ 'salesperson' ], # ditto links => [ [ '/view/sales.html?', 'salesnum' ] ], # usual conventions sales_detail_link => [ 'sales_commission_pkg.html?', 'salesnum' ], credit_detail_link => [ 'cust_credit.html?commission_salesnum=', 'salesnum' ], align => 'l', query => { table => 'sales', # must be a Commission_Mixin #other params as appropriate }, count_query => 'SELECT COUNT(*) FROM sales ...', # all other elements/search.html stuff will be passed through &> The hash passed as 'query' will be passed through to the cust_bill_pkg_search and cust_credit_search methods, and so can contain type-specific options. <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Financial reports'); my %opt = @_; my $conf = new FS::Conf; my $money_char = $conf->config('money_char') || '$'; my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi, ''); my $date_format = $conf->config('date_format') || '%m/%d/%Y'; my $query = $opt{'query'}; my $paid = $cgi->param('paid') ? 1 : 0; if ($beginning) { $opt{'title'} .= ': ' . time2str($date_format, $beginning) . ' to ' . time2str($date_format, $ending); } if ($paid) { $opt{'title'} .= ' - paid sales only'; } my $sales_sub_maker = sub { my $field = shift; sub { my $object = shift; my $search = $object->cust_bill_pkg_search( $beginning, $ending, 'paid' => $paid, %$query, ); $search->{select} = "SUM(cust_bill_pkg.$field) AS total_amount"; my $result = qsearchs($search); my $total = $result->get('total_amount') || 0; return $money_char. sprintf('%.2f', $total); }; }; my $commission_sub = sub { my $object = shift; my $search = $object->cust_credit_search( $beginning, $ending, %$query ); $search->{select} = 'SUM(cust_credit.amount) AS total_amount'; my $result = qsearchs($search); my $total = $result->get('total_amount') || 0; return $money_char. sprintf('%.2f', $total); }; my $sales_link = $opt{'sales_detail_link'}; if ($sales_link) { my ($pre, $post) = split('\?', $sales_link->[0], 2); $sales_link->[0] = $pre . "?begin=$beginning;end=$ending;" . $post; } my $commission_link = $opt{'credit_detail_link'}; if ($commission_link) { my ($pre, $post) = split('\?', $commission_link->[0], 2); $commission_link->[0] = $pre . "?begin=$beginning;end=$ending;" . $post; } # merge our new stuff into %opt my $header = $opt{'header'}; push @$header, 'One-time sales', 'Recurring sales', 'Commission' ; my $fields = $opt{'fields'}; push @$fields, $sales_sub_maker->('setup'), $sales_sub_maker->('recur'), $commission_sub ; push @{$opt{'links'}}, $sales_link, $sales_link, $commission_link; $opt{'align'} .= 'rrr';