Fix für Bug 1136. Die Prüfung für not_discountable war zu früh. Zunächst muss form...
[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 sub get_module {
18   $main::lxdebug->enter_sub();
19
20   my ($self, $form) = @_;
21
22   my ($module, $submodule);
23
24   $module = $form->{"script"};
25   $module =~ s/\.pl$//;
26   if (grep({ $module eq $_ } qw(is ir ar ap))) {
27     $submodule = "invoice";
28   } else {
29     $submodule = "unknown";
30   }
31
32   $main::lxdebug->leave_sub();
33
34   return ($module, $submodule);
35 }
36
37 @dont_save = qw(login password stylesheet action);
38
39 sub save {
40   $main::lxdebug->enter_sub();
41
42   my ($self, $myconfig, $form, $draft_id, $draft_description) = @_;
43
44   my ($dbh, $sth, $query, %saved, $dumped);
45
46   $dbh = $form->dbconnect_noauto($myconfig);
47
48   my ($module, $submodule) = $self->get_module($form);
49
50   $query = "SELECT COUNT(*) FROM drafts WHERE id = ?";
51   my ($res) = selectrow_query($form, $dbh, $query, $draft_id);
52
53   if (!$res) {
54     $draft_id = $module . "-" . $submodule . "-" . Common::unique_id();
55     $query    = "INSERT INTO drafts (id, module, submodule) VALUES (?, ?, ?)";
56     do_query($form, $dbh, $query, $draft_id, $module, $submodule);
57   }
58
59   map({ $saved{$_} = $form->{$_};
60         delete($form->{$_}); } @dont_save);
61
62   $dumped = YAML::Dump($form);
63   map({ $form->{$_} = $saved{$_}; } @dont_save);
64
65   $query =
66     qq|UPDATE drafts SET description = ?, form = ?, employee_id = | .
67     qq|  (SELECT id FROM employee WHERE login = ?) | .
68     qq|WHERE id = ?|;
69
70   do_query($form, $dbh, $query, $draft_description, $dumped, $form->{login}, $draft_id);
71
72   $dbh->commit();
73   $dbh->disconnect();
74
75   $form->{draft_id}          = $draft_id;
76   $form->{draft_description} = $draft_description;
77
78   $main::lxdebug->leave_sub();
79 }
80
81 sub load {
82   $main::lxdebug->enter_sub();
83
84   my ($self, $myconfig, $form, $draft_id) = @_;
85
86   my ($dbh, $sth, $query, @values);
87
88   $dbh = $form->dbconnect($myconfig);
89
90   $query = qq|SELECT id, description, form FROM drafts WHERE id = ?|;
91
92   $sth = prepare_execute_query($form, $dbh, $query, $draft_id);
93
94   my @values;
95   if (my $ref = $sth->fetchrow_hashref()) {
96     @values = ($ref->{form}, $ref->{id}, $ref->{description});
97   }
98   $sth->finish();
99
100   $dbh->disconnect();
101
102   $main::lxdebug->leave_sub();
103
104   return @values;
105 }
106
107 sub remove {
108   $main::lxdebug->enter_sub();
109
110   my ($self, $myconfig, $form, @draft_ids) = @_;
111
112   return $main::lxdebug->leave_sub() unless (@draft_ids);
113
114   my ($dbh, $sth, $query);
115
116   $dbh = $form->dbconnect($myconfig);
117
118   $query = qq|DELETE FROM drafts WHERE id IN (| . join(", ", map { "?" } @draft_ids) . qq|)|;
119   do_query($form, $dbh, $query, @draft_ids);
120
121   $dbh->disconnect();
122
123   $main::lxdebug->leave_sub();
124 }
125
126 sub list {
127   $main::lxdebug->enter_sub();
128
129   my ($self, $myconfig, $form) = @_;
130
131   my ($dbh, $sth, $query, @values);
132
133   $dbh = $form->dbconnect($myconfig);
134
135   my ($module, $submodule) = $self->get_module($form);
136
137   my @list = ();
138   $query =
139     qq|SELECT d.id, d.description, d.itime::timestamp(0) AS itime, | .
140     qq|  e.name AS employee_name | .
141     qq|FROM drafts d | .
142     qq|LEFT JOIN employee e ON d.employee_id = e.id | .
143     qq|WHERE (d.module = ?) AND (d.submodule = ?) | .
144     qq|ORDER BY d.itime|;
145   my @values = ($module, $submodule);
146
147   $sth = prepare_execute_query($form, $dbh, $query, @values);
148
149   while (my $ref = $sth->fetchrow_hashref()) {
150     push(@list, $ref);
151   }
152   $sth->finish();
153
154   $dbh->disconnect();
155
156   $main::lxdebug->leave_sub();
157
158   return @list;
159 }
160
161 1;