Packages
% my $s = 0; % if ( $curuser->access_right('Order customer package') ) { <% $s++ ? ' | ' : '' %> <% order_pkg_link($cust_main) %> % } % if ( $curuser->access_right('One-time charge') % && $conf->config('payby-default') ne 'HIDE' % ) { % <% $s++ ? ' | ' : '' %> <% popup_link('edit/quick-charge.html?custnum='. $cust_main->custnum, 'One-time charge', 'One-time charge', '#333399', 545) %> % } % if ( $curuser->access_right('Bulk change customer packages') ) { <% $s++ ? ' | ' : '' %> Bulk order and cancel packages (preserves services) % }

% if ( @$packages ) { Current packages % } % if ( $cust_main->num_cancelled_pkgs ) { % if ( $cgi->param('showcancelledpackages') eq '0' #see if it was set by me % || ( $conf->exists('hidecancelledpackages') % && ! $cgi->param('showcancelledpackages') % ) % ) % { % $cgi->param('showcancelledpackages', 1); % ( show % } else { % $cgi->param('showcancelledpackages', 0); % ( hide % } cancelled packages ) % } % if ( @$packages ) { <% include('/elements/table-grid.html') %> % my $bgcolor1 = '#eeeeee'; % my $bgcolor2 = '#ffffff'; % my $bgcolor = ''; Package Status Services %foreach my $cust_pkg (@$packages) { % % my $part_pkg = $cust_pkg->part_pkg; % % if ( $bgcolor eq $bgcolor1 ) { % $bgcolor = $bgcolor2; % } else { % $bgcolor = $bgcolor1; % } <% $cust_pkg->pkgnum %>: <% $part_pkg->pkg %> - <% $part_pkg->comment %>
% unless ( $cust_pkg->get('cancel') ) { % my $br = 0; % if ( $curuser->access_right('Change customer package') ) { $br=1; ( <%pkg_change_link($cust_pkg)%> ) % } % if ( $curuser->access_right('Edit customer package dates') ) { $br=1; ( <%pkg_dates_link($cust_pkg)%> ) % } % if ( $curuser->access_right('Customize customer package') ) { $br=1; ( <%pkg_customize_link($cust_pkg,$cust_main->custnum)%> ) % } <% $br ? '
' : '' %> % } % if ( $cust_pkg->num_cust_event % && ( $curuser->access_right('Billing event reports') % || $curuser->access_right('View customer billing events') % ) % ) { ( <%pkg_event_link($cust_pkg)%> ) % }
% % sub myfreq { % my $part_pkg = shift; % my $freq = $part_pkg->freq_pretty; % $freq =~ s/ / /g; % $freq; % } % % #this should use cust_pkg->status and cust_pkg->statuscolor eventually % % my $colspan = $conf->exists('cust_pkg-display_times') ? 8 : 4; % my $width = $conf->exists('cust_pkg-display_times') ? '38%' : '56%'; % % #false laziness w/edit/REAL_cust_pkg.cgi % my( $billed_or_prepaid, $last_bill_or_renewed, $next_bill_or_prepaid_until ); % unless ( $part_pkg->is_prepaid ) { % $billed_or_prepaid = 'billed'; % $last_bill_or_renewed = 'Last bill'; % $next_bill_or_prepaid_until = 'Next bill'; % } else { % $billed_or_prepaid = 'prepaid'; % $last_bill_or_renewed = 'Renewed'; % $next_bill_or_prepaid_until = 'Prepaid until'; % } % % % if ( $cust_pkg->get('cancel') ) { <% pkg_datestr($cust_pkg, 'cancel', $conf) %> % unless ( $cust_pkg->get('setup') ) { % } else { <% pkg_datestr($cust_pkg, 'setup', $conf) %> % if ( $cust_pkg->get('last_bill') ) { <% pkg_datestr($cust_pkg, 'last_bill',$conf) %> % } % if ( $cust_pkg->get('susp') ) { <% pkg_datestr($cust_pkg, 'susp', $conf) %> % } % } % } else { % if ( $cust_pkg->get('susp') ) { <% pkg_datestr($cust_pkg, 'susp', $conf) %> % unless ( $cust_pkg->get('setup') ) { % } else { <% pkg_datestr($cust_pkg, 'setup', $conf) %> % } % if ( $cust_pkg->get('last_bill') ) { <% pkg_datestr($cust_pkg, 'last_bill', $conf) %> % } % if ( $cust_pkg->get('expire') ) { <% pkg_datestr($cust_pkg, 'expire', $conf) %> % } % } else { % unless ( $cust_pkg->get('setup') ) { % unless ( $part_pkg->freq ) { % } else { % } % } else { % unless ( $part_pkg->freq ) { <% pkg_datestr($cust_pkg, 'setup', $conf) %> % } else { % if (scalar($cust_pkg->overlimit)) { %}else{ % } <% pkg_datestr($cust_pkg, 'setup', $conf) %> % } % } % if ( $cust_pkg->get('last_bill') ) { <% pkg_datestr($cust_pkg, 'last_bill', $conf) %> % } % if ( $cust_pkg->get('bill') ) { #next bill <% pkg_datestr($cust_pkg, 'bill', $conf) %> % } % if ( $cust_pkg->get('adjourn') ) { <% pkg_datestr($cust_pkg, 'adjourn', $conf) %> % } % if ( $cust_pkg->get('expire') ) { <% pkg_datestr($cust_pkg, 'expire', $conf) %> % } % if ( $part_pkg->freq ) { % } % } % }
Cancelled 
<% $cust_pkg->last_reason ? $cust_pkg->last_reason->reason : '' %>
>Never billed
Setup 
<% $last_bill_or_renewed %> 
Suspended 
Suspended 
<% $cust_pkg->last_reason ? $cust_pkg->last_reason->reason : '' %>
>Never billed
Setup 
<% $last_bill_or_renewed %> 
Expires 
> % if ( $curuser->access_right('Unsuspend customer package') ) { ( <% pkg_unsuspend_link($cust_pkg) %> ) % } % if ( $curuser->access_right('Cancel customer package immediately') ) { ( <% pkg_cancel_link($cust_pkg) %> ) % }
>Not yet billed (one-time charge)
> % if ( $curuser->access_right('Cancel customer package immediately') ) { ( <% pkg_cancel_link($cust_pkg) %> ) % }
>Not yet billed (<% $billed_or_prepaid %> <% myfreq($part_pkg) %>)
>One-time charge
Billed 
>Overlimit, <% $billed_or_prepaid %> <% myfreq($part_pkg) %>
>Active, <% $billed_or_prepaid %> <% myfreq($part_pkg) %>
Setup 
<% $last_bill_or_renewed %> 
<% $next_bill_or_prepaid_until %> 
Adjourns 
Expires 
> % if ( $curuser->access_right('Suspend customer package') ) { ( <% pkg_suspend_link($cust_pkg) %> ) % } % if ( $curuser->access_right('Suspend customer package later') ) { ( <% pkg_adjourn_link($cust_pkg) %> ) % } % if ( $curuser->access_right('Cancel customer package immediately') ) { ( <% pkg_cancel_link($cust_pkg) %> ) % } % if ( $curuser->access_right('Cancel customer package later') ) { ( <% pkg_expire_link($cust_pkg) %> ) % }
% #foreach my $svcpart (sort {$a->{svcpart} <=> $b->{svcpart}} @{$pkg->{svcparts}}) { % foreach my $part_svc ( $cust_pkg->part_svc ) { % #foreach my $service (@{$svcpart->{services}}) { % foreach my $cust_svc ( @{ $part_svc->cust_pkg_svc } ) { % } % if ( ! $cust_pkg->get('cancel') % && $curuser->access_right('Provision customer service') % && $part_svc->num_avail % ) { % } % }
<% FS::UI::Web::svc_link($m, $part_svc, $cust_svc) %> <% FS::UI::Web::svc_label_link($m, $part_svc, $cust_svc) %>
<% $cust_svc->overlimit ? "Overlimit: ". time2str('%b %o %Y' . ($conf->exists('cust_pkg-display_times') ? ' %l:%M %P' : ''), $cust_svc->overlimit) : '' %>
% if ( $curuser->access_right('Recharge customer service') % && $part_svc->svcdb eq 'svc_acct' % && ( $cust_svc->svc_x->seconds ne '' % || $cust_svc->svc_x->upbytes ne '' % || $cust_svc->svc_x->downbytes ne '' % || $cust_svc->svc_x->totalbytes ne '' % ) % ) { ( <%svc_recharge_link($cust_svc)%> ) % } % if ( $curuser->access_right('Unprovision customer service') ) { ( <%svc_unprovision_link($cust_svc)%> ) % }
<% svc_provision_link($cust_pkg, $part_svc, $conf, $curuser) %>
% } #end display packages % % } else {
% } % if ( $cgi->param('fragment') =~ /^cust_pkg(\d+)$/ ) { % } <%init> my( $cust_main ) = @_; my $conf = new FS::Conf; my $curuser = $FS::CurrentUser::CurrentUser; my $packages = get_packages($cust_main, $conf); <%once> #subroutines sub get_packages { my $cust_main = shift or return undef; my $conf = shift; my @packages = (); my $method; if ( $cgi->param('showcancelledpackages') eq '0' #see if it was set by me || ( $conf->exists('hidecancelledpackages') && ! $cgi->param('showcancelledpackages') ) ) { $method = 'ncancelled_pkgs'; } else { $method = 'all_pkgs'; } [ $cust_main->$method() ]; } sub svc_provision_link { my ($cust_pkg, $part_svc, $conf, $curuser) = @_; ( my $svc_nbsp = $part_svc->svc ) =~ s/\s+/ /g; my $num_avail = $part_svc->num_avail; my $pkgnum_svcpart = "pkgnum=". $cust_pkg->pkgnum. ';'. "svcpart=". $part_svc->svcpart; my $url; if ( $part_svc->svcdb eq 'svc_external' #could be generalized && $conf->exists('svc_external-skip_manual') ) { $url = "${p}edit/process/". $part_svc->svcdb. ".cgi?$pkgnum_svcpart"; } else { $url = svc_url( 'm' => $m, 'action' => 'edit', 'part_svc' => $part_svc, 'query' => $pkgnum_svcpart, ); #$url = "${p}edit/$svcpart->{svcdb}.cgi?$pkgnum_svcpart"; } my $link = qq!!. "Provision $svc_nbsp ($num_avail)"; if ( $conf->exists('legacy_link') && $curuser->access_right('View/link unlinked services') ) { $link .= '
'. qq!!. "Link to legacy $svc_nbsp ($num_avail)"; } $link; } sub svc_unprovision_link { my $cust_svc = shift or return ''; qq!Unprovision!; } sub pkg_datestr { my($cust_pkg, $field, $conf) = @_ or return ''; return ' ' unless $cust_pkg->get($field); my $format = '%b'. ' %o,'. ' %Y'; #$format .= ' %l:%M:%S%P %z' $format .= ' %l'. ':'. '%M'. ' %P' if $conf->exists('cust_pkg-display_times'); my $strip = time2str($format, $cust_pkg->get($field) ); $strip =~ s/ (\d)/$1/g; $strip; } sub pkg_change_link { pkg_popup_link('misc/change_pkg.cgi?dummy=value', 'Change package', 'Change', '', @_ ); } sub pkg_suspend_link { pkg_popup_link( 'misc/cancel_pkg.html?method=suspend', 'Suspend now', 'Suspend', '#FF9900', @_ ); } sub pkg_adjourn_link { pkg_popup_link( 'misc/cancel_pkg.html?method=adjourn', 'Suspend later', 'Adjourn', '#CC6600', @_ ); } sub pkg_unsuspend_link { pkg_link('misc/unsusp_pkg', 'Unsuspend', @_ ); } sub pkg_expire_link { pkg_link('misc/expire_pkg', 'Cancel later', @_ ); } sub pkg_dates_link { pkg_link('edit/REAL_cust_pkg', 'Edit dates', @_ ); } sub pkg_cancel_link { pkg_popup_link( 'misc/cancel_pkg.html?method=cancel', 'Cancel now', 'Cancel', '#ff0000', @_ ); } sub pkg_expire_link { pkg_popup_link( 'misc/cancel_pkg.html?method=expire', 'Cancel later', 'Expire', #"Cancel package $num later" '#CC0000', @_ ); } sub svc_recharge_link { svc_popup_link( 'misc/recharge_svc.html', 'Recharge', 'Recharge', '#333399', @_ ); } sub order_pkg_link { cust_popup_link( 'misc/order_pkg.html', 'Order new package', 'Order new package', '#333399', @_ ); } sub pkg_event_link { my($cust_pkg) = @_; qq!!. 'View package events'. ''; } sub pkg_link { my($action, $label, $cust_pkg) = @_; return '' unless $cust_pkg; qq!$label!; } sub pkg_popup_link { my($action, $label, $actionlabel, $color, $cust_pkg) = @_; $action .= '&pkgnum='. $cust_pkg->pkgnum; $actionlabel .= ' package '. $cust_pkg->pkgnum; popup_link($action, $label, $actionlabel, $color, 768); } sub svc_popup_link { my($action, $label, $actionlabel, $color, $cust_svc) = @_; $action .= '?svcnum='. $cust_svc->svcnum; $actionlabel .= ' service '. $cust_svc->svcnum; popup_link($action, $label, $actionlabel, $color); } sub cust_popup_link { my($action, $label, $actionlabel, $color, $cust_main) = @_; $action .= '?'. $cust_main->custnum; popup_link($action, $label, $actionlabel, $color); } sub popup_link { my($action, $label, $actionlabel, $color, $width) = @_; $color ||= '#333399'; $width ||= 540; qq!$label!; } sub pkg_customize_link { my $cust_pkg = shift or return ''; my $custnum = $cust_pkg->custnum; qq!Customize!; }