X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Fbrowse%2Fpart_pkg.cgi;h=8c51b35f4b152a386411473ecc9743da243e3ca9;hp=1eb55c88ad85258ae11cfdcb0f4d901f71ff26fe;hb=7a33cb6e4c3e33b7399d6574cbd3ee38ddcba5e0;hpb=e5770f1c578ba47f730488df7fb5a03307ac71ab diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi index 1eb55c88a..8c51b35f4 100755 --- a/httemplate/browse/part_pkg.cgi +++ b/httemplate/browse/part_pkg.cgi @@ -27,6 +27,19 @@ 'html_foot' => $html_foot, ) %> +<%def .style> + + + <%init> my $curuser = $FS::CurrentUser::CurrentUser; @@ -45,6 +58,7 @@ die "access denied" my $conf = new FS::Conf; my $taxclasses = $conf->exists('enable_taxclasses'); +my $taxvendor = $conf->config('tax_data_vendor'); my $money_char = $conf->config('money_char') || '$'; my $select = '*'; @@ -76,12 +90,24 @@ if ( $cgi->param('classnum') =~ /^(\d+)$/ ) { } $cgi->delete('classnum'); +if ( $cgi->param('pkgpartbatch') =~ /^([\w\/\-\:\. ]+)$/ ) { + push @where, "pkgpartbatch = '$1' "; +} + if ( $cgi->param('missing_recur_fee') ) { - push @where, "0 = ( SELECT COUNT(*) FROM part_pkg_option - WHERE optionname = 'recur_fee' - AND part_pkg_option.pkgpart = part_pkg.pkgpart - AND CAST( optionvalue AS NUMERIC ) > 0 - )"; + push @where, "NOT EXISTS ( SELECT 1 FROM part_pkg_option + WHERE optionname = 'recur_fee' + AND part_pkg_option.pkgpart = part_pkg.pkgpart + AND CAST( optionvalue AS NUMERIC ) > 0 + )"; +} + +if ( $cgi->param('ratenum') =~ /^(\d+)$/ ) { + push @where, "EXISTS( SELECT 1 FROM part_pkg_option + WHERE optionname LIKE '%ratenum' + AND optionvalue = '$1' + AND part_pkg_option.pkgpart = part_pkg.pkgpart + )"; } if ( $cgi->param('family') =~ /^(\d+)$/ ) { @@ -168,6 +194,7 @@ my $html_init = qq!

!; +$html_init .= include('.style'); $cgi->param('dummy', 1); @@ -243,6 +270,7 @@ push @fields, sub { $part_pkg->part_pkg_discount; [ + # Line 0: Family package link (if applicable) ( !$family_pkgpart && $part_pkg->pkgpart == $part_pkg->family_pkgpart ? () : [ { @@ -253,13 +281,13 @@ push @fields, sub { 'link' => $p.'browse/part_pkg.cgi?family='.$part_pkg->family_pkgpart, } ] ), - [ + [ # Line 1: Plan type (Anniversary, Prorate, Call Rating, etc.) { data =>$plan, align=>'center', colspan=>2, }, ], - [ + [ # Line 2: Setup fee { data =>$money_char. sprintf('%.2f ', $part_pkg->option('setup_fee') ), align=>'right' @@ -274,7 +302,7 @@ push @fields, sub { align=>'left', }, ], - [ + [ # Line 3: Recurring fee { data=>( $is_recur ? $money_char. sprintf('%.2f', $part_pkg->option('recur_fee')) @@ -284,20 +312,56 @@ push @fields, sub { colspan=> ( $is_recur ? 1 : 2 ), }, ( $is_recur - ? { data => ( $is_recur - ? '   '. $part_pkg->freq_pretty. - ( $part_pkg->option('recur_fee') == 0 - && $part_pkg->recur_show_zero - ? ' (printed on invoices)' - : '' - ) - : '' ), + ? { data => '   '. $part_pkg->freq_pretty. + ( $part_pkg->option('recur_fee') == 0 + && $part_pkg->recur_show_zero + ? ' (printed on invoices)' + : '' + ), align=>'left', } : () ), ], - ( + [ { data => ' ' }, ], # Line 4: empty + ( $part_pkg->adjourn_months ? + [ # Line 5: Adjourn months + { data => mt('After [quant,_1,month], suspend the package.', + $part_pkg->adjourn_months), + align => 'left', + size => -1, + colspan => 2, + } + ] : () + ), + ( $part_pkg->contract_end_months ? + [ # Line 6: Contract end months + { data => mt('After [quant,_1,month], contract ends.', + $part_pkg->contract_end_months), + align => 'left', + size => -1, + colspan => 2, + } + ] : () + ), + ( $part_pkg->expire_months ? + [ # Line 7: Expire months and automatic transfer + { data => $part_pkg->change_to_pkgpart ? + mt('After [quant,_1,month], change to ', + $part_pkg->expire_months) . + qq() . $part_pkg->change_to_pkg->pkg . qq() . '.' + : mt('After [quant,_1,month], cancel the package.', + $part_pkg->expire_months) + , + align => 'left', + size => -1, + colspan => 2, + } + ] : () + ), + ( # Usage prices map { my $amount = $_->amount / ($_->target_info->{multiplier} || 1); my $label = $_->target_info->{label}; [ @@ -311,7 +375,8 @@ push @fields, sub { } $part_pkg->part_pkg_usageprice ), - ( map { my $dst_pkg = $_->dst_pkg; + ( # Supplementals + map { my $dst_pkg = $_->dst_pkg; [ { data => 'Supplemental:  '. '' . @@ -323,7 +388,8 @@ push @fields, sub { } $part_pkg->supp_part_pkg_link ), - ( map { + ( # Billing add-ons/bundle packages + map { my $dst_pkg = $_->dst_pkg; [ { data => 'Add-on: '.$dst_pkg->pkg_comment, @@ -334,7 +400,8 @@ push @fields, sub { } $part_pkg->bill_part_pkg_link ), - ( scalar(@discounts) + ( # Discounts available + scalar(@discounts) ? [ { data => 'Discounts', align=>'center', #? @@ -356,7 +423,7 @@ push @fields, sub { @discounts : () ), - ]; + ]; # end of "middle column" # $plan_labels{$part_pkg->plan}.'
'. # $money_char.sprintf('%.2f setup
', $part_pkg->option('setup_fee') ). @@ -419,7 +486,8 @@ push @fields, sub { #agent type if ( $acl_edit_global ) { #really we just want a count, but this is fine unless someone has tons - my @all_agent_types = map {$_->typenum} qsearch('agent_type',{}); + my @all_agent_types = map {$_->typenum} + qsearch('agent_type', { 'disabled'=>'' }); if ( scalar(@all_agent_types) > 1 ) { push @header, 'Agent types'; my $typelink = $p. 'edit/agent_type.cgi?'; @@ -446,15 +514,7 @@ if ( $acl_edit_global ) { #if ( $cgi->param('active') ) { push @header, 'Customer
packages'; - my %col = ( - 'on hold' => '7E0079', #purple! - 'not yet billed' => '009999', #teal? cyan? - 'active' => '00CC00', - 'suspended' => 'FF9900', - 'cancelled' => 'FF0000', - #'one-time charge' => '000000', - 'charge' => '000000', - ); + my %col = %{ FS::cust_pkg->statuscolors }; my $cust_pkg_link = $p. 'search/cust_pkg.cgi?pkgpart='; push @fields, sub { my $part_pkg = shift; [ @@ -517,6 +577,49 @@ if ( $taxclasses ) { push @header, 'Taxclass'; push @fields, sub { shift->taxclass() || ' '; }; $align .= 'l'; +} elsif ( $taxvendor ) { + push @header, 'Tax product'; + my @classnums = ( 'setup', 'recur' ); + my @classnames = ( 'Setup', 'Recur' ); + foreach ( qsearch('usage_class', { disabled => '' }) ) { + push @classnums, $_->classnum; + push @classnames, $_->classname; + } + my $taxproduct_sub = sub { + my $ppt = shift; + '' . encode_entities($ppt->taxproduct) . '' + }; + my $taxproduct_list_sub = sub { + my $part_pkg = shift; + my $base_ppt = $part_pkg->taxproduct; + my $out = []; + if ( $base_ppt ) { + push @$out, [ + { 'data' => '', 'align' => 'left' }, + { 'data' => &$taxproduct_sub($base_ppt), 'align' => 'right' }, + ]; + } + if ( my $units_ppt = $part_pkg->units_taxproduct ) { + push @$out, [ + { 'data' => emt('Lines'), 'align' => 'left' }, + { 'data' => &$taxproduct_sub($units_ppt), 'align' => 'right' }, + ]; + } + for (my $i = 0; $i < scalar @classnums; $i++) { + my $num = $part_pkg->option('usage_taxproductnum_' . $classnums[$i]); + next if !$num; + my $ppt = FS::part_pkg_taxproduct->by_key($num); + push @$out, [ + { 'data' => $classnames[$i], 'align' => 'left', }, + { 'data' => &$taxproduct_sub($ppt), 'align' => 'right' }, + ]; + } + $out; + }; + push @fields, $taxproduct_list_sub; + $align .= 'l'; } # make a table of report class optionnames => the actual @@ -554,9 +657,12 @@ push @fields, }, ]; } + sort grep { $options{$_} =~ /\S/ } grep { $_ !~ /^(setup|recur)_fee$/ - and $_ !~ /^report_option_\d+$/ } + and $_ !~ /^report_option_\d+$/ + and $_ !~ /^usage_taxproductnum_/ + } keys %options ); if ( @report_options ) {