From: Ivan Kohler Date: Mon, 19 Aug 2013 03:12:48 +0000 (-0700) Subject: continue sales person work: customer and package selection, commissions, reporting... X-Git-Url: http://git.freeside.biz/gitweb/?a=commitdiff_plain;h=d14a91ec4beae6c02225cdfd4fc3acbc3d66981b;hp=6891db8c9287fa670e5f6961c8ad3f2e3097fc3c;p=freeside.git continue sales person work: customer and package selection, commissions, reporting. RT#23402 --- diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 81fe23bbe..c2f0dcaeb 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -518,6 +518,7 @@ sub tables_hashref { 'salesnum', 'serial', '', '', '', '', 'salesperson', 'varchar', '', $char_d, '', '', 'agentnum', 'int', 'NULL', '', '', '', + 'sales_custnum', 'int', 'NULL', '', '', '', 'disabled', 'char', 'NULL', 1, '', '', ], 'primary_key' => 'salesnum', diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index 8644e8385..a2084fb96 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -34,7 +34,7 @@ use FS::reason; use FS::cust_pkg_discount; use FS::discount; use FS::UI::Web; -use Data::Dumper; +use FS::sales; # need to 'use' these instead of 'require' in sub { cancel, suspend, unsuspend, # setup } @@ -631,6 +631,8 @@ sub check { || $self->ut_numbern('pkgpart') || $self->ut_foreign_keyn('contactnum', 'contact', 'contactnum' ) || $self->ut_foreign_keyn('locationnum', 'cust_location', 'locationnum') + || $self->ut_foreign_keyn('salesnum', 'sales', 'salesnum') + || $self->ut_numbern('quantity') || $self->ut_numbern('start_date') || $self->ut_numbern('setup') || $self->ut_numbern('bill') @@ -2226,7 +2228,7 @@ sub abort_change { =item set_quantity QUANTITY -Change the package's quantity field. This is the one package property +Change the package's quantity field. This is one of the few package properties that can safely be changed without canceling and reordering the package (because it doesn't affect tax eligibility). Returns an error or an empty string. @@ -2236,14 +2238,29 @@ empty string. sub set_quantity { my $self = shift; $self = $self->replace_old; # just to make sure - my $qty = shift; - ($qty =~ /^\d+$/ and $qty > 0) or return "bad package quantity $qty"; - $self->set('quantity' => $qty); + $self->quantity(shift); + $self->replace; +} + +=item set_salesnum SALESNUM + +Change the package's salesnum (sales person) field. This is one of the few +package properties that can safely be changed without canceling and reordering +the package (because it doesn't affect tax eligibility). Returns an error or +an empty string. + +=cut + +sub set_salesnum { + my $self = shift; + $self = $self->replace_old; # just to make sure + $self->salesnum(shift); $self->replace; } use Storable 'thaw'; use MIME::Base64; +use Data::Dumper; sub process_bulk_cust_pkg { my $job = shift; my $param = thaw(decode_base64(shift)); diff --git a/FS/FS/sales.pm b/FS/FS/sales.pm index 3cb61fde3..00f45c0e4 100644 --- a/FS/FS/sales.pm +++ b/FS/FS/sales.pm @@ -1,18 +1,10 @@ package FS::sales; +use base qw( FS::Agent_Mixin FS::Record ); use strict; -use vars qw( @ISA ); -use base qw( FS::Record ); -use Business::CreditCard 0.28; -use FS::Record qw( dbh qsearch qsearchs ); +use FS::Record qw( qsearchs ); #qsearch qsearchs ); +use FS::agent; use FS::cust_main; -use FS::cust_pkg; -use FS::agent_type; -use FS::reg_code; -use FS::TicketSystem; -#use FS::Conf; - -@ISA = qw( FS::m2m_Common FS::Record ); =head1 NAME @@ -35,7 +27,7 @@ FS::sales - Object methods for sales records =head1 DESCRIPTION -An FS::sales object represents an example. FS::sales inherits from +An FS::sales object represents a sales person. FS::sales inherits from FS::Record. The following fields are currently supported: =over 4 @@ -61,7 +53,8 @@ disabled =item new HASHREF -Creates a new example. To add the example to the database, see L<"insert">. +Creates a new sales person. To add the sales person to the database, see +L<"insert">. Note that this stores the hash reference, not a distinct copy of the hash it points to. You can ask the object for a copy with the I method. @@ -100,7 +93,7 @@ returns the error, otherwise returns false. =item check -Checks all fields to make sure this is a valid example. If there is +Checks all fields to make sure this is a valid sales person. If there is an error, returns the error, otherwise returns false. Called by the insert and replace methods. @@ -114,24 +107,32 @@ sub check { my $error = $self->ut_numbern('salesnum') - || $self->ut_numbern('agentnum') + || $self->ut_text('salesperson') + || $self->ut_foreign_key('agentnum', 'agent', 'agentnum') + || $self->ut_foreign_keyn('sales_custnum', 'cust_main', 'custnum') + || $self->ut_enum('disabled', [ '', 'Y' ]) ; return $error if $error; - if ( $self->dbdef_table->column('disabled') ) { - $error = $self->ut_enum('disabled', [ '', 'Y' ] ); - return $error if $error; - } - $self->SUPER::check; } +=item sales_cust_main + +Returns the FS::cust_main object (see L), if any, for this +sales person. + +=cut + +sub sales_cust_main { + my $self = shift; + qsearchs( 'cust_main', { 'custnum' => $self->sales_custnum } ); +} + =back =head1 BUGS -The author forgot to customize this manpage. - =head1 SEE ALSO L, schema.html from the base documentation. diff --git a/httemplate/browse/sales.html b/httemplate/browse/sales.html index 6fac058f9..d2b6cfef5 100644 --- a/httemplate/browse/sales.html +++ b/httemplate/browse/sales.html @@ -16,6 +16,8 @@ my $curuser = $FS::CurrentUser::CurrentUser; die "access denied" unless $curuser->access_right('Edit sales people'); +my $conf = new FS::Conf; + #Sales people bring in business.

