%#this should use cust_pkg->status and cust_pkg->statuscolor eventually % if ( $cust_pkg->get('cancel') ) { #status: cancelled % my $cpr = $cust_pkg->last_cust_pkg_reason('cancel'); <% pkg_status_row($cust_pkg, 'Cancelled', 'cancel', 'color'=>'FF0000', conf=>$conf ) %> <% pkg_status_row_colspan( ( $cpr ? $cpr->reasontext. ' by '. $cpr->otaker : '' ), '', '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', conf=>$conf ) %> <% pkg_status_row_changed( $cust_pkg, conf=>$conf ) %> <% pkg_status_row_if( $cust_pkg, $last_bill_or_renewed, 'last_bill', conf=>$conf, curuser=>$curuser ) %> <% pkg_status_row_if( $cust_pkg, 'Suspended', 'susp', conf=>$conf, curuser=>$curuser ) %> % } % % } else { % % if ( $cust_pkg->get('susp') ) { #status: suspended % my $cpr = $cust_pkg->last_cust_pkg_reason('susp'); <% pkg_status_row( $cust_pkg, 'Suspended', 'susp', 'color'=>'FF9900', conf=>$conf ) %> <% pkg_status_row_colspan( ( $cpr ? $cpr->reasontext. ' by '. $cpr->otaker : '' ), '', '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', conf=>$conf ) %> % } <% pkg_status_row_changed( $cust_pkg, conf=>$conf ) %> <% pkg_status_row_if( $cust_pkg, $last_bill_or_renewed, 'last_bill', conf=>$conf, curuser=>$curuser ) %> % # pkg_status_row($cust_pkg, 'Next bill', 'bill', conf=>$conf) <% pkg_status_row_if( $cust_pkg, 'Expires', 'expire', conf=>$conf, curuser=>$curuser ) %> % } 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', conf=>$conf) %> % } 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', conf=>$conf) %> % } % % } % my $autosuspend = pkg_autosuspend_time( $cust_pkg ); % $cust_pkg->set('autosuspend', $autosuspend) if $autosuspend; <% pkg_status_row_changed( $cust_pkg, conf=>$conf ) %> <% pkg_status_row_if( $cust_pkg, $last_bill_or_renewed, 'last_bill', conf=>$conf, curuser=>$curuser ) %> <% pkg_status_row_if( $cust_pkg, $next_bill_or_prepaid_until, 'bill', conf=>$conf, curuser=>$curuser ) %> <% pkg_status_row_if($cust_pkg, 'Will automatically suspend by', 'autosuspend', conf=>$conf) %> <% pkg_status_row_if( $cust_pkg, 'Will suspend on', 'adjourn', conf=>$conf, curuser=>$curuser ) %> <% pkg_status_row_if( $cust_pkg, 'Expires', 'expire', conf=>$conf, curuser=>$curuser ) %> % 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('Delay suspension events') ) { ( <% pkg_delay_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) %> ) % }
<%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 $conf = new FS::Conf; 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'; } #subroutines sub myfreq { my $part_pkg = shift; my $freq = $part_pkg->freq_pretty; $freq =~ s/ / /g; $freq; } #false laziness w/package.html sub pkg_link { my($action, $label, $cust_pkg) = @_; return '' unless $cust_pkg; qq!$label!; } 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, $opt{conf}).''; $html; } sub pkg_status_row_if { my( $cust_pkg, $title, $field, %opt ) = @_; $title = '( '. pkg_unadjourn_link($cust_pkg). ' ) '. $title if ( $field eq 'adjourn' && $opt{curuser}->access_right('Suspend customer package later') ); $title = '( '. pkg_unexpire_link($cust_pkg). ' ) '. $title if ( $field eq 'expire' && $opt{curuser}->access_right('Cancel customer package later') ); $cust_pkg->get($field) ? pkg_status_row($cust_pkg, $title, $field, %opt) : ''; } sub pkg_status_row_changed { my( $cust_pkg, %opt ) = @_; return '' unless $cust_pkg->change_date; my $html = pkg_status_row( $cust_pkg, 'Package changed', 'change_date', conf=>$opt{'conf'} ); 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; } 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_suspend_link { include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'misc/cancel_pkg.html?method=suspend', 'label' => 'Suspend now', 'actionlabel' => 'Suspend', 'color' => '#FF9900', 'cust_pkg' => shift, ) } sub pkg_adjourn_link { include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'misc/cancel_pkg.html?method=adjourn', 'label' => 'Suspend later', 'actionlabel' => 'Adjourn', 'color' => '#CC6600', 'cust_pkg' => shift, ) } sub pkg_delay_link { include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'misc/delay_susp_pkg.html', 'label' => 'Delay suspend', 'actionlabel' => 'Delay suspend for', 'cust_pkg' => shift, ) } sub pkg_unsuspend_link { pkg_link('misc/unsusp_pkg', 'Unsuspend', @_ ); } sub pkg_unadjourn_link { pkg_link('misc/unadjourn_pkg', 'Abort', @_ ); } sub pkg_unexpire_link { pkg_link('misc/unexpire_pkg', 'Abort', @_ ); } sub pkg_cancel_link { include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'misc/cancel_pkg.html?method=cancel', 'label' => 'Cancel now', 'actionlabel' => 'Cancel', 'color' => '#ff0000', 'cust_pkg' => shift, ) } sub pkg_expire_link { include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'misc/cancel_pkg.html?method=expire', 'label' => 'Cancel later', 'actionlabel' => 'Expire', #"Cancel package $num later" 'color' => '#CC0000', 'cust_pkg' => shift, ) } sub svc_recharge_link { include( '/elements/popup_link-cust_svc.html', 'action' => $p. 'misc/recharge_svc.html', 'label' => 'Recharge', 'actionlabel' => 'Recharge', 'color' => '#333399', 'cust_svc' => shift, ) } sub pkg_autosuspend_time { my $cust_pkg = shift or return ''; my $days = 7; my $time = time; my $pending_suspend = 0; #this seems to be extremely inefficient... while ( $days > 0 && scalar( grep { $_->part_event->action eq 'suspend' } @{$cust_pkg->cust_main->due_cust_event( time => $time + 86400*$days, testonly => 1, ) } ) ) { $pending_suspend = 1; $days--; } $pending_suspend ? time + ($days + 1) * 86400 : ''; }