Einkaufs-, Verkaufs-, Debitoren- und Kreditorenrechnungen können als Entwurf gespeich...
[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 sub save {
38   $main::lxdebug->enter_sub();
39
40   my ($self, $myconfig, $form, $draft_id, $draft_description) = @_;
41
42   my ($dbh, $sth, $query, %saved, @dont_save, $dumped);
43
44   $dbh = $form->dbconnect_noauto($myconfig);
45
46   my ($module, $submodule) = $self->get_module($form);
47
48   $query = "SELECT COUNT(*) FROM drafts WHERE id = ?";
49   my ($res) = selectrow_query($form, $dbh, $query, $draft_id);
50   if (!$res) {
51     $draft_id = $module . "-" . $submodule . "-" . Common::unique_id();
52     $query = "INSERT INTO drafts (id, module, submodule) VALUES (?, ?, ?)";
53     do_query($form, $dbh, $query, $draft_id, $module, $submodule);
54   }
55
56   @dont_save = qw(login password path action);
57   map({ $saved{$_} = $form->{$_};
58         delete($form->{$_}); } @dont_save);
59   $dumped = YAML::Dump($form);
60   map({ $form->{$_} = $saved{$_}; } @dont_save);
61
62   $query =
63     qq|UPDATE drafts SET description = ?, form = ?, employee_id = | .
64     qq|  (SELECT id FROM employee WHERE login = ?) | .
65     qq|WHERE id = ?|;
66
67   do_query($form, $dbh, $query, $draft_description, $dumped,
68            $form->{login}, $draft_id);
69
70   $dbh->commit();
71   $dbh->disconnect();
72
73   $form->{draft_id} = $draft_id;
74   $form->{draft_description} = $draft_description;
75
76   $main::lxdebug->leave_sub();
77 }
78
79 sub load {
80   $main::lxdebug->enter_sub();
81
82   my ($self, $myconfig, $form, $draft_id) = @_;
83
84   my ($dbh, $sth, $query, @values);
85
86   $dbh = $form->dbconnect($myconfig);
87
88   $query = qq|SELECT id, description, form FROM drafts WHERE id = ?|;
89
90   $sth = $dbh->prepare($query);
91   $sth->execute($draft_id) || $form->dberror("$query ($draft_id)");
92
93   my @values;
94   if (my $ref = $sth->fetchrow_hashref()) {
95     @values = ($ref->{form}, $ref->{id}, $ref->{description});
96   }
97   $sth->finish();
98
99   do_query($form, $dbh, "DELETE FROM drafts WHERE id = ?", $draft_id);
100
101   $dbh->disconnect();
102
103   $main::lxdebug->leave_sub();
104
105   return @values;
106 }
107
108 sub remove {
109   $main::lxdebug->enter_sub();
110
111   my ($self, $myconfig, $form, $draft_id) = @_;
112
113   return $main::lxdebug->leave_sub() unless ($draft_id);
114
115   my ($dbh, $sth, $query, @values);
116
117   $dbh = $form->dbconnect($myconfig);
118
119   $query = qq|DELETE FROM drafts WHERE id = ?|;
120   do_query($form, $dbh, $query, $draft_id);
121
122   $dbh->disconnect();
123
124   $main::lxdebug->leave_sub();
125 }
126
127 sub list {
128   $main::lxdebug->enter_sub();
129
130   my ($self, $myconfig, $form) = @_;
131
132   my ($dbh, $sth, $query, @values);
133
134   $dbh = $form->dbconnect($myconfig);
135
136   my ($module, $submodule) = $self->get_module($form);
137
138   my @list = ();
139   $query =
140     qq|SELECT d.id, d.description, d.itime::timestamp(0) AS itime, | .
141     qq|  e.name AS employee_name | .
142     qq|FROM drafts d | .
143     qq|LEFT JOIN employee e ON d.employee_id = e.id | .
144     qq|WHERE (d.module = ?) AND (d.submodule = ?) | .
145     qq|ORDER BY d.itime|;
146   my @values = ($module, $submodule);
147
148   $sth = $dbh->prepare($query);
149   $sth->execute(@values) ||
150     $form->dberror($query . " (" . join(", ", @values) . ")");
151
152   while (my $ref = $sth->fetchrow_hashref()) {
153     push(@list, $ref);
154   }
155   $sth->finish();
156
157   $dbh->disconnect();
158
159   $main::lxdebug->leave_sub();
160
161   return @list;
162 }
163
164 1;