X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsales.pm;h=c1e075e5ea8ea652673d4c0b5e9dd76f84c1fc97;hp=3cb61fde3d3d24f40b51e4bea9e596b331b8b5ca;hb=20f03d52cc6c930f610c0b4466eeeeda54fdbb40;hpb=a6fe07e49e3fc12169e801b1ed6874c3a5bd8500 diff --git a/FS/FS/sales.pm b/FS/FS/sales.pm index 3cb61fde3..c1e075e5e 100644 --- a/FS/FS/sales.pm +++ b/FS/FS/sales.pm @@ -1,18 +1,12 @@ package FS::sales; +use base qw( FS::Commission_Mixin 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( 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 ); +use FS::cust_bill_pkg; +use FS::cust_credit; =head1 NAME @@ -35,7 +29,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 @@ -44,14 +38,21 @@ FS::Record. The following fields are currently supported: primary key +=item salesperson + +Name + =item agentnum -agentnum +Agent (see L) =item disabled -disabled +Disabled flag, empty or `Y' + +=item sales_custnum +Sales person master customer (see L) =back @@ -61,7 +62,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 +102,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 +116,92 @@ 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 } ); +} + +=item cust_bill_pkg START END OPTIONS + +Returns the package line items (see L) for which this +sales person could receive commission. + +START and END are an optional date range to limit the results. + +OPTIONS may contain: +- I: if this is a true value, sales of packages that have no +package sales person will be included if this is their customer sales person. +- I: limit to this package classnum. +- I: limit to sales that have no unpaid balance. + +=cut + +sub sales_where { + my $self = shift; + my $salesnum = $self->salesnum; + die "bad salesnum" unless $salesnum =~ /^(\d+)$/; + my %opt = @_; + + my $cmp_salesnum = 'cust_pkg.salesnum'; + if ($opt{cust_main_sales}) { + $cmp_salesnum = 'COALESCE(cust_pkg.salesnum, cust_main.salesnum)'; } - $self->SUPER::check; + my @where = ( "$cmp_salesnum = $salesnum", + "sales_pkg_class.salesnum = $salesnum" + ); + + # sales_pkg_class number-of-months limit, grr + # (we should be able to just check for the cust_event record from the + # commission credit, but the report is supposed to act as a check on that) + # + # Pg-specific, of course + my $setup_date = 'TO_TIMESTAMP( cust_pkg.setup )'; + my $interval = "(sales_pkg_class.commission_duration || ' months')::interval"; + my $charge_date = 'TO_TIMESTAMP( cust_bill._date )'; + push @where, "CASE WHEN sales_pkg_class.commission_duration IS NOT NULL ". + "THEN $charge_date < $setup_date + $interval ". + "ELSE TRUE END"; + + @where; +} + +sub commission_where { + my $self = shift; + 'cust_credit.commission_salesnum = ' . $self->salesnum; +} + +# slightly modify it +sub cust_bill_pkg_search { + my $self = shift; + my $search = $self->SUPER::cust_bill_pkg_search(@_); + $search->{addl_from} .= ' + JOIN sales_pkg_class ON( COALESCE(sales_pkg_class.classnum, 0) = COALESCE(part_pkg.classnum, 0) )'; + + return $search; } =back =head1 BUGS -The author forgot to customize this manpage. - =head1 SEE ALSO L, schema.html from the base documentation.