package FS::part_pkg::prorate_Mixin;
use strict;
-use vars qw(@ISA %info);
-use Time::Local qw(timelocal);
+use vars qw( %info );
+use Time::Local qw( timelocal );
-@ISA = qw(FS::part_pkg);
%info = (
'disabled' => 1,
);
Takes all the arguments of calc_recur, followed by a day of the month
to prorate to (which must be <= 28). Calculates a prorated charge from
the $sdate to that day, and sets the $sdate and $param->{months} accordingly.
+base_recur() will be called to determine the base price per billing cycle.
Options:
-- recur_fee: The charge to use for a complete billing period.
- add_full_period: Bill for the time up to the prorate day plus one full
billing period after that.
- prorate_round_day: Round the current time to the nearest full day,
my $self = shift;
my ($cust_pkg, $sdate, $details, $param, $cutoff_day) = @_;
- my $charge = $self->option('recur_fee',1) || 0;
+ my $charge = $self->base_recur($cust_pkg, $sdate) || 0;
if($cutoff_day) {
# only works for freq >= 1 month; probably can't be fixed
my $mnow = $$sdate;
my ($sec, $min, $hour, $mday, $mon, $year) = (localtime($mnow))[0..5];
if( $self->option('prorate_round_day',1) ) {
- $mday++ if $hour >= 12;
+ # If the time is 12:00-23:59, move to the next day by adding 18
+ # hours to $mnow. Because of DST this can end up from 05:00 to 18:59
+ # but it's always within the next day.
+ $mnow += 64800 if $hour >= 12;
+ # Get the new day, month, and year.
+ ($mday,$mon,$year) = (localtime($mnow))[3..5];
+ # Then set $mnow to midnight on that date.
$mnow = timelocal(0,0,0,$mday,$mon,$year);
}
my $mend;
$mend =
timelocal(0,0,0,$cutoff_day,$mon,$year);
$mstart =
- timelocal(0,0,0,$cutoff_day,$mon == 0 ? 11 : $mon - 1,$year-($mon==11));
+ timelocal(0,0,0,$cutoff_day,$mon == 0 ? 11 : $mon - 1,$year-($mon==0));
}
# next bill date will be figured as $$sdate + one period
my $permonth = $charge / $self->freq;
my $months = ( ( $self->freq - 1 ) + ($mend-$mnow) / ($mend-$mstart) );
- if ( $self->option('add_full_period',1) ) {
- # charge a full period in addition to the partial month
+ # add a full period if currently billing for a partial period
+ if ( $self->option('add_full_period',1) and $months < $self->freq ) {
$months += $self->freq;
$$sdate = $self->add_freq($mstart);
}