From 67779831c7ac1bb6d65073a0e523453dacf751c6 Mon Sep 17 00:00:00 2001 From: mark Date: Wed, 7 Sep 2011 19:12:55 +0000 Subject: [PATCH] show available discounts on invoice, #5318 --- FS/FS/Conf.pm | 9 +++++++- FS/FS/part_pkg/discount_Mixin.pm | 45 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index e1e72e1e2..79b7d8c93 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -682,7 +682,14 @@ my %payment_gateway_options = ( 'description' => 'Generate a line item on an invoice even when a package is discounted 100%', 'type' => 'checkbox', }, - + + { + 'key' => 'discount-show_available', + 'section' => 'billing', + 'description' => 'Show available prepayment discounts on invoices.', + 'type' => 'checkbox', + }, + { 'key' => 'invoice-barcode', 'section' => 'billing', diff --git a/FS/FS/part_pkg/discount_Mixin.pm b/FS/FS/part_pkg/discount_Mixin.pm index 87ec3a708..5d484590b 100644 --- a/FS/FS/part_pkg/discount_Mixin.pm +++ b/FS/FS/part_pkg/discount_Mixin.pm @@ -36,10 +36,15 @@ Takes all the arguments of calc_recur. Calculates and returns the amount by which to reduce the recurring fee; also increments months used on the discount and generates an invoice detail describing it. +If the configuration option 'discount-show_available' is enabled, and this +package is eligible for a prepayment discount but doesn't have one, an +invoice detail will be generated to describe the available discounts. + =cut sub calc_discount { my($self, $cust_pkg, $sdate, $details, $param ) = @_; + my $conf = new FS::Conf; my $br = $self->base_recur_permonth($cust_pkg, $sdate); $br += $param->{'override_charges'} if $param->{'override_charges'}; @@ -155,7 +160,6 @@ sub calc_discount { push @{ $param->{'discounts'} }, $cust_bill_pkg_discount; #add details on discount to invoice - my $conf = new FS::Conf; my $money_char = $conf->config('money_char') || '$'; $months = sprintf('%.2f', $months) if $months =~ /\./; @@ -169,7 +173,46 @@ sub calc_discount { $tot_discount += $amount; } + if (!@cust_pkg_discount and $conf->exists('discount-show_available') ) { + push @$details, $self->available_discounts; + } + sprintf('%.2f', $tot_discount); } +=item available_discounts + +Returns a list of details decribing the available prepayment discounts +for this package. + +=cut + +sub available_discounts { + my $self = shift; + return if $self->freq ne '1'; + my @details; + my $money_char = FS::Conf->new->config('money_char') || '$'; + my @discounts = map { $_->discount } $self->part_pkg_discount; + # probably the most logical way to arrange these + foreach my $discount (sort { $a->months <=> $b->months } @discounts) { + my $months = $discount->months; + my $amount; + if ( $discount->amount > 0 ) { + $amount = $money_char . sprintf('%.2f', $discount->amount); + } + elsif ( $discount->percent ) { + $amount = $discount->percent .'%'; + } + else { #? + next; + } + push @details, "Prepay $months months for $amount discount." + # better way to display this? + # if it's a problem, we'll add discount.invoice_text or something + # for the customer-visible text line. + } + return @details; +} + + 1; -- 2.11.0