diff options
-rw-r--r-- | FS/FS/Conf.pm | 7 | ||||
-rw-r--r-- | FS/FS/Record.pm | 4 | ||||
-rw-r--r-- | FS/FS/cust_main.pm | 19 | ||||
-rw-r--r-- | FS/FS/cust_main/Billing.pm | 16 | ||||
-rw-r--r-- | FS/FS/part_pkg.pm | 27 | ||||
-rwxr-xr-x | httemplate/misc/cust_main-unsuspend.cgi | 10 | ||||
-rw-r--r-- | httemplate/misc/unsuspend_cust.html | 26 | ||||
-rw-r--r-- | httemplate/view/cust_main/packages/status.html | 3 |
8 files changed, 74 insertions, 38 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 616a06c90..e56cf3b2d 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -4046,13 +4046,6 @@ and customer address. Include units.', }, { - 'key' => 'disable_setup_suspended_pkgs', - 'section' => 'billing', - 'description' => 'Disables charging of setup fees for suspended packages.', - 'type' => 'checkbox', - }, - - { 'key' => 'password-generated-allcaps', 'section' => 'password', 'description' => 'Causes passwords automatically generated to consist entirely of capital letters', diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index c53c9ae3c..4915b96ef 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -3322,7 +3322,7 @@ sub scalar_sql { defined($scalar) ? $scalar : ''; } -=item count [ WHERE ] +=item count [ WHERE [, PLACEHOLDER ...] ] Convenience method for the common case of "SELECT COUNT(*) FROM table", with optional WHERE. Must be called as method on a class with an @@ -3335,7 +3335,7 @@ sub count { my $table = $self->table or die 'count called on object of class '.ref($self); my $sql = "SELECT COUNT(*) FROM $table"; $sql .= " WHERE $where" if $where; - $self->scalar_sql($sql); + $self->scalar_sql($sql, @_); } =back diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 9b893eacd..84426b4ac 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -2171,14 +2171,27 @@ sub cust_payby { =item unsuspend Unsuspends all unflagged suspended packages (see L</unflagged_suspended_pkgs> -and L<FS::cust_pkg>) for this customer. Always returns a list: an empty list -on success or a list of errors. +and L<FS::cust_pkg>) for this customer, except those on hold. + +Returns a list: an empty list on success or a list of errors. =cut sub unsuspend { my $self = shift; - grep { $_->unsuspend } $self->suspended_pkgs; + grep { ($_->get('setup')) && $_->unsuspend } $self->suspended_pkgs; +} + +=item release_hold + +Unsuspends all suspended packages in the on-hold state (those without setup +dates) for this customer. + +=cut + +sub release_hold { + my $self = shift; + grep { (!$_->setup) && $_->unsuspend } $self->suspended_pkgs; } =item suspend diff --git a/FS/FS/cust_main/Billing.pm b/FS/FS/cust_main/Billing.pm index d55cb2f37..29f7e8e54 100644 --- a/FS/FS/cust_main/Billing.pm +++ b/FS/FS/cust_main/Billing.pm @@ -1090,6 +1090,16 @@ sub _make_lines { my %setup_param = ( 'discounts' => \@setup_discounts ); my $setup_billed_currency = ''; my $setup_billed_amount = 0; + # Conditions for setting setup date and charging the setup fee: + # - this is not a recurring-only billing run + # - and the package is not currently being canceled + # - and, unless we're specifically told otherwise via 'resetup': + # - it doesn't already HAVE a setup date + # - or a start date in the future + # - and it's not suspended + # + # The last condition used to check the "disable_setup_suspended" option but + # that's obsolete. We now never set the setup date on a suspended package. if ( ! $options{recurring_only} and ! $options{cancel} and ( $options{'resetup'} @@ -1097,11 +1107,7 @@ sub _make_lines { && ( ! $cust_pkg->start_date || $cust_pkg->start_date <= $cmp_time ) - && ( ! $conf->exists('disable_setup_suspended_pkgs') - || ( $conf->exists('disable_setup_suspended_pkgs') && - ! $cust_pkg->getfield('susp') - ) - ) + && ( ! $cust_pkg->getfield('susp') ) ) ) ) diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 005d69d05..e4927a389 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -1818,23 +1818,16 @@ sub _upgrade_data { # class method die $error if $error; } - foreach my $optionname( qw( - recur_hourly_% - recur_input_% - recur_output_% - recur_total_% - ) ){ - foreach my $opt (qsearch('part_pkg_option', - { 'optionname' => { op => 'LIKE', - value => $optionname, - }, - pkgpart => $pkgpart, - })){ - $opt->optionvalue($opt->optionvalue * 1024); - - my $error = $opt->replace; - die $error if $error; - } + foreach my $opt (qsearch('part_pkg_option', + { 'optionname' => { op => 'LIKE', + value => 'recur_%_charge', + }, + pkgpart => $pkgpart, + })){ + $opt->optionvalue($opt->optionvalue * 1024); + + my $error = $opt->replace; + die $error if $error; } } diff --git a/httemplate/misc/cust_main-unsuspend.cgi b/httemplate/misc/cust_main-unsuspend.cgi index eb4a2c8f8..e8ac8d31e 100755 --- a/httemplate/misc/cust_main-unsuspend.cgi +++ b/httemplate/misc/cust_main-unsuspend.cgi @@ -34,6 +34,10 @@ if($cgi->param('now_or_later')) { if($resume) { #warn "setting resume dates on custnum#$custnum\n"; my @pkgs = $cust_main->suspended_pkgs; + if (!$cgi->param('release_hold')) { + # then avoid packages that are on hold + @pkgs = grep { $_->get('setup') } @pkgs; + } @errors = grep {$_} map { $_->unsuspend( 'date' => $resume, ) } @pkgs; @@ -42,9 +46,13 @@ if($cgi->param('now_or_later')) { @errors = ("error parsing adjourn date: ".$cgi->param('adjourn')); } } -else { +else { # unsuspending now warn "unsuspending $cust_main"; @errors = $cust_main->unsuspend; + + if ( $cgi->param('release_hold') ) { + push @errors, $cust_main->release_hold; + } } my $error = join(' / ', @errors) if scalar(@errors); diff --git a/httemplate/misc/unsuspend_cust.html b/httemplate/misc/unsuspend_cust.html index 600eb268a..4555a58b3 100644 --- a/httemplate/misc/unsuspend_cust.html +++ b/httemplate/misc/unsuspend_cust.html @@ -7,8 +7,7 @@ <P ALIGN="center"><B><% mt('Unsuspend this customer?') |h %></B> -<TABLE BORDER="0" CELLSPACING="2" -STYLE="margin-left:auto; margin-right:auto"> +<TABLE BORDER="0" CELLSPACING="2" STYLE="margin-left:auto; margin-right:auto"> <TR> <TD ALIGN="right"> <INPUT TYPE="radio" NAME="now_or_later" VALUE="0" onclick="toggle(false)" CHECKED /> @@ -26,6 +25,21 @@ STYLE="margin-left:auto; margin-right:auto"> } &> </TD> </TR> +% if ( $on_hold_pkgs > 0 ) { +<TR> + <TD ALIGN="right"> + <INPUT TYPE="checkbox" NAME="release_hold" VALUE="1" CHECKED \ + <% $susp_pkgs == 0 ? 'DISABLED' : '' %> /> + + </TD> + <TD ALIGN="left"> + <% emt('Activate [quant,_1,on-hold package,on-hold packages]', $on_hold_pkgs) %> + </TD> +</TR> +% } +% if ( $susp_pkgs == 0 ) { # then always release holds, or this will do nothing + <INPUT TYPE="hidden" NAME="release_hold" VALUE="1"> +% } </TABLE> <SCRIPT type="text/javascript"> function toggle(val) { @@ -64,5 +78,13 @@ my $cust_main = qsearchs( { } ); die "No customer # $custnum" unless $cust_main; +my $susp_pkgs = FS::cust_pkg->count( + FS::cust_pkg->susp_sql . " AND custnum = ?", $custnum +); + +my $on_hold_pkgs = FS::cust_pkg->count( + FS::cust_pkg->on_hold_sql . " AND custnum = ?", $custnum +); + </%init> diff --git a/httemplate/view/cust_main/packages/status.html b/httemplate/view/cust_main/packages/status.html index dbf3698e3..accdb4588 100644 --- a/httemplate/view/cust_main/packages/status.html +++ b/httemplate/view/cust_main/packages/status.html @@ -48,7 +48,8 @@ % % if ( $cust_pkg->get('susp') ) { #suspended or on hold % -% if ( $cust_pkg->order_date eq $cust_pkg->get('susp') ) { #status: on hold +% #if ( $cust_pkg->order_date eq $cust_pkg->get('susp') ) { # inconsistent with FS::cust_pkg::status +% if ( ! $cust_pkg->setup ) { #status: on hold <% pkg_status_row( $cust_pkg, emt('On Hold'), '', 'color'=>'7E0079', %opt ) %> |