'percent', 'decimal', '', '', '', '',
'months', 'decimal', 'NULL', '', '', '',
'disabled', 'char', 'NULL', 1, '', '',
+ 'setup', 'char', 'NULL', 1, '', '',
],
'primary_key' => 'discountnum',
'unique' => [],
use FS::cust_pkg_discount;
use FS::discount;
use FS::UI::Web;
+use Data::Dumper;
# need to 'use' these instead of 'require' in sub { cancel, suspend, unsuspend,
# setup }
}
-use Data::Dumper;
use Storable 'thaw';
use MIME::Base64;
sub process_bulk_cust_pkg {
'amount' => $self->discountnum_amount,
'percent' => $self->discountnum_percent,
'months' => $self->discountnum_months,
+ 'setup' => $self->discountnum_setup,
#'disabled' => $self->discountnum_disabled,
};
'amount' => $self->amount,
'percent' => $self->percent,
'months' => $self->months,
+ 'setup' => $self->setup,
'disabled' => 'Y',
};
my $error = $discount->insert;
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
|| $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;
my $self = shift;
my $desc = $self->description_short;
$desc .= ' for '. $self->months. ' months' if $self->months;
+ $desc .= ', applies to setup' if $self->setup;
$desc;
}
my $br = $self->base_recur($cust_pkg, $sdate);
$br += $param->{'override_charges'} if $param->{'override_charges'};
+
+ return 0 if defined $param->{'setup_charge'} && $param->{'setup_charge'} == 0;
my $tot_discount = 0;
#UI enforces just 1 for now, will need ordering when they can be stacked
? min( $chg_months,
$discount->months - $cust_pkg_discount->months_used )
: $chg_months;
+
+ if(defined $param->{'setup_charge'}) {
+ next unless $discount->setup;
+
+ if ( $discount->percent ) {
+ $amount = sprintf('%.2f', $discount->percent * $param->{'setup_charge'} / 100 );
+ $months = 1;
+ }
+ }
my $error = $cust_pkg_discount->increment_months_used($months)
- if $cust_pkg->pkgpart == $param->{real_pkgpart};
+ if ($cust_pkg->pkgpart == $param->{real_pkgpart}
+ && ! defined $param->{'setup_charge'});
die "error discounting: $error" if $error;
$amount *= $months;
$months = sprintf('%.2f', $months) if $months =~ /\./;
my $d = 'Includes ';
- $d .= $discount->name. ' ' if $discount->name;
+ $d .= 'setup ' if defined $param->{'setup_charge'};
$d .= 'discount of '. $discount->description_short;
- $d .= " for $months month". ( $months!=1 ? 's' : '' );
+ $d .= " for $months month". ( $months!=1 ? 's' : '' ) unless defined $param->{'setup_charge'};
$d .= ": $money_char$amount" if $months != 1 || $discount->percent;
push @$details, $d;
my $quantity = $cust_pkg->quantity || 1;
my $charge = $quantity * $self->unit_setup($cust_pkg, $sdate, $details);
- sprintf('%.2f', $charge);
+
+ my $param = { 'setup_charge' => $charge };
+ my $discount = $self->calc_discount($cust_pkg, $sdate, $details, $param);
+
+ sprintf('%.2f', $charge - $discount);
}
sub unit_setup {
{ field => 'months', type => 'text', size => 2,
postfix => '<BR><FONT SIZE="-1"><I>(blank for non-expiring discount)</I></FONT>',
},
+ { field => 'setup', type => 'checkbox', value=>'Y', },
],
'labels' => {
'discountnum' => 'Discount #',
'amount' => 'Amount ',
'percent' => 'Percentage ',
'months' => 'Duration (months)',
+ 'setup' => 'Apply to setup fees',
},
'viewall_dir' => 'browse',
'new_callback' => $new_callback,
'amount' => scalar($cgi->param('discountnum_amount')),
'percent' => scalar($cgi->param('discountnum_percent')),
'months' => scalar($cgi->param('discountnum_months')),
+ 'setup' => scalar($cgi->param('discountnum_setup')),
#'disabled' => $self->discountnum_disabled,
};
my $error = $cust_pkg_discount->insert;
'discountnum_amount' => scalar($cgi->param('discountnum_amount')),
'discountnum_percent' => scalar($cgi->param('discountnum_percent')),
'discountnum_months' => scalar($cgi->param('discountnum_months')),
+ 'discountnum_setup' => scalar($cgi->param('discountnum_setup')),
'contract_end' => ( scalar($cgi->param('contract_end'))
? parse_datetime($cgi->param('contract_end'))
: ''
)
%>
+ <% include( '/elements/tr-checkbox.html',
+ 'label' => '<B>Apply discount to setup fee</B>',
+ 'field' => $name.'_setup',
+ 'id' => $name.'_setup',
+ 'curr_value' => scalar($cgi->param($name.'_setup')),
+ 'value' => 'Y',
+ 'colspan' => $opt{'colspan'},
+ )
+ %>
+
<SCRIPT TYPE="text/javascript">
% my $ge = 'document.getElementById';
<% $ge %>('<% $name %>_months').style.visibility = '';
<% $ge %>('<% $name %>_months_postfix').style.display = '';
<% $ge %>('<% $name %>_months_postfix').style.visibility = '';
+ <% $ge %>('<% $name %>_setup_label0').style.display = '';
+ <% $ge %>('<% $name %>_setup_label0').style.visibility = '';
+ <% $ge %>('<% $name %>_setup').style.display = '';
+ <% $ge %>('<% $name %>_setup').style.visibility = '';
} else {
<% $ge %>('<% $name %>__type_label0').style.display = 'none';
<% $ge %>('<% $name %>_months').style.visibility = 'hidden';
<% $ge %>('<% $name %>_months_postfix').style.display = 'none';
<% $ge %>('<% $name %>_months_postfix').style.visibility = 'hidden';
+
+ <% $ge %>('<% $name %>_setup_label0').style.display = 'none';
+ <% $ge %>('<% $name %>_setup_label0').style.visibility = 'hidden';
+ <% $ge %>('<% $name %>_setup').style.display = 'none';
+ <% $ge %>('<% $name %>_setup').style.visibility = 'hidden';
}