my @header = ( 'Sales person' ); @@ -28,6 +30,18 @@ if ( $curuser->access_right('Configuration') ) { push @links, [ $p.'edit/agent.cgi?', 'agentnum' ]; } +push @header, 'Master Customer'; +push @fields, sub { + my $sales = shift; + return '' unless $sales->sales_custnum; + include('/elements/small_custview.html', + $sales->sales_custnum, + scalar($conf->config('countrydefault')), + 1, #show balance + ); +}; +push @links, ''; + push @header, 'Commissions'; push @fields, sub { diff --git a/httemplate/edit/process/cust_main.cgi b/httemplate/edit/process/cust_main.cgi index 621de24bf..ff8be1a71 100755 --- a/httemplate/edit/process/cust_main.cgi +++ b/httemplate/edit/process/cust_main.cgi @@ -213,6 +213,7 @@ if ( $new->custnum eq '' or $duplicate_of ) { #later 'custnum' => $custnum, 'pkgpart' => $pkgpart, 'locationnum' => scalar($cgi->param('locationnum')), + 'salesnum' => scalar($cgi->param('salesnum')), } ); diff --git a/httemplate/edit/sales.html b/httemplate/edit/sales.html index 763f86124..90f651dda 100755 --- a/httemplate/edit/sales.html +++ b/httemplate/edit/sales.html @@ -3,12 +3,14 @@ 'table' => 'sales', 'fields' => [ 'salesperson', { field=>'agentnum', type=>'select-agent', disable_empty=>1, }, + { field=>'sales_custnum', type=>'search-cust_main', }, { field=>'disabled', type=>'checkbox', value=>'Y', }, ], - 'labels' => { 'salesnum' => 'Sales Person', - 'salesperson' => 'Name', - 'agentnum' => 'Agent', - 'disabled' => 'Disabled', + 'labels' => { 'salesnum' => 'Sales Person', + 'salesperson' => 'Name', + 'agentnum' => 'Agent', + 'sales_custnum' => 'Master customer', + 'disabled' => 'Disabled', }, 'viewall_dir' => 'browse', 'agent_virt' => 1, diff --git a/httemplate/view/cust_main/packages/package.html b/httemplate/view/cust_main/packages/package.html index 5fad2d668..b29fedcbd 100644 --- a/httemplate/view/cust_main/packages/package.html +++ b/httemplate/view/cust_main/packages/package.html @@ -1,5 +1,7 @@ > + + -% if ( $cust_pkg->quantity > 1 ) { - - - -% } + + + + + + + + + + + % my $editi = $curuser->access_right('Edit customer package invoice details'); % my $editc = $curuser->access_right('Edit customer package comments'); % my @cust_pkg_detail = $cust_pkg->cust_pkg_detail; @@ -188,24 +236,11 @@ % } -% if ( $curuser->access_right('Change customer package') -% && ! $cust_pkg->get('cancel') -% && ! $supplemental -% && $part_pkg->freq ne '0' -% && ! $opt{no_links} -% ) -% { - -% # yeah, I guess we'll let you do this on a future change package -% if ( FS::Conf->new->exists('invoice-unitprice') ) { - -% } - -% } + + % }
<% $opt{before_pkg_callback} @@ -14,14 +16,6 @@
-       <% mt('Quantity:') |h %> - <% $cust_pkg->quantity %> -
@@ -86,6 +80,60 @@
+ +% my $change_quan_label = 'Change quantity'; +% if ( $cust_pkg->quantity > 1 ) { +% $change_quan_label = 'change'; +       <% mt('Quantity:') |h %> + <% $cust_pkg->quantity %> +% } + +% if ( $curuser->access_right('Change customer package') +% && ! $cust_pkg->get('cancel') +% && ! $supplemental +% && $part_pkg->freq ne '0' +% && ! $opt{no_links} +% && $opt{'invoice-unitprice'} +% ) +% { + + ( <% pkg_change_quantity_link($cust_pkg, $change_quan_label) %> ) + +% } + +
+ +% my $change_sales_label = 'Change sales person'; +% if ( $cust_pkg->salesnum ) { +% $change_sales_label = 'change'; +       <% mt('Sales Person:') |h %> + <% $cust_pkg->salesperson %> +% } + +% if ( $curuser->access_right('Change customer package') +% && ! $cust_pkg->get('cancel') +% && ! $supplemental +% #&& $part_pkg->freq ne '0' +% && ! $opt{no_links} +% ) +% { + + ( <% pkg_change_salesnum_link($cust_pkg, $change_sales_label) %> ) + +% } + +
- ( <% pkg_change_quantity_link($cust_pkg) %> ) -
+ % if ( @cust_pkg_usage ) { @@ -309,11 +344,24 @@ sub pkg_change_location_link { } sub pkg_change_quantity_link { + my( $cust_pkg, $label ) = @_; include( '/elements/popup_link-cust_pkg.html', 'action' => $p. 'edit/cust_pkg_quantity.html?', - 'label' => emt('Change quantity'), + 'label' => emt($label), 'actionlabel' => emt('Change'), - 'cust_pkg' => shift, + 'cust_pkg' => $cust_pkg, + 'width' => 390, + 'height' => 220, + ); +} + +sub pkg_change_salesnum_link { + my( $cust_pkg, $label ) = @_; + include( '/elements/popup_link-cust_pkg.html', + 'action' => $p. 'edit/cust_pkg_salesnum.html?', + 'label' => emt($label), + 'actionlabel' => emt('Change'), + 'cust_pkg' => $cust_pkg, 'width' => 390, 'height' => 220, ); diff --git a/httemplate/view/cust_main/packages/section.html b/httemplate/view/cust_main/packages/section.html index 0383fe892..152ccaa5d 100755 --- a/httemplate/view/cust_main/packages/section.html +++ b/httemplate/view/cust_main/packages/section.html @@ -77,6 +77,9 @@ my $pkg_attached = ( scalar(keys %change_custnum) == 1 my $countrydefault = scalar($conf->config('countrydefault')) || 'US'; my %conf_opt = ( + #for package.html + 'invoice-unitprice' => $conf->exists('invoice-unitprice'), + #for services.html and status.html 'cust_pkg-display_times' => ($conf->exists('cust_pkg-display_times') || $curuser->option('cust_pkg-display_times')),
<% mt('Included usage') %>