daily/weekly billing
[freeside.git] / FS / FS / part_pkg.pm
index 99d88d5..695d48c 100644 (file)
@@ -180,6 +180,8 @@ insert and replace methods.
 sub check {
   my $self = shift;
 
+  for (qw(setup recur)) { $self->set($_=>0) if $self->get($_) =~ /^\s*$/; }
+
   my $conf = new FS::Conf;
   if ( $conf->exists('safe-part_pkg') ) {
 
@@ -227,11 +229,19 @@ sub check {
 
   }
 
+  if ( $self->dbdef_table->column('freq')->type =~ /(int)/i ) {
+    my $error = $self->ut_number('freq');
+    return $error if $error;
+  } else {
+    $self->freq =~ /^(\d+[dw]?)$/
+      or return "Illegal or empty freq: ". $self->freq;
+    $self->freq($1);
+  }
+
     $self->ut_numbern('pkgpart')
       || $self->ut_text('pkg')
       || $self->ut_text('comment')
       || $self->ut_anything('setup')
-      || $self->ut_number('freq')
       || $self->ut_anything('recur')
       || $self->ut_alphan('plan')
       || $self->ut_anything('plandata')
@@ -239,6 +249,7 @@ sub check {
       || $self->ut_enum('recurtax', [ '', 'Y' ] )
       || $self->ut_textn('taxclass')
       || $self->ut_enum('disabled', [ '', 'Y' ] )
+      || $self->SUPER::check
     ;
 }
 
@@ -265,11 +276,12 @@ SVCDB is specified and does not match the svcdb of the service definition,
 
 sub svcpart {
   my $self = shift;
-  my $svcdb = shift;
-  my @pkg_svc = $self->pkg_svc;
-  return '' if scalar(@pkg_svc) != 1
-               || $pkg_svc[0]->quantity != 1
-               || ( $svcdb && $pkg_svc[0]->part_svc->svcdb ne $svcdb );
+  my $svcdb = scalar(@_) ? shift : '';
+  my @pkg_svc = grep {
+    $_->quantity == 1
+    && ( $svcdb eq $_->part_svc->svcdb || !$svcdb )
+  } $self->pkg_svc;
+  return '' if scalar(@pkg_svc) != 1;
   $pkg_svc[0]->svcpart;
 }