Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Controller / TopQuickSearch / Article.pm
1 package SL::Controller::TopQuickSearch::Article;
2
3 use strict;
4 use parent qw(Rose::Object);
5
6 use SL::Locale::String qw(t8);
7 use SL::DB::Part;
8 use SL::Controller::Helper::GetModels;
9 use SL::Controller::Base;
10
11 use Rose::Object::MakeMethods::Generic (
12   'scalar --get_set_init' => [ qw(parts models part) ],
13 );
14
15 sub auth { 'part_service_assembly_edit' }
16
17 sub name { 'article' }
18
19 sub description_config { t8('Articles') }
20
21 sub description_field { t8('Articles') }
22
23 sub query_autocomplete {
24   my ($self) = @_;
25
26   my $objects = $self->models->get;
27
28   [
29     map {
30      value       => $_->displayable_name,
31      label       => $_->displayable_name,
32      id          => $_->id,
33     }, @$objects
34   ];
35 }
36
37 sub select_autocomplete {
38   my ($self) = @_;
39   $self->redirect_to_part($::form->{id});
40 }
41
42 sub do_search {
43   my ($self) = @_;
44
45   my $objects = $self->models->get;
46
47   return !@$objects     ? ()
48        : @$objects == 1 ? $self->redirect_to_part($objects->[0]->id)
49        :                  $self->redirect_to_search($::form->{term});
50 }
51
52 sub redirect_to_search {
53   my ($self, $term) = @_;
54
55   SL::Controller::Base->new->url_for(
56     controller   => 'ic.pl',
57     action       => 'generate_report',
58     all          => $term,
59     (searchitems => $self->part_type) x!!$self->part_type,
60   );
61 }
62
63 sub redirect_to_part {
64   my ($self, $term) = @_;
65
66   SL::Controller::Base->new->url_for(
67     controller => 'controller.pl',
68     action     => 'Part/edit',
69     'part.id'  => $term,
70   );
71 }
72
73 sub part_type {
74   ()
75 }
76
77 sub init_models {
78   my ($self) = @_;
79
80   SL::Controller::Helper::GetModels->new(
81     controller => $self,
82     model      => 'Part',
83     source     => {
84       filter => {
85         (part_type => $self->part_type) x!!$self->part_type,
86         or => [ obsolete => undef, obsolete => 0 ],
87         'all:substr:multi::ilike' => $::form->{term},
88       },
89     },
90     sorted     => {
91       _default   => {
92         by  => 'partnumber',
93         dir => 1,
94       },
95       partnumber => t8('Partnumber'),
96     },
97     paginated  => {
98       per_page => 10,
99     },
100   )
101 }
102
103 1;