e21b3c5052d6bf3672131d66f79cdc43a40d9ad1
[kivitendo-erp.git] / bin / mozilla / common.pl
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 # Stuff that can be used from other modules
9 #
10 ######################################################################
11
12 use SL::Common;
13 use SL::DB::Helper::Mappings;
14 use SL::DB;
15 use SL::DBUtils qw(do_query);
16 use SL::Form;
17 use SL::MoreCommon qw(restore_form save_form);
18
19 use strict;
20
21 sub build_std_url {
22   $main::lxdebug->enter_sub(2);
23
24   my $form     = $main::form;
25
26   my $script = $form->{script};
27
28   my @parts;
29
30   foreach my $key (@_) {
31     next unless ($key);
32
33     if ($key =~ /(.*?)=(.*)/) {
34       if ($1 eq 'script') {
35         $script = $2;
36       } else {
37         push @parts, $key;
38       }
39
40     } else {
41       foreach my $var ($form->flatten_variables($key)) {
42         push @parts, E($var->{key}) . '=' . E($var->{value});
43       }
44     }
45   }
46
47   my $url = "${script}?" . join('&', @parts);
48
49   $main::lxdebug->leave_sub(2);
50
51   return $url;
52 }
53
54 # -------------------------------------------------------------------------
55
56 sub delivery_customer_selection {
57   $main::lxdebug->enter_sub();
58
59   my $form     = $main::form;
60   my %myconfig = %main::myconfig;
61   my $locale   = $main::locale;
62
63   my $order_by = "name";
64   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
65   my $order_dir = 1;
66   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
67
68   my $delivery = Common->retrieve_delivery_customer(\%myconfig, $form, $order_by, $order_dir);
69   map({ $delivery->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$delivery}));
70
71   if (0 == scalar(@{$delivery})) {
72     $form->show_generic_information($locale->text("No Customer was found matching the search parameters."));
73   } elsif (1 == scalar(@{$delivery})) {
74     $::request->{layout}->add_javascripts_inline("customer_selected('1')");
75   }
76
77   my $callback = "$form->{script}?action=delivery_customer_selection&";
78   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
79       (qw(name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
80
81   my @header_sort = qw(name customernumber address);
82   my %header_title = ( "name" => $locale->text("Name"),
83                        "customernumber" => $locale->text("Customer Number"),
84                        "address" => $locale->text("Address"),
85                      );
86
87   my @header =
88     map(+{ "column_title" => $header_title{$_},
89            "column" => $_,
90            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
91          },
92         @header_sort);
93
94   $form->{"title"} = $locale->text("Select a Customer");
95   $form->header(no_layout => 1);
96   print $form->parse_html_template("generic/select_delivery_customer", { "HEADER"   => \@header,
97                                                                          "DELIVERY" => $delivery, });
98
99   $main::lxdebug->leave_sub();
100 }
101
102 # -------------------------------------------------------------------------
103
104 sub vendor_selection {
105   $main::lxdebug->enter_sub();
106
107   my $form     = $main::form;
108   my %myconfig = %main::myconfig;
109   my $locale   = $main::locale;
110
111   my $order_by = "name";
112   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
113   my $order_dir = 1;
114   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
115
116   my $vendor = Common->retrieve_vendor(\%myconfig, $form, $order_by, $order_dir);
117   map({ $vendor->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$vendor}));
118
119   if (0 == scalar(@{$vendor})) {
120     $form->show_generic_information($locale->text("No Vendor was found matching the search parameters."));
121   } elsif (1 == scalar(@{$vendor})) {
122     $::request->{layout}->add_javascripts_inline("vendor_selected('1')");
123   }
124
125   my $callback = "$form->{script}?action=vendor_selection&";
126   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
127       (qw(name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
128
129   my @header_sort = qw(name customernumber address);
130   my %header_title = ( "name" => $locale->text("Name"),
131                        "customernumber" => $locale->text("Customer Number"),
132                        "address" => $locale->text("Address"),
133                      );
134
135   my @header =
136     map(+{ "column_title" => $header_title{$_},
137            "column" => $_,
138            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
139          },
140         @header_sort);
141
142   $form->{"title"} = $locale->text("Select a Customer");
143   $form->header(no_layout => 1);
144   print $form->parse_html_template("generic/select_vendor", { "HEADER" => \@header,
145                                                               "VENDOR" => $vendor, });
146
147   $main::lxdebug->leave_sub();
148 }
149
150 # -------------------------------------------------------------------------
151
152 sub calculate_qty {
153   $main::lxdebug->enter_sub();
154
155   my $form     = $main::form;
156   my $locale   = $main::locale;
157
158   $form->{formel} =~ s/\r\n//g;
159
160   my ($variable_string, $formel) = split /###/,$form->{formel};
161   my @variable;
162
163   foreach my $item (split m/;/, $variable_string) {
164     next unless $item =~ m/^ \s* (\w+) \s* = \s* (\w+) \s* (\w+) \s* $/x;
165     push @variable, {
166       description => $1,
167       name        => $2,
168       unit        => $3,
169     };
170   }
171
172   my @header_sort = qw(variable value unit);
173   my %header_title = (
174     variable => $locale->text("Variable"),
175     value    => $locale->text("Value"),
176     unit     => $locale->text("Unit"),
177   );
178   my @header = map +{
179     column_title => $header_title{$_},
180     column       => $_,
181   }, @header_sort;
182
183   $form->{formel} = $formel;
184   $form->{title}  = $locale->text("Please enter values");
185   $form->header(no_layout => 1);
186   print $form->parse_html_template("generic/calculate_qty", { "HEADER"    => \@header,
187                                                               "VARIABLES" => \@variable, });
188
189   $main::lxdebug->leave_sub();
190 }
191
192 # -------------------------------------------------------------------------
193
194 sub H {
195   return $main::locale->quote_special_chars('HTML', $_[0]);
196 }
197
198 sub Q {
199   return $main::locale->quote_special_chars('URL@HTML', $_[0]);
200 }
201
202 sub E {
203   return $main::form->escape($_[0]);
204 }
205
206 sub NTI {
207   my ($element) = @_;
208
209   $element =~ s/tabindex\s*=\s*"\d+"//;
210   return $element;
211 }
212
213 sub format_dates {
214   return $::form->format_dates(@_);
215 }
216
217 sub reformat_numbers {
218   return $::form->reformat_numbers(@_);
219 }
220
221 # -------------------------------------------------------------------------
222
223 sub show_history {
224   $main::lxdebug->enter_sub();
225
226   my $form     = $main::form;
227   my %myconfig = %main::myconfig;
228   my $locale   = $main::locale;
229
230   my $dbh = $form->dbconnect(\%myconfig);
231   my ($sort, $sortby) = split(/\-\-/, $form->{order});
232   $sort =~ s/.*\.(.*)/$1/;
233
234   $form->{title} = $locale->text("History");
235   $form->header(no_layout => 1);
236
237   my $callback = build_std_url(qw(action longdescription trans_id_type input_name));
238   my $restriction;
239   if ( $form->{trans_id_type} eq 'glid' ) {
240     $restriction = "AND ( snumbers LIKE 'invnumber%' OR what_done LIKE '%Buchungsnummer%' OR snumbers LIKE 'gltransaction%' ) ";
241   } elsif ( $form->{trans_id_type} eq 'id' ) {
242     $restriction = " AND ( snumbers NOT LIKE 'invnumber_%' AND snumbers NOT LIKE 'gltransaction%' AND (what_done NOT LIKE '%Buchungsnummer%' OR what_done IS null))";
243   } else {
244     $restriction = '';
245   };
246
247   print $form->parse_html_template( "common/show_history", {
248     "DATEN"        => $form->get_history($dbh,$form->{input_name},$restriction,$form->{order}),
249     "SUCCESS"      => ($form->get_history($dbh,$form->{input_name}) ne "0"),
250     uc($sort)      => 1,
251     uc($sort)."BY" => $sortby,
252     callback       => $callback,
253   } );
254
255   $dbh->disconnect();
256   $main::lxdebug->leave_sub();
257 }
258
259 # -------------------------------------------------------------------------
260
261 sub call_sub {
262   $main::lxdebug->enter_sub();
263
264   my $name = shift;
265
266   my $form     = $main::form;
267   my $locale   = $main::locale;
268
269   if (!$name) {
270     $form->error($locale->text("Trying to call a sub without a name"));
271   }
272
273   $name =~ s/[^a-zA-Z0-9_]//g;
274
275   if (!defined(&{ $name })) {
276     $form->error(sprintf($locale->text("Attempt to call an undefined sub named '%s'"), $name));
277   }
278
279   {
280     no strict "refs";
281     &{ $name }(@_);
282   }
283
284   $main::lxdebug->leave_sub();
285 }
286
287 # -------------------------------------------------------------------------
288
289 sub show_vc_details {
290   $main::lxdebug->enter_sub();
291
292   my $form     = $main::form;
293   my %myconfig = %main::myconfig;
294   my $locale   = $main::locale;
295
296   $form->{vc} = $form->{vc} eq "customer" ? "customer" : "vendor";
297   $form->isblank("vc_id",
298                  $form->{vc} eq "customer" ?
299                  $locale->text("No customer has been selected yet.") :
300                  $locale->text("No vendor has been selected yet."));
301
302   Common->get_vc_details(\%myconfig, $form, $form->{vc}, $form->{vc_id});
303   $form->{discount_as_percent} = $form->format_amount(\%::myconfig, $form->parse_amount(\%::myconfig, $form->{discount}) * 100, 2);
304
305   $form->{title} = $form->{vc} eq "customer" ?
306     $locale->text("Customer details") : $locale->text("Vendor details");
307   $form->header(no_layout => 1);
308   print $form->parse_html_template("common/show_vc_details", { "is_customer" => $form->{vc} eq "customer" });
309
310   $main::lxdebug->leave_sub();
311 }
312
313 # -------------------------------------------------------------------------
314
315 sub retrieve_partunits {
316   $main::lxdebug->enter_sub();
317
318   my $form     = $main::form;
319
320   my @part_ids = grep { $_ } map { $form->{"id_${_}"} } (1..$form->{rowcount});
321
322   if (@part_ids) {
323     my %partunits = IO->retrieve_partunits('part_ids' => \@part_ids);
324
325     foreach my $i (1..$form->{rowcount}) {
326       next unless ($form->{"id_${i}"});
327       $form->{"partunit_${i}"} = $partunits{$form->{"id_${i}"}};
328     }
329   }
330
331   $main::lxdebug->leave_sub();
332 }
333
334 # -------------------------------------------------------------------------
335
336 sub cov_selection_internal {
337   $main::lxdebug->enter_sub();
338
339   my $form     = $main::form;
340   my %myconfig = %main::myconfig;
341   my $locale   = $main::locale;
342
343   my $order_by = "name";
344   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
345   my $order_dir = 1;
346   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
347
348   my $type = $form->{"is_vendor"} ? $locale->text("vendor") : $locale->text("customer");
349
350   my $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, $order_by, $order_dir, $form->{"is_vendor"}, $form->{"allow_both"});
351   map({ $covs->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$covs}));
352
353   if (0 == scalar(@{$covs})) {
354     $form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
355   } elsif (1 == scalar(@{$covs})) {
356     $::request->{layout}->add_javascripts_inline("cov_selected('1')");
357   }
358
359   my $callback = "$form->{script}?action=cov_selection_internal&";
360   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
361       (qw(name input_name input_id is_vendor allow_both), grep({ /^[fl]_/ } keys %$form)));
362
363   my @header_sort = qw(name address contact);
364   my %header_title = ( "name" => $locale->text("Name"),
365                        "address" => $locale->text("Address"),
366                        "contact" => $locale->text("Contact"),
367                        );
368
369   my @header =
370     map(+{ "column_title" => $header_title{$_},
371            "column" => $_,
372            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
373          },
374         @header_sort);
375
376   foreach my $cov (@{ $covs }) {
377     $cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
378     $cov->{address} =~ s{^,}{}x;
379     $cov->{address} =~ s{\ +}{\ }gx;
380
381     $cov->{contact} = join " ", map { $cov->{$_} } qw(cp_gender cp_title cp_givenname cp_name);
382     $cov->{contact} =~ s{\ +}{\ }gx;
383   }
384
385   $form->{"title"} = $form->{is_vendor} ? $locale->text("Select a vendor") : $locale->text("Select a customer");
386   $form->header();
387   print($form->parse_html_template("generic/cov_selection", { "HEADER" => \@header,
388                                                               "COVS" => $covs, }));
389
390   $main::lxdebug->leave_sub();
391 }
392
393
394 # Functions to call add routines beneath different reports
395
396 sub sales_invoice {
397   $main::lxdebug->enter_sub();
398
399   print $::form->redirect_header('is.pl?action=add&type=invoice');
400
401   $main::lxdebug->leave_sub();
402 }
403
404 sub ar_transaction {
405   $main::lxdebug->enter_sub();
406
407   print $::form->redirect_header('ar.pl?action=add');
408
409   $main::lxdebug->leave_sub();
410 }
411
412 sub vendor_invoice {
413   $main::lxdebug->enter_sub();
414
415   print $::form->redirect_header('ir.pl?action=add&type=invoice');
416
417   $main::lxdebug->leave_sub();
418 }
419
420 sub ap_transaction {
421   $main::lxdebug->enter_sub();
422
423   print $::form->redirect_header('ap.pl?action=add');
424
425   $main::lxdebug->leave_sub();
426 }
427
428 sub gl_transaction {
429   $main::lxdebug->enter_sub();
430
431   print $::form->redirect_header('gl.pl?action=add');
432
433   $main::lxdebug->leave_sub();
434 }
435
436 sub db {
437   goto &SL::DB::Helper::Mappings::db;
438 }
439
440 sub continue { call_sub($::form->{nextsub}); }
441
442 1;