RT#71166: Catch blank intro_duration at package definition setup
[freeside.git] / FS / FS / part_pkg / flat_introrate.pm
index 1fc9cd2..786841b 100644 (file)
@@ -6,6 +6,31 @@ use vars qw( %info );
 
 use FS::Log;
 
+# mostly false laziness with FS::part_pkg::global_Mixin::validate_moneyn,
+# except for blank string handling...
+sub validate_money {
+  my ($option, $valref) = @_;
+  if ( $$valref eq '' ) {
+    $$valref = '0';
+  } elsif ( $$valref =~ /^\s*(\d*)(\.\d{1})\s*$/ ) {
+    #handle one decimal place without barfing out
+    $$valref = ( ($1||''). ($2.'0') ) || 0;
+  } elsif ( $$valref =~ /^\s*(\d*)(\.\d{2})?\s*$/ ) {
+    $$valref = ( ($1||''). ($2||'') ) || 0;
+  } else {
+    return "Illegal (money) $option: ". $$valref;
+  }
+  return '';
+}
+
+sub validate_number {
+  my ($option, $valref) = @_;
+  $$valref = 0 unless $$valref;
+  return "Invalid $option"
+    unless ($$valref) = ($$valref =~ /^\s*(\d+)\s*$/);
+  return '';
+}
+
 %info = (
   'name' => 'Introductory price for X months, then flat rate,'.
             'relative to setup date (anniversary billing)',
@@ -14,10 +39,12 @@ use FS::Log;
   'fields' => {
     'intro_fee' => { 'name' => 'Introductory recurring fee for this package',
                      'default' => 0,
+                     'validate' => \&validate_money,
                    },
     'intro_duration' =>
          { 'name' => 'Duration of the introductory period, in number of months',
            'default' => 0,
+           'validate' => \&validate_number,
          },
   },
   'fieldorder' => [ qw(intro_duration intro_fee) ],