From: Ivan Kohler Date: Mon, 19 Aug 2013 02:58:15 +0000 (-0700) Subject: continue sales person work: customer and package selection, commissions, reporting... X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=ed0b1255389309d81f1e87ad3b1d5bd7ab3dd9b7 continue sales person work: customer and package selection, commissions, reporting. RT#23402 --- diff --git a/FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm b/FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm new file mode 100644 index 000000000..666de1378 --- /dev/null +++ b/FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm @@ -0,0 +1,40 @@ +package FS::part_event::Action::Mixin::credit_sales_pkg_class; +use base qw( FS::part_event::Action::Mixin::credit_pkg ); + +use strict; +use FS::Record qw(qsearchs); + +sub option_fields { + my $class = shift; + my %option_fields = $class->SUPER::option_fields; + + delete $option_fields{'percent'}; + + $option_fields{'cust_main_sales'} = { + 'label' => "Credit the customer sales person if there is no package sales person", + 'type' => 'checkbox', + 'value' => 'Y', + }; + + %option_fields; +} + +sub _calc_credit_percent { + my( $self, $cust_pkg ) = @_; + + my $salesnum = $cust_pkg->salesnum; + $salesnum ||= $self->cust_main($cust_pkg)->salesnum + if $self->option('cust_main_sales'); + + return 0 unless $salesnum; + + my $sales_pkg_class = qsearchs( 'sales_pkg_class', { + 'salesnum' => $salesnum, + 'classnum' => $cust_pkg->part_pkg->classnum, + }); + + $sales_pkg_class ? $sales_pkg_class->commission_percent : 0; + +} + +1; diff --git a/FS/FS/part_event/Action/pkg_sales_credit.pm b/FS/FS/part_event/Action/pkg_sales_credit.pm new file mode 100644 index 000000000..8e04a3bd5 --- /dev/null +++ b/FS/FS/part_event/Action/pkg_sales_credit.pm @@ -0,0 +1,41 @@ +package FS::part_event::Action::pkg_sales_credit; + +use strict; +use base qw( FS::part_event::Action::pkg_referral_credit ); + +sub description { 'Credit the sales person a specific amount'; } + +#a little false laziness w/pkg_referral_credit +sub do_action { + my( $self, $cust_pkg, $cust_event ) = @_; + + my $cust_main = $self->cust_main($cust_pkg); + + my $sales = $cust_pkg->sales; + return "No customer record for sales person ". $sales->salesperson + unless $sales->sales_custnum; + + my $sales_cust_main = $sales->sales_cust_main; + #? or return "No customer record for sales person ". $sales->salesperson; + + my $amount = $self->_calc_credit($cust_pkg); + return '' unless $amount > 0; + + my $reasonnum = $self->option('reasonnum'); + + my $error = $sales_cust_main->credit( + $amount, + \$reasonnum, + 'eventnum' => $cust_event->eventnum, + 'addlinfo' => 'for customer #'. $cust_main->display_custnum. + ': '.$cust_main->name. + ', package #'. $cust_pkg->pkgnum, + #'commission_salesnum' => $sales->salesnum, + ); + die "Error crediting customer ". $sales_cust_main->custnum. + " for sales commission: $error" + if $error; + +} + +1; diff --git a/FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm b/FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm new file mode 100644 index 000000000..600985bd5 --- /dev/null +++ b/FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm @@ -0,0 +1,9 @@ +package FS::part_event::Action::pkg_sales_credit_pkg_class; + +use strict; +use base qw( FS::part_event::Action::Mixin::credit_sales_pkg_class + FS::part_event::Action::pkg_sales_credit ); + +sub description { "Credit the package sales person an amount based on their commission percentage for the package's class"; } + +1; diff --git a/httemplate/edit/cust_pkg_salesnum.html b/httemplate/edit/cust_pkg_salesnum.html new file mode 100755 index 000000000..dba2a905e --- /dev/null +++ b/httemplate/edit/cust_pkg_salesnum.html @@ -0,0 +1,49 @@ +<& /elements/header-popup.html, "Change Sales Person" &> +<& /elements/error.html &> + +
+ +<& /elements/table-grid.html, 'bgcolor' => '#cccccc', 'cellpadding' => 2 &> + + + Current package  + + <% $curuser->option('show_pkgnum') ? $cust_pkg->pkgnum.': ' : '' %><% $part_pkg->pkg |h %> - <% $part_pkg->comment |h %> + + + +<& /elements/tr-select-sales.html, + #'field' => 'salesnum', + 'curr_value' => $cust_pkg->salesnum, + 'th' => 1, +&> + + + +
+ + +
+ + + +<%init> + +#some false laziness w/misc/change_pkg.cgi + +my $conf = new FS::Conf; + +my $curuser = $FS::CurrentUser::CurrentUser; + +die "access denied" + unless $curuser->access_right('Change customer package'); + +my $pkgnum = scalar($cgi->param('pkgnum')); +$pkgnum =~ /^(\d+)$/ or die "illegal pkgnum $pkgnum"; +$pkgnum = $1; + +my $cust_pkg = FS::cust_pkg->by_key($pkgnum) or die "unknown pkgnum $pkgnum"; + +my $part_pkg = $cust_pkg->part_pkg; + + diff --git a/httemplate/edit/process/cust_pkg_salesnum.html b/httemplate/edit/process/cust_pkg_salesnum.html new file mode 100644 index 000000000..aab37416a --- /dev/null +++ b/httemplate/edit/process/cust_pkg_salesnum.html @@ -0,0 +1,33 @@ +% if ($error) { +% $cgi->param('error', $error); +% $cgi->redirect(popurl(3). 'edit/cust_pkg_salesnum.html?'. $cgi->query_string ); +% } else { + + <& /elements/header-popup.html, "Sales Person changed" &> + + + + +% } +<%init> + +my $curuser = $FS::CurrentUser::CurrentUser; + +die "access denied" + unless $curuser->access_right('Change customer package'); + +my $cust_pkg = qsearchs({ + 'table' => 'cust_pkg', + 'addl_from' => 'LEFT JOIN cust_main USING ( custnum )', + 'hashref' => { 'pkgnum' => scalar($cgi->param('pkgnum')), }, + 'extra_sql' => ' AND '. $curuser->agentnums_sql, +}); +die 'unknown pkgnum' unless $cust_pkg; + +$cgi->param('salesnum') =~ /^(\d*)$/; +my $salesnum = $1; +my $error = $cust_pkg->set_salesnum($1); + +