},
{
- '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',
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
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
=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
my $unitsetup = 0;
my @setup_discounts = ();
my %setup_param = ( 'discounts' => \@setup_discounts );
+ # 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'}
&& ( ! $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') )
+ )
)
)
{
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;
@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);
<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 />
} &>
</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) {
} );
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>
%
% 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 ) %>