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') ) { #status: cancelled <% pkg_status_row($cust_pkg, 'Cancelled', 'cancel', 'color'=>'FF0000' ) %> <% pkg_status_row_colspan( ( $cust_pkg->last_reason ? $cust_pkg->last_reason->reason : '' ), '', 'align' => 'right', 'color' => 'ff0000', 'size' => '-2', ) %> % unless ( $cust_pkg->get('setup') ) { <% pkg_status_row_colspan('Never billed') %> % } else { <% pkg_status_row( $cust_pkg, 'Setup', 'setup' ) %> <% pkg_status_row_changed( $cust_pkg ) %> <% pkg_status_row_if( $cust_pkg, $last_bill_or_renewed, 'last_bill' ) %> <% pkg_status_row_if( $cust_pkg, 'Suspended', 'susp' ) %> % } % % } else { % % if ( $cust_pkg->get('susp') ) { #status: suspended <% pkg_status_row( $cust_pkg, 'Suspended', 'susp', 'color'=>'FF9900' ) %> <% pkg_status_row_colspan( ( $cust_pkg->last_reason ? $cust_pkg->last_reason->reason : '' ), '', 'align' => 'right', 'color' => 'FF9900', 'size' => '-2', ) %> % unless ( $cust_pkg->get('setup') ) { <% pkg_status_row_colspan('Never billed') %> % } else { <% pkg_status_row($cust_pkg, 'Setup', 'setup' ) %> % } <% pkg_status_row_changed( $cust_pkg ) %> <% pkg_status_row_if( $cust_pkg, $last_bill_or_renewed, 'last_bill' ) %> % # pkg_status_row($cust_pkg, 'Next bill', 'bill') <% pkg_status_row_if( $cust_pkg, 'Expires', 'expire' ) %> % } else { #status: active % % unless ( $cust_pkg->get('setup') ) { #not setup % % unless ( $part_pkg->freq ) { <% pkg_status_row_colspan('Not yet billed (one-time charge)') %> % } else { <% pkg_status_row_colspan("Not yet billed ($billed_or_prepaid ". myfreq($part_pkg). ')' ) %> % } % % } else { #setup % % unless ( $part_pkg->freq ) { <% pkg_status_row_colspan('One-time charge') %> <% pkg_status_row($cust_pkg, 'Billed', 'setup') %> % } else { % % if (scalar($cust_pkg->overlimit)) { <% pkg_status_row_colspan( 'Overlimit', $billed_or_prepaid. ' '. myfreq($part_pkg), 'color' => 'FFD000', ) %> % } else { <% pkg_status_row_colspan( 'Active', $billed_or_prepaid. ' '. myfreq($part_pkg), 'color' => '00CC00', ) %> % } <% pkg_status_row($cust_pkg, 'Setup', 'setup') %> % } % % } <% pkg_status_row_changed( $cust_pkg ) %> <% pkg_status_row_if( $cust_pkg, $last_bill_or_renewed, 'last_bill' ) %> <% pkg_status_row_if( $cust_pkg, $next_bill_or_prepaid_until, 'bill' ) %> <% pkg_status_row_if( $cust_pkg, 'Will suspend on', 'adjourn' ) %> <% pkg_status_row_if( $cust_pkg, 'Expires', 'expire' ) %> % if ( $part_pkg->freq ) { % } % % } % }
> % 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) %> ) % }
> % if ( $curuser->access_right('Cancel customer package immediately') ) { ( <% pkg_cancel_link($cust_pkg) %> ) % }
> % 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) %> <% FS::UI::Web::svc_export_links($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); my $colspan = $conf->exists('cust_pkg-display_times') ? 8 : 4; my $width = $conf->exists('cust_pkg-display_times') ? '38%' : '56%'; sub pkg_status_row { my( $cust_pkg, $title, $field, %opt ) = @_; my $color = $opt{'color'}; my $html = qq(); $html .= qq() if length($color); $html .= qq($title ); $html .= qq() if length($color); $html .= qq(); $html .= pkg_datestr($cust_pkg, $field, $conf).''; $html; } sub pkg_status_row_if { my( $cust_pkg, $title, $field, %opt ) = @_; $cust_pkg->get($field) ? pkg_status_row(@_) : ''; } sub pkg_status_row_changed { my($cust_pkg) = @_; return '' unless $cust_pkg->change_date; my $html = pkg_status_row( $cust_pkg, 'Package changed', 'change_date' ); my $old = $cust_pkg->old_cust_pkg; if ( $old ) { my $part_pkg = $old->part_pkg; my $label = 'Changed from '. $cust_pkg->change_pkgnum. ': '. $part_pkg->pkg. ' - '. $part_pkg->comment; $html .= pkg_status_row_colspan( $label, '', size=>'-1', align=>'right' ); } $html; } sub pkg_status_row_colspan { my($title, $addl, %opt) = @_; my $align = $opt{'align'} ? 'ALIGN="'. $opt{'align'}.'"' : ''; my $color = $opt{'color'} ? 'COLOR="#'.$opt{'color'}.'"' : ''; my $size = $opt{'size'} ? 'SIZE="'. $opt{'size'}. '"' : ''; my $html = qq(); $html .= qq() if length($color) || $size; $html .= qq() if $color && !$size; $html .= $title; $html .= qq() if $color && !$size; $html .= qq() if length($color) || $size; $html .= ", $addl" if length($addl); $html .= qq(); $html; } <%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!; }