Merge branch 'master' of ssh://lx-office/~/lx-office-erp
[kivitendo-erp.git] / bin / mozilla / do.pl
index 9cc026c..cf7bc42 100644 (file)
@@ -1,4 +1,4 @@
-# #=====================================================================
+#=====================================================================
 # LX-Office ERP
 # Copyright (C) 2004
 # Based on SQL-Ledger Version 2.1.9
@@ -46,21 +46,28 @@ require "bin/mozilla/invoice_io.pl";
 require "bin/mozilla/io.pl";
 require "bin/mozilla/reportgenerator.pl";
 
+use strict;
+
+my $print_post;
+
 1;
 
 # end of main
 
 sub check_do_access {
-  $auth->assert($form->{type} . '_edit');
+  $main::auth->assert($main::form->{type} . '_edit');
 }
 
 sub set_headings {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
   my ($action) = @_;
 
+  my $form     = $main::form;
+  my $locale   = $main::locale;
+
   if ($form->{type} eq 'purchase_delivery_order') {
     $form->{vc}    = 'vendor';
     $form->{title} = $action eq "edit" ? $locale->text('Edit Purchase Delivery Order') : $locale->text('Add Purchase Delivery Order');
@@ -71,14 +78,16 @@ sub set_headings {
 
   $form->{heading} = $locale->text('Delivery Order');
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub add {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+
   set_headings("add");
 
   $form->{callback} = build_std_url('action=add', 'type', 'vc') unless ($form->{callback});
@@ -87,14 +96,16 @@ sub add {
   prepare_order();
   display_form();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub edit {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+
   # show history button
   $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   #/show hhistory button
@@ -111,17 +122,19 @@ sub edit {
       # reset rowcount
       undef $form->{rowcount};
       add();
-      $lxdebug->leave_sub();
+      $main::lxdebug->leave_sub();
       return;
 #     }
   } elsif (!$form->{id}) {
     add();
-    $lxdebug->leave_sub();
+    $main::lxdebug->leave_sub();
     return;
   }
 
+  my ($language_id, $printer_id);
   if ($form->{print_and_save}) {
-    $form->{action}   = "print";
+    $form->{action}   = "dispatcher";
+    $form->{action_print} = "1";
     $form->{resubmit} = 1;
     $language_id      = $form->{language_id};
     $printer_id       = $form->{printer_id};
@@ -139,19 +152,22 @@ sub edit {
 
   display_form();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub order_links {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+
   # get customer/vendor
   $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
 
   # retrieve order/quotation
-  $form->{webdav}   = $webdav;
+  $form->{webdav}   = $main::webdav;
   $form->{jsscript} = 1;
 
   my $editing = $form->{id};
@@ -159,14 +175,19 @@ sub order_links {
   DO->retrieve('vc'  => $form->{vc},
                'ids' => $form->{id});
 
-  $payment_id  = $form->{payment_id}  if ($form->{payment_id});
-  $language_id = $form->{language_id} if ($form->{language_id});
-  $taxzone_id  = $form->{taxzone_id}  if ($form->{taxzone_id});
-  $salesman_id = $form->{salesman_id} if ($editing);
+  $form->backup_vars(qw(payment_id language_id taxzone_id salesman_id taxincluded cp_id intnotes));
+  $form->{shipto} = 1 if $form->{id};
 
+  # get customer / vendor
+  if ($form->{vc} eq 'vendor') {
+    IR->get_vendor(\%myconfig, \%$form);
+  } else {
+    IS->get_customer(\%myconfig, \%$form);
+  }
 
-  $taxincluded    = $form->{taxincluded};
-  $form->{shipto} = 1 if $form->{id};
+  $form->restore_vars(qw(payment_id language_id taxzone_id intnotes cp_id));
+  $form->restore_vars(qw(taxincluded)) if $form->{id};
+  $form->restore_vars(qw(salesman_id)) if $editing;
 
   if ($form->{"all_$form->{vc}"}) {
     unless ($form->{"$form->{vc}_id"}) {
@@ -174,37 +195,26 @@ sub order_links {
     }
   }
 
-  $cp_id    = $form->{cp_id};
-  $intnotes = $form->{intnotes};
-
-  $form->{cp_id} = $cp_id;
-
-  $form->{payment_id}  = $payment_id  if ($payment_id);
-  $form->{language_id} = $language_id if ($language_id);
-  $form->{taxzone_id}  = $taxzone_id  if ($taxzone_id);
-  $form->{intnotes}    = $intnotes    if ($intnotes);
-
   ($form->{ $form->{vc} })  = split /--/, $form->{ $form->{vc} };
   $form->{"old$form->{vc}"} = qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
 
-  $form->{taxincluded} = $taxincluded if ($form->{id});
-
   $form->{employee} = "$form->{employee}--$form->{employee_id}";
 
-  $form->{salesman_id} = $salesman_id if ($editing);
-
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub prepare_order {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+
   $form->{formname} = $form->{type} unless $form->{formname};
 
   my $i = 0;
-  foreach $ref (@{ $form->{form_details} }) {
+  foreach my $ref (@{ $form->{form_details} }) {
     $form->{rowcount} = ++$i;
 
     map { $form->{"${_}_$i"} = $ref->{$_} } keys %{$ref};
@@ -215,9 +225,9 @@ sub prepare_order {
     } else {
       $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{"discount_$i"});
     }
-    ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
+    my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
     $dec           = length $dec;
-    $decimalplaces = ($dec > 2) ? $dec : 2;
+    my $decimalplaces = ($dec > 2) ? $dec : 2;
 
     # copy reqdate from deliverydate for invoice -> order conversion
     $form->{"reqdate_$i"} = $form->{"deliverydate_$i"} unless $form->{"reqdate_$i"};
@@ -227,18 +237,19 @@ sub prepare_order {
     (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/);
     $dec_qty = length $dec_qty;
     $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty);
-
-    map { $form->{"${_}_$i"} =~ s/\"/&quot;/g } qw(partnumber description unit);
   }
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub form_header {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+
   $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id};
   $form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id};
 
@@ -246,7 +257,7 @@ sub form_header {
   $form->{jsscript} = 1;
 
   #write Trigger
-  $jsscript = Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1", "reqdate", "BL", "trigger2");
+  my $jsscript = Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1", "reqdate", "BL", "trigger2");
 
   my @old_project_ids = ($form->{"globalproject_id"});
   map({ push(@old_project_ids, $form->{"project_id_$_"})
@@ -281,36 +292,47 @@ sub form_header {
     if ($form->{format} eq "html") {
       $form->{onload} = "window.open('about:blank','Beleg'); document.do.target = 'Beleg';";
     }
+    # emulate click for resubmitting actions
+    $form->{onload} .= "document.do.${_}.click(); " for grep { /^action_/ } keys %$form;
     $form->{onload} .= "document.do.submit();"
   }
 
   $form->header();
+  # Fix für Bug 1082 Erwartet wird: 'abteilungsNAME--abteilungsID'
+  $form->{department} .= '--' . $form->{department_id};
+
   print $form->parse_html_template('do/form_header');
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub form_footer {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+
   $form->{PRINT_OPTIONS} = print_options('inline' => 1);
 
   print $form->parse_html_template('do/form_footer');
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub update_delivery_order {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+
   set_headings($form->{"id"} ? "edit" : "add");
 
   $form->{update} = 1;
 
+  my $payment_id;
   $payment_id = $form->{payment_id} if $form->{payment_id};
 
   check_name($form->{vc});
@@ -318,7 +340,7 @@ sub update_delivery_order {
   $form->{payment_id} = $payment_id if $form->{payment_id} eq "";
 
   # for pricegroups
-  $i = $form->{rowcount};
+  my $i = $form->{rowcount};
 
   if (   ($form->{"partnumber_$i"} eq "")
       && ($form->{"description_$i"} eq "")
@@ -346,7 +368,6 @@ sub update_delivery_order {
 
       } else {
 
-        map { $form->{item_list}[$i]{$_} =~ s/\"/&quot;/g }    qw(partnumber description unit);
         map { $form->{"${_}_$i"} = $form->{item_list}[0]{$_} } keys %{ $form->{item_list}[0] };
 
         $form->{"marge_price_factor_$i"} = $form->{item_list}->[0]->{price_factor};
@@ -375,14 +396,18 @@ sub update_delivery_order {
     }
   }
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub search {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
+
   $form->{vc} = $form->{type} eq 'purchase_delivery_order' ? 'vendor' : 'customer';
 
   $form->get_lists("projects"     => { "key" => "ALL_PROJECTS",
@@ -399,17 +424,22 @@ sub search {
 
   print $form->parse_html_template('do/search');
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub orders {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
-  ($form->{ $form->{vc} }, $form->{"${form->{vc}}_id"}) = split(/--/, $form->{ $form->{vc} });
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
+  my $cgi      = $main::cgi;
 
-  $form->{sort} ||= 'transdate';
+  ($form->{ $form->{vc} }, $form->{"$form->{vc}_id"}) = split(/--/, $form->{ $form->{vc} });
+
+  report_generator_set_default_sort('transdate', 1);
 
   DO->transactions();
 
@@ -436,7 +466,7 @@ sub orders {
 
   my @hidden_variables = map { "l_${_}" } @columns;
   push @hidden_variables, $form->{vc}, qw(l_closed l_notdelivered open closed delivered notdelivered donumber ordnumber
-                                          transaction_description transdatefrom transdateto type vc employee_id salesman_id);
+                                          transaction_description transdatefrom transdateto type vc employee_id salesman_id project_id);
 
   my $href = build_std_url('action=orders', grep { $form->{$_} } @hidden_variables);
 
@@ -455,8 +485,9 @@ sub orders {
     'delivered'               => { 'text' => $locale->text('Delivered'), },
   );
 
-  foreach my $name (qw(id transdate donumber ordnumber name employee shipvia)) {
-    $column_defs{$name}->{link} = $href . "&sort=$name";
+  foreach my $name (qw(id transdate donumber ordnumber name employee shipvia transaction_description)) {
+    my $sortdir                 = $form->{sort} eq $name ? 1 - $form->{sortdir} : $form->{sortdir};
+    $column_defs{$name}->{link} = $href . "&sort=$name&sortdir=$sortdir";
   }
 
   $form->{"l_type"} = "Y";
@@ -467,9 +498,9 @@ sub orders {
   $report->set_columns(%column_defs);
   $report->set_column_order(@columns);
 
-  $report->set_export_options('orders', @hidden_variables);
+  $report->set_export_options('orders', @hidden_variables, qw(sort sortdir));
 
-  $report->set_sort_indicator($form->{sort}, 1);
+  $report->set_sort_indicator($form->{sort}, $form->{sortdir});
 
   my @options;
   if ($form->{customer}) {
@@ -479,7 +510,7 @@ sub orders {
     push @options, $locale->text('Vendor') . " : $form->{vendor}";
   }
   if ($form->{department}) {
-    ($department) = split /--/, $form->{department};
+    my ($department) = split /--/, $form->{department};
     push @options, $locale->text('Department') . " : $department";
   }
   if ($form->{donumber}) {
@@ -492,10 +523,10 @@ sub orders {
     push @options, $locale->text('Transaction description') . " : $form->{transaction_description}";
   }
   if ($form->{transdatefrom}) {
-    push @options, $locale->text('From') . "&nbsp;" . $locale->date(\%myconfig, $form->{transdatefrom}, 1);
+    push @options, $locale->text('From') . " " . $locale->date(\%myconfig, $form->{transdatefrom}, 1);
   }
   if ($form->{transdateto}) {
-    push @options, $locale->text('Bis') . "&nbsp;" . $locale->date(\%myconfig, $form->{transdateto}, 1);
+    push @options, $locale->text('Bis') . " " . $locale->date(\%myconfig, $form->{transdateto}, 1);
   }
   if ($form->{open}) {
     push @options, $locale->text('Open');
@@ -523,14 +554,14 @@ sub orders {
   $form->{callback} = $href .= "&sort=$form->{sort}";
 
   # escape callback for href
-  $callback = $form->escape($href);
+  my $callback = $form->escape($href);
 
   my $edit_url       = build_std_url('action=edit', 'type', 'vc');
   my $edit_order_url = build_std_url('script=oe.pl', 'type=' . ($form->{type} eq 'sales_delivery_order' ? 'sales_order' : 'purchase_order'), 'action=edit');
 
   my $idx            = 1;
 
-  foreach $dord (@{ $form->{DO} }) {
+  foreach my $dord (@{ $form->{DO} }) {
     $dord->{open}      = $dord->{closed}    ? $locale->text('No')  : $locale->text('Yes');
     $dord->{delivered} = $dord->{delivered} ? $locale->text('Yes') : $locale->text('No');
 
@@ -553,14 +584,18 @@ sub orders {
 
   $report->generate_with_headers();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub save {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
+
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
   $form->isblank("transdate", $locale->text('Delivery Order Date missing!'));
@@ -568,7 +603,7 @@ sub save {
   $form->{donumber} =~ s/^\s*//g;
   $form->{donumber} =~ s/\s*$//g;
 
-  $msg = ucfirst $form->{vc};
+  my $msg = ucfirst $form->{vc};
   $form->isblank($form->{vc}, $locale->text($msg . " missing!"));
 
   # $locale->text('Customer missing!');
@@ -589,8 +624,8 @@ sub save {
   # saving the history
   if(!exists $form->{addition}) {
     $form->{snumbers} = qq|donumber_| . $form->{donumber};
-       $form->{addition} = "SAVED";
-       $form->save_history($form->dbconnect(\%myconfig));
+    $form->{addition} = "SAVED";
+    $form->save_history($form->dbconnect(\%myconfig));
   }
   # /saving the history
 
@@ -600,14 +635,17 @@ sub save {
     update();
     exit;
   }
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub delete {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my $locale   = $main::locale;
+
   map { delete $form->{$_} } qw(action header login password);
   my @variables = map { { 'key' => $_, 'value' => $form->{$_} } } grep { '' eq ref $form->{$_} } keys %{ $form };
 
@@ -616,20 +654,24 @@ sub delete {
 
   print $form->parse_html_template('do/delete', { 'VARIABLES' => \@variables });
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub delete_delivery_order {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
+
   if (DO->delete()) {
     # saving the history
     if(!exists $form->{addition}) {
       $form->{snumbers} = qq|donumber_| . $form->{donumber};
-         $form->{addition} = "DELETED";
-         $form->save_history($form->dbconnect(\%myconfig));
+      $form->{addition} = "DELETED";
+      $form->save_history($form->dbconnect(\%myconfig));
     }
     # /saving the history
 
@@ -639,29 +681,35 @@ sub delete_delivery_order {
 
   $form->error($locale->text('Cannot delete delivery order!'));
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub invoice {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
 
   check_do_access();
-  $auth->assert($form->{type} eq 'purchase_delivery_order' ? 'vendor_invoice_edit' : 'invoice_edit');
+  $main::auth->assert($form->{type} eq 'purchase_delivery_order' ? 'vendor_invoice_edit' : 'invoice_edit');
 
-  $form->{deliverydate} = $form->{transdate};
-  $form->{transdate}    = $form->{invdate} = $form->current_date(\%myconfig);
-  $form->{duedate}      = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
+  $form->{convert_from_do_ids} = $form->{id};
+  $form->{deliverydate}        = $form->{transdate};
+  $form->{transdate}           = $form->{invdate} = $form->current_date(\%myconfig);
+  $form->{duedate}             = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
+  $form->{defaultcurrency}     = $form->get_default_currency(\%myconfig);
 
-  $form->{id}     = '';
-  $form->{closed} = 0;
   $form->{rowcount}--;
 
-  $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
+  delete @{$form}{qw(id closed delivered)};
 
+  my ($script, $buysell);
   if ($form->{type} eq 'purchase_delivery_order') {
     $form->{title}  = $locale->text('Add Vendor Invoice');
     $form->{script} = 'ir.pl';
     $script         = "ir";
+    $buysell        = 'sell';
 
   } else {
     $form->{title}  = $locale->text('Add Sales Invoice');
@@ -670,14 +718,15 @@ sub invoice {
     $buysell        = 'buy';
   }
 
-  for $i (1 .. $form->{rowcount}) {
+  for my $i (1 .. $form->{rowcount}) {
     map { $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if $form->{"${_}_${i}"} } qw(ship qty sellprice listprice basefactor);
   }
 
   $form->{type} = "invoice";
 
   # locale messages
-  $locale = new Locale "$myconfig{countrycode}", "$script";
+  $main::locale = new Locale "$myconfig{countrycode}", "$script";
+  $locale = $main::locale;
 
   require "bin/mozilla/$form->{script}";
 
@@ -692,12 +741,12 @@ sub invoice {
   prepare_invoice();
 
   # format amounts
-  for $i (1 .. $form->{rowcount}) {
+  for my $i (1 .. $form->{rowcount}) {
     $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{"discount_$i"});
 
-    ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
+    my ($dec) = ($form->{"sellprice_$i"} =~ /\.(\d+)/);
     $dec           = length $dec;
-    $decimalplaces = ($dec > 2) ? $dec : 2;
+    my $decimalplaces = ($dec > 2) ? $dec : 2;
 
     # copy delivery date from reqdate for order -> invoice conversion
     $form->{"deliverydate_$i"} = $form->{"reqdate_$i"}
@@ -716,14 +765,18 @@ sub invoice {
 
   display_form();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub invoice_multi {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
 
   check_do_access();
-  $auth->assert($form->{type} eq 'sales_delivery_order' ? 'invoice_edit' : 'vendor_invoice_edit');
+  $main::auth->assert($form->{type} eq 'sales_delivery_order' ? 'invoice_edit' : 'vendor_invoice_edit');
 
   my @do_ids = map { $form->{"trans_id_$_"} } grep { $form->{"multi_id_$_"} } (1..$form->{rowcount});
 
@@ -740,15 +793,22 @@ sub invoice_multi {
                               'back_button' => 1);
   }
 
-  $form->{deliverydate}    = $form->{transdate};
-  $form->{transdate}       = $form->current_date(\%myconfig);
-  $form->{duedate}         = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
-  $form->{type}            = "invoice";
-  $form->{closed}          = 0;
-  $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
-
-  my $buysell;
-  if ($form->{type} eq 'purchase_delivery_order') {
+  my $source_type              = $form->{type};
+  $form->{convert_from_do_ids} = join ' ', @do_ids;
+  # bei der auswahl von mehreren Lieferscheinen fuer eine Rechnung, die einfach in donumber_array
+  # zwischenspeichern (DO.pm) und als ' '-separierte Liste wieder zurueckschreiben
+  # Hinweis: delete gibt den wert zurueck und loescht danach das element (nett und einfach)
+  # $shell: perldoc perlunc; /delete EXPR
+  $form->{donumber}            = delete $form->{donumber_array};
+  $form->{deliverydate}        = $form->{transdate};
+  $form->{transdate}           = $form->current_date(\%myconfig);
+  $form->{duedate}             = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
+  $form->{type}                = "invoice";
+  $form->{closed}              = 0;
+  $form->{defaultcurrency}     = $form->get_default_currency(\%myconfig);
+
+  my ($script, $buysell);
+  if ($source_type eq 'purchase_delivery_order') {
     $form->{title}  = $locale->text('Add Vendor Invoice');
     $form->{script} = 'ir.pl';
     $script         = "ir";
@@ -766,8 +826,12 @@ sub invoice_multi {
   $form->{rowcount} = 0;
   foreach my $ref (@{ $form->{form_details} }) {
     $form->{rowcount}++;
+    $ref->{reqdate} ||= $ref->{dord_transdate}; # copy transdates into each invoice row
     map { $form->{"${_}_$form->{rowcount}"} = $ref->{$_} } keys %{ $ref };
     map { $form->{"${_}_$form->{rowcount}"} = $form->format_amount(\%myconfig, $ref->{$_}) } qw(qty sellprice discount lastcost);
+    $form->{"discount_$form->{rowcount}"}   = $form->{"discount_$form->{rowcount}"}  * 100; #s.a. Bug 1151
+    # Anm.: Eine Änderung des discounts in der SL/DO.pm->retrieve (select (doi.discount * 100) as discount) ergibt in psql einen
+    # Wert von 10.0000001490116. Ferner ist der Rabatt in der Rechnung dann bei 1.0 (?). Deswegen lasse ich das hier. jb 10.10.09
   }
   delete $form->{form_details};
 
@@ -779,14 +843,16 @@ sub invoice_multi {
   prepare_invoice();
   display_form();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub save_as_new {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+
   $form->{saveasnew} = 1;
   $form->{closed}    = 0;
   $form->{delivered} = 0;
@@ -802,14 +868,16 @@ sub save_as_new {
 
   save();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub e_mail {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   check_do_access();
 
+  my $form     = $main::form;
+
   $form->{print_and_save} = 1;
 
   $print_post = 1;
@@ -822,20 +890,22 @@ sub e_mail {
 
   edit_e_mail();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub calculate_stock_in_out {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
 
   my $i = shift;
 
   if (!$form->{"id_${i}"}) {
-    $lxdebug->leave_sub();
+    $main::lxdebug->leave_sub();
     return '';
   }
 
-  AM->retrieve_all_units();
+  my $all_units = AM->retrieve_all_units();
 
   my $in_out   = $form->{type} =~ /^sales/ ? 'out' : 'in';
   my $sinfo    = DO->unpack_stock_information('packed' => $form->{"stock_${in_out}_${i}"});
@@ -849,16 +919,18 @@ sub calculate_stock_in_out {
                                             'max_places'  => 2);
   $content    .= qq| <input type="button" onclick="open_stock_in_out_window('${in_out}', $i);" value="?">|;
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 
   return $content;
 }
 
 sub get_basic_bin_wh_info {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   my $stock_info = shift;
 
+  my $form     = $main::form;
+
   foreach my $sinfo (@{ $stock_info }) {
     next unless ($sinfo->{bin_id});
 
@@ -866,11 +938,13 @@ sub get_basic_bin_wh_info {
     map { $sinfo->{"${_}_description"} = $sinfo->{"${_}description"} = $bin_info->{"${_}_description"} } qw(bin warehouse);
   }
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub stock_in_out_form {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
 
   if ($form->{in_out} eq 'out') {
     stock_out_form();
@@ -878,14 +952,16 @@ sub stock_in_out_form {
     stock_in_form();
   }
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub redo_stock_info {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   my %params    = @_;
 
+  my $form     = $main::form;
+
   my @non_empty = grep { $_->{qty} } @{ $params{stock_info} };
 
   if ($params{add_empty_row}) {
@@ -897,11 +973,14 @@ sub redo_stock_info {
 
   @{ $params{stock_info} } = @non_empty;
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub update_stock_in {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
 
   my $stock_info = [];
 
@@ -912,24 +991,30 @@ sub update_stock_in {
 
   display_stock_in_form($stock_info);
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub stock_in_form {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
 
   my $stock_info = DO->unpack_stock_information('packed' => $form->{stock});
 
   display_stock_in_form($stock_info);
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub display_stock_in_form {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
 
   my $stock_info = shift;
 
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
+
   $form->{title} = $locale->text('Stock');
 
   my $part_info  = IC->get_basic_part_info('id' => $form->{parts_id});
@@ -949,11 +1034,14 @@ sub display_stock_in_form {
                                                          'STOCK_INFO' => $stock_info,
                                                          'PART_INFO'  => $part_info, });
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub set_stock_in {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
 
   my $stock_info = [];
 
@@ -970,11 +1058,15 @@ sub set_stock_in {
   $form->header();
   print $form->parse_html_template('do/set_stock_in_out');
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub stock_out_form {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
 
   $form->{title} = $locale->text('Release From Stock');
 
@@ -1016,11 +1108,15 @@ sub stock_out_form {
                                                           'WHCONTENTS' => $form->{delivered} ? $stock_info : \@contents,
                                                           'PART_INFO'  => $part_info, });
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub set_stock_out {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
 
   my $stock_info = [];
 
@@ -1054,11 +1150,15 @@ sub set_stock_out {
     print $form->parse_html_template('do/set_stock_in_out');
   }
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub transfer_in {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
 
   if (DO->is_marked_as_delivered('id' => $form->{id})) {
     $form->show_generic_error($locale->text('The parts for this delivery order have already been transferred in.'), 'back_button' => 1);
@@ -1101,7 +1201,7 @@ sub transfer_in {
       push @{ $form->{ERRORS} }, $locale->text('The delivery order has not been marked as delivered. The warehouse contents have not changed.');
 
       update();
-      $lxdebug->leave_sub();
+      $main::lxdebug->leave_sub();
 
       exit 0;
     }
@@ -1114,11 +1214,15 @@ sub transfer_in {
 
   save();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
 }
 
 sub transfer_out {
-  $lxdebug->enter_sub();
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+  my %myconfig = %main::myconfig;
+  my $locale   = $main::locale;
 
   if (DO->is_marked_as_delivered('id' => $form->{id})) {
     $form->show_generic_error($locale->text('The parts for this delivery order have already been transferred out.'), 'back_button' => 1);
@@ -1178,7 +1282,7 @@ sub transfer_out {
         $request->{ok} = $request->{sum_base_qty} <= $inv->{qty};
       }
 
-      foreach $request (values %request_map) {
+      foreach my $request (values %request_map) {
         next if ($request->{ok});
 
         my $pinfo = $part_info_map{$request->{parts_id}};
@@ -1197,7 +1301,7 @@ sub transfer_out {
       push @{ $form->{ERRORS} }, $locale->text('The delivery order has not been marked as delivered. The warehouse contents have not changed.');
 
       update();
-      $lxdebug->leave_sub();
+      $main::lxdebug->leave_sub();
 
       exit 0;
     }
@@ -1210,17 +1314,46 @@ sub transfer_out {
 
   save();
 
-  $lxdebug->leave_sub();
+  $main::lxdebug->leave_sub();
+}
+
+sub mark_closed {
+  $main::lxdebug->enter_sub();
+
+  my $form     = $main::form;
+
+  DO->close_orders('ids' => [ $form->{id} ]);
+
+  $form->{closed} = 1;
+
+  update();
+
+  $main::lxdebug->leave_sub();
 }
 
+
 sub yes {
-  call_sub($form->{yes_nextsub});
+  call_sub($main::form->{yes_nextsub});
 }
 
 sub no {
-  call_sub($form->{no_nextsub});
+  call_sub($main::form->{no_nextsub});
 }
 
 sub update {
-  call_sub($form->{update_nextsub} || $form->{nextsub} || 'update_delivery_order');
+  call_sub($main::form->{update_nextsub} || $main::form->{nextsub} || 'update_delivery_order');
+}
+
+sub dispatcher {
+  my $form     = $main::form;
+  my $locale   = $main::locale;
+
+  foreach my $action (qw(update ship_to print e_mail save transfer_out transfer_in mark_closed save_as_new invoice delete)) {
+    if ($form->{"action_${action}"}) {
+      call_sub($action);
+      return;
+    }
+  }
+
+  $form->error($locale->text('No action defined.'));
 }