bcdb599966dae549c322e5909cb699f45d064e96
[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::Form;
13 use SL::Common;
14 use SL::MoreCommon;
15
16 sub build_std_url {
17   $lxdebug->enter_sub(2);
18
19   my $script = $form->{script};
20
21   my @parts;
22
23   foreach my $key ((qw(login password), @_)) {
24     next unless ($key);
25
26     if ($key =~ /(.*?)=(.*)/) {
27       if ($1 eq 'script') {
28         $script = $2;
29       } else {
30         push @parts, $key;
31       }
32
33     } else {
34       push @parts, "${key}=" . E($form->{$key});
35     }
36   }
37
38   my $url = "${script}?" . join('&', @parts);
39
40   $lxdebug->leave_sub(2);
41
42   return $url;
43 }
44
45 sub select_employee {
46   $lxdebug->enter_sub();
47
48   my ($callback_sub, @employees) = @_;
49
50   if (0 == scalar(@employees)) {
51     @employees = SystemBrace->get_all_employees(\%myconfig, $form);
52   }
53
54   my $old_form = save_form();
55
56   $form->header();
57   print($form->parse_html_template("generic/select_employee",
58                                    { "EMPLOYEES" => \@employees,
59                                      "old_form" => $old_form,
60                                      "title" => $locale->text("Select an employee"),
61                                      "nextsub" => "select_employee_internal",
62                                      "callback_sub" => $callback_sub }));
63
64   $lxdebug->leave_sub();
65 }
66
67 sub select_employee_internal {
68   $lxdebug->enter_sub();
69
70   my ($new_id, $new_name, $callback_sub);
71
72   my $new_id = $form->{"new_id_" . $form->{"selection"}};
73   my $new_name = $form->{"new_name_" . $form->{"selection"}};
74   my $callback_sub = $form->{"callback_sub"};
75
76   restore_form($form->{"old_form"});
77
78   call_sub($callback_sub, $new_id, $new_name);
79
80   $lxdebug->leave_sub();
81 }
82
83 ## Customers/Vendors
84
85 sub check_customer_or_vendor {
86   $lxdebug->enter_sub();
87
88   my ($field, $cov_selected_nextsub, $is_vendor) = @_;
89
90   if ($form->{"f_${field}"} eq $form->{"f_old_${field}"}) {
91     $lxdebug->leave_sub();
92     return 1;
93   }
94
95   my $type = $is_vendor ? $locale->text("vendor") : $locale->text("customer");
96
97   my $old_form = save_form();
98   $form->{"name"} = $form->{"f_${field}"};
99   $form->{"obsolete"} = 1;
100   my $covs;
101   $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, "name", 1, $is_vendor);
102   restore_form($old_form);
103
104   if (0 == scalar(@{$covs})) {
105     $form->header();
106     $form->show_generic_error(sprintf($locale->text("There is no %s whose name matches '%s'."), $type, $form->{"f_${field}"}));
107
108     $lxdebug->leave_sub();
109     return 0;
110
111   }
112
113   if (1 != scalar(@{$covs})) {
114     # If there is more than one CoV with the same name
115     # then we have to check if the ID is set, too. Otherwise
116     # we'd be stuck in an endless loop.
117     if ($form->{"f_${field}_id"}) {
118       foreach my $cov (@{$covs}) {
119         if (($form->{"f_${field}_id"} == $cov->{"id"}) &&
120             ($form->{"f_${field}"} eq $cov->{"name"})) {
121           $lxdebug->leave_sub();
122           return 1;
123         }
124       }
125     }
126
127     $form->{"cov_selected_nextsub"} = $cov_selected_nextsub;
128     $form->{"check_cov_field"} = $field;
129     select_customer_or_vendor("cov_selected", $is_vendor, @{$covs});
130     $lxdebug->leave_sub();
131     return 0;
132   }
133
134   $form->{"f_${field}_id"} = $covs->[0]->{"id"};
135   $form->{"f_${field}"} = $covs->[0]->{"name"};
136
137   $lxdebug->leave_sub();
138
139   return 1;
140 }
141
142 sub select_customer_or_vendor {
143   $lxdebug->enter_sub();
144
145   my ($callback_sub, $is_vendor, @covs) = @_;
146
147   my $old_form = save_form();
148
149   if (0 == scalar(@covs)) {
150     delete($form->{"name"});
151     $form->{"obsolete"} = 1;
152     my $c = Common->retrieve_customers_or_vendors(\%myconfig, $form, "name", 1, $is_vendor);
153     restore_form($old_form);
154     @covs = @{$c};
155   }
156
157   $form->header();
158   print($form->parse_html_template("generic/select_customer_or_vendor",
159                                    { "COVS" => \@covs,
160                                      "old_form" => $old_form,
161                                      "title" => $is_vendor ? $locale->text("Select a vendor") : $locale->text("Select a customer"),
162                                      "nextsub" => "select_cov_internal",
163                                      "callback_sub" => $callback_sub }));
164
165   $lxdebug->leave_sub();
166 }
167
168 sub cov_selected {
169   $lxdebug->enter_sub();
170   my ($new_id, $new_name) = @_;
171
172   my $field = $form->{"check_cov_field"};
173   delete($form->{"check_cov_field"});
174
175   $form->{"f_${field}_id"} = $new_id;
176   $form->{"f_${field}"} = $new_name;
177   $form->{"f_old_${field}"} = $new_name;
178
179   &{ $form->{"cov_selected_nextsub"} }();
180
181   $lxdebug->leave_sub();
182 }
183
184 sub select_cov_internal {
185   $lxdebug->enter_sub();
186
187   my ($new_id, $new_name, $callback_sub);
188
189   my $new_id = $form->{"new_id_" . $form->{"selection"}};
190   my $new_name = $form->{"new_name_" . $form->{"selection"}};
191   my $callback_sub = $form->{"callback_sub"};
192
193   restore_form($form->{"old_form"});
194
195   &{ $callback_sub }($new_id, $new_name);
196
197   $lxdebug->leave_sub();
198 }
199
200 sub select_part {
201   $lxdebug->enter_sub();
202
203   my ($callback_sub, @parts) = @_;
204
205   my $remap_parts_id = 0;
206   if (defined($parts[0]->{"parts_id"}) && !defined($parts[0]->{"id"})) {
207     $remap_parts_id = 1;
208     map({ $_->{"id"} = $_->{"parts_id"}; } @parts);
209   }
210
211   my $remap_partnumber = 0;
212   if (defined($parts[0]->{"partnumber"}) && !defined($parts[0]->{"number"})) {
213     $remap_partnumber = 1;
214     map({ $_->{"number"} = $_->{"partnumber"}; } @parts);
215   }
216
217   my $has_charge = 0;
218   if (defined($parts[0]->{"chargenumber"})) {
219     $has_charge = 1;
220     map({ $_->{"has_charge"} = 1; } @parts);
221   }
222
223   my $old_form = save_form();
224
225   $form->header();
226   print($form->parse_html_template("generic/select_part",
227                                    { "PARTS" => \@parts,
228                                      "old_form" => $old_form,
229                                      "title" => $locale->text("Select a part"),
230                                      "nextsub" => "select_part_internal",
231                                      "callback_sub" => $callback_sub,
232                                      "has_charge" => $has_charge,
233                                      "remap_parts_id" => $remap_parts_id,
234                                      "remap_partnumber" => $remap_partnumber }));
235
236   $lxdebug->leave_sub();
237 }
238
239 sub select_part_internal {
240   $lxdebug->enter_sub();
241
242   my ($new_item, $callback_sub);
243
244   my $re = "^new_.*_" . $form->{"selection"};
245   map({
246     my $key = $_;
247     $key =~ s/^new_//;
248     $key =~ s/_\d+$//;
249     $new_item->{$key} = $form->{$_};
250   } grep(/$re/, keys(%{$form})));
251
252   if ($form->{"remap_parts_id"}) {
253     $new_item->{"parts_id"} = $new_item->{"id"};
254     delete($new_item->{"id"});
255   }
256   if ($form->{"remap_partnumber"}) {
257     $new_item->{"partnumber"} = $new_item->{"number"};
258     delete($new_item->{"number"});
259   }
260
261   my $callback_sub = $form->{"callback_sub"};
262
263   restore_form($form->{"old_form"});
264
265   call_sub($callback_sub, $new_item);
266
267   $lxdebug->leave_sub();
268 }
269
270 sub part_selection_internal {
271   $lxdebug->enter_sub();
272
273   $order_by = "description";
274   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
275   $order_dir = 1;
276   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
277
278   $parts = Common->retrieve_parts(\%myconfig, $form, $order_by, $order_dir);
279   map({ $parts->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$parts}));
280   if (0 == scalar(@{$parts})) {
281     $form->show_generic_information($locale->text("No part was found matching the search parameters."));
282   } elsif (1 == scalar(@{$parts})) {
283     $onload = "part_selected('1')";
284   }
285
286   my $callback = "$form->{script}?action=part_selection_internal&";
287   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
288       (qw(login password partnumber description input_partnumber input_description input_partsid), grep({ /^[fl]_/ } keys %$form)));
289
290   my @header_sort = qw(partnumber description);
291   my %header_title = ( "partnumber" => $locale->text("Part Number"),
292                        "description" => $locale->text("Part description"),
293                        );
294
295   my @header =
296     map(+{ "column_title" => $header_title{$_},
297            "column" => $_,
298            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
299          },
300         @header_sort);
301
302   $form->{"title"} = $locale->text("Select a part");
303   $form->header();
304   print($form->parse_html_template("generic/part_selection", { "HEADER" => \@header,
305                                                                "PARTS" => $parts,
306                                                                "onload" => $onload }));
307
308   $lxdebug->leave_sub();
309 }
310
311 sub project_selection_internal {
312   $lxdebug->enter_sub();
313
314   $order_by = "description";
315   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
316   $order_dir = 1;
317   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
318
319   $projects = Common->retrieve_projects(\%myconfig, $form, $order_by, $order_dir);
320   map({ $projects->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$projects}));
321   if (0 == scalar(@{$projects})) {
322     $form->show_generic_information($locale->text("No project was found matching the search parameters."));
323   } elsif (1 == scalar(@{$projects})) {
324     $onload = "project_selected('1')";
325   }
326
327   my $callback = "$form->{script}?action=project_selection_internal&";
328   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
329       (qw(login password projectnumber description input_projectnumber input_description input_project_id), grep({ /^[fl]_/ } keys %$form)));
330
331   my @header_sort = qw(projectnumber description);
332   my %header_title = ( "projectnumber" => $locale->text("Project Number"),
333                        "description" => $locale->text("Project description"),
334                        );
335
336   my @header =
337     map(+{ "column_title" => $header_title{$_},
338            "column" => $_,
339            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
340          },
341         @header_sort);
342
343   $form->{"title"} = $locale->text("Select a project");
344   $form->header();
345   print($form->parse_html_template("generic/project_selection", { "HEADER" => \@header,
346                                                                   "PROJECTS" => $projects,
347                                                                   "onload" => $onload }));
348
349   $lxdebug->leave_sub();
350 }
351
352 sub employee_selection_internal {
353   $lxdebug->enter_sub();
354
355   $order_by = "name";
356   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
357   $order_dir = 1;
358   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
359
360   $employees = Common->retrieve_employees(\%myconfig, $form, $order_by, $order_dir);
361   map({ $employees->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$employees}));
362   if (0 == scalar(@{$employees})) {
363     $form->show_generic_information($locale->text("No employee was found matching the search parameters."));
364   } elsif (1 == scalar(@{$employees})) {
365     $onload = "employee_selected('1')";
366   }
367
368   my $callback = "$form->{script}?action=employee_selection_internal&";
369   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
370       (qw(login password name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
371
372   my @header_sort = qw(name);
373   my %header_title = ( "name" => $locale->text("Name"),
374                        );
375
376   my @header =
377     map(+{ "column_title" => $header_title{$_},
378            "column" => $_,
379            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
380          },
381         @header_sort);
382
383   $form->{"title"} = $locale->text("Select an employee");
384   $form->header();
385   print($form->parse_html_template("generic/employee_selection", { "HEADER" => \@header,
386                                                                    "EMPLOYEES" => $employees,
387                                                                    "onload" => $onload }));
388
389   $lxdebug->leave_sub();
390 }
391
392 sub delivery_customer_selection {
393   $lxdebug->enter_sub();
394
395   $order_by = "name";
396   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
397   $order_dir = 1;
398   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
399
400   $delivery = Common->retrieve_delivery_customer(\%myconfig, $form, $order_by, $order_dir);
401   map({ $delivery->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$delivery}));
402   if (0 == scalar(@{$delivery})) {
403     $form->show_generic_information($locale->text("No Customer was found matching the search parameters."));
404   } elsif (1 == scalar(@{$delivery})) {
405     $onload = "customer_selected('1')";
406   }
407
408   my $callback = "$form->{script}?action=delivery_customer_selection&";
409   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
410       (qw(login password name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
411
412   my @header_sort = qw(name customernumber address);
413   my %header_title = ( "name" => $locale->text("Name"),
414                        "customernumber" => $locale->text("Customer Number"),
415                        "address" => $locale->text("Address"),
416                      );
417
418   my @header =
419     map(+{ "column_title" => $header_title{$_},
420            "column" => $_,
421            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
422          },
423         @header_sort);
424
425   $form->{"title"} = $locale->text("Select a Customer");
426   $form->header();
427   print $form->parse_html_template("generic/select_delivery_customer", { "HEADER"   => \@header,
428                                                                          "DELIVERY" => $delivery,
429                                                                          "onload"   => $onload });
430
431   $lxdebug->leave_sub();
432 }
433
434 sub vendor_selection {
435   $lxdebug->enter_sub();
436
437   $order_by = "name";
438   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
439   $order_dir = 1;
440   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
441
442   $vendor = Common->retrieve_vendor(\%myconfig, $form, $order_by, $order_dir);
443   map({ $vendor->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$vendor}));
444   if (0 == scalar(@{$vendor})) {
445     $form->show_generic_information($locale->text("No Vendor was found matching the search parameters."));
446   } elsif (1 == scalar(@{$vendor})) {
447     $onload = "vendor_selected('1')";
448   }
449
450   my $callback = "$form->{script}?action=vendor_selection&";
451   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
452       (qw(login password name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
453
454   my @header_sort = qw(name customernumber address);
455   my %header_title = ( "name" => $locale->text("Name"),
456                        "customernumber" => $locale->text("Customer Number"),
457                        "address" => $locale->text("Address"),
458                      );
459
460   my @header =
461     map(+{ "column_title" => $header_title{$_},
462            "column" => $_,
463            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
464          },
465         @header_sort);
466
467   $form->{"title"} = $locale->text("Select a Customer");
468   $form->header();
469   print $form->parse_html_template("generic/select_vendor", { "HEADER" => \@header,
470                                                               "VENDOR" => $vendor,
471                                                               "onload" => $onload });
472
473   $lxdebug->leave_sub();
474 }
475
476 sub calculate_qty {
477   $lxdebug->enter_sub();
478
479   my @variable_sort = ();
480   my %variable_list = ();
481   my $unit_list = ();
482   $form->{formel} =~ s/\r\n//g;
483
484   my ($variable_string, $formel) = split /###/,$form->{formel};
485
486
487   split /;/, $variable_string;
488   foreach $item (@_) {
489     my($name, $valueunit) = split /=/,$item;
490     my($value, $unit) = split / /, $valueunit;
491
492     push(@variable_sort, $value);
493     $variable_list{$value} = $name;
494     $unit_list{$value} = $unit;
495   }
496
497   my @header_sort = qw(variable value unit);
498   my %header_title = ( "variable" => $locale->text("Variable"),
499                        "value" => $locale->text("Value"),
500                        "unit" => $locale->text("Unit"),
501                      );
502
503   my @variable = map(+{ "description" => $variable_list{$_},
504                         "name" => $_,
505                         "unit" => $unit_list{$_} }, @variable_sort);
506
507   my @header =
508     map(+{ "column_title" => $header_title{$_},
509            "column" => $_,
510          },
511         @header_sort);
512   $form->{formel} = $formel; 
513   $form->{"title"} = $locale->text("Please enter values");
514   $form->header();
515   print($form->parse_html_template("generic/calculate_qty", { "HEADER"    => \@header,
516                                                               "VARIABLES" => \@variable,
517                                                               "onload"    => $onload }));
518
519   $lxdebug->leave_sub();
520 }
521
522 sub set_longdescription {
523   $lxdebug->enter_sub();
524
525   $form->{title} = $locale->text("Enter longdescription");
526   $form->header();
527   print $form->parse_html_template("generic/set_longdescription");
528
529   $lxdebug->leave_sub();
530 }
531
532 sub H {
533   return $form->quote_html($_[0]);
534 }
535
536 sub Q {
537   return $form->quote($_[0]);
538 }
539
540 sub E {
541   return $form->escape($_[0]);
542 }
543
544 sub NTI {
545   my ($element) = @_;
546
547   $element =~ s/tabindex\s*=\s*"\d+"//;
548   return $element;
549 }
550
551 sub format_dates {
552   $lxdebug->enter_sub();
553
554   my ($dateformat, $longformat, @indices) = @_;
555
556   $dateformat = $myconfig{"dateformat"} unless ($dateformat);
557
558   foreach my $idx (@indices) {
559     next unless (defined($form->{$idx}));
560
561     if (!ref($form->{$idx})) {
562       $form->{$idx} = $locale->reformat_date(\%myconfig, $form->{$idx},
563                                              $dateformat, $longformat);
564
565     } elsif (ref($form->{$idx}) eq "ARRAY") {
566       for (my $i = 0; $i < scalar(@{$form->{$idx}}); $i++) {
567         $form->{$idx}->[$i] =
568           $locale->reformat_date(\%myconfig, $form->{$idx}->[$i],
569                                  $dateformat, $longformat);
570       }
571     }
572   }
573
574   $lxdebug->leave_sub();
575 }
576
577 sub reformat_numbers {
578   $lxdebug->enter_sub();
579
580   my ($numberformat, $places, @indices) = @_;
581
582   return $lxdebug->leave_sub()
583     if (!$numberformat || ($numberformat eq $myconfig{"numberformat"}));
584
585   foreach my $idx (@indices) {
586     next unless (defined($form->{$idx}));
587
588     if (!ref($form->{$idx})) {
589       $form->{$idx} = $form->parse_amount(\%myconfig, $form->{$idx});
590
591     } elsif (ref($form->{$idx}) eq "ARRAY") {
592       for (my $i = 0; $i < scalar(@{$form->{$idx}}); $i++) {
593         $form->{$idx}->[$i] =
594           $form->parse_amount(\%myconfig, $form->{$idx}->[$i]);
595       }
596     }
597   }
598
599   my $saved_numberformat = $myconfig{"numberformat"};
600   $myconfig{"numberformat"} = $numberformat;
601
602   foreach my $idx (@indices) {
603     next unless (defined($form->{$idx}));
604
605     if (!ref($form->{$idx})) {
606       $form->{$idx} = $form->format_amount(\%myconfig, $form->{$idx}, $places);
607
608     } elsif (ref($form->{$idx}) eq "ARRAY") {
609       for (my $i = 0; $i < scalar(@{$form->{$idx}}); $i++) {
610         $form->{$idx}->[$i] =
611           $form->format_amount(\%myconfig, $form->{$idx}->[$i], $places);
612       }
613     }
614   }
615
616   $myconfig{"numberformat"} = $saved_numberformat;
617
618   $lxdebug->leave_sub();
619 }
620
621 sub show_history {
622         $lxdebug->enter_sub();
623         my $dbh = $form->dbconnect(\%myconfig);
624         my ($sort, $sortby) = split(/\-\-/, $form->{order});
625   $sort =~ s/.*\.(.*)/$1/;
626   
627         $form->{title} = $locale->text("History");
628     $form->header();
629     print $form->parse_html_template( "common/show_history", {
630         "DATEN" => $form->get_history($dbh,$form->{input_name},"",$form->{order}),
631         "SUCCESS" => ($form->get_history($dbh,$form->{input_name}) ne "0"),
632       uc($sort) => 1,
633       uc($sort)."BY" => $sortby
634         } );
635         
636         $dbh->disconnect();
637         $lxdebug->leave_sub();  
638 }
639
640 sub call_sub {
641   $lxdebug->enter_sub();
642
643   my $name = shift;
644
645   if (!$name) {
646     $form->error($locale->text("Trying to call a sub without a name"));
647   }
648
649   $name =~ s/[^a-zA-Z0-9_]//g;
650
651   if (!defined(&{ $name })) {
652     $form->error(sprintf($locale->text("Attempt to call an undefined sub named '%s'"), $name));
653   }
654
655   &{ $name }(@_);
656
657   $lxdebug->leave_sub();
658 }
659
660 sub show_vc_details {
661         $lxdebug->enter_sub();
662
663   $form->{vc} = $form->{vc} eq "customer" ? "customer" : "vendor";
664   $form->isblank("vc_id",
665                  $form->{vc} eq "customer" ?
666                  $locale->text("No customer has been selected yet.") :
667                  $locale->text("No vendor has been selected yet."));
668
669   Common->get_vc_details(\%myconfig, $form, $form->{vc}, $form->{vc_id});
670
671   $form->{title} = $form->{vc} eq "customer" ?
672     $locale->text("Customer details") : $locale->text("Vendor details");
673   $form->header();
674   print $form->parse_html_template("common/show_vc_details", { "is_customer" => $form->{vc} eq "customer" });
675
676         $lxdebug->leave_sub();
677 }
678
679 sub mark_as_paid_common {
680   $lxdebug->enter_sub();
681   use SL::DBUtils;
682   my ($myconfig, $db_name) = @_;
683
684   if($form->{mark_as_paid}) {
685     my $dbh ||= $form->get_standard_dbh($myconfig);
686     my $query = qq|UPDATE $db_name SET paid = amount WHERE id = ?|;
687     do_query($form, $dbh, $query, $form->{id});
688     $dbh->commit();
689     $form->redirect($locale->text("Marked as paid"));
690 }
691   else {
692     my $referer  =  $ENV{HTTP_REFERER};
693     my $login    =  $form->escape($form->{login});
694     my $password =  $form->escape($form->{password});
695     my $id       =  $form->escape($form->{id});
696     $referer     =~ s/^(.*)action\=.*\&(.*)$/$1action\=mark_as_paid\&mark_as_paid\=1\&login\=$login\&password\=$password\&id\=$id\&$2/;
697     $form->header();
698     print qq|<body>|;
699     print qq|<p><b>|.$locale->text('Mark as paid?').qq|</b></p>|;
700     print qq|<input type="button" value="|.$locale->text('yes').qq|" onclick="document.location.href='|.$referer.qq|'">&nbsp;|;
701     print qq|<input type="button" value="|.$locale->text('no').qq|" onclick="javascript:history.back();">|;
702     print qq|</body></html>|;
703 }
704   
705   $lxdebug->leave_sub();
706 }
707
708 sub cov_selection_internal {
709   $lxdebug->enter_sub();
710
711   $order_by = "name";
712   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
713   $order_dir = 1;
714   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
715
716   my $type = $form->{"is_vendor"} ? $locale->text("vendor") : $locale->text("customer");
717
718   $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, $order_by, $order_dir, $form->{"is_vendor"}, $form->{"allow_both"});
719   map({ $covs->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$covs}));
720   if (0 == scalar(@{$covs})) {
721     $form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
722   } elsif (1 == scalar(@{$covs})) {
723     $onload = "cov_selected('1')";
724   }
725
726   my $callback = "$form->{script}?action=cov_selection_internal&";
727   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
728       (qw(login path password name input_name input_id is_vendor allow_both), grep({ /^[fl]_/ } keys %$form)));
729
730   my @header_sort = qw(name address contact);
731   my %header_title = ( "name" => $locale->text("Name"),
732                        "address" => $locale->text("Address"),
733                        "contact" => $locale->text("Contact"),
734                        );
735
736   my @header =
737     map(+{ "column_title" => $header_title{$_},
738            "column" => $_,
739            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
740          },
741         @header_sort);
742
743   foreach my $cov (@{ $covs }) {
744     $cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
745     $cov->{address} =~ s{^,}{}x;
746     $cov->{address} =~ s{\ +}{\ }gx;
747
748     $cov->{contact} = join " ", map { $cov->{$_} } qw(cp_greeting cp_title cp_givenname cp_name);
749     $cov->{contact} =~ s{\ +}{\ }gx;
750   }
751
752   $form->{"title"} = $form->{is_vendor} ? $locale->text("Select a vendor") : $locale->text("Select a customer");
753   $form->header();
754   print($form->parse_html_template("generic/cov_selection", { "HEADER" => \@header,
755                                                               "COVS" => $covs,
756                                                               "onload" => $onload }));
757
758   $lxdebug->leave_sub();
759 }
760
761 sub check_cov2 {
762   $lxdebug->enter_sub();
763
764   my $callback_sub = shift;
765
766   if (!$form->{customer}
767       || ($form->{customer} eq $form->{old_customer})
768       || ("$form->{customer}--$form->{customer_id}" eq $form->{old_customer})) {
769     $lxdebug->leave_sub();
770     return;
771   }
772
773   $old_name     = $form->{name};
774   $form->{name} = $form->{customer};
775
776   my $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, "name", "ASC", 0, 1);
777
778   $form->{name} = $old_name;
779
780   if (0 == scalar @{$covs}) {
781     $form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
782
783   } elsif (1 == scalar @{ $covs }) {
784     $form->{customer}           = $covs->[0]->{name};
785     $form->{old_customer}       = $covs->[0]->{name};
786     $form->{customer_id}        = $covs->[0]->{id};
787     $form->{customer_is_vendor} = $covs->[0]->{customer_is_vendor};
788
789   } else {
790     $form->{new_cov_nextsub} = $callback_sub;
791
792     delete @{$form}{qw(customer customer_is_vendor customer_id old_customer action)};
793     my @hidden = map { { 'key' => $_, 'value' => $form->{$_} } } grep { '' eq ref $form->{$_} } keys %{ $form };
794
795     foreach my $cov (@{ $covs }) {
796       $cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
797       $cov->{address} =~ s{^,}{}x;
798       $cov->{address} =~ s{\ +}{\ }gx;
799
800       $cov->{contact} = join " ", map { $cov->{$_} } qw(cp_greeting cp_title cp_givenname cp_name);
801       $cov->{contact} =~ s{\ +}{\ }gx;
802     }
803
804     $form->{title} = $locale->text("Select a vendor or customer");
805     $form->header();
806
807     print $form->parse_html_template("generic/cov_selection2", { "COVS" => $covs, "HIDDEN" => \@hidden });
808
809     exit 0;
810   }
811
812   $lxdebug->leave_sub();
813 }
814
815 sub cov_selected2 {
816   $lxdebug->enter_sub();
817
818   if (!$form->{new_cov} || !$form->{new_cov_nextsub}) {
819     $form->error($locale->text('No customer has been selected.'));
820   }
821
822   map { $form->{$_} = $form->{"new_cov_${_}_$form->{new_cov}"} } qw(customer customer_id customer_is_vendor);
823   $form->{old_customer} = $form->{customer};
824
825   &{ $form->{new_cov_nextsub} }();
826
827   $lxdebug->leave_sub();
828 }
829
830 sub select_item_selection_internal {
831   $lxdebug->enter_sub();
832
833   @items = SystemBrace->retrieve_select_items(\%myconfig, $form, $form->{"select_item_type"});
834   if (0 == scalar(@items)) {
835     $form->show_generic_information($locale->text("No item was found."));
836   } elsif (1 == scalar(@items)) {
837     $onload = "select_item_selected('1')";
838   }
839
840   $form->{"title"} = $locale->text("Select an entry");
841   $form->header();
842   print($form->parse_html_template("generic/select_item_selection", { "SELECT_ITEMS" => \@items,
843                                                                       "onload" => $onload }));
844
845   $lxdebug->leave_sub();
846 }
847 1;