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