X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Frecur_Common.pm;h=7233cc67feba810c9201ee0e69088b66a0851b81;hp=71f3af718b29bd050194a6875d5e6678f33fedfc;hb=aed8ec35ccb9cdeb7ea0cb6ff2946f9d83d582f6;hpb=a67fd3bbfeec137ebf494e36eaa920145b8509a1 diff --git a/FS/FS/part_pkg/recur_Common.pm b/FS/FS/part_pkg/recur_Common.pm index 71f3af718..7233cc67f 100644 --- a/FS/FS/part_pkg/recur_Common.pm +++ b/FS/FS/part_pkg/recur_Common.pm @@ -1,12 +1,12 @@ package FS::part_pkg::recur_Common; +use base qw( FS::part_pkg::flat ); use strict; -use vars qw( @ISA %recur_method ); +use vars qw( %info %recur_method ); use Tie::IxHash; use Time::Local; -use FS::part_pkg::prorate; -@ISA = qw(FS::part_pkg::prorate); +%info = ( 'disabled' => 1 ); #recur_Common not a usable price plan directly tie %recur_method, 'Tie::IxHash', 'anniversary' => 'Charge the recurring fee at the frequency specified above', @@ -14,6 +14,41 @@ tie %recur_method, 'Tie::IxHash', 'subscription' => 'Charge the full fee for the first partial period (selectable billing date)', ; +sub base_recur { + my $self = shift; + $self->option('recur_fee', 1) || 0; +} + +sub calc_setup { + # moved from all descendant packages which just had $self->option('setup_fee') + my($self, $cust_pkg, $sdate, $details, $param) = @_; + + return 0 if $self->prorate_setup($cust_pkg, $sdate); + + my $charge = $self->option('setup_fee'); + + my $discount = 0; + if ( $charge > 0 ) { + $param->{'setup_charge'} = $charge; + $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param); + delete $param->{'setup_charge'}; + } + + sprintf('%.2f', $charge - $discount); +} + +sub cutoff_day { + # prorate/subscription only; we don't support sync_bill_date here + my $self = shift; + my $cust_pkg = shift; + my $recur_method = $self->option('recur_method',1) || 'anniversary'; + if ( $recur_method eq 'prorate' or $recur_method eq 'subscription' ) { + return $self->option('cutoff_day',1) || 1; + } else { + return 0; + } +} + sub calc_recur_Common { my $self = shift; my($cust_pkg, $sdate, $details, $param ) = @_; #only need $sdate & $param @@ -23,34 +58,34 @@ sub calc_recur_Common { if ( $param->{'increment_next_bill'} ) { my $recur_method = $self->option('recur_method', 1) || 'anniversary'; - - if ( $recur_method eq 'prorate' ) { + my $cutoff_day = $self->cutoff_day($cust_pkg); - $charges = $self->SUPER::calc_recur(@_); + $charges = $self->base_recur($cust_pkg); + $charges += $param->{'override_charges'} if $param->{'override_charges'}; - } else { + if ( $recur_method eq 'prorate' ) { - $charges = $self->option('recur_fee'); + $charges = $self->calc_prorate(@_, $cutoff_day); + $charges += $param->{'override_charges'} if $param->{'override_charges'}; - if ( $recur_method eq 'subscription' ) { + } elsif ( $recur_method eq 'subscription' ) { - my $cutoff_day = $self->option('cutoff_day', 1) || 1; - my ($day, $mon, $year) = ( localtime($$sdate) )[ 3..5 ]; + my ($day, $mon, $year) = ( localtime($$sdate) )[ 3..5 ]; - if ( $day < $cutoff_day ) { - if ( $mon == 0 ) { $mon=11; $year--; } - else { $mon--; } - } + if ( $day < $cutoff_day ) { + if ( $mon == 0 ) { $mon=11; $year--; } + else { $mon--; } + } - $$sdate = timelocal(0, 0, 0, $cutoff_day, $mon, $year); + $$sdate = timelocal(0, 0, 0, $cutoff_day, $mon, $year); - }#$recur_method eq 'subscription' + }#$recur_method - }#$recur_method eq 'prorate' + $charges -= $self->calc_discount( $cust_pkg, $sdate, $details, $param ); }#increment_next_bill - $charges; + return $charges; }