From 0692ff47a2eac65616bf24104a51e558506f1b8f Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Tue, 25 Mar 2014 12:59:42 -0700 Subject: [PATCH] fix quotations vs. currency_fixed price plan, RT#26810, RT#21565 --- FS/FS/part_pkg/currency_fixed.pm | 12 +++++++----- FS/FS/quotation_pkg.pm | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/FS/FS/part_pkg/currency_fixed.pm b/FS/FS/part_pkg/currency_fixed.pm index bbd95e872..41d7a657e 100644 --- a/FS/FS/part_pkg/currency_fixed.pm +++ b/FS/FS/part_pkg/currency_fixed.pm @@ -54,9 +54,10 @@ sub calc_setup { use FS::Conf; sub calc_currency_option { - my($self, $optionname, $cust_pkg, $sdate, $details, $param) = @_; + my($self, $optionname, $cust_or_quotation_pkg, $sdate, $details, $param) = @_; - my($currency, $amount) = $cust_pkg->part_pkg_currency_option($optionname); + my($currency, $amount) = + $cust_or_quotation_pkg->part_pkg_currency_option($optionname); return sprintf('%.2f', $amount ) unless $currency; $param->{'billed_currency'} = $currency; @@ -73,9 +74,10 @@ sub calc_currency_option { } sub base_recur { - my( $self, $cust_pkg, $sdate, $details, $param ) = @_; - $param ||= {}; - $self->calc_currency_option('recur_fee', $cust_pkg, $sdate, $details, $param); + my( $self, $cust_or_quotation_pkg, $sdate, $details, $param ) = @_; + $self->calc_currency_option( + 'recur_fee', $cust_or_quotation_pkg, $sdate, $details, $param || {} + ); } sub can_discount { 0; } #can't discount yet (percentage would work, but amount?) diff --git a/FS/FS/quotation_pkg.pm b/FS/FS/quotation_pkg.pm index c98e0f98b..79cce80fa 100644 --- a/FS/FS/quotation_pkg.pm +++ b/FS/FS/quotation_pkg.pm @@ -157,13 +157,37 @@ sub recur { my $self = shift; return '0.00' if $self->{'_NO_RECUR_KLUDGE'}; my $part_pkg = $self->part_pkg; - my $recur = $part_pkg->can('base_recur') ? $part_pkg->base_recur + my $recur = $part_pkg->can('base_recur') ? $part_pkg->base_recur($self) : $part_pkg->option('recur_fee'); #XXX discounts $recur *= $self->quantity if $self->quantity; sprintf('%.2f', $recur); } +=item part_pkg_currency_option OPTIONNAME + +Returns a two item list consisting of the currency of this quotation's customer +or prospect, if any, and a value for the provided option. If the customer or +prospect has a currency, the value is the option value the given name and the +currency (see L). Otherwise, if the customer or +prospect has no currency, is the regular option value for the given name (see +L). + +=cut + +#false laziness w/cust_pkg->part_pkg_currency_option +sub part_pkg_currency_option { + my( $self, $optionname ) = @_; + my $part_pkg = $self->part_pkg; + my $prospect_or_customer = $self->cust_main || $self->prospect_main; + if ( my $currency = $prospect_or_customer->currency ) { + ($currency, $part_pkg->part_pkg_currency_option($currency, $optionname) ); + } else { + ('', $part_pkg->option($optionname) ); + } +} + + =item cust_bill_pkg_display [ type => TYPE ] =cut @@ -213,6 +237,18 @@ sub cust_main { $quotation->cust_main; } +=item prospect_main + +Returns the prospect (L object). + +=cut + +sub prospect_main { + my $self = shift; + my $quotation = FS::quotation->by_key($self->quotationnum) or return ''; + $quotation->prospect_main; +} + =back =head1 BUGS -- 2.11.0