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