5607a5b8296e8bfead09a97565c2be5ba37d67be
[kivitendo-erp.git] / SL / Controller / TopQuickSearch / Contact.pm
1 package SL::Controller::TopQuickSearch::Contact;
2
3 use strict;
4 use parent qw(SL::Controller::TopQuickSearch::Base);
5
6 use SL::Controller::CustomerVendor;
7 use SL::DB::Vendor;
8 use SL::DBUtils qw(selectfirst_array_query);
9 use SL::Locale::String qw(t8);
10
11 sub auth { 'customer_vendor_edit' }
12
13 sub name { 'contact' }
14
15 sub description_config { t8('Contact') }
16
17 sub description_field { t8('Contacts') }
18
19 sub query_autocomplete {
20   my ($self) = @_;
21
22   my $result = SL::DB::Manager::Contact->get_all(
23     query => [
24       or => [
25         cp_name      => { ilike => "%$::form->{term}%" },
26         cp_givenname => { ilike => "%$::form->{term}%" },
27         cp_email     => { ilike => "%$::form->{term}%" },
28       ],
29       cp_cv_id => [ \'SELECT id FROM customer UNION SELECT id FROM vendor' ],
30     ],
31     limit => 10,
32     sort_by => 'cp_name',
33   );
34
35   return [
36     map {
37      value       => $_->full_name,
38      label       => $_->full_name,
39      id          => $_->cp_id,
40     }, @$result
41   ];
42 }
43
44 sub select_autocomplete {
45   my ($self) = @_;
46
47   my $contact = SL::DB::Manager::Contact->find_by(cp_id => $::form->{id});
48
49   SL::Controller::CustomerVendor->new->url_for(action => 'edit', id => $contact->cp_cv_id, db => db_for_contact($contact));
50 }
51
52 sub do_search {
53   my ($self) = @_;
54
55   my $results = $self->query_autocomplete;
56
57   if (@$results != 1) {
58     return SL::Controller::CustomerVendor->new->url_for(
59       controller      => 'ct.pl',
60       action          => 'list_contacts',
61       'filter.status' => 'active',
62       search_term     => $::form->{term},
63     );
64   } else {
65     $::form->{id} = $results->[0]{id};
66     return $self->select_autocomplete;
67   }
68 }
69
70
71 sub db_for_contact {
72   my ($contact) = @_;
73
74   my ($customer, $vendor) = selectfirst_array_query($::form, $::form->get_standard_dbh, <<SQL, ($contact->cp_cv_id)x2);
75     SELECT (SELECT COUNT(id) FROM customer WHERE id = ?), (SELECT COUNT(id) FROM vendor WHERE id = ?);
76 SQL
77
78   die 'Contact is orphaned, cannot link to it'         if !$customer && !$vendor;
79
80   $customer ? 'customer' : 'vendor';
81 }
82
83 # TODO: multi search
84
85 1;