Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Controller / CustomDataExportDesigner.pm
1 package SL::Controller::CustomDataExportDesigner;
2
3 use strict;
4 use utf8;
5
6 use parent qw(SL::Controller::Base);
7
8 use List::UtilsBy qw(sort_by);
9
10 use SL::DB::CustomDataExportQuery;
11 use SL::Helper::Flash qw(flash_later);
12 use SL::Locale::String qw(t8);
13
14 use Rose::Object::MakeMethods::Generic
15 (
16   'scalar --get_set_init' => [ qw(query queries access_rights) ],
17 );
18
19 __PACKAGE__->run_before('check_auth');
20 __PACKAGE__->run_before('setup_javascripts');
21
22 #
23 # actions
24 #
25
26 sub action_list {
27   my ($self) = @_;
28
29   $self->setup_list_action_bar;
30   $self->render('custom_data_export_designer/list', title => $::locale->text('Design custom data export queries'));
31 }
32
33 sub action_edit {
34   my ($self) = @_;
35
36   my $title = $self->query->id ? t8('Edit custom data export query') : t8('Add custom data export query');
37
38   $self->setup_edit_action_bar;
39   $self->render('custom_data_export_designer/edit', title => $title);
40 }
41
42 sub action_edit_parameters {
43   my ($self) = @_;
44
45   my $title     = $self->query->id ? t8('Edit custom data export query') : t8('Add custom data export query');
46   my @parameters = $self->gather_query_data;
47
48   $self->setup_edit_parameters_action_bar;
49   $self->render('custom_data_export_designer/edit_parameters', title => $title, PARAMETERS => \@parameters);
50 }
51
52 sub action_save {
53   my ($self) = @_;
54
55   my @parameters = $self->gather_query_data;
56
57   $self->query->parameters(\@parameters);
58
59   $self->query->save;
60
61   flash_later('info', t8('The custom data export has been saved.'));
62
63   $self->redirect_to($self->url_for(action => 'list'));
64 }
65
66 sub action_delete {
67   my ($self) = @_;
68
69   $self->query->delete;
70
71   flash_later('info', t8('The custom data export has been deleted.'));
72
73   $self->redirect_to($self->url_for(action => 'list'));
74 }
75
76 #
77 # filters
78 #
79
80 sub check_auth {
81   $::auth->assert('custom_data_export_designer');
82 }
83
84 sub setup_javascripts {
85   $::request->layout->add_javascripts('kivi.Validator.js', 'kivi.CustomDataExportDesigner.js');
86 }
87
88 #
89 # helpers
90 #
91
92 sub init_query   { $::form->{id} ? SL::DB::CustomDataExportQuery->new(id => $::form->{id})->load : SL::DB::CustomDataExportQuery->new }
93 sub init_queries { scalar SL::DB::Manager::CustomDataExportQuery->get_all_sorted }
94
95 sub init_access_rights {
96   my @rights = ([ '', t8('Available to all users') ]);
97   my $category;
98
99   foreach my $right ($::auth->all_rights_full) {
100     # name, description, category
101
102     if ($right->[2]) {
103       $category = t8($right->[1]);
104     } elsif ($category) {
105       push @rights, [ $right->[0], sprintf('%s → %s [%s]', $category, t8($right->[1]), $right->[0]) ];
106     }
107   }
108
109   return \@rights;
110 }
111
112 sub setup_list_action_bar {
113   my ($self) = @_;
114
115   for my $bar ($::request->layout->get('actionbar')) {
116     $bar->add(
117       link => [
118         t8('Add'),
119         link      => $self->url_for(action => 'edit'),
120         accesskey => 'enter',
121       ],
122     );
123   }
124 }
125
126 sub setup_edit_action_bar {
127   my ($self) = @_;
128
129   for my $bar ($::request->layout->get('actionbar')) {
130     $bar->add(
131       action => [
132         t8('Continue'),
133         submit    => [ '#form', { action => 'CustomDataExportDesigner/edit_parameters' } ],
134         checks    => [ 'kivi.validate_form' ],
135         accesskey => 'enter',
136       ],
137       action => [
138         t8('Delete'),
139         submit   => [ '#form', { action => 'CustomDataExportDesigner/delete' } ],
140         confirm  => t8('Do you really want to delete this object?'),
141         disabled => !$self->query->id ? t8('This object has not been saved yet.')
142                   :                      undef,
143       ],
144       action => [
145         t8('Back'),
146         call => [ 'kivi.history_back' ],
147       ],
148     );
149   }
150 }
151
152 sub setup_edit_parameters_action_bar {
153   my ($self) = @_;
154
155   for my $bar ($::request->layout->get('actionbar')) {
156     $bar->add(
157       action => [
158         t8('Save'),
159         submit    => [ '#form', { action => 'CustomDataExportDesigner/save' } ],
160         checks    => [ 'kivi.validate_form' ],
161         accesskey => 'enter',
162       ],
163       action => [
164         t8('Back'),
165         call => [ 'kivi.history_back' ],
166       ],
167     );
168   }
169 }
170
171 sub gather_query_data {
172   my ($self) = @_;
173
174   $self->query->$_($::form->{query}->{$_}) for qw(name description sql_query access_right);
175   return $self->gather_query_parameters;
176 }
177
178 sub gather_query_parameters {
179   my ($self) = @_;
180
181   my %used_parameter_names  = map  { ($_ => 1) }                       $self->query->used_parameter_names;
182   my @existing_parameters   = grep { $used_parameter_names{$_->name} } @{ $self->query->parameters // [] };
183   my %parameters_by_name    = map  { ($_->name => $_) }                @existing_parameters;
184   $parameters_by_name{$_} //= SL::DB::CustomDataExportQueryParameter->new(name => $_, parameter_type => 'text', default_value_type => 'none') for keys %used_parameter_names;
185
186   foreach my $parameter_data (@{ $::form->{parameters} // [] }) {
187     my $parameter_obj = $parameters_by_name{ $parameter_data->{name} };
188     next unless $parameter_obj;
189
190     $parameter_obj->$_($parameter_data->{$_}) for qw(parameter_type description default_value_type default_value);
191   }
192
193   return sort_by { lc $_->name } values %parameters_by_name;
194 }
195
196 1;