Lager: Umstellung auf Verwendung vom Part-Picker
[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 mark_as_paid_common {
337   $main::lxdebug->enter_sub();
338
339   my ($myconfig, $db_name) = @_;
340
341   my $form     = $main::form;
342   my $locale   = $main::locale;
343
344   if($form->{mark_as_paid}) {
345     SL::DB->client->with_transaction(sub {
346       my $dbh ||= SL::DB->client->dbh;
347       my $query = qq|UPDATE $db_name SET paid = amount, datepaid = current_date WHERE id = ?|;
348       do_query($form, $dbh, $query, $form->{id});
349       1;
350     }) or do { $::form->error(SL::DB->client->error) };
351     $form->redirect($locale->text("Marked as paid"));
352
353   } else {
354     my $referer = $ENV{HTTP_REFERER};
355     my $script;
356     my $callback;
357     if ($referer =~ /action/) {
358       $referer =~ /^(.*)\?action\=[^\&]*(\&.*)$/;
359       $script = $1;
360       $callback = $2;
361     } elsif ($referer =~ /RESTORE_FORM_FROM_SESSION_ID/){
362       $referer =~ /^(.*)\?RESTORE_FORM_FROM_SESSION_ID\=(.*)$/;
363       $script = $1;
364       $callback = "";
365     } else {
366       $script = $referer;
367       $callback = "";
368     }
369     $referer = $script . "?action=mark_as_paid&mark_as_paid=1&id=$form->{id}" . $callback;
370     $form->header();
371     print qq|<p><b>|.$locale->text('Mark as paid?').qq|</b></p>|;
372     print qq|<input type="button" value="|.$locale->text('yes').qq|" onclick="document.location.href='|.$referer.qq|'">&nbsp;|;
373     print qq|<input type="button" value="|.$locale->text('no').qq|" onclick="javascript:history.back();">|;
374   }
375
376   $main::lxdebug->leave_sub();
377 }
378
379 sub cov_selection_internal {
380   $main::lxdebug->enter_sub();
381
382   my $form     = $main::form;
383   my %myconfig = %main::myconfig;
384   my $locale   = $main::locale;
385
386   my $order_by = "name";
387   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
388   my $order_dir = 1;
389   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
390
391   my $type = $form->{"is_vendor"} ? $locale->text("vendor") : $locale->text("customer");
392
393   my $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, $order_by, $order_dir, $form->{"is_vendor"}, $form->{"allow_both"});
394   map({ $covs->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$covs}));
395
396   if (0 == scalar(@{$covs})) {
397     $form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
398   } elsif (1 == scalar(@{$covs})) {
399     $::request->{layout}->add_javascripts_inline("cov_selected('1')");
400   }
401
402   my $callback = "$form->{script}?action=cov_selection_internal&";
403   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
404       (qw(name input_name input_id is_vendor allow_both), grep({ /^[fl]_/ } keys %$form)));
405
406   my @header_sort = qw(name address contact);
407   my %header_title = ( "name" => $locale->text("Name"),
408                        "address" => $locale->text("Address"),
409                        "contact" => $locale->text("Contact"),
410                        );
411
412   my @header =
413     map(+{ "column_title" => $header_title{$_},
414            "column" => $_,
415            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
416          },
417         @header_sort);
418
419   foreach my $cov (@{ $covs }) {
420     $cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
421     $cov->{address} =~ s{^,}{}x;
422     $cov->{address} =~ s{\ +}{\ }gx;
423
424     $cov->{contact} = join " ", map { $cov->{$_} } qw(cp_gender cp_title cp_givenname cp_name);
425     $cov->{contact} =~ s{\ +}{\ }gx;
426   }
427
428   $form->{"title"} = $form->{is_vendor} ? $locale->text("Select a vendor") : $locale->text("Select a customer");
429   $form->header();
430   print($form->parse_html_template("generic/cov_selection", { "HEADER" => \@header,
431                                                               "COVS" => $covs, }));
432
433   $main::lxdebug->leave_sub();
434 }
435
436
437 # Functions to call add routines beneath different reports
438
439 sub sales_invoice {
440   $main::lxdebug->enter_sub();
441
442   print $::form->redirect_header('is.pl?action=add&type=invoice');
443
444   $main::lxdebug->leave_sub();
445 }
446
447 sub ar_transaction {
448   $main::lxdebug->enter_sub();
449
450   print $::form->redirect_header('ar.pl?action=add');
451
452   $main::lxdebug->leave_sub();
453 }
454
455 sub vendor_invoice {
456   $main::lxdebug->enter_sub();
457
458   print $::form->redirect_header('ir.pl?action=add&type=invoice');
459
460   $main::lxdebug->leave_sub();
461 }
462
463 sub ap_transaction {
464   $main::lxdebug->enter_sub();
465
466   print $::form->redirect_header('ap.pl?action=add');
467
468   $main::lxdebug->leave_sub();
469 }
470
471 sub gl_transaction {
472   $main::lxdebug->enter_sub();
473
474   print $::form->redirect_header('gl.pl?action=add');
475
476   $main::lxdebug->leave_sub();
477 }
478
479 sub db {
480   goto &SL::DB::Helper::Mappings::db;
481 }
482
483 1;