X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_pkg%2Fflat.pm;h=7bc44e17670af8089969a18eeffa8179c113dbdf;hb=87a59b1bdf236765177c27ab18390ef1317cc34c;hp=f86db2ef4bf3a839bccd9991c4a1b223327c21db;hpb=ea830c61145a0c659f24e55a4640db4e2036c06f;p=freeside.git diff --git a/FS/FS/part_pkg/flat.pm b/FS/FS/part_pkg/flat.pm index f86db2ef4..7bc44e176 100644 --- a/FS/FS/part_pkg/flat.pm +++ b/FS/FS/part_pkg/flat.pm @@ -98,12 +98,16 @@ tie my %contract_years, 'Tie::IxHash', ( sub price_info { my $self = shift; + my %opt = @_; 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 $setup = $opt{cust_pkg} ? $self->base_setup( $opt{cust_pkg} ) + : ($self->option('setup_fee') || 0); + my $recur = $opt{cust_pkg} ? $self->base_recur( $opt{cust_pkg} ) + : ($self->option('recur_fee', 1) || 0); + $recur += $self->usageprice_recur( $opt{cust_pkg} ) if $opt{cust_pkg}; my $str = ''; - $str = $money_char . $setup . ($recur ? ' setup ' : ' one-time') if $setup; + $str = $money_char . $setup . ($recur ? ' setup' : ' one-time') if $setup; $str .= ', ' if ($setup && $recur); $str .= $money_char. $recur. '/'. $self->freq_pretty if $recur; $str; @@ -120,9 +124,7 @@ sub calc_setup { push @$details, $self->option( 'additional_info' . $i++ ); } - my $quantity = $cust_pkg->quantity || 1; - - my $charge = $quantity * $self->unit_setup($cust_pkg, $sdate, $details); + my $charge = $self->base_setup($cust_pkg, $sdate, $details); my $discount = 0; if ( $charge > 0 ) { @@ -131,10 +133,10 @@ sub calc_setup { delete $param->{'setup_charge'}; } - sprintf('%.2f', $charge - $discount); + sprintf( '%.2f', ($cust_pkg->quantity || 1) * ($charge - $discount) ); } -sub unit_setup { +sub base_setup { my($self, $cust_pkg, $sdate, $details ) = @_; $self->option('setup_fee') || 0; @@ -151,8 +153,9 @@ sub calc_recur { if $self->recur_temporality eq 'preceding' && !$last_bill; my $charge = $self->base_recur($cust_pkg, $sdate); - if ( my $cutoff_day = $self->cutoff_day($cust_pkg) ) { - $charge = $self->calc_prorate(@_, $cutoff_day); + # always treat cutoff_day as a list + if ( my @cutoff_day = $self->cutoff_day($cust_pkg) ) { + $charge = $self->calc_prorate(@_, @cutoff_day); } elsif ( $param->{freq_override} ) { # XXX not sure if this should be mutually exclusive with sync_bill_date. @@ -161,11 +164,12 @@ sub calc_recur { $charge *= $param->{freq_override} if $param->{freq_override}; } - my $quantity = $cust_pkg->quantity || 1; - $charge *= $quantity; + $charge += $self->usageprice_recur($cust_pkg, $sdate); + $cust_pkg->apply_usageprice(); #$sdate for prorating? my $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param); - return sprintf('%.2f', $charge - $discount); + + sprintf( '%.2f', ($cust_pkg->quantity || 1) * ($charge - $discount) ); } sub cutoff_day { @@ -177,7 +181,7 @@ sub cutoff_day { return (localtime($next_bill))[3]; } } - return 0; + return (); } sub base_recur { @@ -193,6 +197,15 @@ sub base_recur_permonth { sprintf('%.2f', $self->base_recur($cust_pkg) / $self->freq ); } +sub usageprice_recur { + my($self, $cust_pkg, $sdate) = @_; + + my $recur = 0; + $recur += $_->price foreach $cust_pkg->cust_pkg_usageprice; + + sprintf('%.2f', $recur); +} + sub calc_cancel { my $self = shift; my $conf = new FS::Conf; @@ -260,6 +273,8 @@ sub can_start_date { ! shift->option('start_1st', 1) } sub can_discount { 1; } +sub can_usageprice { 1; } + sub recur_temporality { my $self = shift; $self->option('recur_temporality', 1);