Merge branch 'master' of ssh://lx-office/~/lx-office-erp
[kivitendo-erp.git] / bin / mozilla / oe.pl
index 656089f..add4b46 100644 (file)
 
 use POSIX qw(strftime);
 
+use SL::DO;
 use SL::FU;
 use SL::OE;
 use SL::IR;
 use SL::IS;
+use SL::MoreCommon qw(ary_diff);
 use SL::PE;
 use SL::ReportGenerator;
 use List::Util qw(max reduce sum);
+use Data::Dumper;
 
 require "bin/mozilla/io.pl";
 require "bin/mozilla/arap.pl";
@@ -229,8 +232,16 @@ sub order_links {
   $form->{employee}    = "$form->{employee}--$form->{employee_id}";
 
   # build vendor/customer drop down comatibility... don't ask
-  $form->{"old$form->{vc}"} = $form->{vc};
-  $form->{"select$form->{vc}"} = 1;
+  if (@{ $form->{"all_$form->{vc}"} }) {
+    $form->{"select$form->{vc}"} = 1;
+    $form->{$form->{vc}}         = qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
+  }
+
+  $form->{"old$form->{vc}"}  = $form->{$form->{vc}};
+
+  if ($form->{"old$form->{vc}"} !~ m/--\d+$/ && $form->{"$form->{vc}_id"}) {
+    $form->{"old$form->{vc}"} .= qq|--$form->{"$form->{vc}_id"}|
+  }
 
   $lxdebug->leave_sub();
 }
@@ -242,9 +253,12 @@ sub prepare_order {
 
   $form->{formname} ||= $form->{type};
 
+  # format discounts if values come from db. either as single id, or as a collective order
+  my $format_discounts = $form->{id} || $form->{convert_from_oe_ids};
+
   for my $i (1 .. $form->{rowcount}) {
     $form->{"reqdate_$i"} ||= $form->{"deliverydate_$i"};
-    $form->{"discount_$i"}  = $form->format_amount(\%myconfig, $form->{"discount_$i"} * ($form->{id} ? 100 : 1));
+    $form->{"discount_$i"}  = $form->format_amount(\%myconfig, $form->{"discount_$i"} * ($format_discounts ? 100 : 1));
     $form->{"sellprice_$i"} = $form->format_amount(\%myconfig, $form->{"sellprice_$i"});
     $form->{"qty_$i"}       = $form->format_amount(\%myconfig, $form->{"qty_$i"});
   }
@@ -266,23 +280,8 @@ sub form_header {
   $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id};
   $form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id};
 
-  map { $form->{$_} = H($form->{$_}) }
-    qw(shippingpoint shipvia notes intnotes shiptoname
-       shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact
-       shiptophone shiptofax shiptodepartment_1 shiptodepartment_2);
   # use JavaScript Calendar or not
   $form->{jsscript} = 1;
-  $TMPL_VAR{button1} = qq|
-     <td nowrap><input name=transdate id=transdate size=11 title="$myconfig{dateformat}" value="$form->{transdate}" onBlur=\"check_right_date_format(this)\">
-      <input type=button name=transdate id="trigger1" value=| . $locale->text('button') . qq|></td>
-    |;
-  $TMPL_VAR{button2} = qq|
-     <td nowrap width="13"><input name=reqdate id=reqdate size=11 title="$myconfig{dateformat}" value="$form->{reqdate}" onBlur=\"check_right_date_format(this)\">
-      <input type=button name=reqdate name=reqdate id="trigger2" value=| . $locale->text('button') . qq|></td>
-   |;
-  #write Trigger
-  $TMPL_VAR{jsscript} = Form->write_trigger(\%myconfig, "2", "transdate", "BL", "trigger1", "reqdate", "BL", "trigger2");
 
   # openclosed checkboxes
   my @tmp;
