diff options
author | Ivan Kohler <ivan@freeside.biz> | 2013-08-26 01:09:28 -0700 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2013-08-26 01:09:28 -0700 |
commit | 41592b95d0f43281a84db45e2aea24c708a96f76 (patch) | |
tree | cd114331cf52b9124723928dfa55ba3f219e56e2 /FS | |
parent | 0cd16691f5919a6e63bc99b409e56f5517d07e80 (diff) |
continue sales person work: customer and package selection, commissions, reporting. RT#23402
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/Schema.pm | 8 | ||||
-rw-r--r-- | FS/FS/cust_credit.pm | 5 | ||||
-rw-r--r-- | FS/FS/cust_main.pm | 10 | ||||
-rw-r--r-- | FS/FS/part_event/Action/pkg_agent_credit.pm | 9 | ||||
-rw-r--r-- | FS/FS/part_event/Action/pkg_sales_credit.pm | 11 | ||||
-rw-r--r-- | FS/FS/part_event/Condition/pkg_age_before.pm | 3 | ||||
-rw-r--r-- | FS/FS/part_event/Condition/pkg_age_before_sales.pm | 2 | ||||
-rw-r--r-- | FS/FS/sales.pm | 58 |
8 files changed, 88 insertions, 18 deletions
diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 75851885a..a6689c20e 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -967,11 +967,15 @@ sub tables_hashref { 'closed', 'char', 'NULL', 1, '', '', 'pkgnum', 'int', 'NULL', '', '', '', #desired pkgnum for pkg-balances 'eventnum', 'int', 'NULL', '', '', '', #triggering event for commission - #'commission_agentnum', 'int', 'NULL', '', '', '', # + 'commission_agentnum', 'int', 'NULL', '', '', '', # + 'commission_salesnum', 'int', 'NULL', '', '', '', # + 'commission_pkgnum', 'int', 'NULL', '', '', '', # ], 'primary_key' => 'crednum', 'unique' => [], - 'index' => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'] ], + 'index' => [ ['custnum'], ['_date'], ['usernum'], ['eventnum'], + [ 'commission_salesnum' ], + ], }, 'cust_credit_bill' => { diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm index ba279a26c..fdc7e6e89 100644 --- a/FS/FS/cust_credit.pm +++ b/FS/FS/cust_credit.pm @@ -19,6 +19,8 @@ use FS::part_pkg; use FS::reason_type; use FS::reason; use FS::cust_event; +use FS::agent; +use FS::sales; $me = '[ FS::cust_credit ]'; $DEBUG = 0; @@ -311,6 +313,9 @@ sub check { || $self->ut_enum('closed', [ '', 'Y' ]) || $self->ut_foreign_keyn('pkgnum', 'cust_pkg', 'pkgnum') || $self->ut_foreign_keyn('eventnum', 'cust_event', 'eventnum') + || $self->ut_foreign_keyn('commission_agentnum', 'agent', 'agentnum') + || $self->ut_foreign_keyn('commission_salesnum', 'sales', 'salesnum') + || $self->ut_foreign_keyn('commission_pkgnum', 'cust_pkg', 'pkgnum') ; return $error if $error; diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 310c2263f..7dc6ac4f9 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -3325,6 +3325,8 @@ reason, and a 'reason_type' option must be passed to indicate the FS::reason_type for the new reason. An I<addlinfo> option may be passed to set the credit's I<addlinfo> field. +Likewise for I<eventnum>, I<commission_agentnum>, I<commission_salesnum> and +I<commission_pkgnum>. Any other options are passed to FS::cust_credit::insert. @@ -3350,10 +3352,10 @@ sub credit { $cust_credit->set('reason', $reason) } - for (qw( addlinfo eventnum )) { - $cust_credit->$_( delete $options{$_} ) - if exists($options{$_}); - } + $cust_credit->$_( delete $options{$_} ) + foreach grep exists($options{$_}), + qw( addlinfo eventnum ), + map "commission_$_", qw( agentnum salesnum pkgnum ); $cust_credit->insert(%options); diff --git a/FS/FS/part_event/Action/pkg_agent_credit.pm b/FS/FS/part_event/Action/pkg_agent_credit.pm index e1c77be07..494c40e3f 100644 --- a/FS/FS/part_event/Action/pkg_agent_credit.pm +++ b/FS/FS/part_event/Action/pkg_agent_credit.pm @@ -26,10 +26,11 @@ sub do_action { my $error = $agent_cust_main->credit( $amount, \$reasonnum, - 'eventnum' => $cust_event->eventnum, - 'addlinfo' => 'for customer #'. $cust_main->display_custnum. - ': '.$cust_main->name, - #'commission_agentnum' => $agent->agentnum, + 'eventnum' => $cust_event->eventnum, + 'addlinfo' => 'for customer #'. $cust_main->display_custnum. + ': '.$cust_main->name, + 'commission_agentnum' => $agent->agentnum, + 'commission_pkgnum' => $cust_pkg->pkgnum, ); die "Error crediting customer ". $agent_cust_main->custnum. " for agent commission: $error" diff --git a/FS/FS/part_event/Action/pkg_sales_credit.pm b/FS/FS/part_event/Action/pkg_sales_credit.pm index 8e04a3bd5..caa25cc80 100644 --- a/FS/FS/part_event/Action/pkg_sales_credit.pm +++ b/FS/FS/part_event/Action/pkg_sales_credit.pm @@ -26,11 +26,12 @@ sub do_action { 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, + 'eventnum' => $cust_event->eventnum, + 'addlinfo' => 'for customer #'. $cust_main->display_custnum. + ': '.$cust_main->name. + ', package #'. $cust_pkg->pkgnum, + 'commission_salesnum' => $sales->salesnum, + 'commission_pkgnum' => $cust_pkg->pkgnum, ); die "Error crediting customer ". $sales_cust_main->custnum. " for sales commission: $error" diff --git a/FS/FS/part_event/Condition/pkg_age_before.pm b/FS/FS/part_event/Condition/pkg_age_before.pm index c778265f2..89389ad71 100644 --- a/FS/FS/part_event/Condition/pkg_age_before.pm +++ b/FS/FS/part_event/Condition/pkg_age_before.pm @@ -10,7 +10,8 @@ sub pkg_age_operator { '>'; } sub pkg_age_label { 'Package date age younger than'; } sub pkg_age_compare { - my( $pkg_date, $age ) = @_; + my( $self, $pkg_date, $age ) = @_; + $pkg_date > $age; } diff --git a/FS/FS/part_event/Condition/pkg_age_before_sales.pm b/FS/FS/part_event/Condition/pkg_age_before_sales.pm index 4ad56fa10..32369c05b 100644 --- a/FS/FS/part_event/Condition/pkg_age_before_sales.pm +++ b/FS/FS/part_event/Condition/pkg_age_before_sales.pm @@ -24,7 +24,7 @@ sub option_fields { } sub pkg_age_age { - my( $self, $cust_pkg, %opt ); + my( $self, $cust_pkg, %opt ) = @_; my $salesnum = $cust_pkg->salesnum; $salesnum ||= $self->cust_main($cust_pkg)->salesnum diff --git a/FS/FS/sales.pm b/FS/FS/sales.pm index 00f45c0e4..c8604abce 100644 --- a/FS/FS/sales.pm +++ b/FS/FS/sales.pm @@ -2,9 +2,11 @@ package FS::sales; use base qw( FS::Agent_Mixin FS::Record ); use strict; -use FS::Record qw( qsearchs ); #qsearch qsearchs ); +use FS::Record qw( qsearch qsearchs ); use FS::agent; use FS::cust_main; +use FS::cust_bill_pkg; +use FS::cust_credit; =head1 NAME @@ -129,6 +131,60 @@ sub sales_cust_main { qsearchs( 'cust_main', { 'custnum' => $self->sales_custnum } ); } +sub cust_bill_pkg { + my( $self, $sdate, $edate, %search ) = @_; + + my $cmp_salesnum = delete $search{'cust_main_sales'} + ? ' COALESCE( cust_pkg.salesnum, cust_main.salesnum )' + : ' cust_pkg.salesnum '; + + my $classnum_sql = ''; + if ( exists( $search{'classnum'} ) ) { + my $classnum = $search{'classnum'}; + $classnum_sql = " AND part_pkg.classnum ". ( $classnum ? " = $classnum " + : ' IS NULL ' ); + } + + qsearch({ 'table' => 'cust_bill_pkg', + 'addl_from' => ' LEFT JOIN cust_bill USING ( invnum ) '. + ' LEFT JOIN cust_pkg USING ( pkgnum ) '. + ' LEFT JOIN part_pkg USING ( pkgpart ) '. + ' LEFT JOIN cust_main ON ( cust_pkg.custnum = cust_main.custnum )', + 'extra_sql' => ( keys %{ $search{'hashref'} } + ? ' AND ' : 'WHERE ' + ). + " cust_bill._date >= $sdate ". + " AND cust_bill._date < $edate ". + " AND $cmp_salesnum = ". $self->salesnum. + $classnum_sql, + #%search, + }); +} + +sub cust_credit { + my( $self, $sdate, $edate, %search ) = @_; + + $search{'hashref'}->{'commission_salesnum'} = $self->salesnum; + + my $classnum_sql = ''; + if ( exists($search{'commission_classnum'}) ) { + my $classnum = delete($search{'commission_classnum'}); + $classnum_sql = " AND part_pkg.classnum ". ( $classnum ? " = $classnum" + : " IS NULL " ); + + $search{'addl_from'} .= + ' LEFT JOIN cust_pkg ON ( commission_pkgnum = cust_pkg.pkgnum ) '. + ' LEFT JOIN part_pkg USING ( pkgpart ) '; + } + + qsearch({ 'table' => 'cust_credit', + 'extra_sql' => " AND cust_credit._date >= $sdate ". + " AND cust_credit._date < $edate ". + $classnum_sql, + %search, + }); +} + =back =head1 BUGS |