From a51b71cdea80993d815ecd9c79132df0a68b78b6 Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Tue, 30 Dec 2014 23:28:57 -0800 Subject: [PATCH] sales commission on invoices: allow commission based on cost, #25847 --- FS/FS/part_event/Action/Mixin/credit_bill.pm | 47 +++++++++++++++++----------- FS/FS/part_pkg.pm | 4 +-- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/FS/FS/part_event/Action/Mixin/credit_bill.pm b/FS/FS/part_event/Action/Mixin/credit_bill.pm index 4930e35fb..82b215d2c 100644 --- a/FS/FS/part_event/Action/Mixin/credit_bill.pm +++ b/FS/FS/part_event/Action/Mixin/credit_bill.pm @@ -24,14 +24,15 @@ sub option_fields { 'label' => 'Of', 'type' => 'select', #add additional ways to specify in the package def - 'options' => [qw( setuprecur setup recur setuprecur_margin setup_margin recur_margin )], + 'options' => [qw( setuprecur setup recur setup_cost recur_cost setup_margin recur_margin_permonth )], 'labels' => { - 'setuprecur' => 'Amount charged', - 'setup' => 'Setup fee', - 'recur' => 'Recurring fee', - 'setuprecur_margin' => 'Amount charged minus total cost', - 'setup_margin' => 'Setup fee minus setup cost', - 'recur_margin' => 'Recurring fee minus recurring cost', + 'setuprecur' => 'Amount charged on this invoice', + 'setup' => 'Setup fee charged on this invoice', + 'recur' => 'Recurring fee charged on this invoice', + 'setup_cost' => 'Setup cost', + 'recur_cost' => 'Recurring cost', + 'setup_margin' => 'Package setup fee minus setup cost', + 'recur_margin_permonth' => 'Monthly recurring fee minus recurring cost', }, }, ); @@ -55,7 +56,8 @@ sub _calc_credit { my $cust_bill_pkg = shift; my $what = $self->option('what'); - my $margin = 1 if $what =~ s/_margin$//; + my $cost = ($what =~ /_cost/ ? 1 : 0); + my $margin = ($what =~ /_margin/ ? 1 : 0); my $pkgnum = $cust_bill_pkg->pkgnum; my $cust_pkg = $cust_bill_pkg->cust_pkg; @@ -68,24 +70,31 @@ sub _calc_credit { } my $charge = 0; - if ( $what eq 'setup' ) { - $charge = $cust_bill_pkg->get('setup'); - } elsif ( $what eq 'recur' ) { - $charge = $cust_bill_pkg->get('recur'); - } elsif ( $what eq 'setuprecur' ) { - $charge = $cust_bill_pkg->get('setup') + $cust_bill_pkg->get('recur'); - } - if ( $margin ) { + if ( $margin or $cost ) { + # look up package costs only if we need them my $pkgpart = $cust_bill_pkg->pkgpart_override || $cust_pkg->pkgpart; my $part_pkg = $part_pkg_cache{$pkgpart} ||= FS::part_pkg->by_key($pkgpart); + + if ( $cost ) { + $charge = $part_pkg->get($what); + } else { # $margin + $charge = $part_pkg->$what($cust_pkg); + } + + $charge = ($charge || 0) * ($cust_pkg->quantity || 1); + + } else { # setup, recur, or setuprecur + if ( $what eq 'setup' ) { - $charge -= $part_pkg->get('setup_cost'); + $charge = $cust_bill_pkg->get('setup'); } elsif ( $what eq 'recur' ) { - $charge -= $part_pkg->get('recur_cost'); + $charge = $cust_bill_pkg->get('recur'); } elsif ( $what eq 'setuprecur' ) { - $charge -= $part_pkg->get('setup_cost') + $part_pkg->get('recur_cost'); + $charge = $cust_bill_pkg->get('setup') + $cust_bill_pkg->get('recur'); } + + # don't multiply by quantity here; it's already included } $charge = 0 if $charge < 0; # e.g. prorate diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index e4927a389..d2f2f86fa 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -1665,7 +1665,7 @@ recur_cost divided by freq (only supported for monthly and longer frequencies) sub recur_cost_permonth { my($self, $cust_pkg) = @_; return 0 unless $self->freq =~ /^\d+$/ && $self->freq > 0; - sprintf('%.2f', $self->recur_cost / $self->freq ); + sprintf('%.2f', ($self->recur_cost || 0) / $self->freq ); } =item cust_bill_pkg_recur CUST_PKG @@ -1710,7 +1710,7 @@ unit_setup minus setup_cost sub setup_margin { my $self = shift; - $self->unit_setup(@_) - $self->setup_cost; + $self->unit_setup(@_) - ($self->setup_cost || 0); } =item recur_margin_permonth -- 2.11.0