X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fdiscount.pm;h=361e0b4b2e63a6d11c26f4a33523a58f2d47d93c;hb=71f6489e0b4cdd286668b79c8a397876df20840c;hp=457c9d6819d1c6d1d9c7a07ec85af8e6a52288d2;hpb=75125d51297402390c1bbb489cf39b74611b1009;p=freeside.git diff --git a/FS/FS/discount.pm b/FS/FS/discount.pm index 457c9d681..361e0b4b2 100644 --- a/FS/FS/discount.pm +++ b/FS/FS/discount.pm @@ -1,8 +1,7 @@ package FS::discount; +use base qw( FS::Record ); use strict; -use base qw( FS::Record ); -use FS::Record qw( qsearch qsearchs ); =head1 NAME @@ -54,6 +53,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,16 +117,43 @@ 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_foreign_keyn('classnum', 'discount_class', 'classnum') || $self->ut_textn('name') || $self->ut_money('amount') || $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' ]) + #|| $self->ut_enum('linked', [ '', 'Y' ]) ; return $error if $error; +#causes "months must be integers greater than 1" errors when you go back and +# try to edit an existing discount (because the months format as NN.000) +#not worth whatever reason it came in with "prepayment discounts rt#5318" for +# #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; } @@ -142,10 +173,18 @@ sub description_short { my $conf = new FS::Conf; my $money_char = $conf->config('money_char') || '$'; - my $desc = ''; - $desc .= $money_char. sprintf('%.2f/month ', $self->amount) + my $desc; + if ( $self->name ) { + $desc = $self->name . ': '; + } else { + $desc = 'Discount of '; + } + $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,10 +193,22 @@ 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; } +sub classname { + my $self = shift; + my $discount_class = $self->discount_class; + $discount_class ? $discount_class->classname : '(none)'; +} + =back =head1 BUGS