In SQL-Queries keine Form-Variablen direkt benutzen.
[kivitendo-erp.git] / SL / Common.pm
1 #====================================================================
2 # LX-Office ERP
3 # Copyright (C) 2004
4 # Based on SQL-Ledger Version 2.1.9
5 # Web http://www.lx-office.org
6 #
7 #====================================================================
8
9 package Common;
10
11 use Time::HiRes qw(gettimeofday);
12
13 sub unique_id {
14   my ($a, $b) = gettimeofday();
15   return "${a}-${b}-${$}";
16 }
17
18 sub tmpname {
19   return "/tmp/lx-office-tmp-" . unique_id();
20 }
21
22 sub retrieve_parts {
23   $main::lxdebug->enter_sub();
24
25   my ($self, $myconfig, $form, $order_by, $order_dir) = @_;
26
27   my $dbh = $form->dbconnect($myconfig);
28
29   my (@filter_values, $filter);
30   if ($form->{"partnumber"}) {
31     $filter .= qq| AND (partnumber ILIKE ?)|;
32     push(@filter_values, '%' . $form->{"partnumber"} . '%');
33   }
34   if ($form->{"description"}) {
35     $filter .= qq| AND (description ILIKE ?)|;
36     push(@filter_values, '%' . $form->{"description"} . '%');
37   }
38   substr($filter, 1, 3) = "WHERE" if ($filter);
39
40   $order_by =~ s/[^a-zA-Z_]//g;
41   $order_dir = $order_dir ? "ASC" : "DESC";
42
43   my $query =
44     qq|SELECT id, partnumber, description | .
45     qq|FROM parts $filter | .
46     qq|ORDER BY $order_by $order_dir|;
47   my $sth = $dbh->prepare($query);
48   $sth->execute(@filter_values) || $form->dberror($query . " (" . join(", ", @filter_values) . ")");
49   my $parts = [];
50   while (my $ref = $sth->fetchrow_hashref()) {
51     push(@{$parts}, $ref);
52   }
53   $sth->finish();
54   $dbh->disconnect();
55
56   $main::lxdebug->leave_sub();
57
58   return $parts;
59 }
60
61 sub retrieve_projects {
62   $main::lxdebug->enter_sub();
63
64   my ($self, $myconfig, $form, $order_by, $order_dir) = @_;
65
66   my $dbh = $form->dbconnect($myconfig);
67
68   my (@filter_values, $filter);
69   if ($form->{"projectnumber"}) {
70     $filter .= qq| AND (projectnumber ILIKE ?)|;
71     push(@filter_values, '%' . $form->{"projectnumber"} . '%');
72   }
73   if ($form->{"description"}) {
74     $filter .= qq| AND (description ILIKE ?)|;
75     push(@filter_values, '%' . $form->{"description"} . '%');
76   }
77   substr($filter, 1, 3) = "WHERE" if ($filter);
78
79   $order_by =~ s/[^a-zA-Z_]//g;
80   $order_dir = $order_dir ? "ASC" : "DESC";
81
82   my $query =
83     qq|SELECT id, projectnumber, description | .
84     qq|FROM project $filter | .
85     qq|ORDER BY $order_by $order_dir|;
86   my $sth = $dbh->prepare($query);
87   $sth->execute(@filter_values) || $form->dberror($query . " (" . join(", ", @filter_values) . ")");
88   my $projects = [];
89   while (my $ref = $sth->fetchrow_hashref()) {
90     push(@{$projects}, $ref);
91   }
92   $sth->finish();
93   $dbh->disconnect();
94
95   $main::lxdebug->leave_sub();
96
97   return $projects;
98 }
99
100 sub retrieve_employees {
101   $main::lxdebug->enter_sub();
102
103   my ($self, $myconfig, $form, $order_by, $order_dir) = @_;
104
105   my $dbh = $form->dbconnect($myconfig);
106
107   my (@filter_values, $filter);
108   if ($form->{"name"}) {
109     $filter .= qq| AND (name ILIKE ?)|;
110     push(@filter_values, '%' . $form->{"name"} . '%');
111   }
112   substr($filter, 1, 3) = "WHERE" if ($filter);
113
114   $order_by =~ s/[^a-zA-Z_]//g;
115   $order_dir = $order_dir ? "ASC" : "DESC";
116
117   my $query =
118     qq|SELECT id, name | .
119     qq|FROM employee $filter | .
120     qq|ORDER BY $order_by $order_dir|;
121   my $sth = $dbh->prepare($query);
122   $sth->execute(@filter_values) || $form->dberror($query . " (" . join(", ", @filter_values) . ")");
123   my $employees = [];
124   while (my $ref = $sth->fetchrow_hashref()) {
125     push(@{$employees}, $ref);
126   }
127   $sth->finish();
128   $dbh->disconnect();
129
130   $main::lxdebug->leave_sub();
131
132   return $employees;
133 }
134
135 sub retrieve_delivery_customer {
136   $main::lxdebug->enter_sub();
137
138   my ($self, $myconfig, $form, $order_by, $order_dir) = @_;
139
140   my $dbh = $form->dbconnect($myconfig);
141
142   my (@filter_values, $filter);
143   if ($form->{"name"}) {
144     $filter .= qq| (name ILIKE ?) AND|;
145     push(@filter_values, '%' . $form->{"name"} . '%');
146   }
147
148   $order_by =~ s/[^a-zA-Z_]//g;
149   $order_dir = $order_dir ? "ASC" : "DESC";
150
151   my $query =
152     qq!SELECT id, name, customernumber, (street || ', ' || zipcode || city) AS address ! .
153     qq!FROM customer ! .
154     qq!WHERE $filter business_id = (SELECT id FROM business WHERE description = 'Endkunde') ! .
155     qq!ORDER BY $order_by $order_dir!;
156   my $sth = $dbh->prepare($query);
157   $sth->execute(@filter_values) ||
158     $form->dberror($query . " (" . join(", ", @filter_values) . ")");
159   my $delivery_customers = [];
160   while (my $ref = $sth->fetchrow_hashref()) {
161     push(@{$delivery_customers}, $ref);
162   }
163   $sth->finish();
164   $dbh->disconnect();
165
166   $main::lxdebug->leave_sub();
167
168   return $delivery_customers;
169 }
170
171 sub retrieve_vendor {
172   $main::lxdebug->enter_sub();
173
174   my ($self, $myconfig, $form, $order_by, $order_dir) = @_;
175
176   my $dbh = $form->dbconnect($myconfig);
177
178   my (@filter_values, $filter);
179   if ($form->{"name"}) {
180     $filter .= qq| (name ILIKE ?) AND|;
181     push(@filter_values, '%' . $form->{"name"} . '%');
182   }
183
184   $order_by =~ s/[^a-zA-Z_]//g;
185   $order_dir = $order_dir ? "ASC" : "DESC";
186
187   my $query =
188     qq!SELECT id, name, customernumber, (street || ', ' || zipcode || city) AS address FROM customer ! .
189     qq!WHERE $filter business_id = (SELECT id FROM business WHERE description = 'Händler') ! .
190     qq!ORDER BY $order_by $order_dir!;
191   my $sth = $dbh->prepare($query);
192   $sth->execute(@filter_values) ||
193     $form->dberror($query . " (" . join(", ", @filter_values) . ")");
194   my $vendors = [];
195   while (my $ref = $sth->fetchrow_hashref()) {
196     push(@{$vendors}, $ref);
197   }
198   $sth->finish();
199   $dbh->disconnect();
200
201   $main::lxdebug->leave_sub();
202
203   return $vendors;
204 }
205
206 sub mkdir_with_parents {
207   $main::lxdebug->enter_sub();
208
209   my ($full_path) = @_;
210
211   my $path = "";
212
213   $full_path =~ s|/+|/|;
214
215   foreach my $part (split(m|/|, $full_path)) {
216     $path .= "/" if ($path);
217     $path .= $part;
218
219     die("Could not create directory '$path' because a file exists with " .
220         "the same name.\n") if (-f $path);
221
222     if (! -d $path) {
223       mkdir($path, 0770) || die("Could not create the directory '$path'. " .
224                                 "OS error: $!\n");
225     }
226   }
227
228   $main::lxdebug->leave_sub();
229 }
230
231 sub webdav_folder {
232   $main::lxdebug->enter_sub();
233
234   my ($form) = @_;
235
236   return $main::lxdebug->leave_sub()
237     unless ($main::webdav && $form->{id});
238
239   my ($path, $number);
240
241   $form->{WEBDAV} = {};
242
243   if ($form->{type} eq "sales_quotation") {
244     ($path, $number) = ("angebote", $form->{quonumber});
245   } elsif ($form->{type} eq "sales_order") {
246     ($path, $number) = ("bestellungen", $form->{ordnumber});
247   } elsif ($form->{type} eq "request_quotation") {
248     ($path, $number) = ("anfragen", $form->{quonumber});
249   } elsif ($form->{type} eq "purchase_order") {
250     ($path, $number) = ("lieferantenbestellungen", $form->{ordnumber});
251   } elsif ($form->{type} eq "credit_note") {
252     ($path, $number) = ("gutschriften", $form->{invnumber});
253   } elsif ($form->{vc} eq "customer") {
254     ($path, $number) = ("rechnungen", $form->{invnumber});
255   } else {
256     ($path, $number) = ("einkaufsrechnungen", $form->{invnumber});
257   }
258
259   return $main::lxdebug->leave_sub() unless ($path && $number);
260
261   $path = "webdav/${path}/${number}";
262
263   if (!-d $path) {
264     mkdir_with_parents($path);
265
266   } else {
267     my $base_path = substr($ENV{'SCRIPT_NAME'}, 1);
268     $base_path =~ s|[^/]+$||;
269
270     foreach my $file (<$path/*>) {
271       my $fname = $file;
272       $fname =~ s|.*/||;
273       $form->{WEBDAV}{$fname} =
274         ($ENV{"HTTPS"} ? "https://" : "http://") .
275         $ENV{'SERVER_NAME'} . "/" . $base_path . $file;
276     }
277   }
278
279   $main::lxdebug->leave_sub();
280 }
281
282 1;