calculate_qty (Formel): auf Dialog umgestellt
[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   my $html = $form->parse_html_template("generic/calculate_qty", { "HEADER"    => \@header,
185                                                                    "VARIABLES" => \@variable, });
186   print $::form->ajax_response_header, $html;
187
188   $main::lxdebug->leave_sub();
189 }
190
191 # -------------------------------------------------------------------------
192
193 sub H {
194   return $main::locale->quote_special_chars('HTML', $_[0]);
195 }
196
197 sub Q {
198   return $main::locale->quote_special_chars('URL@HTML', $_[0]);
199 }
200
201 sub E {
202   return $main::form->escape($_[0]);
203 }
204
205 sub NTI {
206   my ($element) = @_;
207
208   $element =~ s/tabindex\s*=\s*"\d+"//;
209   return $element;
210 }
211
212 sub format_dates {
213   return $::form->format_dates(@_);
214 }
215
216 sub reformat_numbers {
217   return $::form->reformat_numbers(@_);
218 }
219
220 # -------------------------------------------------------------------------
221
222 sub show_history {
223   $main::lxdebug->enter_sub();
224
225   my $form     = $main::form;
226   my %myconfig = %main::myconfig;
227   my $locale   = $main::locale;
228
229   my $dbh = $form->dbconnect(\%myconfig);
230   my ($sort, $sortby) = split(/\-\-/, $form->{order});
231   $sort =~ s/.*\.(.*)/$1/;
232
233   $form->{title} = $locale->text("History");
234   $form->header(no_layout => 1);
235
236   my $callback = build_std_url(qw(action longdescription trans_id_type input_name));
237   my $restriction;
238   if ( $form->{trans_id_type} eq 'glid' ) {
239     $restriction = "AND ( snumbers LIKE 'invnumber%' OR what_done LIKE '%Buchungsnummer%' OR snumbers LIKE 'gltransaction%' OR snumbers LIKE 'emailjournal%' ) ";
240   } elsif ( $form->{trans_id_type} eq 'id' ) {
241     $restriction = " AND ( snumbers NOT LIKE 'invnumber_%' AND snumbers NOT LIKE 'gltransaction%' AND snumbers NOT LIKE 'emailjournal%' AND (what_done NOT LIKE '%Buchungsnummer%' OR what_done IS null))";
242   } else {
243     $restriction = '';
244   };
245
246   print $form->parse_html_template( "common/show_history", {
247     "DATEN"        => $form->get_history($dbh,$form->{input_name},$restriction,$form->{order}),
248     "SUCCESS"      => ($form->get_history($dbh,$form->{input_name}) ne "0"),
249     uc($sort)      => 1,
250     uc($sort)."BY" => $sortby,
251     callback       => $callback,
252   } );
253
254   $dbh->disconnect();
255   $main::lxdebug->leave_sub();
256 }
257
258 # -------------------------------------------------------------------------
259
260 sub call_sub {
261   $main::lxdebug->enter_sub();
262
263   my $name = shift;
264
265   my $form     = $main::form;
266   my $locale   = $main::locale;
267
268   if (!$name) {
269     $form->error($locale->text("Trying to call a sub without a name"));
270   }
271
272   $name =~ s/[^a-zA-Z0-9_]//g;
273
274   if (!defined(&{ $name })) {
275     $form->error(sprintf($locale->text("Attempt to call an undefined sub named '%s'"), $name));
276   }
277
278   {
279     no strict "refs";
280     &{ $name }(@_);
281   }
282
283   $main::lxdebug->leave_sub();
284 }
285
286 # -------------------------------------------------------------------------
287
288 sub show_vc_details {
289   $main::lxdebug->enter_sub();
290
291   my $form     = $main::form;
292   my %myconfig = %main::myconfig;
293   my $locale   = $main::locale;
294
295   $form->{vc} = $form->{vc} eq "customer" ? "customer" : "vendor";
296   $form->isblank("vc_id",
297                  $form->{vc} eq "customer" ?
298                  $locale->text("No customer has been selected yet.") :
299                  $locale->text("No vendor has been selected yet."));
300
301   Common->get_vc_details(\%myconfig, $form, $form->{vc}, $form->{vc_id});
302   $form->{discount_as_percent} = $form->format_amount(\%::myconfig, $form->parse_amount(\%::myconfig, $form->{discount}) * 100, 2);
303
304   $form->{title} = $form->{vc} eq "customer" ?
305     $locale->text("Customer details") : $locale->text("Vendor details");
306   $form->header(no_layout => 1);
307   print $form->parse_html_template("common/show_vc_details", { "is_customer" => $form->{vc} eq "customer" });
308
309   $main::lxdebug->leave_sub();
310 }
311
312 # -------------------------------------------------------------------------
313
314 sub retrieve_partunits {
315   $main::lxdebug->enter_sub();
316
317   my $form     = $main::form;
318
319   my @part_ids = grep { $_ } map { $form->{"id_${_}"} } (1..$form->{rowcount});
320
321   if (@part_ids) {
322     my %partunits = IO->retrieve_partunits('part_ids' => \@part_ids);
323
324     foreach my $i (1..$form->{rowcount}) {
325       next unless ($form->{"id_${i}"});
326       $form->{"partunit_${i}"} = $partunits{$form->{"id_${i}"}};
327     }
328   }
329
330   $main::lxdebug->leave_sub();
331 }
332
333 # -------------------------------------------------------------------------
334
335 sub cov_selection_internal {
336   $main::lxdebug->enter_sub();
337
338   my $form     = $main::form;
339   my %myconfig = %main::myconfig;
340   my $locale   = $main::locale;
341
342   my $order_by = "name";
343   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
344   my $order_dir = 1;
345   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
346
347   my $type = $form->{"is_vendor"} ? $locale->text("vendor") : $locale->text("customer");
348
349   my $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, $order_by, $order_dir, $form->{"is_vendor"}, $form->{"allow_both"});
350   map({ $covs->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$covs}));
351
352   if (0 == scalar(@{$covs})) {
353     $form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
354   } elsif (1 == scalar(@{$covs})) {
355     $::request->{layout}->add_javascripts_inline("cov_selected('1')");
356   }
357
358   my $callback = "$form->{script}?action=cov_selection_internal&";
359   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
360       (qw(name input_name input_id is_vendor allow_both), grep({ /^[fl]_/ } keys %$form)));
361
362   my @header_sort = qw(name address contact);
363   my %header_title = ( "name" => $locale->text("Name"),
364                        "address" => $locale->text("Address"),
365                        "contact" => $locale->text("Contact"),
366                        );
367
368   my @header =
369     map(+{ "column_title" => $header_title{$_},
370            "column" => $_,
371            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
372          },
373         @header_sort);
374
375   foreach my $cov (@{ $covs }) {
376     $cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
377     $cov->{address} =~ s{^,}{}x;
378     $cov->{address} =~ s{\ +}{\ }gx;
379
380     $cov->{contact} = join " ", map { $cov->{$_} } qw(cp_gender cp_title cp_givenname cp_name);
381     $cov->{contact} =~ s{\ +}{\ }gx;
382   }
383
384   $form->{"title"} = $form->{is_vendor} ? $locale->text("Select a vendor") : $locale->text("Select a customer");
385   $form->header();
386   print($form->parse_html_template("generic/cov_selection", { "HEADER" => \@header,
387                                                               "COVS" => $covs, }));
388
389   $main::lxdebug->leave_sub();
390 }
391
392
393 # Functions to call add routines beneath different reports
394
395 sub sales_invoice {
396   $main::lxdebug->enter_sub();
397
398   print $::form->redirect_header('is.pl?action=add&type=invoice');
399
400   $main::lxdebug->leave_sub();
401 }
402
403 sub ar_transaction {
404   $main::lxdebug->enter_sub();
405
406   print $::form->redirect_header('ar.pl?action=add');
407
408   $main::lxdebug->leave_sub();
409 }
410
411 sub vendor_invoice {
412   $main::lxdebug->enter_sub();
413
414   print $::form->redirect_header('ir.pl?action=add&type=invoice');
415
416   $main::lxdebug->leave_sub();
417 }
418
419 sub ap_transaction {
420   $main::lxdebug->enter_sub();
421
422   print $::form->redirect_header('ap.pl?action=add');
423
424   $main::lxdebug->leave_sub();
425 }
426
427 sub gl_transaction {
428   $main::lxdebug->enter_sub();
429
430   print $::form->redirect_header('gl.pl?action=add');
431
432   $main::lxdebug->leave_sub();
433 }
434
435 sub db {
436   goto &SL::DB::Helper::Mappings::db;
437 }
438
439 sub continue { call_sub($::form->{nextsub}); }
440
441 1;