marei: headline/colspec keys for SimpleTabular
[kivitendo-erp.git] / SL / Controller / Draft.pm
1 package SL::Controller::Draft;
2
3 use strict;
4
5 use parent qw(SL::Controller::Base);
6
7 use SL::Helper::Flash qw(flash);
8 use SL::Locale::String qw(t8);
9 use SL::Request;
10 use SL::DB::Draft;
11 use SL::DBUtils qw(selectall_hashref_query);
12 use SL::YAML;
13 use List::Util qw(max);
14
15 use Rose::Object::MakeMethods::Generic (
16  scalar => [ qw() ],
17  'scalar --get_set_init' => [ qw(module submodule draft) ],
18 );
19
20 __PACKAGE__->run_before('check_auth');
21
22 my %allowed_modules = map { $_ => "bin/mozilla/$_.pl" } qw(is ir ar ap gl);
23
24 #
25 # actions
26 #
27
28 sub action_draft_dialog {
29   my ($self) = @_;
30   $self->js
31     ->dialog->open({
32       html   => $self->dialog_html,
33       id     => 'save_draft',
34       dialog => {
35         title => t8('Drafts'),
36       },
37     })
38     ->render;
39 }
40
41 sub action_save {
42   my ($self) = @_;
43
44   my $id          = $::form->{id};
45   my $description = $::form->{description} or die 'need description';
46   my $form        = $self->_build_form;
47
48   my $draft = SL::DB::Manager::Draft->find_by_or_create(id => $id);
49
50   $draft->id($self->module . '-' . $self->submodule . '-' . Common::unique_id()) unless $draft->id;
51
52   $draft->assign_attributes(
53     module      => $self->module,
54     submodule   => $self->submodule,
55     description => $description,
56     form        => SL::YAML::Dump($form),
57     employee_id => SL::DB::Manager::Employee->current->id,
58   );
59
60   $self->draft($draft);
61
62   if (!$draft->save) {
63     flash('error', t8('There was an error saving the draft'));
64     $self->js
65       ->html('#save_draft', $self->dialog_html)
66       ->render;
67   } else {
68     $self->js
69       ->flash('info', t8("Draft saved."))
70       ->dialog->close('#save_draft')
71       ->val('#draft_id', $draft->id)
72       ->render;
73   }
74 }
75
76 sub action_load {
77   my ($self) = @_;
78
79   if (!$allowed_modules{ $self->draft->module }) {
80     $::form->error(t8('Unknown module: #1', $self->draft->module));
81   } else {
82     package main;
83     require $allowed_modules{ $self->draft->module };
84   }
85   my $params = delete $::form->{form};
86   my $new_form = SL::YAML::Load($self->draft->form);
87   $::form->{$_} = $new_form->{$_} for keys %$new_form;
88   $::form->{"draft_$_"} = $self->draft->$_ for qw(id description);
89
90   if ($params && 'HASH' eq ref $params) {
91     $::form->{$_} = $params->{$_} for keys %$params;
92   }
93   $::form->{script} = $self->draft->module . '.pl';
94   ::show_draft();
95 }
96
97 sub action_delete {
98   my ($self) = @_;
99
100   $self->module($self->draft->module);
101   $self->submodule($self->draft->submodule);
102
103   if (!$self->draft->delete) {
104     flash('error', t8('There was an error deleting the draft'));
105     $self->js
106       ->html('#save_draft', $self->dialog_html)
107       ->render;
108   } else {
109     flash('info', t8('Draft deleted'));
110
111     $self->js
112       ->html('#save_draft', $self->dialog_html)
113       ->render;
114   }
115 }
116
117 #
118 # helpers
119 #
120
121 sub _build_form {
122   my $last_index = max map { /form\[(\d+)\]/ ? $1 : 0 } keys %$::form;
123   my $new_form = {};
124
125   for my $i (0..$last_index) {
126     SL::Request::_store_value($new_form, $::form->{"form[$i][name]"}, $::form->{"form[$i][value]"});
127   }
128
129   return $new_form;
130 }
131
132 sub draft_list {
133   my ($self) = @_;
134
135   if ($::auth->assert('all_drafts_edit', 1)) {
136    my $result = selectall_hashref_query($::form, $::form->get_standard_dbh, <<SQL, $self->module, $self->submodule);
137     SELECT d.*, date(d.itime) AS date
138     FROM drafts d
139     WHERE (d.module      = ?)
140       AND (d.submodule   = ?)
141     ORDER BY d.itime
142 SQL
143   } else {
144     my $result = selectall_hashref_query($::form, $::form->get_standard_dbh, <<SQL, $self->module, $self->submodule, SL::DB::Manager::Employee->current->id);
145     SELECT d.*, date(d.itime) AS date
146     FROM drafts d
147     WHERE (d.module      = ?)
148       AND (d.submodule   = ?)
149       AND (d.employee_id = ?)
150     ORDER BY d.itime
151 SQL
152   }
153 }
154
155 sub dialog_html {
156   my ($self) = @_;
157
158   $self->render('drafts/form', { layout => 0, output => 0 },
159     drafts_list => $self->draft_list
160   )
161 }
162
163 sub init_module {
164   $::form->{module}      or die 'need module';
165 }
166
167 sub init_submodule {
168   $::form->{submodule}   or die 'need submodule';
169 }
170
171 sub init_draft {
172   SL::DB::Manager::Draft->find_by(id => $::form->{id}) or die t8('Could not load this draft');
173 }
174
175 sub check_auth {
176   $::auth->assert('vendor_invoice_edit | invoice_edit | ap_transactions | ar_transactions');
177 }
178
179 1;
180
181 __END__
182
183 =encoding utf-8
184
185 =head1 NAME
186
187 SL::Controller::Draft
188
189 =head1 DESCRIPTION
190
191 Encapsulates the old draft mechanism. Use and improvement are discuraged as
192 long as the storage is not upgrade safe.
193
194 =head1 TODO
195
196   - optional popup on entry
197
198 =head1 AUTHOR
199
200 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
201
202 =cut