use FS::part_pkg;
use FS::cust_bill_pkg_discount;
-@ISA = qw(FS::part_pkg);
+@ISA = qw(FS::part_pkg FS::part_pkg::prorate_Mixin);
tie my %temporalities, 'Tie::IxHash',
'upcoming' => "Upcoming (future)",
#used in cust_pkg.pm so could add to any price plan
'expire_months' => { 'name' => 'Auto-add an expiration date this number of months out',
},
+ 'adjourn_months'=> { 'name' => 'Auto-add a suspension date this number of months out',
+ },
#used in cust_pkg.pm so could add to any price plan where it made sense
'start_1st' => { 'name' => 'Auto-add a start date to the 1st, ignoring the current month.',
'type' => 'checkbox',
},
+ 'sync_bill_date' => { 'name' => 'Prorate first month to synchronize '.
+ 'with the customer\'s other packages',
+ 'type' => 'checkbox',
+ },
+ 'unsuspend_adjust_bill' =>
+ { 'name' => 'Adjust next bill date forward when '.
+ 'unsuspending',
+ 'type' => 'checkbox',
+ },
%usage_fields,
%usage_recharge_fields,
},
'fieldorder' => [ qw( setup_fee recur_fee
recur_temporality unused_credit
- expire_months start_1st
+ expire_months adjourn_months
+ start_1st sync_bill_date
+ unsuspend_adjust_bill
),
@usage_fieldorder, @usage_recharge_fieldorder,
qw( externalid ),
sub unit_setup {
my($self, $cust_pkg, $sdate, $details ) = @_;
- $self->option('setup_fee');
+ $self->option('setup_fee') || 0;
}
sub calc_recur {
- my($self, $cust_pkg, $sdate, $details, $param ) = @_;
+ my $self = shift;
+ my($cust_pkg, $sdate, $details, $param ) = @_;
#my $last_bill = $cust_pkg->last_bill;
my $last_bill = $cust_pkg->get('last_bill'); #->last_bill falls back to setup
return 0
if $self->option('recur_temporality', 1) eq 'preceding' && $last_bill == 0;
- my $br = $self->base_recur($cust_pkg);
-
- my $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param);
+ if( $self->option('sync_bill_date',1) ) {
+ return $self->calc_prorate(@_);
+ }
+ else {
+ my $charge = $self->base_recur($cust_pkg);
+ my $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param);
- sprintf('%.2f', $br - $discount);
+ return sprintf('%.2f', $charge - $discount);
+ }
}
sub calc_discount {
my $discount = $cust_pkg_discount->discount;
#UI enforces one or the other (for now? probably for good)
my $amount = 0;
- $amount += $discount->amount;
+ $amount += $discount->amount
+ if $cust_pkg->pkgpart == $param->{real_pkgpart};
$amount += sprintf('%.2f', $discount->percent * $br / 100 );
my $chg_months = $param->{'months'} || $cust_pkg->part_pkg->freq;
my $months = $discount->months
? min( $chg_months,
- $discount->months - $cust_pkg->months_used )
+ $discount->months - $cust_pkg_discount->months_used )
: $chg_months;
my $error = $cust_pkg_discount->increment_months_used($months);