% my( $cust_main ) = @_; % my $conf = new FS::Conf; % % my $curuser = $FS::CurrentUser::CurrentUser; % % my $packages = get_packages($cust_main, $conf); Packages % if ( $curuser->access_right('Order customer package') ) { <% include('order_pkg.html', $cust_main ) %> % } % if ( $curuser->access_right('One-time charge') % && $conf->config('payby-default') ne 'HIDE' % ) { % <% include('quick-charge.html', $cust_main ) %> % } % if ( $curuser->access_right('Bulk change customer packages') ) { 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') ) { % if ( $curuser->access_right('Change customer package') ) { ( <%pkg_change_link($cust_pkg)%> ) % } % if ( $curuser->access_right('Edit customer package dates') ) { ( <%pkg_dates_link($cust_pkg)%> ) % } % if ( $curuser->access_right('Customize customer package') ) { ( <%pkg_customize_link($cust_pkg,$cust_main->custnum)%> ) % } % } % % 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 { <% 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('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') ) { ( <% 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 
>Active, <% $billed_or_prepaid %> <% myfreq($part_pkg) %>
Setup 
<% $last_bill_or_renewed %> 
<% $next_bill_or_prepaid_until %> 
Expires 
> % if ( $curuser->access_right('Suspend customer package') ) { ( <% pkg_suspend_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) %>
% if ( $curuser->access_right('Recharge customer service') % && $cust_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 {
% } % %#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 = FS::UI::Web::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_link('misc/change_pkg', 'Change package', @_ ); } %sub pkg_suspend_link { pkg_link('misc/susp_pkg', 'Suspend', @_ ); } %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', % @_ % ); % } %sub pkg_expire_link { pkg_popup_link( 'misc/cancel_pkg.html?method=expire', % 'Cancel later', % 'Expire', #"Cancel package $num later" % @_ % ); % } % %sub svc_recharge_link { svc_popup_link( 'misc/recharge_svc.html', % 'Recharge', % 'Recharge', % @_ % ); % } % %sub pkg_link { % my($action, $label, $cust_pkg) = @_; % return '' unless $cust_pkg; % qq!$label!; %} % %sub pkg_popup_link { % my($action, $label, $actionlabel, $cust_pkg) = @_; % $action .= '&pkgnum='. $cust_pkg->pkgnum; % $actionlabel .= ' package '. $cust_pkg->pkgnum; % popup_link($action, $label, $actionlabel); %} % %sub svc_popup_link { % my($action, $label, $actionlabel, $cust_svc) = @_; % $action .= '?svcnum='. $cust_svc->svcnum; % $actionlabel .= ' service '. $cust_svc->svcnum; % popup_link($action, $label, $actionlabel); %} % %sub popup_link { % my($action, $label, $actionlabel) = @_; % qq!$label!; %} % %sub pkg_customize_link { % my $cust_pkg = shift or return ''; % my $custnum = $cust_pkg->custnum; % qq!Customize!; %}