> % my $editi = $curuser->access_right('Edit customer package invoice details'); % my $editc = $curuser->access_right('Edit customer package comments'); % my @cust_pkg_detail = $cust_pkg->cust_pkg_detail; % my @invoice_detail = grep { $_->detailtype eq 'I' } @cust_pkg_detail; % my @comments = grep { $_->detailtype eq 'C' } @cust_pkg_detail; % % if ( scalar(@invoice_detail) || scalar(@comments) || $editi || $editc ) { % % my $editlink = $p. 'edit/cust_pkg_detail.html?pkgnum='. $cust_pkg->pkgnum. % ';detailtype='; % if ( @invoice_detail ) { % foreach my $cust_pkg_detail ( @invoice_detail ) { % }
<% $opt{before_pkg_callback} ? &{ $opt{before_pkg_callback} }( $cust_pkg ) : '' %> <% $opt{show_pkgnum} ? $cust_pkg->pkgnum.': ' : '' %><% $part_pkg->pkg |h %> % % my $custom_comment; % if ( 0 && FS::part_pkg::flat->can('price_info') eq $part_pkg->can('price_info') ) { % #perf hack / disabled in 4.x (feature pricing / cust_pkg_usageprice incompatible, well, harder) % % $part_pkg->{"_$_"} = $part_pkg->option($_) || 0 % foreach grep !defined($part_pkg->{"_$_"} ), qw(setup_fee recur_fee); % % my $str = ''; % $str = $opt{money_char} . $part_pkg->{_setup_fee}. % ($part_pkg->{_recur_fee} ? ' setup' : ' one-time') % if $part_pkg->{_setup_fee}; % $str .= ', ' if $part_pkg->{_setup_fee} && $part_pkg->{_recur_fee}; % $str .= $opt{money_char}. $part_pkg->{_recur_fee}. % '/'. $part_pkg->freq_pretty % if $part_pkg->{_recur_fee}; % $str; % % $custom_comment = % ( $part_pkg->custom ? '(CUSTOM) ' : '' ). % $part_pkg->comment. % ( ($part_pkg->custom || $part_pkg->comment) ? ' - ' : '' ). % ($str || 'No charge'); % % } else { % $custom_comment = $part_pkg->custom_comment('cust_pkg'=>$cust_pkg); % } <% $custom_comment ? ' - ' : '' %> <% $custom_comment |h %>
% if ( $part_pkg->freq eq '0' and !$opt{no_links} ) { % # One-time charge. Nothing you can do with this, unless: % if ( $curuser->access_right('Modify one-time charge') ) { ( <%onetime_change_link($cust_pkg)%> ) % } % # also, you can discount it % if ( $curuser->access_right('Discount customer package') % && ! scalar($cust_pkg->cust_pkg_discount_active) % && ! scalar($cust_pkg->part_pkg->part_pkg_discount) % ) { ( <%pkg_discount_link($cust_pkg)%> ) % }
% % } elsif ( !$cust_pkg->get('cancel') and !$opt{no_links} ) { % % if ( $change_from ) { % # This is the target package for a future change. % # Nothing you can do with it besides modify/cancel the % # future change, and that's on the current package. % } elsif ( $supplemental ) { % # Supplemental packages can't be changed independently. % # Show only "Add comments" and "Add invoice details". % } else { % # the usual case: links to change package definition, % # discount, and customization % my $br = 0; % if ( $curuser->access_right('Change customer package') ) { % $br=1; ( <%pkg_change_link($cust_pkg)%> ) % } % % if ( $curuser->access_right('Discount customer package') % && $part_pkg->can_discount % && ! scalar( @{ $cust_pkg->{_cust_pkg_discount_active} } ) % && ( ! $opt{'term_discounts'} % || ! scalar($cust_pkg->part_pkg->part_pkg_discount) % ) % ) % { % $br=1; ( <%pkg_discount_link($cust_pkg)%> ) % } % % if ( $curuser->access_right('Customize customer package') ) { % $br=1; ( <%pkg_customize_link($cust_pkg,$part_pkg)%> ) % } % <% $br ? '
' : '' %> % } % if ( ( $curuser->access_right('Billing event reports') % || $curuser->access_right('View customer billing events') % ) % && $cust_pkg->exists_cust_event % ) { ( <%pkg_event_link($cust_pkg)%> ) % } % } #!$supplemental
% my $change_quan_label = 'Change quantity'; % if ( $cust_pkg->quantity > 1 ) { % $change_quan_label = 'change';       <% mt('Quantity:') |h %> <% $cust_pkg->quantity %> % } % if ( $curuser->access_right('Change customer package') % && ! $cust_pkg->get('cancel') % && ! $supplemental % && $part_pkg->freq ne '0' % && ! $opt{no_links} % && $opt{'invoice-unitprice'} % ) % { ( <% pkg_change_quantity_link($cust_pkg, $change_quan_label) %> ) % }
% my $change_sales_label = 'Change sales person'; % if ( $cust_pkg->salesnum ) { % $change_sales_label = 'change';       <% mt('Sales Person:') |h %> <% $cust_pkg->salesperson |h %> % } % if ( $curuser->access_right('Change customer package') % && ! $cust_pkg->get('cancel') % && ! $supplemental % #&& $part_pkg->freq ne '0' % && ! $opt{no_links} % ) % { ( <% pkg_change_salesnum_link($cust_pkg, $change_sales_label) %> ) % }
<& /elements/table-grid.html &>
<% mt('Invoice details') |h %> % if ( $editi && ! $cust_pkg->get('cancel') && ! $opt{no_links} ) { (<& /elements/popup_link.html, { 'action' => $editlink. 'I', 'label' => emt('edit'), 'actionlabel' => emt('Edit invoice details'), 'color' => '#333399', 'width' => 763, } &>) % }
 - <% $cust_pkg_detail->detail |h %>
% } else { % if ( $editi && ! $cust_pkg->get('cancel') && ! $opt{no_links} ) { ( <% include('/elements/popup_link.html', { 'action' => $editlink. 'I', 'label' => emt('Add invoice details'), 'actionlabel' => emt('Add invoice details'), 'color' => '#333399', 'width' => 763, }) %> ) % } % } % if ( @comments ) { <& /elements/table-grid.html &> <% mt('Comments') |h %> % if ( $editc && ! $opt{no_links} ) { (<& /elements/popup_link.html, { 'action' => $editlink. 'C', 'label' => emt('edit'), 'actionlabel' => emt('Edit comments'), 'color' => '#333399', 'width' => 763, } &>) % } % foreach my $cust_pkg_detail ( @comments ) {  - <% $cust_pkg_detail->detail |h %> % } % } else { % if ( $editc && ! $opt{no_links} ) { ( <& /elements/popup_link.html, { 'action' => $editlink. 'C', 'label' => emt('Add comments'), 'actionlabel' => emt('Add comments'), 'color' => '#333399', 'width' => 763, } &> ) % } % } % } % if ( @cust_pkg_usage ) { % foreach my $usage (@cust_pkg_usage) { % my $part = $usage->part_pkg_usage; % my $ratio = 255 * ($usage->minutes / $part->minutes); % $ratio = 255 if $ratio > 255; # because rollover % my $color = sprintf('STYLE="font-weight: bold; color: #%02x%02x00"', 255 - $ratio, $ratio); % my $trstyle = ''; % $trstyle = ' CLASS="shared"' if $part->shared; > % if ( $part->shared ) { % } % }
<% mt('Included usage') %>
<% $part->description %>: ALIGN="right"><% sprintf('%.1f', $usage->minutes) %> > / ><% $part->minutes %>(shared)
% } <%init> my %opt = @_; my $bgcolor = $opt{'bgcolor'}; my $cust_pkg = $opt{'cust_pkg'}; my $part_pkg = $opt{'part_pkg'}; my $curuser = $FS::CurrentUser::CurrentUser; my $countrydefault = $opt{'countrydefault'} || 'US'; my $statedefault = $opt{'statedefault'} || ($countrydefault eq 'US' ? 'CA' : ''); # put a marker on the left edge of this column # if this package is somehow special my $supplemental = $opt{'supplemental'} || 0; my $change_from = $opt{'change_from'} || 0; my $style = ''; if ( $supplemental or $change_from ) { $style = 'border-left-width: '.($supplemental + $change_from)*30 . 'px; '. 'border-color: '; if ( $supplemental ) { $style .= '#bbbbff'; } elsif ( $change_from ) { $style .= '#bbffbb'; } $style = qq!STYLE="$style"!; } $cust_pkg->pkgnum =~ /^(\d+)$/; my $pkgnum = $1; my @cust_pkg_usage = qsearch({ 'select' => 'cust_pkg_usage.*', 'table' => 'cust_pkg_usage', 'addl_from' => ' JOIN part_pkg_usage USING (pkgusagepart)', 'extra_sql' => " WHERE pkgnum = $1", 'order_by' => ' ORDER BY priority ASC, description ASC', }); #subroutines #false laziness w/status.html sub pkg_link { my($action, $label, $cust_pkg) = @_; return '' unless $cust_pkg; qq!$label!; } sub pkg_change_link { my $cust_pkg = shift; my $locationnum = $cust_pkg->locationnum; include( '/elements/popup_link-cust_pkg.html', 'action' => $p. "misc/change_pkg.cgi?locationnum=$locationnum", 'label' => emt('Change package'), 'actionlabel' => emt('Change'), 'cust_pkg' => $cust_pkg, 'width' => 960, 'height' => 490, ); } sub onetime_change_link { my $cust_pkg = shift; my $pkgnum = $cust_pkg->pkgnum; include( '/elements/popup_link-cust_pkg.html', 'action' => $p. "edit/quick-charge.html?change_pkgnum=$pkgnum", 'label' => emt('Modify one-time charge'), 'actionlabel' => emt('Modify'), 'cust_pkg' => $cust_pkg, 'width' => 690, 'height' => 380, ); } sub pkg_change_location_link { my $cust_pkg = shift; my $pkgpart = $cust_pkg->pkgpart; include( '/elements/popup_link-cust_pkg.html', 'action' => $p. "misc/change_pkg.cgi?locationnum=-1;pkgpart=$pkgpart;". "address1=;address2=;city=;county=;state=$statedefault;". "zip=;country=$countrydefault", 'label' => emt('Change location'), 'actionlabel' => emt('Change'), 'cust_pkg' => $cust_pkg, 'width' => 960, 'height' => 490, ); } sub pkg_change_quantity_link { my( $cust_pkg, $label ) = @_; include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'edit/cust_pkg_quantity.html?', 'label' => emt($label), 'actionlabel' => emt('Change'), 'cust_pkg' => $cust_pkg, 'width' => 390, 'height' => 220, ); } sub pkg_change_salesnum_link { my( $cust_pkg, $label ) = @_; include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'edit/cust_pkg_salesnum.html?', 'label' => emt($label), 'actionlabel' => emt('Change'), 'cust_pkg' => $cust_pkg, 'width' => 390, 'height' => 220, ); } sub pkg_discount_link { my $cust_pkg = shift or return ''; include( '/elements/popup_link-cust_pkg.html', 'action' => $p.'edit/cust_pkg_discount.html', 'label' => emt('Discount'), 'actionlabel' => emt('Discount'), 'cust_pkg' => $cust_pkg, 'width' => 616, ); } sub pkg_customize_link { my $cust_pkg = shift or return ''; my $part_pkg = shift; my $custnum = $cust_pkg->custnum; qq!!.emt('Customize').''; } sub pkg_event_link { my($cust_pkg) = @_; qq!!. emt('View package events'). ''; }