delete fees, RT#81713
[freeside.git] / FS / FS / prospect_main.pm
index 81f71a9..c54c569 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use vars qw( $DEBUG @location_fields );
 use Scalar::Util qw( blessed );
 use FS::Conf;
-use FS::Record qw( dbh qsearch ); # qsearchs );
+use FS::Record qw( dbh qsearch qsearchs );
 use FS::cust_location;
 use FS::cust_main;
 
@@ -246,6 +246,7 @@ sub check {
     || $self->ut_foreign_key(  'agentnum', 'agent',         'agentnum' )
     || $self->ut_foreign_keyn( 'refnum',   'part_referral', 'refnum'   )
     || $self->ut_textn('company')
+    || $self->ut_foreign_keyn( 'taxstatusnum', 'tax_status', 'taxstatusnum' )
   ;
   return $error if $error;
 
@@ -269,16 +270,54 @@ sub name {
   my $self = shift;
   return $self->company if $self->company;
 
-  my $contact = ($self->prospect_contact)[0]->contact; #first contact?  good enough for now
-  return $contact->line if $contact;
+  my $prospect_contact = ($self->prospect_contact)[0]; #first contact?  good enough for now
+  my $contact = $prospect_contact->contact if $prospect_contact;
+  return $contact->line if $prospect_contact && $contact;
+
+  #address?
 
   'Prospect #'. $self->prospectnum;
 }
 
+=item contact_firstlast
+
+If this prospect has a company, returns the empty string.  If not, returns the
+first contact's first and last name.
+
+Primarily intended for use in quotation substitutions, like the FS::cust_main
+method of the same name.
+
+=cut
+
+sub contact_firstlast {
+  my $self = shift;
+  return '' if $self->company;
+  my @contacts = $self->contact;
+  #return '' unless @contacts;
+  warn $contacts[0]->first;
+  warn $contacts[0]->get('last');
+  $contacts[0]->first. ' '. $contacts[0]->get('last');
+}
+
 =item contact
 
 Returns the contacts (see L<FS::contact>) associated with this prospect.
 
+=cut
+
+sub contact {
+  my $self = shift;
+  my $search = {
+    table       => 'contact',
+    addl_from   => ' JOIN prospect_contact USING (contactnum)',
+    extra_sql   => ' WHERE prospect_contact.prospectnum = '.$self->prospectnum,
+  };
+
+  #classnum argument like FS::cust_main->contact?
+
+  qsearch($search);
+}
+
 =item cust_location
 
 Returns the locations (see L<FS::cust_location>) associated with this prospect.
@@ -287,8 +326,13 @@ Returns the locations (see L<FS::cust_location>) associated with this prospect.
 
 sub cust_location {
   my $self = shift;
-  qsearch( 'cust_location', { 'prospectnum' => $self->prospectnum,
-                              'custnum'     => '' } );
+  qsearch({
+    'table'   => 'cust_location',
+    'hashref' => { 'prospectnum' => $self->prospectnum,
+                   'custnum'     => '',
+                 },
+    'order_by' => 'ORDER BY country, LOWER(state), LOWER(city), LOWER(county), LOWER(address1), LOWER(address2)',
+  });
 }
 
 =item qual
@@ -299,6 +343,36 @@ Returns the qualifications (see L<FS::qual>) associated with this prospect.
 
 Returns the agent (see L<FS::agent>) for this customer.
 
+=item tax_status
+
+Returns the external tax status, as an FS::tax_status object, or the empty 
+string if there is no tax status.
+
+=cut
+
+sub tax_status {
+  my $self = shift;
+  if ( $self->taxstatusnum ) {
+    qsearchs('tax_status', { 'taxstatusnum' => $self->taxstatusnum } );
+  } else { 
+    return '';
+  }
+}
+
+=item taxstatus
+
+Returns the tax status code if there is one.
+
+=cut
+
+sub taxstatus {
+  my $self = shift;
+  my $tax_status = $self->tax_status;
+  $tax_status
+    ? $tax_status->taxstatus
+    : '';
+}
+
 =item convert_cust_main
 
 Converts this prospect to a customer.
@@ -316,16 +390,13 @@ sub convert_cust_main {
 
   my @contact = map $_->contact, $self->prospect_contact;
 
-  #XXX define one contact type as "billing", then we could pick just that one
-  my @invoicing_list = map $_->emailaddress, map $_->contact_email, @contact;
-
   #XXX i'm not compatible with cust_main-require_phone (which is kind of a
   # pre-contact thing anyway)
 
   my $cust_main = new FS::cust_main {
     'bill_location' => $cust_location[0],
     'ship_location' => $cust_location[0],
-    ( map { $_ => $self->$_ } qw( agentnum refnum company ) ),
+    ( map { $_ => $self->$_ } qw( agentnum refnum company taxstatusnum ) ),
   };
 
   $cust_main->refnum( FS::Conf->new->config('referraldefault') || 1  )
@@ -339,11 +410,11 @@ sub convert_cust_main {
     $cust_main->set('last',  'Unknown');
   }
 
-  #v3 payby
-  $cust_main->payby('BILL');
-  $cust_main->paydate('12/2037');
+  #v3 payby no longer allowed
+  #$cust_main->payby('BILL');
+  #$cust_main->paydate('12/2037');
 
-  $cust_main->insert( {}, \@invoicing_list,
+  $cust_main->insert( {},
     'prospectnum' => $self->prospectnum,
   )
     or $cust_main;
@@ -370,15 +441,18 @@ sub search {
   my @where = ();
   my $orderby;
 
-  ##
-  # parse agent
-  ##
-
+  #agent
   if ( $params->{'agentnum'} =~ /^(\d+)$/ and $1 ) {
     push @where,
       "prospect_main.agentnum = $1";
   }
 
+  #refnum
+  if ( $params->{'refnum'} =~ /^(\d+)$/ and $1 ) {
+    push @where,
+      "prospect_main.refnum = $1";
+  }
+
   ##
   # setup queries, subs, etc. for the search
   ##
@@ -410,6 +484,11 @@ sub cust_bill {
   return;
 }
 
+# XXX should have real localization here eventually
+sub locale {
+  FS::Conf->new->config('locale');
+}
+
 =back
 
 =head1 BUGS