fix quotations vs. currency_fixed price plan, RT#26810, RT#21565
authorIvan Kohler <ivan@freeside.biz>
Tue, 25 Mar 2014 19:59:42 +0000 (12:59 -0700)
committerIvan Kohler <ivan@freeside.biz>
Tue, 25 Mar 2014 19:59:42 +0000 (12:59 -0700)
FS/FS/part_pkg/currency_fixed.pm
FS/FS/quotation_pkg.pm

index bbd95e8..41d7a65 100644 (file)
@@ -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?)
index c98e0f9..79cce80 100644 (file)
@@ -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<FS::part_pkg_currency>).  Otherwise, if the customer or
+prospect has no currency, is the regular option value for the given name (see
+L<FS::part_pkg_option>).
+
+=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<FS::prospect_main> object).
+
+=cut
+
+sub prospect_main {
+  my $self = shift;
+  my $quotation = FS::quotation->by_key($self->quotationnum) or return '';
+  $quotation->prospect_main;
+}
+
 =back
 
 =head1 BUGS