Fix für Bug 1738 - Entwürfe können nicht gelöscht werden
[kivitendo-erp.git] / SL / Drafts.pm
1 #======================================================================
2 # LX-Office ERP
3 #
4 #======================================================================
5 #
6 # Saving and loading drafts
7 #
8 #======================================================================
9
10 package Drafts;
11
12 use YAML;
13
14 use SL::Common;
15 use SL::DBUtils;
16
17 use strict;
18
19 sub get_module {
20   $main::lxdebug->enter_sub();
21
22   my ($self, $form) = @_;
23
24   my ($module, $submodule);
25
26   $module = $form->{"script"};
27   $module =~ s/\.pl$//;
28   if (grep({ $module eq $_ } qw(is ir ar ap))) {
29     $submodule = "invoice";
30   } else {
31     $submodule = "unknown";
32   }
33
34   $main::lxdebug->leave_sub();
35
36   return ($module, $submodule);
37 }
38
39 my @dont_save = qw(login password stylesheet action);
40
41 sub save {
42   $main::lxdebug->enter_sub();
43
44   my ($self, $myconfig, $form, $draft_id, $draft_description) = @_;
45
46   my ($dbh, $sth, $query, %saved, $dumped);
47
48   $dbh = $form->get_standard_dbh;
49   $dbh->begin_work;
50
51   my ($module, $submodule) = $self->get_module($form);
52
53   $query = "SELECT COUNT(*) FROM drafts WHERE id = ?";
54   my ($res) = selectrow_query($form, $dbh, $query, $draft_id);
55
56   if (!$res) {
57     $draft_id = $module . "-" . $submodule . "-" . Common::unique_id();
58     $query    = "INSERT INTO drafts (id, module, submodule) VALUES (?, ?, ?)";
59     do_query($form, $dbh, $query, $draft_id, $module, $submodule);
60   }
61
62   map({ $saved{$_} = $form->{$_};
63         delete($form->{$_}); } @dont_save);
64
65   $dumped = YAML::Dump($form);
66   map({ $form->{$_} = $saved{$_}; } @dont_save);
67
68   $query =
69     qq|UPDATE drafts SET description = ?, form = ?, employee_id = | .
70     qq|  (SELECT id FROM employee WHERE login = ?) | .
71     qq|WHERE id = ?|;
72
73   do_query($form, $dbh, $query, $draft_description, $dumped, $form->{login}, $draft_id);
74
75   $dbh->commit();
76
77   $form->{draft_id}          = $draft_id;
78   $form->{draft_description} = $draft_description;
79
80   $main::lxdebug->leave_sub();
81 }
82
83 sub load {
84   $main::lxdebug->enter_sub();
85
86   my ($self, $myconfig, $form, $draft_id) = @_;
87
88   my ($dbh, $sth, $query, @values);
89
90   $dbh = $form->get_standard_dbh;
91
92   $query = qq|SELECT id, description, form FROM drafts WHERE id = ?|;
93
94   $sth = prepare_execute_query($form, $dbh, $query, $draft_id);
95
96   if (my $ref = $sth->fetchrow_hashref()) {
97     @values = ($ref->{form}, $ref->{id}, $ref->{description});
98   }
99   $sth->finish();
100
101   $main::lxdebug->leave_sub();
102
103   return @values;
104 }
105
106 sub remove {
107   $main::lxdebug->enter_sub();
108
109   my ($self, $myconfig, $form, @draft_ids) = @_;
110
111   return $main::lxdebug->leave_sub() unless (@draft_ids);
112
113   my ($dbh, $sth, $query);
114
115   $dbh = $form->get_standard_dbh;
116
117   $query = qq|DELETE FROM drafts WHERE id IN (| . join(", ", map { "?" } @draft_ids) . qq|)|;
118   do_query($form, $dbh, $query, @draft_ids);
119
120   $dbh->commit;
121
122   $main::lxdebug->leave_sub();
123 }
124
125 sub list {
126   $::lxdebug->enter_sub;
127
128   my $self     = shift;
129   my $myconfig = shift || \%::myconfig;
130   my $form     = shift ||  $::form;
131   my $dbh      = $form->get_standard_dbh;
132
133   my @list = selectall_hashref_query($form, $dbh, <<SQL, $self->get_module($form));
134     SELECT d.id, d.description, d.itime::timestamp(0) AS itime,
135       e.name AS employee_name
136     FROM drafts d
137     LEFT JOIN employee e ON d.employee_id = e.id
138     WHERE (d.module = ?) AND (d.submodule = ?)
139     ORDER BY d.itime
140 SQL
141
142   $::lxdebug->leave_sub;
143
144   return @list;
145 }
146
147 1;