X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fbrowse%2Fpart_pkg.cgi;h=f25c00ef29a9b5b0919b157fe2b23981e8d1c30f;hb=ccc850e9ace238da093cd13dc3fd833629fcf47a;hp=87aa79255816992aa7f8181e09d707fba2e46633;hpb=e68a2a20972de41485c438c46d197b5abeee3267;p=freeside.git
diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi
index 87aa79255..f25c00ef2 100755
--- a/httemplate/browse/part_pkg.cgi
+++ b/httemplate/browse/part_pkg.cgi
@@ -27,6 +27,19 @@
'html_foot' => $html_foot,
)
%>
+<%def .style>
+
+
+%def>
<%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,6 +90,10 @@ 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, "NOT EXISTS ( SELECT 1 FROM part_pkg_option
WHERE optionname = 'recur_fee'
@@ -84,6 +102,14 @@ if ( $cgi->param('missing_recur_fee') ) {
)";
}
+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+)$/ ) {
$family_pkgpart = $1;
push @where, "family_pkgpart = $1";
@@ -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') ).
@@ -447,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;
[
@@ -503,7 +562,7 @@ if ( $acl_edit_global ) {
'action' => "${p}edit/bulk-cust_pkg.html?".
'pkgpart='.$part_pkg->pkgpart,
'actionlabel' => 'Change Packages',
- 'width' => 569,
+ 'width' => 960,
'height' => 210,
).' ]',
'align' => 'left',
@@ -518,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
@@ -555,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 ) {
@@ -691,8 +796,22 @@ if ( $acl_edit_bulk ) {
$align .= 'c';
$html_form = qq!';
+ actions => [
+ { submit => 'edit report classes', },
+ { label => 'change customer packages',
+ onclick=> include('/elements/popup_link_onclick.html',
+ 'label' => 'change',
+ 'js_action' => qq{
+ '${p}edit/bulk-cust_pkg.html?' + \$('input[name=pkgpart]').serialize()
+ },
+ 'actionlabel' => 'Change customer packages',
+ 'width' => 960,
+ 'height' => 420,
+ )
+ },
+ ],
+ ).
+ '';
}
my @menubar;