credit sources, RT#28917
[freeside.git] / FS / FS / part_pkg.pm
index 59bc051..d2f2f86 100644 (file)
@@ -1665,7 +1665,7 @@ recur_cost divided by freq (only supported for monthly and longer frequencies)
 sub recur_cost_permonth {
   my($self, $cust_pkg) = @_;
   return 0 unless $self->freq =~ /^\d+$/ && $self->freq > 0;
-  sprintf('%.2f', $self->recur_cost / $self->freq );
+  sprintf('%.2f', ($self->recur_cost || 0) / $self->freq );
 }
 
 =item cust_bill_pkg_recur CUST_PKG
@@ -1710,7 +1710,7 @@ unit_setup minus setup_cost
 
 sub setup_margin {
   my $self = shift;
-  $self->unit_setup(@_) - $self->setup_cost;
+  $self->unit_setup(@_) - ($self->setup_cost || 0);
 }
 
 =item recur_margin_permonth
@@ -1771,7 +1771,7 @@ sub parse {
 # Used by FS::Upgrade to migrate to a new database.
 
 sub _upgrade_data { # class method
-  my($class, %opts) = @_;
+   my($class, %opts) = @_;
 
   warn "[FS::part_pkg] upgrading $class\n" if $DEBUG;
 
@@ -1791,6 +1791,49 @@ sub _upgrade_data { # class method
     $part_pkg->replace;
 
   }
+
+  # Convert RADIUS accounting usage metrics from megabytes to gigabytes
+  # (FS RT#28105)
+  my $upgrade = 'part_pkg_gigabyte_usage';
+  if (!FS::upgrade_journal->is_done($upgrade)) {
+    foreach my $part_pkg (qsearch('part_pkg',
+                                 { plan => 'sqlradacct_hour' })
+                        ){
+
+      my $pkgpart = $part_pkg->pkgpart;
+
+      foreach my $opt (qsearch('part_pkg_option',
+                              { 'optionname'  => { op => 'LIKE',
+                                                   value => 'recur_included_%',
+                                                 },
+                                pkgpart => $pkgpart,
+                              })){
+
+        next if $opt->optionname eq 'recur_included_hours'; # unfortunately named field
+        next if $opt->optionvalue == 0;
+
+       $opt->optionvalue($opt->optionvalue / 1024);
+
+       my $error = $opt->replace;
+       die $error if $error;
+      }
+
+      foreach my $opt (qsearch('part_pkg_option',
+                              { 'optionname'  => { op => 'LIKE',
+                                                   value => 'recur_%_charge',
+                                                 },
+                                pkgpart => $pkgpart,
+                              })){
+       $opt->optionvalue($opt->optionvalue * 1024);
+
+       my $error = $opt->replace;
+       die $error if $error;
+      }
+
+    }
+    FS::upgrade_journal->set_done($upgrade);
+  }
+
   # the rest can be done asynchronously
 }