continue sales person work: customer and package selection, commissions, reporting...
authorIvan Kohler <ivan@freeside.biz>
Mon, 19 Aug 2013 02:58:15 +0000 (19:58 -0700)
committerIvan Kohler <ivan@freeside.biz>
Mon, 19 Aug 2013 02:58:15 +0000 (19:58 -0700)
FS/FS/part_event/Action/Mixin/credit_sales_pkg_class.pm [new file with mode: 0644]
FS/FS/part_event/Action/pkg_sales_credit.pm [new file with mode: 0644]
FS/FS/part_event/Action/pkg_sales_credit_pkg_class.pm [new file with mode: 0644]
httemplate/edit/cust_pkg_salesnum.html [new file with mode: 0755]
httemplate/edit/process/cust_pkg_salesnum.html [new file with mode: 0644]

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 (file)
index 0000000..666de13
--- /dev/null
@@ -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 (file)
index 0000000..8e04a3b
--- /dev/null
@@ -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 (file)
index 0000000..600985b
--- /dev/null
@@ -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 (executable)
index 0000000..dba2a90
--- /dev/null
@@ -0,0 +1,49 @@
+<& /elements/header-popup.html, "Change Sales Person" &>
+<& /elements/error.html &>
+
+<FORM ACTION="<% $p %>edit/process/cust_pkg_salesnum.html" METHOD=POST>
+<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
+<& /elements/table-grid.html, 'bgcolor' => '#cccccc', 'cellpadding' => 2 &>
+
+  <TR>
+    <TH ALIGN="right">Current package&nbsp;</TH>
+    <TD CLASS="grid">
+      <% $curuser->option('show_pkgnum') ? $cust_pkg->pkgnum.': ' : '' %><B><% $part_pkg->pkg |h %></B> - <% $part_pkg->comment |h %>
+    </TD>
+  </TR>
+
+<& /elements/tr-select-sales.html,
+    #'field'       => 'salesnum',
+    'curr_value'  => $cust_pkg->salesnum,
+    'th'          => 1,
+&>
+
+</TABLE>
+
+<BR>
+<INPUT NAME="submit" TYPE="submit" VALUE="Change">
+
+</FORM>
+</BODY>
+</HTML>
+
+<%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;
+
+</%init>
diff --git a/httemplate/edit/process/cust_pkg_salesnum.html b/httemplate/edit/process/cust_pkg_salesnum.html
new file mode 100644 (file)
index 0000000..aab3741
--- /dev/null
@@ -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" &>
+      <SCRIPT TYPE="text/javascript">
+        window.top.location.reload();
+      </SCRIPT>
+    </BODY>
+    </HTML>
+
+% }
+<%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);
+
+</%init>