Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / FS / FS / part_pkg / torrus_Common.pm
index d34f724..b32deab 100644 (file)
@@ -3,7 +3,18 @@ package FS::part_pkg::torrus_Common;
 use base qw( FS::part_pkg::prorate );
 use List::Util qw(max);
 
-our %info = ( 'disabled' => 1 ); #recur_Common not a usable price plan directly
+our %info = ( 'disabled' => 1 ); #torrus_Common not a usable price plan directly
+
+our $DEBUG = 1;
+
+sub recur_temporality { 'preceding'; }
+
+sub price_info {
+    my $self = shift;
+    my $str = $self->SUPER::price_info(@_);
+    $str .= " plus usage" if $str;
+    $str;
+}
 
 sub calc_recur {
   my $self = shift;
@@ -28,33 +39,66 @@ sub calc_usage {
   my $self = shift;
   my($cust_pkg, $sdate, $details, $param ) = @_;
 
-  my $rep_id = 2; #XXX find the one matching the timeframe
-  #SELECT id FROM WHERE reportname = 'MonthlyUsage' AND rep_date = ''
+  my @sdate = localtime($$sdate);
+  #sdate is next bill date, but we want the report from last month
+  my($m, $y) = ($sdate[4], $sdate[5]+1900);
+  if ( $m == 0 ) { $m=12; $y--; }
+  $m = "0$m" if length($m) == 1;
+  my $rep_date = "$y-$m-01";
+  warn "searching for MonthlyUsage report for $rep_date\n" if $DEBUG;
+  my $rep_sql = "
+    SELECT id FROM reports WHERE rep_date = ?
+                             AND reportname = 'MonthlyUsage' and iscomplete = 1
+  ";
+  my $rep_id = $self->scalar_sql($rep_sql, $rep_date) or return 0;
+  warn "report id $rep_id found\n" if $DEBUG;
 
-  #XXX abort if ! iscomplete?
+  #abort if ! iscomplete instead?
 
-  my $serviceid = 'TESTING_1'; #XXX from svc_port (loop?)
+  my $conf = new FS::Conf;
+  my $money_char = $conf->config('money_char') || '$';
 
   my $sql = "
     SELECT value FROM reportfields
       WHERE rep_id = $rep_id
         AND name = ?
-        AND servciceid = ?
+        AND serviceid = ?
   ";
-  
-  my $in  = $self->scalar_sql($sql, $self->_torrus_name, $serviceid.'_IN');
-  my $out = $self->scalar_sql($sql, $self->_torrus_name, $serviceid.'_OUT');
+  my $total = 0;
+  foreach my $svc_port (
+    grep $_->table('svc_port'), map $_->svc_x, $cust_pkg->cust_svc
+  ) {
 
-  my $max = max($in,$out);
+    my $serviceid = $svc_port->serviceid;
 
-  $max -= $self->option($self->_torrus_base);
-  return 0 if $max < 0;
+    warn "searching for $serviceid usage\n" if $DEBUG;
+    my $in  = $self->scalar_sql($sql, $self->_torrus_name, $serviceid.'_IN');
+    my $out = $self->scalar_sql($sql, $self->_torrus_name, $serviceid.'_OUT');
 
-  #XXX add usage details
+    my $max = max($in,$out);
+    warn "$serviceid usage is $max\n" if $DEBUG;
 
-  return sprintf('%.2f', $self->option($self->_torrus_rate) * $max );
+    my $inc = $self->option($self->_torrus_base);#aggregate instead of per-port?
+    $max -= $inc;
+    next if $max < 0;
 
-}
+    my $rate = $self->option($self->_torrus_rate);
+    my $amount = sprintf('%.2f', $rate * $max );
+    $total += $amount;
 
+    #add usage details to invoice
+    my $l = $self->_torrus_label;
+    my $d = "Last month's usage for $serviceid: ". sprintf('%.2f',$max). $l;
+    $d .= " (". ($max+$inc). "$l - $inc$l included)" if $inc;
+    $d .= " @ $money_char$rate/$l: $money_char$amount";
+
+    push @$details, $d;
+
+  }
+
+  return sprintf('%.2f', $total );
+
+}
 
 1;