@@ -292,18 +291,7 @@ sub form_header {
                         $form->{"closed"}    ? "checked" : "",  $locale->text('Closed')    if $form->{id};
   $TMPL_VAR{openclosed} = sprintf qq|<tr><td colspan=%d align=center>%s</td></tr>\n|, 2 * scalar @tmp, join "\n", @tmp if @tmp;
 
-  # set option selected
-  foreach $item ($form->{vc}, 'currency', 'department', ($form->{vc} eq "customer" ? 'customer' : 'vendor')) {
-    $form->{"select$item"} =~ s/ selected//;
-    $form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/;
-  }
-
-  #quote select[customer|vendor] Bug 133
-  $form->{"select$form->{vc}"} = $form->quote($form->{"select$form->{vc}"});
-
-  #substitute \n and \r to \s (bug 543)
-  $form->{"select$form->{vc}"} =~ s/[\n\r]/&nbsp;/g;
-  
+  # project ids
   my @old_project_ids = ($form->{"globalproject_id"}, grep { $_ } map { $form->{"project_id_$_"} } 1..$form->{"rowcount"});
 
   my $vc = $form->{vc} eq "customer" ? "customers" : "vendors";
@@ -326,10 +314,10 @@ sub form_header {
   $TMPL_VAR{sales_employee_labels} = sub { $_[0]->{name} || $_[0]->{login} };
   $TMPL_VAR{shipto_labels}         = sub { join "; ", grep { $_ } map { $_[0]->{"shipto${_}" } } qw(name department_1 street city) };
   $TMPL_VAR{contact_labels}        = sub { join(', ', $_[0]->{"cp_name"}, $_[0]->{"cp_givenname"}) . ($_[0]->{cp_abteilung} ? " ($_[0]->{cp_abteilung})" : "") };
-  $TMPL_VAR{department_labels}     = sub { "$_[0]->{description}--$_[0]->{id}" }; 
+  $TMPL_VAR{department_labels}     = sub { "$_[0]->{description}--$_[0]->{id}" };
 
   # vendor/customer
-  $TMPL_VAR{vc_keys} = sub { "$_[0]->{name}--$_[0]->{id}" };
+  $TMPL_VAR{vc_keys} = sub { E($_[0]->{name}) . "--$_[0]->{id}" };
   $TMPL_VAR{vclimit} = $myconfig{vclimit};
   $TMPL_VAR{vc_select} = "customer_or_vendor_selection_window('$form->{vc}', '', @{[ $form->{vc} eq 'vendor' ? 1 : 0 ]}, 0)";
   push @custom_hiddens, "$form->{vc}_id";
@@ -349,17 +337,16 @@ sub form_header {
   # credit remaining
   $creditwarning = (($form->{creditlimit} != 0) && ($form->{creditremaining} < 0) && !$form->{update}) ? 1 : 0;
   $TMPL_VAR{is_credit_remaining_negativ} = ($form->{creditremaining} =~ /-/) ? "0" : "1";
-  
+
   # business
   $TMPL_VAR{business_label} = ($form->{vc} eq "customer" ? $locale->text('Customer type') : $locale->text('Vendor type'));
 
-  push @custom_hiddens, "ordnumber"      if $form->{type} =~ /_quotation$/;
   push @custom_hiddens, "customer_klass" if $form->{vc} eq 'customer';
 
   $credittext = $locale->text('Credit Limit exceeded!!!');
 
   my $follow_up_vc                =  $form->{ $form->{vc} eq 'customer' ? 'customer' : 'vendor' };
-  $follow_up_vc                   =~ s/--.*?//;
+  $follow_up_vc                   =~ s/--\d*\s*$//;
   $TMPL_VAR{follow_up_trans_info} =  ($form->{type} =~ /_quotation$/ ? $form->{quonumber} : $form->{ordnumber}) . " ($follow_up_vc)";
 
   if ($form->{id}) {
@@ -422,8 +409,8 @@ sub form_footer {
   $introws = max 2, $form->numtextrows($form->{intnotes}, 35, 8);
   $rows    = max $rows, $introws;
 
-  $TMPL_VAR{notes} = qq|<textarea name=notes rows=$rows cols=25 wrap=soft>$form->{notes}</textarea>|;
-  $TMPL_VAR{intnotes} = qq|<textarea name=intnotes rows=$rows cols=35 wrap=soft>$form->{intnotes}</textarea>|;
+  $TMPL_VAR{notes}    = qq|<textarea name=notes rows=$rows cols=25 wrap=soft>| . H($form->{notes}) . qq|</textarea>|;
+  $TMPL_VAR{intnotes} = qq|<textarea name=intnotes rows=$introws cols=35 wrap=soft>| . H($form->{intnotes}) . qq|</textarea>|;
 
   if (!$form->{taxincluded}) {
 
@@ -440,7 +427,7 @@ sub form_footer {
       }
     }
 
-    $form->{invsubtotal} = $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0);
+#    $form->{invsubtotal} = $form->format_amount(\%myconfig, $form->{invsubtotal}, 2, 0); # template does this
 
   } else {
     foreach $item (split / /, $form->{taxaccounts}) {
@@ -478,22 +465,24 @@ sub form_footer {
 
 sub update {
   $lxdebug->enter_sub();
-  
+
   my ($recursive_call) = shift;
 
   check_oe_access();
 
+#  $main::lxdebug->message(0, Dumper($form));
+
   set_headings($form->{"id"} ? "edit" : "add");
 
   map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate) unless $recursive_call;
   $form->{update} = 1;
-      
+
   $payment_id = $form->{payment_id} if $form->{payment_id};
-  
+
   &check_name($form->{vc});
-  
+
   $form->{payment_id} = $payment_id if $form->{payment_id} eq "";
-  
+
   $buysell              = 'buy';
   $buysell              = 'sell' if ($form->{vc} eq 'vendor');
   $form->{forex}        = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{transdate}, $buysell);
@@ -509,8 +498,8 @@ sub update {
       && ($form->{"partsgroup_$i"}  eq "")) {
 
     $form->{creditremaining} += ($form->{oldinvtotal} - $form->{oldtotalpaid});
-    &check_form;
 
+    &check_form;
   } else {
 
     if ($form->{type} =~ /^sales/) {
@@ -521,7 +510,11 @@ sub update {
 
     my $rows = scalar @{ $form->{item_list} };
 
-    $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{discount} * 100);
+    # hier ist das problem fuer bug 817 $form->{discount} wird nicht durchgeschliffen
+    # ferner fallunterscheidung fuer verkauf oder einkauf s.a. bug 736 jb 04.05.2009
+    # select discount as vendor_discount from vendor ||
+    # select discount as customer_discount from customer
+    $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{"$form->{vc}_discount"} * 100);
 
     if ($rows) {
       $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"});
@@ -534,9 +527,17 @@ sub update {
       } else {
 
         $sellprice             = $form->parse_amount(\%myconfig, $form->{"sellprice_$i"});
-        $form->{"discount_$i"} = 0 if $form->{"not_discountable_$i"};
+        # hier werden parts (Artikeleigenschaften) aus item_list (retrieve_item aus IS.pm)
+        # (item wahrscheinlich synonym für parts) entsprechend in die form geschrieben ...
+
+        # Wäre dieses Mapping nicht besser in retrieve_items aufgehoben?
+        #(Eine Funktion bekommt Daten -> ARBEIT -> Rückgabe DATEN)
+        #  Das quot sieht doch auch nach Überarbeitung aus ... (hmm retrieve_items gibt es in IS und IR)
         map { $form->{item_list}[$i]{$_} =~ s/\"/&quot;/g }    qw(partnumber description unit);
         map { $form->{"${_}_$i"} = $form->{item_list}[0]{$_} } keys %{ $form->{item_list}[0] };
+
+        # ... deswegen muss die prüfung, ob es sich um einen nicht rabattierfähigen artikel handelt später erfolgen (Bug 1136)
+        $form->{"discount_$i"} = 0 if $form->{"not_discountable_$i"};
         $form->{payment_id} = $form->{"part_payment_id_$i"} if $form->{"part_payment_id_$i"} ne "";
 
         $form->{"marge_price_factor_$i"} = $form->{item_list}->[0]->{price_factor};
@@ -599,258 +600,50 @@ sub search {
   check_oe_access();
 
   if ($form->{type} eq 'purchase_order') {
-    $form->{title} = $locale->text('Purchase Orders');
-    $form->{vc}    = 'vendor';
-    $ordlabel      = $locale->text('Order Number');
-    $ordnumber     = 'ordnumber';
-    $employee      = $locale->text('Employee');
-  }
-
-  if ($form->{type} eq 'request_quotation') {
-    $form->{title} = $locale->text('Request for Quotations');
-    $form->{vc}    = 'vendor';
-    $ordlabel      = $locale->text('RFQ Number');
-    $ordnumber     = 'quonumber';
-    $employee      = $locale->text('Employee');
-  }
-
-  if ($form->{type} eq 'sales_order') {
-    $form->{title} = $locale->text('Sales Orders');
-    $form->{vc}    = 'customer';
-    $ordlabel      = $locale->text('Order Number');
-    $ordnumber     = 'ordnumber';
-    $employee      = $locale->text('Employee');
-  }
-
-  if ($form->{type} eq 'sales_quotation') {
-    $form->{title} = $locale->text('Quotations');
-    $form->{vc}    = 'customer';
-    $ordlabel      = $locale->text('Quotation Number');
-    $ordnumber     = 'quonumber';
-    $employee      = $locale->text('Employee');
-  }
-
-  # setup vendor / customer selection
-  $form->all_vc(\%myconfig, $form->{vc},
-                ($form->{vc} eq 'customer') ? "AR" : "AP");
+    $form->{vc}        = 'vendor';
+    $form->{ordnrname} = 'ordnumber';
+    $form->{title}     = $locale->text('Purchase Orders');
+    $form->{ordlabel}  = $locale->text('Order Number');
+
+  } elsif ($form->{type} eq 'request_quotation') {
+    $form->{vc}        = 'vendor';
+    $form->{ordnrname} = 'quonumber';
+    $form->{title}     = $locale->text('Request for Quotations');
+    $form->{ordlabel}  = $locale->text('RFQ Number');
+
+  } elsif ($form->{type} eq 'sales_order') {
+    $form->{vc}        = 'customer';
+    $form->{ordnrname} = 'ordnumber';
+    $form->{title}     = $locale->text('Sales Orders');
+    $form->{ordlabel}  = $locale->text('Order Number');
+
+  } elsif ($form->{type} eq 'sales_quotation') {
+    $form->{vc}        = 'customer';
+    $form->{ordnrname} = 'quonumber';
+    $form->{title}     = $locale->text('Quotations');
+    $form->{ordlabel}  = $locale->text('Quotation Number');
 
-  # departments
-  if (@{ $form->{all_departments} }) {
-    $form->{selectdepartment} = "<option>\n";
-
-    map {
-      $form->{selectdepartment} .=
-        "<option>$_->{description}--$_->{id}</option>\n"
-    } (@{ $form->{all_departments} });
-  }
-
-  $department = qq|
-        <tr>
-         <th align=right nowrap>| . $locale->text('Department') . qq|</th>
-         <td colspan=3><select name=department>$form->{selectdepartment}</select></td>
-       </tr>
-| if $form->{selectdepartment};
-
-  my $delivered;
-  if (($form->{"type"} eq "sales_order") ||
-      ($form->{"type"} eq "purchase_order")) {
-    $delivered = qq|
-        <tr>
-          <td><input name="notdelivered" id="notdelivered" class="checkbox" type="checkbox" value="1" checked>
-            <label for="notdelivered">|. $locale->text('Not delivered') . qq|</label></td>
-          <td><input name="delivered" id="delivered" class="checkbox" type="checkbox" value="1" checked>
-            <label for="delivered">| . $locale->text('Delivered') . qq|</label></td>
-        </tr>
-|;
+  } else {
+    $form->show_generic_error($locale->text('oe.pl::search called with unknown type'), back_button => 1);
   }
 
-  # use JavaScript Calendar or not
-  $form->{jsscript} = 1;
-  $jsscript = "";
-
-  $button1 = qq|
-     <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
-     <input type=button name=transdatefrom id="trigger3" value=|
-    . $locale->text('button') . qq|></td>
-    |;
-  $button2 = qq|
-     <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
-     <input type=button name=transdateto name=transdateto id="trigger4" value=|
-    . $locale->text('button') . qq|></td>
-   |;
-
-  #write Trigger
-  $jsscript =
-    Form->write_trigger(\%myconfig, "2", "transdatefrom", "BR", "trigger3",
-                        "transdateto", "BL", "trigger4");
-
-  my $vc = $form->{vc} eq "customer" ? "customers" : "vendors";
-
-  $form->get_lists("projects"  => { "key" => "ALL_PROJECTS",
-                                    "all" => 1 },
-                   "employees" => "ALL_EMPLOYEES",
-                   "salesmen"  => "ALL_SALESMEN",
-                   $vc         => "ALL_" . uc($vc)
-                  );
-
-  my %labels = ();
-  my @values = ("");
-  foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
-    push(@values, $item->{"id"});
-    $labels{$item->{"id"}} = $item->{"projectnumber"};
-  }
-  my $projectnumber =
-    NTI($cgi->popup_menu('-name' => 'project_id', '-values' => \@values,
-                         '-labels' => \%labels));
-
-  #employees
-  %labels = ();
-  @values = ("");
-  foreach my $item (@{ $form->{"ALL_EMPLOYEES"} }) {
-    push(@values, $item->{"id"});
-    $labels{$item->{"id"}} = $item->{"name"} ne "" ? $item->{"name"} : $item->{"login"};
-  }
-  
-  #salesmen
-  my %labels_salesmen = ();
-  my @values_salesmen = ('');
-  foreach my $item (@{ $form->{"ALL_SALESMEN"} }) {
-    push(@values_salesmen, $item->{"id"});
-    $labels_salesmen{$item->{"id"}} = $item->{"name"} ne "" ? $item->{"name"} : $item->{"login"};
-  }
-
-  my $employee_block = qq|
-    <tr>
-      <th align="right">| . $locale->text('Employee') . qq|</th>
-      <td>| .  NTI($cgi->popup_menu('-name'   => 'employee_id', '-values' => \@values, '-labels' => \%labels)) . qq|</td>
-    </tr>
-    <tr>
-      <th align="right">| . $locale->text('Salesman') . qq|</th>
-      <td>| .
-        NTI($cgi->popup_menu('-name'   => 'salesman_id',
-                             '-values' => \@values_salesmen,
-                             '-labels' => \%labels_salesmen)) . qq|
-      </td>
-    </tr>|;
-
-  %labels = ();
-  @values = ("");
-
-  foreach my $item (@{ $form->{($form->{vc} eq "customer" ? "ALL_CUSTOMERS" : "ALL_VENDORS")}}) {
-    push(@values, $item->{name}.qq|--|.$item->{"id"});
-    $labels{$item->{name}.qq|--|.$item->{"id"}} = $item->{"name"};
-  }
-
-  my $vc_label = $form->{vc} eq "customer" ? $locale->text('Customer') : $locale->text('Vendor');
-  $vc =
-    $myconfig{vclimit} <=  scalar(@values)
-    ? qq|<input type="text" value="| . H(($form->{"old$form->{vc}"} =~ /^(.*)\-\-.*$/)) . qq|" name="$form->{vc}">| 
-    : NTI($cgi->popup_menu('-name' => "$form->{vc}",
-                           '-default' => $form->{"old$form->{vc}"},
-                           '-onChange' => 'document.getElementById(\'update_button\').click();',
-                           '-values' => \@values,
-                           '-labels' => \%labels));
-  $form->header;
-
-  print qq|
-<body>
-
-<form method=post action=$form->{script}>
-
-<table width=100%>
-  <tr>
-    <th class=listtop>$form->{title}</th>
-  </tr>
-  <tr height="5"></tr>
-  <tr>
-    <td>
-      <table>
-        <tr>
-          <th align=right>$vc_label</th>
-          <td colspan=3>$vc</td>
-        </tr>
-$department
-        <tr>
-          <th align=right>$ordlabel</th>
-          <td colspan=3><input name="$ordnumber" size=20></td>
-        </tr>
-$employee_block
-        <tr>
-          <th align="right">| . $locale->text('Transaction description') . qq|</th>
-          <td colspan="3"><input name="transaction_description" size=20></td>
-        </tr>
-        <tr>
-          <th align="right">| . $locale->text("Project Number") . qq|</th>
-          <td colspan="3">$projectnumber</td>
-        </tr>
-        <tr>
-          <th align=right>| . $locale->text('From') . qq|</th> $button1
-          <th align=right>| . $locale->text('Bis') . qq|</th> $button2
-        </tr>
-        <input type=hidden name=sort value=transdate>
-        <tr>
-          <th align=right>| . $locale->text('Include in Report') . qq|</th>
-          <td colspan=5>
-           <table>
-        <tr>
-          <td><input type="checkbox" name="open" value="1" id="open" checked> <label for="open">| . $locale->text("Open") . qq|</td>
-          <td><input type="checkbox" name="closed" value="1" id="closed"> <label for="closed">| . $locale->text("Closed") . qq|</td>
-        </tr>
-        $delivered
-             <tr>
-               <td><input name="l_id" class=checkbox type=checkbox value=Y> | . $locale->text('ID') . qq|</td>
-               <td><input name="l_$ordnumber" class=checkbox type=checkbox value=Y checked> $ordlabel</td>
-             </tr>
-             <tr>
-               <td><input name="l_transdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Date') . qq|</td>
-               <td><input name="l_reqdate" class=checkbox type=checkbox value=Y checked> | . $locale->text('Required by') . qq|</td>
-             </tr>
-             <tr>
-               <td><input name="l_name" class=checkbox type=checkbox value=Y checked> $vc_label</td>
-               <td><input name="l_employee" class=checkbox type=checkbox value=Y checked> $employee</td>
-               
-               <td><input name="l_shipvia" class=checkbox type=checkbox value=Y> | . $locale->text('Ship via') . qq|</td>
-             </tr>
-             <tr>
-               <td><input name="l_netamount" class=checkbox type=checkbox value=Y> | . $locale->text('Amount') . qq|</td>
-               <td><input name="l_tax" class=checkbox type=checkbox value=Y> | . $locale->text('Tax') . qq|</td>
-               <td><input name="l_amount" class=checkbox type=checkbox value=Y checked> | . $locale->text('Total') . qq|</td>
-             </tr>
-             <tr>
-               <td><input name="l_marge_total" class=checkbox type=checkbox value=Y> | .             $locale->text('Ertrag') . qq|</td>
-               <td><input name="l_marge_percent" class=checkbox type=checkbox value=Y> | .             $locale->text('Ertrag prozentual') . qq|</td>
-             </tr>
-             <tr>
-          <td><input name="l_globalprojectnumber" class=checkbox type=checkbox value=Y> | . $locale->text('Project Number') . qq|</td>
-          <td><input name="l_transaction_description" class=checkbox type=checkbox value=Y> | . $locale->text('Transaction description') . qq|</td>
-             </tr>
-             <tr>
-               <td><input name="l_subtotal" class=checkbox type=checkbox value=Y> | . $locale->text('Subtotal') . qq|</td>
-                <td><input name="l_salesman" class="checkbox" type="checkbox" value="Y"> | . $locale->text('Salesman') . qq|</td>
-             </tr>
-           </table>
-          </td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-  <tr><td colspan=4><hr size=3 noshade></td></tr>
-</table>
-
-$jsscript
-
-<br>
-<input type=hidden name=nextsub value=orders>
-<input type=hidden name=vc value=$form->{vc}>
-<input type=hidden name=type value=$form->{type}>
+  # setup vendor / customer data
+  $form->all_vc(\%myconfig, $form->{vc}, ($form->{vc} eq 'customer') ? "AR" : "AP");
+  $form->get_lists("projects"     => { "key" => "ALL_PROJECTS", "all" => 1 },
+                   "employees"    => "ALL_EMPLOYEES",
+                   "salesmen"     => "ALL_SALESMEN",
+                   "departments"  => "ALL_DEPARTMENTS",
+                   "$form->{vc}s" => "ALL_VC");
+
+  # constants and subs for template
+  $form->{jsscript}        = 1;
+  $form->{employee_labels} = sub { $_[0]->{"name"} || $_[0]->{"login"} };
+  $form->{vc_keys}         = sub { E($_[0]->{name}) . "--$_[0]->{id}" };
+  $form->{salesman_labels} = $form->{employee_labels};
 
-<input class=submit type=submit name=action value="|
-    . $locale->text('Continue') . qq|">
-</form>
+  $form->header();
 
-</body>
-</html>
-|;
+  print $form->parse_html_template('oe/search', { %myconfig });
 
   $lxdebug->leave_sub();
 }
@@ -880,9 +673,9 @@ sub orders {
 
   $ordnumber = ($form->{type} =~ /_order$/) ? "ordnumber" : "quonumber";
 
-  ($form->{ $form->{vc} }, $form->{"${form->{vc}}_id"}) = split(/--/, $form->{ $form->{vc} });
+  ($form->{ $form->{vc} }, $form->{"$form->{vc}_id"}) = split(/--/, $form->{ $form->{vc} });
 
-  $form->{sort} ||= 'transdate';
+  report_generator_set_default_sort('transdate', 1);
 
   OE->transactions(\%myconfig, \%$form);
 
@@ -897,7 +690,8 @@ sub orders {
     "salesman",
     "shipvia",                 "globalprojectnumber",
     "transaction_description", "open",
-    "delivered", "marge_total", "marge_percent"
+    "delivered", "marge_total", "marge_percent",
+    "country",                 "ustid",
   );
 
   # only show checkboxes if gotten here via sales_order form.
@@ -933,7 +727,8 @@ sub orders {
 
   my @hidden_variables = map { "l_${_}" } @columns;
   push @hidden_variables, "l_subtotal", $form->{vc}, qw(l_closed l_notdelivered open closed delivered notdelivered ordnumber quonumber
-                                                        transaction_description transdatefrom transdateto type vc employee_id salesman_id);
+                                                        transaction_description transdatefrom transdateto type vc employee_id salesman_id
+                                                        reqdatefrom reqdateto);
 
   my $href = build_std_url('action=orders', grep { $form->{$_} } @hidden_variables);
 
@@ -957,11 +752,14 @@ sub orders {
     'open'                    => { 'text' => $locale->text('Open'), },
     'delivered'               => { 'text' => $locale->text('Delivered'), },
     'marge_total'             => { 'text' => $locale->text('Ertrag'), },
-    'marge_percent'           => { 'text' => $locale->text('Ertrag prozentual'), }
+    'marge_percent'           => { 'text' => $locale->text('Ertrag prozentual'), },
+    'country'                 => { 'text' => $locale->text('Country'), },
+    'ustid'                   => { 'text' => $locale->text('USt-IdNr.'), },
   );
 
-  foreach my $name (qw(id transdate reqdate quonumber ordnumber name employee salesman shipvia)) {
-    $column_defs{$name}->{link} = $href . "&sort=$name";
+  foreach my $name (qw(id transdate reqdate quonumber ordnumber name employee salesman shipvia transaction_description)) {
+    my $sortdir                 = $form->{sort} eq $name ? 1 - $form->{sortdir} : $form->{sortdir};
+    $column_defs{$name}->{link} = $href . "&sort=$name&sortdir=$sortdir";
   }
 
   my %column_alignment = map { $_ => 'right' } qw(netamount tax amount curr);
@@ -972,8 +770,8 @@ sub orders {
 
   $report->set_columns(%column_defs);
   $report->set_column_order(@columns);
-  $report->set_export_options('orders', @hidden_variables);
-  $report->set_sort_indicator($form->{sort}, 1);
+  $report->set_export_options('orders', @hidden_variables, qw(sort sortdir));
+  $report->set_sort_indicator($form->{sort}, $form->{sortdir});
 
   my @options;
   my ($department) = split m/--/, $form->{department};
@@ -984,8 +782,16 @@ sub orders {
   push @options, $locale->text('Order Number')            . " : $form->{ordnumber}"                       if $form->{ordnumber};
   push @options, $locale->text('Notes')                   . " : $form->{notes}"                           if $form->{notes};
   push @options, $locale->text('Transaction description') . " : $form->{transaction_description}"         if $form->{transaction_description};
-  push @options, $locale->text('From') . "&nbsp;" . $locale->date(\%myconfig, $form->{transdatefrom}, 1)  if $form->{transdatefrom};
-  push @options, $locale->text('Bis')  . "&nbsp;" . $locale->date(\%myconfig, $form->{transdateto},   1)  if $form->{transdateto};
+  if ( $form->{transdatefrom} or $form->{transdateto} ) {
+    push @options, $locale->text('Order Date');
+    push @options, $locale->text('From') . " " . $locale->date(\%myconfig, $form->{transdatefrom}, 1)     if $form->{transdatefrom};
+    push @options, $locale->text('Bis')  . " " . $locale->date(\%myconfig, $form->{transdateto},   1)     if $form->{transdateto};
+  };
+  if ( $form->{reqdatefrom} or $form->{reqdateto} ) {
+    push @options, $locale->text('Delivery Date');
+    push @options, $locale->text('From') . " " . $locale->date(\%myconfig, $form->{reqdatefrom}, 1)       if $form->{reqdatefrom};
+    push @options, $locale->text('Bis')  . " " . $locale->date(\%myconfig, $form->{reqdateto},   1)       if $form->{reqdateto};
+  };
   push @options, $locale->text('Open')                                                                    if $form->{open};
   push @options, $locale->text('Closed')                                                                  if $form->{closed};
   push @options, $locale->text('Delivered')                                                               if $form->{delivered};
@@ -1125,14 +931,14 @@ sub save_and_close {
     if ($form->{currency} ne $form->{defaultcurrency});
 
   &validate_items;
-  
-  if($form->{payment_id}) { 
+
+  if($form->{payment_id}) {
     $payment_id = $form->{payment_id};
   }
-  
+
   # if the name changed get new values
   if (&check_name($form->{vc})) {
-    if($form->{payment_id} eq "") { 
+    if($form->{payment_id} eq "") {
       $form->{payment_id} = $payment_id;
     }
     &update;
@@ -1227,14 +1033,14 @@ sub save {
     if ($form->{currency} ne $form->{defaultcurrency});
 
   &validate_items;
-  
-  if($form->{payment_id}) { 
+
+  if($form->{payment_id}) {
     $payment_id = $form->{payment_id};
   }
-  
+
   # if the name changed get new values
   if (&check_name($form->{vc})) {
-    if($form->{payment_id} eq "") { 
+    if($form->{payment_id} eq "") {
       $form->{payment_id} = $payment_id;
     }
     &update;
@@ -1291,12 +1097,12 @@ sub save {
        $form->{addition} = "SAVED";
        $form->save_history($form->dbconnect(\%myconfig));
   }
-  # /saving the history 
+  # /saving the history
 
   $form->{simple_save} = 1;
   if(!$form->{print_and_save}) {
-    set_headings("edit");
-    &update;
+    delete @{$form}{ary_diff([keys %{ $form }], [qw(login stylesheet id script type)])};
+    edit();
     exit;
   }
   $lxdebug->leave_sub();
@@ -1370,7 +1176,7 @@ sub delete_order_quotation {
          $form->{addition} = "DELETED";
          $form->save_history($form->dbconnect(\%myconfig));
     }
-    # /saving the history 
+    # /saving the history
     $form->info($msg);
     exit();
   }
@@ -1385,8 +1191,9 @@ sub invoice {
   check_oe_access();
   $auth->assert($form->{type} eq 'purchase_order' || $form->{type} eq 'request_quotation' ? 'vendor_invoice_edit' : 'invoice_edit');
 
-  $form->{old_employee_id} = $form->{employee_id};
   $form->{old_salesman_id} = $form->{salesman_id};
+  $form->get_employee();
+
 
   if ($form->{type} =~ /_order$/) {
 
@@ -1406,9 +1213,9 @@ sub invoice {
     $form->{ordnumber}    = "";
     $form->{quodate}      = $form->{transdate};
   }
-  
+
   $payment_id = $form->{payment_id} if $form->{payment_id};
-  
+
   # if the name changed get new values
   if (&check_name($form->{vc})) {
     $form->{payment_id} = $payment_id if $form->{payment_id} eq "";
@@ -1439,27 +1246,14 @@ sub invoice {
     }
   }
 
-  # close orders/quotations
-  $form->{closed} = 1;
+  $form->{convert_from_oe_ids} = $form->{id};
+  $form->{transdate}           = $form->{invdate} = $form->current_date(\%myconfig);
+  $form->{duedate}             = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
+  $form->{shipto}              = 1;
+  $form->{defaultcurrency}     = $form->get_default_currency(\%myconfig);
 
-  # save order if one ordnumber has been given
-  # if not it's most likely a collective order, which can't be saved back
-  # so they just have to be closed
-  if (($form->{ordnumber} ne '') || ($form->{quonumber} ne '')) {
-    OE->close_order(\%myconfig, \%$form) if ($form->{id});
-  } else {
-    OE->close_orders(\%myconfig, \%$form);
-  }
-
-  $form->{transdate} = $form->{invdate} = $form->current_date(\%myconfig);
-  $form->{duedate}   = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1);
-
-  $form->{id}     = '';
-  $form->{closed} = 0;
+  delete @{$form}{qw(id closed)};
   $form->{rowcount}--;
-  $form->{shipto} = 1;
-
-  $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
   if ($form->{type} =~ /_order$/) {
     $form->{exchangerate} = $exchangerate;
@@ -1474,7 +1268,7 @@ sub invoice {
     $buysell        = 'sell';
   }
 
-  if (   $form->{type} eq 'sales_order' 
+  if (   $form->{type} eq 'sales_order'
       || $form->{type} eq 'sales_quotation') {
     $form->{title}  = $locale->text('Add Sales Invoice');
     $form->{script} = 'is.pl';
@@ -1492,7 +1286,7 @@ sub invoice {
 
   require "bin/mozilla/$form->{script}";
 
-  map { $form->{"select$_"} = "" } ($form->{vc}, currency);
+  map { $form->{"select$_"} = "" } ($form->{vc}, "currency");
 
   $currency = $form->{currency};
   &invoice_links;
@@ -1693,8 +1487,7 @@ sub save_as_new {
   check_oe_access();
 
   $form->{saveasnew} = 1;
-  $form->{closed}    = 0;
-  map { delete $form->{$_} } qw(printed emailed queued);
+  map { delete $form->{$_} } qw(printed emailed queued delivered closed);
 
   # Let Lx-Office assign a new order number if the user hasn't changed the
   # previous one. If it has been changed manually then use it as-is.
@@ -1706,6 +1499,17 @@ sub save_as_new {
     delete($form->{$idx});
   }
 
+  # clear reqdate unless changed
+  if ($form->{reqdate} && $form->{id}) {
+    my $saved_order = OE->retrieve_simple(id => $form->{id});
+    if ($saved_order && $saved_order->{reqdate} eq $form->{reqdate}) {
+      delete $form->{reqdate};
+    }
+  }
+
+  # update employee
+  $form->get_employee();
+
   &save;
 
   $lxdebug->leave_sub();
@@ -1775,11 +1579,6 @@ sub purchase_order {
     check_for_direct_delivery();
   }
 
-  if (   $form->{type} eq 'sales_quotation'
-      || $form->{type} eq 'request_quotation') {
-    OE->close_order(\%myconfig, \%$form);
-  }
-
   if ($form->{type} =~ /^sales_/) {
     delete($form->{ordnumber});
   }
@@ -1790,6 +1589,8 @@ sub purchase_order {
   $form->{vc}    = "vendor";
   $form->{type}  = "purchase_order";
 
+  $form->get_employee();
+
   &poso;
 
   $lxdebug->leave_sub();
@@ -1798,25 +1599,20 @@ sub purchase_order {
 sub sales_order {
   $lxdebug->enter_sub();
 
-  $form->{"Watchdog::currency"} = 1;
-
   check_oe_access();
   $auth->assert('sales_order_edit');
 
-  if (   $form->{type} eq 'sales_quotation'
-      || $form->{type} eq 'request_quotation') {
-    OE->close_order(\%myconfig, $form);
-  }
-
   if ($form->{type} eq "purchase_order") {
     delete($form->{ordnumber});
   }
 
   $form->{cp_id} *= 1;
 
-  $form->{title} = $locale->text('Add Sales Order');
-  $form->{vc}    = "customer";
-  $form->{type}  = "sales_order";
+  $form->{title}  = $locale->text('Add Sales Order');
+  $form->{vc}     = "customer";
+  $form->{type}   = "sales_order";
+
+  $form->get_employee();
 
   &poso;
 
@@ -1832,22 +1628,34 @@ sub poso {
   $form->{transdate} = $form->current_date(\%myconfig);
   delete $form->{duedate};
 
-  $form->{closed}          = 0;
+  $form->{convert_from_oe_ids} = $form->{id};
+  $form->{closed}              = 0;
 
-  $form->{old_employee_id} = $form->{employee_id};
-  $form->{old_salesman_id} = $form->{salesman_id};
+  $form->{old_employee_id}     = $form->{employee_id};
+  $form->{old_salesman_id}     = $form->{salesman_id};
 
   # reset
-  map { delete $form->{$_} } qw(id subject message cc bcc printed emailed queued customer vendor creditlimit creditremaining discount tradediscount oldinvtotal);
+  map { delete $form->{$_} } qw(id subject message cc bcc printed emailed queued customer vendor creditlimit creditremaining discount tradediscount oldinvtotal delivered
+                                ordnumber);
 
   for $i (1 .. $form->{rowcount}) {
-    map { $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if ($form->{"${_}_${i}"}) } qw(ship qty sellprice listprice basefactor);
+    map { $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if ($form->{"${_}_${i}"}) } qw(ship qty sellprice listprice basefactor discount);
   }
 
+  my %saved_vars = map { $_ => $form->{$_} } grep { $form->{$_} } qw(currency);
+
   &order_links;
 
+  map { $form->{$_} = $saved_vars{$_} } keys %saved_vars;
+
   &prepare_order;
 
+  # prepare_order assumes that the discount is in db-notation (0.05) and not user-notation (5)
+  # and therefore multiplies the values by 100 in the case of reading from db or making an order from several quotation, so we convert this back into percent-notation for the user interface by multiplying with 0.01
+  for $i (1 .. $form->{rowcount}) {
+    $form->{"discount_$i"}  = $form->format_amount(\%myconfig, $form->{"discount_$i"} * 0.01);
+  };
+
   # format amounts
   for $i (1 .. $form->{rowcount} - 1) {
     map { $form->{"${_}_$i"} =~ s/\"/&quot;/g } qw(partnumber description unit);
@@ -1874,22 +1682,24 @@ sub delivery_order {
     $form->{type}  = 'purchase_delivery_order';
   }
 
+  $form->get_employee();
+
   require "bin/mozilla/do.pl";
 
-  $form->{cp_id}           *= 1;
-  $form->{transdate}        = $form->current_date(\%myconfig);
+  $form->{script}               = 'do.pl';
+  $form->{cp_id}               *= 1;
+  $form->{convert_from_oe_ids}  = $form->{id};
+  $form->{transdate}            = $form->current_date(\%myconfig);
   delete $form->{duedate};
 
-  $form->{closed}           = 0;
-
   $form->{old_employee_id}  = $form->{employee_id};
   $form->{old_salesman_id}  = $form->{salesman_id};
 
   # reset
-  map { delete $form->{$_} } qw(id subject message cc bcc printed emailed queued creditlimit creditremaining discount tradediscount oldinvtotal);
+  delete @{$form}{qw(id subject message cc bcc printed emailed queued creditlimit creditremaining discount tradediscount oldinvtotal closed delivered)};
 
   for $i (1 .. $form->{rowcount}) {
-    map { $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if ($form->{"${_}_${i}"}) } qw(ship qty sellprice listprice basefactor);
+    map { $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if ($form->{"${_}_${i}"}) } qw(ship qty sellprice listprice basefactor discount);
   }
 
   my %old_values = map { $_ => $form->{$_} } qw(customer_id oldcustomer customer vendor_id oldvendor vendor);
@@ -1978,7 +1788,7 @@ sub report_for_todo_list {
   my $content;
 
   if (@{ $quotations }) {
-    my $edit_url = build_std_url('script=oe.pl', 'action=edit', 'type=sales_quotation', 'vc=customer');
+    my $edit_url = build_std_url('script=oe.pl', 'action=edit');
 
     $content     = $form->parse_html_template('oe/report_for_todo_list', { 'QUOTATIONS' => $quotations,
                                                                            'edit_url'   => $edit_url });