clarify interface difference between calc_setup and calc_recur: calc_setup takes...
[freeside.git] / FS / FS / part_pkg / currency_fixed.pm
index bee6c5b..d4c1487 100644 (file)
@@ -5,7 +5,8 @@ use base qw( FS::part_pkg::recur_Common );
 
 use strict;
 use vars qw( %info );
 
 use strict;
 use vars qw( %info );
-#use FS::Record qw(qsearch qsearchs);
+use FS::Record qw(qsearchs); # qsearch qsearchs);
+use FS::currency_exchange;
 
 %info = (
   'name' => 'Per-currency pricing from package definitions',
 
 %info = (
   'name' => 'Per-currency pricing from package definitions',
@@ -26,42 +27,74 @@ use vars qw( %info );
   },
   'fieldorder' => [qw( recur_method cutoff_day ),
                    FS::part_pkg::prorate_Mixin::fieldorder,
   },
   'fieldorder' => [qw( recur_method cutoff_day ),
                    FS::part_pkg::prorate_Mixin::fieldorder,
-                  )],
+                  ],
   'weight' => '59',
 );
 
 sub price_info {
     my $self = shift;
   'weight' => '59',
 );
 
 sub price_info {
     my $self = shift;
-    my $str = $self->SUPER::price_info;
+    my $str = $self->SUPER::price_info(@_);
     $str .= " (or local currency pricing)" if $str;
     $str;
 }
 
     $str .= " (or local currency pricing)" if $str;
     $str;
 }
 
-#some false laziness w/recur_Common, could have been better about it.. pry when
-# we do discounting
+sub base_setup {
+  my($self, $cust_pkg, $time, $details, $param ) = @_;
+
+  $self->calc_currency_option('setup_fee', $cust_pkg, $time, $details, $param);
+}
+
 sub calc_setup {
 sub calc_setup {
-  my($self, $cust_pkg, $sdate, $details, $param) = @_;
+  my($self, $cust_pkg, $time, $details, $param) = @_;
 
 
-  return 0 if $self->prorate_setup($cust_pkg, $sdate);
+  return 0 if $self->prorate_setup($cust_pkg, $time);
 
 
-  sprintf('%.2f', $cust_pkg->part_pkg_currency_option('setup_fee') );
+  $self->base_setup($cust_pkg, $time, $details, $param);
+}
+
+use FS::Conf;
+sub calc_currency_option {
+  my($self, $optionname, $cust_or_quotation_pkg, $time, $details, $param) = @_;
+
+  my($currency, $amount) =
+    $cust_or_quotation_pkg->part_pkg_currency_option($optionname);
+  return sprintf('%.2f', $amount ) unless $currency;
+
+  $param->{'billed_currency'} = $currency;
+  $param->{'billed_amount'}   = $amount;
+
+  my $currency_exchange = qsearchs('currency_exchange', {
+    'from_currency' => $currency,
+    'to_currency'   => ( FS::Conf->new->config('currency') || 'USD' ),
+  }) or die "No exchange rate from $currency\n";
+
+  #XXX do we want the rounding here to work differently?
+  #my $recognized_amount =
+  sprintf('%.2f', $amount * $currency_exchange->rate);
 }
 
 sub base_recur {
 }
 
 sub base_recur {
-  my( $self, $cust_pkg ) = @_;
-  sprintf('%.2f', $cust_pkg->part_pkg_currency_option('recur_fee') );
+  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?)
 sub calc_recur {
   my $self = shift;
 }
 
 sub can_discount { 0; } #can't discount yet (percentage would work, but amount?)
 sub calc_recur {
   my $self = shift;
+
   #my($cust_pkg, $sdate, $details, $param ) = @_;
   #my($cust_pkg, $sdate, $details, $param ) = @_;
-  #$self->calc_recur_Common($cust_pkg,$sdate,$details,$param);
-  $self->calc_recur_Common(@_);
+  my $cust_pkg = $_[0];
+
+  ($cust_pkg->quantity || 1) * $self->calc_recur_Common(@_); #($cust_pkg,$sdate,$details,$param);
+
 }
 
 sub is_free { 0; }
 
 sub can_currency_exchange { 1; }
 
 }
 
 sub is_free { 0; }
 
 sub can_currency_exchange { 1; }
 
+sub can_usageprice { 0; }
+
 1;
 1;