RT# 82137 - Added ability for processing fee to be pain on seperate invoice.
[freeside.git] / FS / FS / agent.pm
index 68a5912..d6171c6 100644 (file)
@@ -1,7 +1,7 @@
 package FS::agent;
 
 use strict;
-use vars qw( @ISA );
+use base qw( FS::Commission_Mixin FS::m2m_Common FS::Record );
 #use Crypt::YAPassGen;
 use Business::CreditCard 0.28;
 use FS::Record qw( dbh qsearch qsearchs );
@@ -12,8 +12,6 @@ use FS::reg_code;
 use FS::TicketSystem;
 use FS::Conf;
 
-@ISA = qw( FS::m2m_Common FS::Record );
-
 =head1 NAME
 
 FS::agent - Object methods for agent records
@@ -46,27 +44,49 @@ from FS::Record.  The following fields are currently supported:
 
 =over 4
 
-=item agentnum - primary key (assigned automatically for new agents)
+=item agentnum
+
+primary key (assigned automatically for new agents)
+
+=item agent
+
+Text name of this agent
+
+=item typenum
+
+Agent type (see L<FS::agent_type>)
+
+=item ticketing_queueid
+
+Ticketing Queue
 
-=item agent - Text name of this agent
+=item invoice_template
 
-=item typenum - Agent type (see L<FS::agent_type>)
+Invoice template name
 
-=item ticketing_queueid - Ticketing Queue
+=item agent_custnum
 
-=item invoice_template - Invoice template name
+Optional agent customer (see L<FS::cust_main>)
 
-=item agent_custnum - Optional agent customer (see L<FS::cust_main>)
+=item disabled
 
-=item disabled - Disabled flag, empty or 'Y'
+Disabled flag, empty or 'Y'
 
-=item prog - Deprecated (never used)
+=item prog
 
-=item freq - Deprecated (never used)
+Deprecated (never used)
 
-=item username - (Deprecated) Username for the Agent interface
+=item freq
 
-=item _password - (Deprecated) Password for the Agent interface
+Deprecated (never used)
+
+=item username
+
+(Deprecated) Username for the Agent interface
+
+=item _password
+
+(Deprecated) Password for the Agent interface
 
 =back
 
@@ -127,6 +147,7 @@ sub check {
       || $self->ut_textn('prog')
       || $self->ut_textn('invoice_template')
       || $self->ut_foreign_keyn('agent_custnum', 'cust_main', 'custnum' )
+      || $self->ut_numbern('ticketing_queueid')
   ;
   return $error if $error;
 
@@ -200,7 +221,7 @@ field, or the empty string.
 sub ticketing_queue {
   my $self = shift;
   FS::TicketSystem->queue($self->ticketing_queueid);
-};
+}
 
 =item payment_gateway [ OPTION => VALUE, ... ]
 
@@ -239,8 +260,27 @@ sub payment_gateway {
     # seeing the card number
     my $gatewaynum =
       $conf->config('selfservice-payment_gateway', $self->agentnum);
-    my $gateway = FS::payment_gateway->by_key($gatewaynum)
-      if $gatewaynum;
+    my $gateway;
+    $gateway = FS::payment_gateway->by_key($gatewaynum) if $gatewaynum;
+    return $gateway if $gateway;
+
+    # a little less kludgey than the above, and allows PayPal to coexist 
+    # with credit card gateways
+    my $is_paypal = { op => '!=', value => 'PayPal' };
+    if ( uc($options{method}) eq 'PAYPAL' ) {
+      $is_paypal = 'PayPal';
+    }
+
+    $gateway = qsearchs({
+        table     => 'payment_gateway',
+        addl_from => ' JOIN agent_payment_gateway USING (gatewaynum) ',
+        hashref   => {
+          gateway_namespace => 'Business::OnlineThirdPartyPayment',
+          gateway_module    => $is_paypal,
+          disabled          => '',
+        },
+        extra_sql => ' AND agentnum = '.$self->agentnum,
+    });
 
     if ( $gateway ) {
       return $gateway;
@@ -354,6 +394,23 @@ sub payment_gateway {
   $payment_gateway;
 }
 
+=item invoice_modes
+
+Returns all L<FS::invoice_mode> objects that are valid for this agent (i.e.
+those with this agentnum or null agentnum).
+
+=cut
+
+sub invoice_modes {
+  my $self = shift;
+  qsearch( {
+      table     => 'invoice_mode',
+      hashref   => { agentnum => $self->agentnum },
+      extra_sql => ' OR agentnum IS NULL',
+      order_by  => ' ORDER BY modename',
+  } );
+}
+
 =item num_prospect_cust_main
 
 Returns the number of prospects (customers with no packages ever ordered) for
@@ -393,6 +450,29 @@ sub cust_main_sql {
   );
 }
 
+=item num_ordered_cust_main
+
+Returns the number of ordered customers for this agent (customers with packages
+ordered, but not yet billed).
+
+=cut
+
+sub num_ordered_cust_main {
+  shift->num_sql(FS::cust_main->ordered_sql);
+}
+
+=item ordered_cust_main
+
+Returns the ordered customers for this agent (customers with packages ordered,
+but not yet billed), as cust_main objects.
+
+=cut
+
+sub ordered_cust_main {
+  shift->cust_main_sql(FS::cust_main->ordered_sql);
+}
+
+
 =item num_active_cust_main
 
 Returns the number of active customers for this agent (customers with active
@@ -527,6 +607,28 @@ sub num_cancel_cust_pkg {
   shift->num_pkg_sql(FS::cust_pkg->cancel_sql);
 }
 
+=item num_on_hold_cust_pkg
+
+Returns the number of inactive customer packages (one-time packages otherwise
+unsuspended/uncancelled) for this agent.
+
+=cut
+
+sub num_on_hold_cust_pkg {
+  shift->num_pkg_sql(FS::cust_pkg->on_hold_sql);
+}
+
+=item num_not_yet_billed_cust_pkg
+
+Returns the number of inactive customer packages (one-time packages otherwise
+unsuspended/uncancelled) for this agent.
+
+=cut
+
+sub num_not_yet_billed_cust_pkg {
+  shift->num_pkg_sql(FS::cust_pkg->not_yet_billed_sql);
+}
+
 =item generate_reg_codes NUM PKGPART_ARRAYREF
 
 Generates the specified number of registration codes, allowing purchase of the
@@ -618,6 +720,16 @@ sub num_sales {
   $sth->fetchrow_arrayref->[0];
 }
 
+sub commission_where {
+  my $self = shift;
+  'cust_credit.commission_agentnum = ' . $self->agentnum;
+}
+
+sub sales_where {
+  my $self = shift;
+  'cust_main.agentnum = ' . $self->agentnum;
+}
+
 =back
 
 =head1 BUGS