TopQuickSearch: erste version
[kivitendo-erp.git] / SL / Controller / TopQuickSearch / Contact.pm
diff --git a/SL/Controller/TopQuickSearch/Contact.pm b/SL/Controller/TopQuickSearch/Contact.pm
new file mode 100644 (file)
index 0000000..5607a5b
--- /dev/null
@@ -0,0 +1,85 @@
+package SL::Controller::TopQuickSearch::Contact;
+
+use strict;
+use parent qw(SL::Controller::TopQuickSearch::Base);
+
+use SL::Controller::CustomerVendor;
+use SL::DB::Vendor;
+use SL::DBUtils qw(selectfirst_array_query);
+use SL::Locale::String qw(t8);
+
+sub auth { 'customer_vendor_edit' }
+
+sub name { 'contact' }
+
+sub description_config { t8('Contact') }
+
+sub description_field { t8('Contacts') }
+
+sub query_autocomplete {
+  my ($self) = @_;
+
+  my $result = SL::DB::Manager::Contact->get_all(
+    query => [
+      or => [
+        cp_name      => { ilike => "%$::form->{term}%" },
+        cp_givenname => { ilike => "%$::form->{term}%" },
+        cp_email     => { ilike => "%$::form->{term}%" },
+      ],
+      cp_cv_id => [ \'SELECT id FROM customer UNION SELECT id FROM vendor' ],
+    ],
+    limit => 10,
+    sort_by => 'cp_name',
+  );
+
+  return [
+    map {
+     value       => $_->full_name,
+     label       => $_->full_name,
+     id          => $_->cp_id,
+    }, @$result
+  ];
+}
+
+sub select_autocomplete {
+  my ($self) = @_;
+
+  my $contact = SL::DB::Manager::Contact->find_by(cp_id => $::form->{id});
+
+  SL::Controller::CustomerVendor->new->url_for(action => 'edit', id => $contact->cp_cv_id, db => db_for_contact($contact));
+}
+
+sub do_search {
+  my ($self) = @_;
+
+  my $results = $self->query_autocomplete;
+
+  if (@$results != 1) {
+    return SL::Controller::CustomerVendor->new->url_for(
+      controller      => 'ct.pl',
+      action          => 'list_contacts',
+      'filter.status' => 'active',
+      search_term     => $::form->{term},
+    );
+  } else {
+    $::form->{id} = $results->[0]{id};
+    return $self->select_autocomplete;
+  }
+}
+
+
+sub db_for_contact {
+  my ($contact) = @_;
+
+  my ($customer, $vendor) = selectfirst_array_query($::form, $::form->get_standard_dbh, <<SQL, ($contact->cp_cv_id)x2);
+    SELECT (SELECT COUNT(id) FROM customer WHERE id = ?), (SELECT COUNT(id) FROM vendor WHERE id = ?);
+SQL
+
+  die 'Contact is orphaned, cannot link to it'         if !$customer && !$vendor;
+
+  $customer ? 'customer' : 'vendor';
+}
+
+# TODO: multi search
+
+1;