<& elements/search.html, 'title' => 'Discounts', 'name' => 'discounts', 'query' => $query, 'count_query' => $count_query, 'count_addl' => [ $money_char. '%.2f total', ], 'header' => [ #'#', 'Discount', 'Class', 'Amount', 'Months', 'Package', 'Invoice', 'Date', FS::UI::Web::cust_header(), ], 'fields' => [ #'billpkgdiscountnum', sub { $_[0]->cust_pkg_discount->discount->description }, sub { $_[0]->cust_pkg_discount->discount->classname }, sub { sprintf($money_char.'%.2f', shift->amount ) }, $months_sub, 'pkg',#sub { $_[0]->cust_bill_pkg->cust_pkg->part_pkg->pkg }, 'invnum', sub { time2str('%b %d %Y', shift->_date ) }, \&FS::UI::Web::cust_fields, ], 'sort_fields' => [ '', '', 'amount', 'months', 'pkg', 'invnum', '_date', ], 'links' => [ #'', '', #link to customer discount??? '', '', '', '', $ilink, $ilink, ( map { $_ ne 'Cust. Status' ? $clink : '' } FS::UI::Web::cust_header() ), ], #'align' => 'rlrrrc'.FS::UI::Web::cust_aligns(), 'align' => 'lcrrlrr'.FS::UI::Web::cust_aligns(), 'color' => [ #'', '', '', '', '', '', '', '', FS::UI::Web::cust_colors(), ], 'style' => [ #'', '', '', '', '', '', '', '', FS::UI::Web::cust_styles(), ], &> <%init> #a little false laziness below w/cust_bill_pkg.cgi die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Financial reports'); my $conf = new FS::Conf; #here is the agent virtualization my $agentnums_sql = $FS::CurrentUser::CurrentUser->agentnums_sql( 'table' => 'cust_main' ); my @where = ( $agentnums_sql ); my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); push @where, "_date >= $beginning", "_date <= $ending"; if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) { push @where, "cust_main.agentnum = $1"; } #usernum if ( $cgi->param('usernum') =~ /^(\d+)$/ ) { push @where, "cust_pkg_discount.usernum = $1"; } # (discount) classnum my $join_discount = ''; #false laziness w/cust_pkg_discount.html and cust_pkg.pm::search if ( grep { $_ eq 'discount_classnum' } $cgi->param ) { # my @classnum = (); # if ( ref($params->{'discount_classnum'}) ) { # # if ( ref($params->{'discount_classnum'}) eq 'HASH' ) { # @classnum = grep $params->{'discount_classnum'}{$_}, keys %{ $params->{'discount_classnum'} }; # } elsif ( ref($params->{'discount_classnum'}) eq 'ARRAY' ) { # @classnum = @{ $params->{'discount_classnum'} }; # } else { # die 'unhandled discount_classnum ref '. $params->{'discount_classnum'}; # } # # # } elsif ( $params->{'discount_classnum'} =~ /^(\d*)$/ && $1 ne '0' ) { # @classnum = ( $1 ); # } # # if ( @classnum ) { if ( $cgi->param('discount_classnum') =~ /^(\d*)$/ && $1 ne '0' ) { my @classnum = ( $1 ); $join_discount = 'LEFT JOIN discount USING (discountnum)'; my @c_where = (); my @nums = grep $_, @classnum; push @c_where, 'discount.classnum IN ('. join(',',@nums). ')' if @nums; my $null = scalar( grep { $_ eq '' } @classnum ); push @c_where, 'discount.classnum IS NULL' if $null; if ( scalar(@c_where) == 1 ) { push @where, @c_where; } elsif ( @c_where ) { push @where, ' ( '. join(' OR ', @c_where). ' ) '; } } } # #(package) classnum # # not specified: all classes # # 0: empty class # # N: classnum # my $use_override = $cgi->param('use_override'); # if ( $cgi->param('classnum') =~ /^(\d+)$/ ) { # my $comparison = ''; # if ( $1 == 0 ) { # $comparison = "IS NULL"; # } else { # $comparison = "= $1"; # } # # if ( $use_override ) { # push @where, "( # part_pkg.classnum $comparison AND pkgpart_override IS NULL OR # override.classnum $comparison AND pkgpart_override IS NOT NULL # )"; # } else { # push @where, "part_pkg.classnum $comparison"; # } # } my $count_query = "SELECT COUNT(*), SUM(cust_bill_pkg_discount.amount)"; my $join_cust_pkg_discount = 'LEFT JOIN cust_pkg_discount USING (pkgdiscountnum)'; my $join_cust = ' JOIN cust_bill USING ( invnum ) '. FS::UI::Web::join_cust_main('cust_bill', 'cust_pkg'); my $join_pkg = ' JOIN cust_bill_pkg USING ( billpkgnum ) LEFT JOIN cust_pkg ON ( cust_bill_pkg.pkgnum = cust_pkg.pkgnum ) LEFT JOIN part_pkg USING ( pkgpart ) '; #LEFT JOIN part_pkg AS override # ON pkgpart_override = override.pkgpart '; my $join = "$join_cust_pkg_discount $join_discount $join_pkg $join_cust"; my $where = ' WHERE '. join(' AND ', @where); $count_query .= " FROM cust_bill_pkg_discount $join $where"; my @select = ( 'cust_bill_pkg_discount.*', #'cust_bill_pkg.*', 'cust_bill.invnum', 'cust_bill._date', ); push @select, 'part_pkg.pkg'; push @select, 'cust_main.custnum', FS::UI::Web::cust_sql_fields(); my $query = { 'table' => 'cust_bill_pkg_discount', 'addl_from' => $join, 'hashref' => {}, 'select' => join(', ', @select ), 'extra_sql' => $where, 'order_by' => 'ORDER BY _date, billpkgdiscountnum', }; my $ilink = [ "${p}view/cust_bill.cgi?", 'invnum' ]; my $clink = [ "${p}view/cust_main.cgi?", 'custnum' ]; my $conf = new FS::Conf; my $money_char = $conf->config('money_char') || '$'; my $months_sub = sub { my $cust_bill_pkg_discount = shift; return 'Setup' if $cust_bill_pkg_discount->cust_pkg_discount->setuprecur eq 'setup'; sprintf('%.2f', $cust_bill_pkg_discount->months); };