add granularity to single_price CDR rating, RT#5495
[freeside.git] / FS / FS / part_pkg / voip_cdr.pm
index 5a43403..ee00914 100644 (file)
@@ -4,17 +4,16 @@ use strict;
 use vars qw(@ISA $DEBUG %info);
 use Date::Format;
 use Tie::IxHash;
-use Time::Local;
 use FS::Conf;
 use FS::Record qw(qsearchs qsearch);
-use FS::part_pkg::flat;
+use FS::part_pkg::recur_Common;
 use FS::cdr;
 use FS::rate;
 use FS::rate_prefix;
 use FS::rate_detail;
 use FS::part_pkg::recur_Common;
 
-@ISA = qw(FS::part_pkg::prorate);
+@ISA = qw(FS::part_pkg::recur_Common);
 
 $DEBUG = 0;
 
@@ -36,6 +35,8 @@ tie my %temporalities, 'Tie::IxHash',
   'preceding' => "Preceding (past)",
 ;
 
+tie my %granularity, 'Tie::IxHash', FS::rate_detail::granularities();
+
 %info = (
   'name' => 'VoIP rating by plan of CDR records in an internal (or external) SQL table',
   'shortname' => 'VoIP/telco CDR rating (standard)',
@@ -67,7 +68,7 @@ tie my %temporalities, 'Tie::IxHash',
                          #'type' => 'radio',
                          #'options' => \%recur_method,
                          'type' => 'select',
-                         'select_options' => \%FS::part_pkg::recur_common::recur_method,
+                         'select_options' => \%FS::part_pkg::recur_Common::recur_method,
                        },
 
     'rating_method' => { 'name' => 'Rating method',
@@ -83,9 +84,13 @@ tie my %temporalities, 'Tie::IxHash',
                    },
 
     'min_charge' => { 'name' => 'Charge per minute when using "single price per minute" rating method',
-                      'type' => 'money',
                     },
 
+    'sec_granularity' => { 'name' => 'Granularity when using "single price per minute" rating method',
+                           'type' => 'select',
+                           'select_options' => \%granularity,
+                         },
+
     'ignore_unrateable' => { 'name' => 'Ignore calls without a rate in the rate tables.  By default, the system will throw a fatal error upon encountering unrateable calls.',
                              'type' => 'checkbox',
                            },
@@ -151,6 +156,7 @@ tie my %temporalities, 'Tie::IxHash',
     '411_rewrite' => { 'name' => 'Rewrite these (comma-separated) destination numbers to 411 for rating purposes (also ignore any carrierid check): ',
                       },
 
+    #false laziness w/cdr_termination.pm
     'output_format' => { 'name' => 'CDR invoice display format',
                          'type' => 'select',
                          'select_options' => { FS::cdr::invoice_formats() },
@@ -163,6 +169,7 @@ tie my %temporalities, 'Tie::IxHash',
     'summarize_usage' => { 'name' => 'Include usage summary with recurring charges when usage is in separate section',
                           'type' => 'checkbox',
                         },
+    #eofalse
 
     'bill_every_call' => { 'name' => 'Generate an invoice immediately for every call.  Useful for prepaid.',
                            'type' => 'checkbox',
@@ -199,7 +206,8 @@ tie my %temporalities, 'Tie::IxHash',
   'fieldorder' => [qw(
                        setup_fee recur_fee recur_temporality unused_credit
                        recur_method cutoff_day
-                       rating_method ratenum min_charge ignore_unrateable
+                       rating_method ratenum min_charge sec_granularity
+                       ignore_unrateable
                        default_prefix
                        disable_src
                        domestic_prefix international_prefix
@@ -464,21 +472,25 @@ sub calc_usage {
 
         # a little false laziness w/below
 
-        my $granularity = 60;
+        my $granularity = length($self->option('sec_granularity'))
+                            ? $self->option('sec_granularity')
+                            : 60;
 
                     # length($cdr->billsec) ? $cdr->billsec : $cdr->duration;
         my $seconds = $use_duration ? $cdr->duration : $cdr->billsec;
 
         $seconds += $granularity - ( $seconds % $granularity )
           if $seconds      # don't granular-ize 0 billsec calls (bills them)
-          ;#&& $granularity; # 0 is per call
-        my $minutes = sprintf("%.1f", $seconds / 60);
-        $minutes =~ s/\.0$// ;# if $granularity == 60;
+          && $granularity; # 0 is per call
+        my $minutes = $seconds / 60; # sprintf("%.1f", 
+        #$minutes =~ s/\.0$// if $granularity == 60;
 
-        $charge = sprintf('%.2f', ( $self->option('min_charge') * $minutes )
-                                  + 0.00000001 ); #so 1.005 rounds to 1.01
+        # XXX config?
+        #$charge = sprintf('%.2f', ( $self->option('min_charge') * $minutes )
+                                  #+ 0.00000001 ); #so 1.005 rounds to 1.01
+        $charge = sprintf('%.4f', ( $self->option('min_charge') * $minutes )
+                                  + 0.0000000001 ); #so 1.00005 rounds to 1.0001
 
-        $charge =  
         $charges += $charge;
 
         @call_details = ($cdr->downstream_csv( 'format' => $output_format,
@@ -556,13 +568,16 @@ sub calc_usage {
         if ( $charge > 0 ) {
           #just use FS::cust_bill_pkg_detail objects?
           my $call_details;
+          my $phonenum = $cust_svc->svc_x->phonenum;
 
           #if ( $self->option('rating_method') eq 'upstream_simple' ) {
           if ( scalar(@call_details) == 1 ) {
-            $call_details = [ 'C', $call_details[0], $charge, $classnum ];
+            $call_details =
+              [ 'C', $call_details[0], $charge, $classnum, $phonenum ];
           } else { #only used for $rating_method eq 'upstream' now
             $csv->combine(@call_details);
-            $call_details = [ 'C', $csv->string, $charge, $classnum ];
+            $call_details =
+              [ 'C', $csv->string, $charge, $classnum, $phonenum ];
           }
           warn "  adding details on charge to invoice: [ ".
               join(', ', @{$call_details} ). " ]"
@@ -683,11 +698,6 @@ sub is_free {
   0;
 }
 
-sub base_recur {
-  my($self, $cust_pkg) = @_;
-  $self->option('recur_fee');
-}
-
 #  This equates svc_phone records; perhaps svc_phone should have a field
 #  to indicate it represents a line
 sub calc_units {