Fehlermeldung ausgeben, wenn Kunde/Lieferant mit "EU mit UStID" aber ohne UStID gespe...
[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 Carp;
13 use SL::Common;
14 use SL::DBUtils;
15 use SL::Form;
16 use SL::MoreCommon;
17
18 use strict;
19
20 sub build_std_url {
21   $main::lxdebug->enter_sub(2);
22
23   my $form     = $main::form;
24
25   my $script = $form->{script};
26
27   my @parts;
28
29   foreach my $key (@_) {
30     next unless ($key);
31
32     if ($key =~ /(.*?)=(.*)/) {
33       if ($1 eq 'script') {
34         $script = $2;
35       } else {
36         push @parts, $key;
37       }
38
39     } else {
40       foreach my $var ($form->flatten_variables($key)) {
41         push @parts, E($var->{key}) . '=' . E($var->{value});
42       }
43     }
44   }
45
46   my $url = "${script}?" . join('&', @parts);
47
48   $main::lxdebug->leave_sub(2);
49
50   return $url;
51 }
52
53 # -------------------------------------------------------------------------
54
55 sub select_part {
56   $main::lxdebug->enter_sub();
57
58   my ($callback_sub, @parts) = @_;
59
60   my $form     = $main::form;
61   my $locale   = $main::locale;
62
63   my $remap_parts_id = 0;
64   if (defined($parts[0]->{parts_id}) && !defined($parts[0]->{id})) {
65     $remap_parts_id = 1;
66     map { $_->{id} = $_->{parts_id}; } @parts;
67   }
68
69   my $remap_partnumber = 0;
70   if (defined($parts[0]->{partnumber}) && !defined($parts[0]->{number})) {
71     $remap_partnumber = 1;
72     map { $_->{number} = $_->{partnumber}; } @parts;
73   }
74
75   my $has_charge = 0;
76   if (defined($parts[0]->{chargenumber})) {
77     $has_charge = 1;
78     map { $_->{has_charge} = 1; } @parts;
79   }
80   my $has_bestbefore = 0;
81   if (defined($parts[0]->{bestbefore})) {
82     $has_bestbefore = 1;
83     map { $_->{has_bestbefore} = 1; } @parts;
84   }
85   my $has_ean = 0;
86   if (defined($parts[0]->{ean})) {
87     $has_ean = 1;
88     map { $_->{has_ean} = 1; } @parts;
89   }
90
91   my $old_form = save_form();
92
93   $form->header();
94   print $form->parse_html_template("generic/select_part",
95                                    { "PARTS"            => \@parts,
96                                      "old_form"         => $old_form,
97                                      "title"            => $locale->text("Select a part"),
98                                      "nextsub"          => "select_part_internal",
99                                      "callback_sub"     => $callback_sub,
100                                      "has_charge"       => $has_charge,
101                                      "has_bestbefore"   => $has_bestbefore,
102                                      "has_ean"          => $has_ean,
103                                      "remap_parts_id"   => $remap_parts_id,
104                                      "remap_partnumber" => $remap_partnumber });
105
106   $main::lxdebug->leave_sub();
107 }
108
109 sub select_part_internal {
110   $main::lxdebug->enter_sub();
111
112   my $form     = $main::form;
113
114   my ($new_item, $callback_sub);
115
116   my $re = "^new_.*_$form->{selection}\$";
117
118   foreach (grep /$re/, keys %{ $form }) {
119     my $new_key           =  $_;
120     $new_key              =~ s/^new_//;
121     $new_key              =~ s/_\d+$//;
122     $new_item->{$new_key} =  $form->{$_};
123   }
124
125   if ($form->{remap_parts_id}) {
126     $new_item->{parts_id} = $new_item->{id};
127     delete $new_item->{id};
128   }
129
130   if ($form->{remap_partnumber}) {
131     $new_item->{partnumber} = $new_item->{number};
132     delete $new_item->{number};
133   }
134
135   $callback_sub = $form->{callback_sub};
136
137   restore_form($form->{old_form});
138
139   call_sub($callback_sub, $new_item);
140
141   $main::lxdebug->leave_sub();
142 }
143
144 sub part_selection_internal {
145   $main::lxdebug->enter_sub();
146
147   my $form     = $main::form;
148   my %myconfig = %main::myconfig;
149   my $locale   = $main::locale;
150
151   my $order_by  = "description";
152   $order_by  = $form->{"order_by"} if (defined($form->{"order_by"}));
153   my $order_dir = 1;
154   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
155
156   my %options;
157
158   foreach my $opt (split m/:/, $form->{options}) {
159     if ($opt =~ /=/) {
160       my ($key, $value) = split m/=/, $opt, 2;
161       $options{$key} = $value;
162
163     } else {
164       $options{$opt} = 1;
165     }
166   }
167
168   map { $form->{$_} = $options{$_} if ($options{$_}) } qw(no_services no_assemblies assemblies click_button);
169
170   my $parts = Common->retrieve_parts(\%myconfig, $form, $order_by, $order_dir);
171   my $onload;
172
173   if (0 == scalar(@{$parts})) {
174     $form->show_generic_information($locale->text("No part was found matching the search parameters."));
175   } elsif (1 == scalar(@{$parts})) {
176     $onload = "part_selected('1')";
177   }
178
179   map { $parts->[$_]->{selected} = $_ ? 0 : 1; } (0..$#{$parts});
180
181   my $callback = build_std_url('action=part_selection_internal', qw(partnumber description input_partnumber input_description input_partsid),
182                                grep({ /^[fl]_/ } keys %{ $form }));
183
184   my @header_sort  = qw(partnumber description);
185   my %header_title = ( "partnumber"  => $locale->text("Part Number"),
186                        "description" => $locale->text("Part Description"),
187                        );
188
189   my @header =
190     map(+{ "column_title" => $header_title{$_},
191            "column"       => $_,
192            "callback"     => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
193          },
194         @header_sort);
195
196   $form->{formname} ||= 'Form';
197
198   $form->{title} = $locale->text("Select a part");
199   $form->header();
200   print $form->parse_html_template("generic/part_selection", { "HEADER" => \@header,
201                                                                "PARTS"  => $parts,
202                                                                "onload" => $onload });
203
204   $main::lxdebug->leave_sub();
205 }
206
207 # -------------------------------------------------------------------------
208
209 sub delivery_customer_selection {
210   $main::lxdebug->enter_sub();
211
212   my $form     = $main::form;
213   my %myconfig = %main::myconfig;
214   my $locale   = $main::locale;
215
216   my $order_by = "name";
217   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
218   my $order_dir = 1;
219   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
220
221   my $delivery = Common->retrieve_delivery_customer(\%myconfig, $form, $order_by, $order_dir);
222   map({ $delivery->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$delivery}));
223
224   my $onload;
225   if (0 == scalar(@{$delivery})) {
226     $form->show_generic_information($locale->text("No Customer was found matching the search parameters."));
227   } elsif (1 == scalar(@{$delivery})) {
228     $onload = "customer_selected('1')";
229   }
230
231   my $callback = "$form->{script}?action=delivery_customer_selection&";
232   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
233       (qw(name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
234
235   my @header_sort = qw(name customernumber address);
236   my %header_title = ( "name" => $locale->text("Name"),
237                        "customernumber" => $locale->text("Customer Number"),
238                        "address" => $locale->text("Address"),
239                      );
240
241   my @header =
242     map(+{ "column_title" => $header_title{$_},
243            "column" => $_,
244            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
245          },
246         @header_sort);
247
248   $form->{"title"} = $locale->text("Select a Customer");
249   $form->header();
250   print $form->parse_html_template("generic/select_delivery_customer", { "HEADER"   => \@header,
251                                                                          "DELIVERY" => $delivery,
252                                                                          "onload"   => $onload });
253
254   $main::lxdebug->leave_sub();
255 }
256
257 # -------------------------------------------------------------------------
258
259 sub vendor_selection {
260   $main::lxdebug->enter_sub();
261
262   my $form     = $main::form;
263   my %myconfig = %main::myconfig;
264   my $locale   = $main::locale;
265
266   my $order_by = "name";
267   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
268   my $order_dir = 1;
269   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
270
271   my $vendor = Common->retrieve_vendor(\%myconfig, $form, $order_by, $order_dir);
272   map({ $vendor->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$vendor}));
273
274   my $onload;
275   if (0 == scalar(@{$vendor})) {
276     $form->show_generic_information($locale->text("No Vendor was found matching the search parameters."));
277   } elsif (1 == scalar(@{$vendor})) {
278     $onload = "vendor_selected('1')";
279   }
280
281   my $callback = "$form->{script}?action=vendor_selection&";
282   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
283       (qw(name input_name input_id), grep({ /^[fl]_/ } keys %$form)));
284
285   my @header_sort = qw(name customernumber address);
286   my %header_title = ( "name" => $locale->text("Name"),
287                        "customernumber" => $locale->text("Customer Number"),
288                        "address" => $locale->text("Address"),
289                      );
290
291   my @header =
292     map(+{ "column_title" => $header_title{$_},
293            "column" => $_,
294            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
295          },
296         @header_sort);
297
298   $form->{"title"} = $locale->text("Select a Customer");
299   $form->header();
300   print $form->parse_html_template("generic/select_vendor", { "HEADER" => \@header,
301                                                               "VENDOR" => $vendor,
302                                                               "onload" => $onload });
303
304   $main::lxdebug->leave_sub();
305 }
306
307 # -------------------------------------------------------------------------
308
309 sub calculate_qty {
310   $main::lxdebug->enter_sub();
311
312   my $form     = $main::form;
313   my $locale   = $main::locale;
314
315   $form->{formel} =~ s/\r\n//g;
316
317   my ($variable_string, $formel) = split /###/,$form->{formel};
318   my @variable;
319   my $onload; # note! this sub is mostly called over a javascript invocation, and it's unlikey that onload is set.
320
321   foreach my $item (split m/;/, $variable_string) {
322     next unless $item =~ m/^ \s* (\w+) \s* = \s* (\w+) \s* (\w+) \s* $/x;
323     push @variable, {
324       description => $1,
325       name        => $2,
326       unit        => $3,
327     };
328   }
329
330   my @header_sort = qw(variable value unit);
331   my %header_title = (
332     variable => $locale->text("Variable"),
333     value    => $locale->text("Value"),
334     unit     => $locale->text("Unit"),
335   );
336   my @header = map +{
337     column_title => $header_title{$_},
338     column       => $_,
339   }, @header_sort;
340
341   $form->{formel} = $formel;
342   $form->{title}  = $locale->text("Please enter values");
343   $form->header();
344   print $form->parse_html_template("generic/calculate_qty", { "HEADER"    => \@header,
345                                                               "VARIABLES" => \@variable,
346                                                               "onload"    => $onload });
347
348   $main::lxdebug->leave_sub();
349 }
350
351 # -------------------------------------------------------------------------
352
353 sub set_longdescription {
354   $main::lxdebug->enter_sub();
355
356   my $form     = $main::form;
357   my $locale   = $main::locale;
358
359   $form->{title} = $locale->text("Enter longdescription");
360   $form->header();
361   print $form->parse_html_template("generic/set_longdescription");
362
363   $main::lxdebug->leave_sub();
364 }
365
366 # -------------------------------------------------------------------------
367
368 sub H {
369   return $main::locale->quote_special_chars('HTML', $_[0]);
370 }
371
372 sub Q {
373   return $main::locale->quote_special_chars('URL@HTML', $_[0]);
374 }
375
376 sub E {
377   return $main::form->escape($_[0]);
378 }
379
380 sub NTI {
381   my ($element) = @_;
382
383   $element =~ s/tabindex\s*=\s*"\d+"//;
384   return $element;
385 }
386
387 sub format_dates {
388   $main::lxdebug->enter_sub();
389
390   my ($dateformat, $longformat, @indices) = @_;
391
392   my $form     = $main::form;
393   my %myconfig = %main::myconfig;
394   my $locale   = $main::locale;
395
396   $dateformat = $myconfig{"dateformat"} unless ($dateformat);
397
398   foreach my $idx (@indices) {
399     if ($form->{TEMPLATE_ARRAYS} && (ref($form->{TEMPLATE_ARRAYS}->{$idx}) eq "ARRAY")) {
400       for (my $i = 0; $i < scalar(@{$form->{TEMPLATE_ARRAYS}->{$idx}}); $i++) {
401         $form->{TEMPLATE_ARRAYS}->{$idx}->[$i] =
402           $locale->reformat_date(\%myconfig, $form->{TEMPLATE_ARRAYS}->{$idx}->[$i],
403                                  $dateformat, $longformat);
404       }
405     }
406
407     next unless (defined($form->{$idx}));
408
409     if (!ref($form->{$idx})) {
410       $form->{$idx} = $locale->reformat_date(\%myconfig, $form->{$idx},
411                                              $dateformat, $longformat);
412
413     } elsif (ref($form->{$idx}) eq "ARRAY") {
414       for (my $i = 0; $i < scalar(@{$form->{$idx}}); $i++) {
415         $form->{$idx}->[$i] =
416           $locale->reformat_date(\%myconfig, $form->{$idx}->[$i],
417                                  $dateformat, $longformat);
418       }
419     }
420   }
421
422   $main::lxdebug->leave_sub();
423 }
424
425 sub reformat_numbers {
426   $main::lxdebug->enter_sub();
427
428   my ($numberformat, $places, @indices) = @_;
429
430   my $form     = $main::form;
431   my %myconfig = %main::myconfig;
432
433   return $main::lxdebug->leave_sub()
434     if (!$numberformat || ($numberformat eq $myconfig{"numberformat"}));
435
436   foreach my $idx (@indices) {
437     if ($form->{TEMPLATE_ARRAYS} && (ref($form->{TEMPLATE_ARRAYS}->{$idx}) eq "ARRAY")) {
438       for (my $i = 0; $i < scalar(@{$form->{TEMPLATE_ARRAYS}->{$idx}}); $i++) {
439         $form->{TEMPLATE_ARRAYS}->{$idx}->[$i] = $form->parse_amount(\%myconfig, $form->{TEMPLATE_ARRAYS}->{$idx}->[$i]);
440       }
441     }
442
443     next unless (defined($form->{$idx}));
444
445     if (!ref($form->{$idx})) {
446       $form->{$idx} = $form->parse_amount(\%myconfig, $form->{$idx});
447
448     } elsif (ref($form->{$idx}) eq "ARRAY") {
449       for (my $i = 0; $i < scalar(@{$form->{$idx}}); $i++) {
450         $form->{$idx}->[$i] =
451           $form->parse_amount(\%myconfig, $form->{$idx}->[$i]);
452       }
453     }
454   }
455
456   my $saved_numberformat = $myconfig{"numberformat"};
457   $myconfig{"numberformat"} = $numberformat;
458
459   foreach my $idx (@indices) {
460     if ($form->{TEMPLATE_ARRAYS} && (ref($form->{TEMPLATE_ARRAYS}->{$idx}) eq "ARRAY")) {
461       for (my $i = 0; $i < scalar(@{$form->{TEMPLATE_ARRAYS}->{$idx}}); $i++) {
462         $form->{TEMPLATE_ARRAYS}->{$idx}->[$i] = $form->format_amount(\%myconfig, $form->{TEMPLATE_ARRAYS}->{$idx}->[$i], $places);
463       }
464     }
465
466     next unless (defined($form->{$idx}));
467
468     if (!ref($form->{$idx})) {
469       $form->{$idx} = $form->format_amount(\%myconfig, $form->{$idx}, $places);
470
471     } elsif (ref($form->{$idx}) eq "ARRAY") {
472       for (my $i = 0; $i < scalar(@{$form->{$idx}}); $i++) {
473         $form->{$idx}->[$i] =
474           $form->format_amount(\%myconfig, $form->{$idx}->[$i], $places);
475       }
476     }
477   }
478
479   $myconfig{"numberformat"} = $saved_numberformat;
480
481   $main::lxdebug->leave_sub();
482 }
483
484 # -------------------------------------------------------------------------
485
486 sub show_history {
487   $main::lxdebug->enter_sub();
488
489   my $form     = $main::form;
490   my %myconfig = %main::myconfig;
491   my $locale   = $main::locale;
492
493   my $dbh = $form->dbconnect(\%myconfig);
494   my ($sort, $sortby) = split(/\-\-/, $form->{order});
495   $sort =~ s/.*\.(.*)/$1/;
496
497   $form->{title} = $locale->text("History");
498   $form->header();
499   print $form->parse_html_template( "common/show_history", {
500     "DATEN"        => $form->get_history($dbh,$form->{input_name},"",$form->{order}),
501     "SUCCESS"      => ($form->get_history($dbh,$form->{input_name}) ne "0"),
502     uc($sort)      => 1,
503     uc($sort)."BY" => $sortby
504   } );
505
506   $dbh->disconnect();
507   $main::lxdebug->leave_sub();
508 }
509
510 # -------------------------------------------------------------------------
511
512 sub call_sub {
513   $main::lxdebug->enter_sub();
514
515   my $name = shift;
516
517   my $form     = $main::form;
518   my $locale   = $main::locale;
519
520   if (!$name) {
521     $form->error($locale->text("Trying to call a sub without a name"));
522   }
523
524   $name =~ s/[^a-zA-Z0-9_]//g;
525
526   if (!defined(&{ $name })) {
527     $form->error(sprintf($locale->text("Attempt to call an undefined sub named '%s'"), $name));
528   }
529
530   $::called_subs{$name}++;
531   confess "RECURSION DETECTION: call_sub($name) called " . $::called_subs{$name} . " time(s)" if $::called_subs{$name} > 10;
532
533   {
534     no strict "refs";
535     &{ $name }(@_);
536   }
537
538   $main::lxdebug->leave_sub();
539 }
540
541 # -------------------------------------------------------------------------
542
543 sub show_vc_details {
544   $main::lxdebug->enter_sub();
545
546   my $form     = $main::form;
547   my %myconfig = %main::myconfig;
548   my $locale   = $main::locale;
549
550   $form->{vc} = $form->{vc} eq "customer" ? "customer" : "vendor";
551   $form->isblank("vc_id",
552                  $form->{vc} eq "customer" ?
553                  $locale->text("No customer has been selected yet.") :
554                  $locale->text("No vendor has been selected yet."));
555
556   Common->get_vc_details(\%myconfig, $form, $form->{vc}, $form->{vc_id});
557
558   $form->{title} = $form->{vc} eq "customer" ?
559     $locale->text("Customer details") : $locale->text("Vendor details");
560   $form->header();
561   print $form->parse_html_template("common/show_vc_details", { "is_customer" => $form->{vc} eq "customer" });
562
563   $main::lxdebug->leave_sub();
564 }
565
566 # -------------------------------------------------------------------------
567
568 sub retrieve_partunits {
569   $main::lxdebug->enter_sub();
570
571   my $form     = $main::form;
572
573   my @part_ids = grep { $_ } map { $form->{"id_${_}"} } (1..$form->{rowcount});
574
575   if (@part_ids) {
576     my %partunits = IO->retrieve_partunits('part_ids' => \@part_ids);
577
578     foreach my $i (1..$form->{rowcount}) {
579       next unless ($form->{"id_${i}"});
580       $form->{"partunit_${i}"} = $partunits{$form->{"id_${i}"}};
581     }
582   }
583
584   $main::lxdebug->leave_sub();
585 }
586
587 # -------------------------------------------------------------------------
588
589 sub mark_as_paid_common {
590   $main::lxdebug->enter_sub();
591
592   my ($myconfig, $db_name) = @_;
593
594   my $form     = $main::form;
595   my $locale   = $main::locale;
596
597   if($form->{mark_as_paid}) {
598     my $dbh ||= $form->get_standard_dbh($myconfig);
599     my $query = qq|UPDATE $db_name SET paid = amount, datepaid = current_date WHERE id = ?|;
600     do_query($form, $dbh, $query, $form->{id});
601     $dbh->commit();
602     $form->redirect($locale->text("Marked as paid"));
603
604   } else {
605     my $referer = $ENV{HTTP_REFERER};
606     my $script;
607     my $callback;
608     if ($referer =~ /action/) {
609       $referer =~ /^(.*)\?action\=[^\&]*(\&.*)$/;
610       $script = $1;
611       $callback = $2;
612     } else {
613       $script = $referer;
614       $callback = "";
615     }
616     $referer = $script . "?action=mark_as_paid&mark_as_paid=1&id=$form->{id}" . $callback;
617     $form->header();
618     print qq|<body>|;
619     print qq|<p><b>|.$locale->text('Mark as paid?').qq|</b></p>|;
620     print qq|<input type="button" value="|.$locale->text('yes').qq|" onclick="document.location.href='|.$referer.qq|'">&nbsp;|;
621     print qq|<input type="button" value="|.$locale->text('no').qq|" onclick="javascript:history.back();">|;
622     print qq|</body></html>|;
623   }
624
625   $main::lxdebug->leave_sub();
626 }
627
628 sub cov_selection_internal {
629   $main::lxdebug->enter_sub();
630
631   my $form     = $main::form;
632   my %myconfig = %main::myconfig;
633   my $locale   = $main::locale;
634
635   my $order_by = "name";
636   $order_by = $form->{"order_by"} if (defined($form->{"order_by"}));
637   my $order_dir = 1;
638   $order_dir = $form->{"order_dir"} if (defined($form->{"order_dir"}));
639
640   my $type = $form->{"is_vendor"} ? $locale->text("vendor") : $locale->text("customer");
641
642   my $covs = Common->retrieve_customers_or_vendors(\%myconfig, $form, $order_by, $order_dir, $form->{"is_vendor"}, $form->{"allow_both"});
643   map({ $covs->[$_]->{"selected"} = $_ ? 0 : 1; } (0..$#{$covs}));
644
645   my $onload;
646   if (0 == scalar(@{$covs})) {
647     $form->show_generic_information(sprintf($locale->text("No %s was found matching the search parameters."), $type));
648   } elsif (1 == scalar(@{$covs})) {
649     $onload = "cov_selected('1')";
650   }
651
652   my $callback = "$form->{script}?action=cov_selection_internal&";
653   map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
654       (qw(name input_name input_id is_vendor allow_both), grep({ /^[fl]_/ } keys %$form)));
655
656   my @header_sort = qw(name address contact);
657   my %header_title = ( "name" => $locale->text("Name"),
658                        "address" => $locale->text("Address"),
659                        "contact" => $locale->text("Contact"),
660                        );
661
662   my @header =
663     map(+{ "column_title" => $header_title{$_},
664            "column" => $_,
665            "callback" => $callback . "order_by=${_}&order_dir=" . ($order_by eq $_ ? 1 - $order_dir : $order_dir),
666          },
667         @header_sort);
668
669   foreach my $cov (@{ $covs }) {
670     $cov->{address} = "$cov->{street}, $cov->{zipcode} $cov->{city}";
671     $cov->{address} =~ s{^,}{}x;
672     $cov->{address} =~ s{\ +}{\ }gx;
673
674     $cov->{contact} = join " ", map { $cov->{$_} } qw(cp_gender cp_title cp_givenname cp_name);
675     $cov->{contact} =~ s{\ +}{\ }gx;
676   }
677
678   $form->{"title"} = $form->{is_vendor} ? $locale->text("Select a vendor") : $locale->text("Select a customer");
679   $form->header();
680   print($form->parse_html_template("generic/cov_selection", { "HEADER" => \@header,
681                                                               "COVS" => $covs,
682                                                               "onload" => $onload }));
683
684   $main::lxdebug->leave_sub();
685 }
686
687
688 # Functions to call add routines beneath different reports
689
690 sub sales_invoice {
691   $main::lxdebug->enter_sub();
692
693   print $::form->redirect_header('is.pl?action=add&type=invoice');
694
695   $main::lxdebug->leave_sub();
696 }
697
698 sub ar_transaction {
699   $main::lxdebug->enter_sub();
700
701   print $::form->redirect_header('ar.pl?action=add');
702
703   $main::lxdebug->leave_sub();
704 }
705
706 sub vendor_invoice {
707   $main::lxdebug->enter_sub();
708
709   print $::form->redirect_header('ir.pl?action=add&type=invoice');
710
711   $main::lxdebug->leave_sub();
712 }
713
714 sub ap_transaction {
715   $main::lxdebug->enter_sub();
716
717   print $::form->redirect_header('ap.pl?action=add');
718
719   $main::lxdebug->leave_sub();
720 }
721
722 sub gl_transaction {
723   $main::lxdebug->enter_sub();
724
725   print $::form->redirect_header('gl.pl?action=add');
726
727   $main::lxdebug->leave_sub();
728 }
729
730 if ($::use_rdbo) {
731   eval {
732     require SL::DB::Helpers::Mappings;
733     sub db {
734       goto &SL::DB::Helpers::Mappings::db;
735     }
736   } or die $@;
737 }
738
739 1;