per-agent disable_previous_balance, #15863
[freeside.git] / FS / FS / discount.pm
index 6771510..88cbdd4 100644 (file)
@@ -54,6 +54,11 @@ months
 
 disabled
 
+=item setup - apply discount to setup fee (not just to recurring fee)
+
+If the discount is based on a percentage, then the % will be applied to the
+setup and recurring portions. 
+
 =back
 
 =head1 METHODS
@@ -113,6 +118,16 @@ and replace methods.
 sub check {
   my $self = shift;
 
+  if ( $self->_type eq 'Select discount type' ) {
+    return 'Please select a discount type';
+  } elsif ( $self->_type eq 'Amount' ) {
+    $self->percent('0');
+    return 'Amount must be greater than 0' unless $self->amount > 0;
+  } elsif ( $self->_type eq 'Percentage' ) {
+    $self->amount('0.00');
+    return 'Percentage must be greater than 0' unless $self->percent > 0;
+  }
+
   my $error = 
     $self->ut_numbern('discountnum')
     || $self->ut_textn('name')
@@ -120,9 +135,21 @@ sub check {
     || $self->ut_float('percent') #actually decimal, but this will do
     || $self->ut_floatn('months') #actually decimal, but this will do
     || $self->ut_enum('disabled', [ '', 'Y' ])
+    || $self->ut_enum('setup', [ '', 'Y' ])
   ;
   return $error if $error;
 
+  #discourage non-integer months for package discounts
+  if ($self->discountnum) {
+    my $sql =
+      "SELECT count(*) FROM part_pkg_discount WHERE part_pkg_discount.discountnum = ".
+      $self->discountnum;
+
+    my $count = $self->scalar_sql($sql); 
+    return "months must be integers greater than 1"
+      if ( $count && ($self->ut_number('months') || $self->months < 2) );
+  }
+    
   $self->SUPER::check;
 }
 
@@ -145,7 +172,10 @@ sub description_short {
   my $desc = $self->name ? $self->name.': ' : '';
   $desc .= $money_char. sprintf('%.2f/month ', $self->amount)
     if $self->amount > 0;
-  $desc .= $self->percent. '% '
+
+  ( my $percent = $self->percent ) =~ s/\.0+$//;
+  $percent =~ s/(\.\d*[1-9])0+$/$1/;
+  $desc .= $percent. '% '
     if $self->percent > 0;
 
   $desc;
@@ -154,7 +184,13 @@ sub description_short {
 sub description {
   my $self = shift;
   my $desc = $self->description_short;
-  $desc .= ' for '. $self->months. ' months' if $self->months;
+
+  ( my $months = $self->months ) =~ s/\.0+$//;
+  $months =~ s/(\.\d*[1-9])0+$/$1/;
+  $desc .= " for $months months" if $months;
+
+  $desc .= ', applies to setup' if $self->setup;
+
   $desc;
 }