'with the customer\'s other packages',
'type' => 'checkbox',
},
+ 'prorate_defer_bill' => {
+ 'name' => 'When synchronizing, defer the bill until '.
+ 'the customer\'s next bill date',
+ 'type' => 'checkbox',
+ },
'suspend_bill' => { 'name' => 'Continue recurring billing while suspended',
'type' => 'checkbox',
},
'fieldorder' => [ qw( recur_temporality
expire_months adjourn_months
contract_end_months
- start_1st sync_bill_date
+ start_1st sync_bill_date prorate_defer_bill
suspend_bill unsuspend_adjust_bill
externalid ),
],
'weight' => 10,
);
+sub price_info {
+ my $self = shift;
+ my $conf = new FS::Conf;
+ my $money_char = $conf->config('money_char') || '$';
+ my $setup = $self->option('setup_fee') || 0;
+ my $recur = $self->option('recur_fee', 1) || 0;
+ my $str = '';
+ $str = $money_char . $setup . ' one-time' if $setup;
+ $str .= ', ' if ($setup && $recur);
+ $str .= $money_char . $recur . ' recurring ' if $recur;
+ $str;
+}
+
sub calc_setup {
my($self, $cust_pkg, $sdate, $details ) = @_;
+ return 0 if $self->prorate_setup($cust_pkg, $sdate);
+
my $i = 0;
my $count = $self->option( 'additional_count', 'quiet' ) || 0;
while ($i < $count) {
my $quantity = $cust_pkg->quantity || 1;
- sprintf("%.2f", $quantity * $self->unit_setup($cust_pkg, $sdate, $details) );
+ my $charge = $quantity * $self->unit_setup($cust_pkg, $sdate, $details);
+ sprintf('%.2f', $charge);
}
sub unit_setup {
return 0
if $self->option('recur_temporality', 1) eq 'preceding' && $last_bill == 0;
- my $charge = $self->base_recur($cust_pkg);
- if ( $self->option('sync_bill_date',1) ) {
- my $next_bill = $cust_pkg->cust_main->next_bill_date;
- if ( defined($next_bill) ) {
- my $cutoff_day = (localtime($next_bill))[3];
- $charge = $self->calc_prorate(@_, $cutoff_day);
- }
+ my $charge = $self->base_recur($cust_pkg, $sdate);
+ if ( my $cutoff_day = $self->cutoff_day($cust_pkg) ) {
+ $charge = $self->calc_prorate(@_);
}
elsif ( $param->{freq_override} ) {
# XXX not sure if this should be mutually exclusive with sync_bill_date.
return sprintf('%.2f', $charge - $discount);
}
+sub cutoff_day {
+ my $self = shift;
+ my $cust_pkg = shift;
+ if ( $self->option('sync_bill_date',1) ) {
+ my $next_bill = $cust_pkg->cust_main->next_bill_date;
+ if ( defined($next_bill) ) {
+ return (localtime($next_bill))[3];
+ }
+ }
+ return 0;
+}
+
sub base_recur {
- my($self, $cust_pkg) = @_;
+ my($self, $cust_pkg, $sdate) = @_;
$self->option('recur_fee', 1) || 0;
}
my $next_bill = $cust_pkg->getfield('bill') || 0;
- return 0 if ! $self->base_recur($cust_pkg)
+ return 0 if ! $self->base_recur($cust_pkg, \$time)
|| ! $next_bill
|| $next_bill < $time;
my $freq_sec = $1 * $sec{$2||'m'};
return 0 unless $freq_sec;
- sprintf("%.2f", $self->base_recur($cust_pkg) * ( $next_bill - $time ) / $freq_sec );
+ sprintf("%.2f", $self->base_recur($cust_pkg, \$time) * ( $next_bill - $time ) / $freq_sec );
}