'use strict' führt bei der Ausführung zu Fehlern wie "Can't use an undefined value...
[kivitendo-erp.git] / bin / mozilla / ic.pl
index daddf6a..bccac30 100644 (file)
 # Inventory Control module
 #
 #======================================================================
+#$locale->text('ea');
 
 use SL::IC;
+
 #use SL::PE;
 
-require "$form->{path}/io.pl";
+# use strict;
+#use warnings;
+
+# global imports
+our ($form, $locale, %myconfig, $lxdebug);
+
+require "bin/mozilla/io.pl";
+require "bin/mozilla/common.pl";
 
 1;
 
@@ -46,11 +55,11 @@ sub add {
   $form->{title} = $locale->text('Add ' . ucfirst $form->{item});
 
   $form->{callback} =
-    "$form->{script}?action=add&item=$form->{item}&path=$form->{path}&login=$form->{login}&password=$form->{password}"
+    "$form->{script}?action=add&item=$form->{item}&login=$form->{login}&password=$form->{password}"
     unless $form->{callback};
 
-  $form->{unit} =
-    ($form->{item} eq 'service') ? $locale->text('hr') : $locale->text('ea');
+  $form->{"unit_changeable"} = 1;
+
   IC->get_pricegroups(\%myconfig, \%$form);
   &link_part;
   &display_form;
@@ -61,6 +70,8 @@ sub add {
 sub search {
   $lxdebug->enter_sub();
 
+  my ($button1, $button2, $onhand, $makemodel, $serialnumber, $l_serialnumber, $toplevel, $bought);
+
   $form->{title} = (ucfirst $form->{searchitems}) . "s";
   $form->{title} = $locale->text($form->{title});
 
@@ -77,8 +88,8 @@ sub search {
   # $locale->text('Services')
 
   # use JavaScript Calendar or not
-  $form->{jsscript} = $jscalendar;
-  $jsscript = "";
+  $form->{jsscript} = 1;
+  my $jsscript = "";
   if ($form->{jsscript}) {
 
     # with JavaScript Calendar
@@ -183,7 +194,7 @@ sub search {
                <td width=5%>&nbsp;</td>
                <th>| . $locale->text('From') . qq|</th>
                 $button1
-               <th>| . $locale->text('To') . qq|</th>
+               <th>| . $locale->text('To (time)') . qq|</th>
                 $button2
              </tr>
            </table>
@@ -233,7 +244,7 @@ sub search {
                    <tr>
                      <th>| . $locale->text('From') . qq|</th>
                      $button1
-                     <th>| . $locale->text('To') . qq|</th>
+                     <th>| . $locale->text('To (time)') . qq|</th>
                      $button2
                    </tr>
                  </table>
@@ -267,6 +278,8 @@ sub search {
         <tr>
           <th align=right nowrap>| . $locale->text('Part Number') . qq|</th>
           <td><input name=partnumber size=20></td>
+          <th align=right nowrap>| . $locale->text('EAN') . qq|</th>
+          <td><input name=ean size=20></td>
         </tr>
         <tr>
           <th align=right nowrap>|
@@ -324,7 +337,7 @@ sub search {
     . $locale->text('List Price') . qq|</td>
                <td><input name=l_sellprice class=checkbox type=checkbox value=Y checked>&nbsp;|
     . $locale->text('Sell Price') . qq|</td>
-               <td><input name=l_lastcost class=checkbox type=checkbox value=Y>&nbsp;|
+               <td><input name=l_lastcost class=checkbox type=checkbox value=Y checked>&nbsp;|
     . $locale->text('Last Cost') . qq|</td>
                <td><input name=l_linetotal class=checkbox type=checkbox value=Y checked>&nbsp;|
     . $locale->text('Line Total') . qq|</td>
@@ -354,6 +367,8 @@ sub search {
     . $locale->text('Subtotal') . qq|</td>
                <td><input name=l_soldtotal class=checkbox type=checkbox value=Y>&nbsp;|
     . $locale->text('soldtotal') . qq|</td>
+               <td><input name=l_deliverydate class=checkbox type=checkbox value=Y>&nbsp;|
+    . $locale->text('deliverydate') . qq|</td>    
              </tr>
             </table>
           </td>
@@ -368,12 +383,12 @@ $jsscript
 
 <input type=hidden name=nextsub value=generate_report>
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>
 
 <input type=hidden name=revers value="$form->{revers}">
 <input type=hidden name=lastsort value="$form->{lastsort}">
+<input type=hidden name=sort value="description">
 
 <input type=hidden name=ndxs_counter value="$form->{ndxs_counter}">
 
@@ -390,9 +405,238 @@ $jsscript
   $lxdebug->leave_sub();
 }    #end search()
 
+sub search_update_prices {
+  $lxdebug->enter_sub();
+
+  my ($onhand, $makemodel, $serialnumber, $l_serialnumber, $toplevel, $bought);
+
+  $form->{title} = $locale->text('Update prices');
+  IC->get_pricegroups(\%myconfig, \%$form);
+
+  # use JavaScript Calendar or not
+#   $form->{jsscript} = 1;
+#   $jsscript = "";
+#   if ($form->{jsscript}) {
+# 
+#     # with JavaScript Calendar
+#     $button1 = qq|
+#        <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>
+#        <td><input type=button name=transdatefrom id="trigger1" value=|
+#       . $locale->text('button') . qq|></td>
+#       |;
+#     $button2 = qq|
+#        <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}"></td>
+#        <td><input type=button name=transdateto name=transdateto id="trigger2" value=|
+#       . $locale->text('button') . qq|></td>
+#      |;
+# 
+#     #write Trigger
+#     $jsscript =
+#       Form->write_trigger(\%myconfig, "2", "transdatefrom", "BL", "trigger1",
+#                           "transdateto", "BL", "trigger2");
+#   } else {
+# 
+#     # without JavaScript Calendar
+#     $button1 = qq|
+#                               <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>|;
+#     $button2 = qq|
+#                               <td><input name=transdateto id=transdateto size=11 title="$myconfig{dateformat}"></td>|;
+#   }
+
+    $onhand = qq|
+            <input name=itemstatus class=radio type=radio value=onhand>&nbsp;|
+      . $locale->text('On Hand') . qq|
+            <input name=itemstatus class=radio type=radio value=short>&nbsp;|
+      . $locale->text('Short') . qq|
+|;
+
+    $makemodel = qq|
+        <tr>
+          <th align=right nowrap>| . $locale->text('Make') . qq|</th>
+          <td><input name=make size=20></td>
+          <th align=right nowrap>| . $locale->text('Model') . qq|</th>
+          <td><input name=model size=20></td>
+        </tr>
+|;
+
+    $serialnumber = qq|
+          <th align=right nowrap>| . $locale->text('Serial Number') . qq|</th>
+          <td><input name=serialnumber size=20></td>
+|;
+
+    $l_serialnumber = qq|
+        <td><input name=l_serialnumber class=checkbox type=checkbox value=Y>&nbsp;|
+      . $locale->text('Serial Number') . qq|</td>
+|;
+
+
+
+  $form->header;
+
+  print qq|
+<body>
+
+<form method=post action=$form->{script}>
+
+<input type=hidden name=title value="$form->{title}">
+
+<table width="100%">
+  <tr><th class=listtop>$form->{title}</th></tr>
+  <tr height="5"></tr>
+  <tr valign=top>
+    <td>
+      <table>
+        <tr>
+          <th align=right nowrap>| . $locale->text('Part Number') . qq|</th>
+          <td><input name=partnumber size=20></td>
+        </tr>
+        <tr>
+          <th align=right nowrap>|
+    . $locale->text('Part Description') . qq|</th>
+          <td colspan=3><input name=description size=40></td>
+        </tr>
+       <tr>
+          <th align=right nowrap>| . $locale->text('Group') . qq|</th>
+          <td><input name=partsgroup size=20></td>
+         $serialnumber
+       </tr>
+       $makemodel
+        <tr>
+          <th align=right nowrap>| . $locale->text('Drawing') . qq|</th>
+          <td><input name=drawing size=20></td>
+          <th align=right nowrap>| . $locale->text('Microfiche') . qq|</th>
+          <td><input name=microfiche size=20></td>
+        </tr>
+       $toplevel
+        <tr>
+          <td></td>
+          <td colspan=3>
+            <input name=itemstatus class=radio type=radio value=active checked>&nbsp;|
+    . $locale->text('Active') . qq|
+           $onhand
+            <input name=itemstatus class=radio type=radio value=obsolete>&nbsp;|
+    . $locale->text('Obsolete') . qq|
+            <input name=itemstatus class=radio type=radio value=orphaned>&nbsp;|
+    . $locale->text('Orphaned') . qq|
+         </td>
+       </tr>
+       $bought
+        <tr>
+         <td></td>
+          <td colspan=3>
+           <hr size=1 noshade>
+         </td>
+       </tr>|;
+  print qq|
+  <tr>
+    <td colspan=4>
+      <table width=100%>
+        <tr>
+          <th class="listheading">| . $locale->text('Preisklasse') . qq|</th>
+          <th class="listheading">| . $locale->text('Preis') . qq|</th>
+          <th class="listheading">| . $locale->text('Prozentual/Absolut') . qq|</th>
+        </tr>
+        <tr>
+          <td>| . $locale->text('Sell Price') . qq|</td>
+          <td><input name="sellprice" size=11 value="$form->{"sellprice"}"></td>
+          <td><input name="sellprice_type" class=radio type=radio value=percent checked>/<input name="sellprice_type" class=radio type=radio value=absolut></td>
+        </tr>
+        <tr>
+          <td>| . $locale->text('List Price') . qq|</td>
+          <td><input name="listprice" size=11 value="$form->{"listprice"}"></td>
+          <td><input name="listprice_type" class=radio type=radio value=percent checked>/<input name="listprice_type" class=radio type=radio value=absolut></td>
+        </tr>
+|;
+  for my $i (1 .. $form->{price_rows}) {
+    print qq|
+        <tr>
+          <td width=50%><input type=hidden name="pricegroup_$i" size=30  value="$form->{"pricegroup_$i"}">$form->{"pricegroup_$i"}</td>
+          <td width=50%><input name="price_$i" size=11></td>
+          <input type=hidden name="pricegroup_id_$i" value="$form->{"pricegroup_id_$i"}">
+          <td><input name="pricegroup_type_$i" class=radio type=radio value=percent checked>/<input name="pricegroup_type_$i" class=radio type=radio value=absolut></td>
+        </tr>
+|;
+  }
+
+  print qq|
+      </table>
+    </td>
+  </tr>
+
+  <tr><td colspan=4><hr size=3 noshade></td></tr>
+</table>
+<input type=hidden name=nextsub value=confirm_price_update>
+<input type=hidden name=price_rows value=$form->{price_rows}>
+
+<input type=hidden name=login value=$form->{login}>
+<input type=hidden name=password value=$form->{password}>
+
+<br>
+<input class=submit type=submit name=action value="|
+    . $locale->text('Continue') . qq|">
+</form>
+
+</body>
+</html>
+|;
+  $lxdebug->leave_sub();
+}    #end search()
+
+sub confirm_price_update {
+  $lxdebug->enter_sub();
+
+
+  $form->{nextsub} = "update_prices";
+  $form->header;
+
+  print qq|
+<body>
+
+<form method=post action=$form->{script}>
+|;
+
+  # delete action variable
+  map { delete $form->{$_} } qw(action header);
+
+  foreach my $key (keys %$form) {
+    $form->{$key} =~ s/\"/&quot;/g;
+    print qq|<input type=hidden name=$key value="$form->{$key}">\n|;
+  }
+
+  print qq|
+<h2 class=confirm>| . $locale->text('Confirm!') . qq|</h2>
+
+<h4>|
+    . $locale->text('Are you sure you want to update the prices')
+. qq| </h4>
+
+<p>
+<input name=action class=submit type=submit value="|
+    . $locale->text('Continue') . qq|">
+</form>
+|;
+
+  $lxdebug->leave_sub();
+}
+
+sub update_prices {
+  $lxdebug->enter_sub();
+
+  if (IC->update_prices(\%myconfig, \%$form)) {
+    $form->redirect($form->{update_count} . $locale->text('prices updated!'));
+  } else {
+    $form->error($locale->text('Could not update prices!'));
+  }
+
+  $lxdebug->leave_sub();
+}
+
 sub choice {
   $lxdebug->enter_sub();
 
+  our ($j, $lastndx);
+  my ($totop100);
+
   $form->{title} = $locale->text('Top 100 hinzufuegen');
 
   $form->header;
@@ -411,10 +655,8 @@ sub choice {
   print qq|
       <table>
        <tr class=listheading>
-         <th class=listheading nowrap>|
-    . $locale->text('Part Number') . qq|</th>
-         <th class=listheading nowrap>|
-    . $locale->text('Part Description') . qq|</th>
+         <th class=listheading nowrap>| . $locale->text('Part Number') . qq|</th>
+         <th class=listheading nowrap>| . $locale->text('Part Description') . qq|</th>
         </tr>
         <tr valign=top>
          <td><input type=text name=partnumber size=20 value=></td>
@@ -425,7 +667,6 @@ sub choice {
 
   print qq|
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>
 
@@ -457,9 +698,10 @@ sub choice {
 
 <input name=extras type=hidden value=$form->{extras}>|;
 
+  my ($partnumber, $description, $unit, $sellprice, $soldtotal);
   # if choice set data
   if ($form->{ndx}) {
-    for ($i = 0; $i < $form->{ndxs_counter}; $i++) {
+    for (my $i = 0; $i < $form->{ndxs_counter}; $i++) {
 
       # prepeare data
       $partnumber  = $form->{"totop100_partnumber_$j"};
@@ -483,7 +725,7 @@ sub choice {
 
   # set data for next page
   if (($form->{ndxs_counter}) > 0) {
-    for ($i = 1; ($i < $form->{ndxs_counter} + 1); $i++) {
+    for (my $i = 1; ($i < $form->{ndxs_counter} + 1); $i++) {
       $partnumber  = $form->{"totop100_partnumber_$i"};
       $description = $form->{"totop100_description_$i"};
       $unit        = $form->{"totop100_unit_$i"};
@@ -515,20 +757,12 @@ sub choice {
 sub list {
   $lxdebug->enter_sub();
 
-  # get parts for
-  if (($form->{partnumber} eq "") and ($form->{description} eq "")) {
-    IC->get_parts(\%myconfig, \%$form, "");
-  } else {
-    if ((!($form->{partnumber} eq "")) and ($form->{description} eq "")) {
-      IC->get_parts(\%myconfig, \%$form, "partnumber");
-    } else {
-      if (($form->{partnumber} eq "") and (!($form->{description} eq ""))) {
-        IC->get_parts(\%myconfig, \%$form, "description");
-      } else {
-        IC->get_parts(\%myconfig, \%$form, "all");
-      }    #fi
-    }    #fi
-  }    #fi
+  our ($lastndx);
+  our ($partnumber, $description, $unit, $sellprice, $soldtotal);
+
+  my @sortorders = ("", "partnumber", "description", "all");
+  my $sortorder = $sortorders[($form->{description} ? 2 : 0) + ($form->{partnumber} ? 1 : 0)];
+  IC->get_parts(\%myconfig, \%$form, $sortorder);
 
   $form->{title} = $locale->text('Top 100 hinzufuegen');
 
@@ -583,7 +817,6 @@ sub list {
 <br>
 
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>
 
@@ -611,21 +844,16 @@ sub list {
 
 <input name=ndxs_counter type=hidden value=$form->{ndxs_counter}>|;
 
-  $totop100 = "";
+  my $totop100 = "";
 
   if (($form->{ndxs_counter}) > 0) {
     for ($i = 1; ($i < $form->{ndxs_counter} + 1); $i++) {
-      $j1 = $form->{"totop100_partnumber_$i"};
-      $j2 = $form->{"totop100_description_$i"};
-      $j3 = $form->{"totop100_unit_$i"};
-      $j4 = $form->{"totop100_sellprice_$i"};
-      $j5 = $form->{"totop100_soldtotal_$i"};
-
-      $partnumber  = $j1;
-      $description = $j2;
-      $unit        = $j3;
-      $sellprice   = $j4;
-      $soldtotal   = $j5;
+
+      $partnumber  = $form->{"totop100_partnumber_$i"};
+      $description = $form->{"totop100_description_$i"};
+      $unit        = $form->{"totop100_unit_$i"};
+      $sellprice   = $form->{"totop100_sellprice_$i"};
+      $soldtotal   = $form->{"totop100_soldtotal_$i"};
 
       $totop100 .= qq|
 <input type=hidden name=totop100_partnumber_$i value=$form->{"totop100_partnumber_$i"}>
@@ -658,18 +886,13 @@ sub top100 {
 
     if ($form->{ndxs_counter} > 0) {
 
-      $index = $form->{ndx};
-
-      $j1 = $form->{"new_partnumber_$index"};
-      $form->{"totop100_partnumber_$form->{ndxs_counter}"} = $j1;
-      $j2 = $form->{"new_description_$index"};
-      $form->{"totop100_description_$form->{ndxs_counter}"} = $j2;
-      $j3 = $form->{"new_unit_$index"};
-      $form->{"totop100_unit_$form->{ndxs_counter}"} = $j3;
-      $j4 = $form->{"new_sellprice_$index"};
-      $form->{"totop100_sellprice_$form->{ndxs_counter}"} = $j4;
-      $j5 = $form->{"new_soldtotal_$index"};
-      $form->{"totop100_soldtotal_$form->{ndxs_counter}"} = $j5;
+      my $index = $form->{ndx};
+
+      $form->{"totop100_partnumber_$form->{ndxs_counter}"} = $form->{"new_partnumber_$index"};
+      $form->{"totop100_description_$form->{ndxs_counter}"} = $form->{"new_description_$index"};
+      $form->{"totop100_unit_$form->{ndxs_counter}"} = $form->{"new_unit_$index"};
+      $form->{"totop100_sellprice_$form->{ndxs_counter}"} = $form->{"new_sellprice_$index"};
+      $form->{"totop100_soldtotal_$form->{ndxs_counter}"} = $form->{"new_soldtotal_$index"};
     }    #fi
   }    #fi
   &addtop100();
@@ -679,18 +902,22 @@ sub top100 {
 sub addtop100 {
   $lxdebug->enter_sub();
 
+  my ($revers, $lastsort, $callback, $option, $description, $sameitem,
+      $partnumber, $unit, $sellprice, $soldtotal, $totop100, $onhand, $align);
+  my (@column_index, %column_header, %column_data);
+  my ($totalsellprice, $totallastcost, $totallistprice, $subtotalonhand, $subtotalsellprice, $subtotallastcost, $subtotallistprice);
+
   $form->{top100}      = "top100";
   $form->{l_soldtotal} = "Y";
   $form->{soldtotal}   = "soldtotal";
   $form->{sort}        = "soldtotal";
   $form->{l_qty}       = "N";
-  $callback .= "&form->{top100}=$form->{top100}";
   $form->{l_linetotal} = "";
   $form->{revers}      = 1;
   $form->{number}      = "position";
   $form->{l_number}    = "Y";
 
-  my $totop100 = "";
+  $totop100 = "";
 
   $form->{title} = $locale->text('Top 100');
 
@@ -704,7 +931,7 @@ sub addtop100 {
   }    #fi
 
   $callback =
-    "$form->{script}?action=top100&path=$form->{path}&login=$form->{login}&password=$form->{password}&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title="
+    "$form->{script}?action=top100&login=$form->{login}&password=$form->{password}&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title="
     . $form->escape($form->{title}, 1);
 
   # if we have a serialnumber limit search
@@ -797,6 +1024,10 @@ sub addtop100 {
     $callback .= "&partnumber=$form->{partnumber}";
     $option   .= $locale->text('Part Number') . qq| : $form->{partnumber}<br>|;
   }
+  if ($form->{ean}) {
+    $callback .= "&partnumber=$form->{ean}";
+    $option   .= $locale->text('EAN') . qq| : $form->{ean}<br>|;
+  }
   if ($form->{partsgroup}) {
     $callback .= "&partsgroup=$form->{partsgroup}";
     $option   .= $locale->text('Group') . qq| : $form->{partsgroup}<br>|;
@@ -835,8 +1066,8 @@ sub addtop100 {
     $option   .= $locale->text('soldtotal') . qq| : $form->{soldtotal}<br>|;
   }
 
-  @columns = $form->sort_columns(
-    qw(number partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal)
+  my @columns = $form->sort_columns(
+    qw(number partnumber ean description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal)
   );
 
   if ($form->{l_linetotal}) {
@@ -866,7 +1097,7 @@ sub addtop100 {
         || $form->{rfq}
         || $form->{quoted}) {
       $form->{l_onhand} = "Y";
-        } else {
+    } else {
       $form->{l_linetotalsellprice} = "";
       $form->{l_linetotallastcost}  = "";
     }
@@ -875,7 +1106,7 @@ sub addtop100 {
   $form->{l_lastcost} = ""
     if ($form->{searchitems} eq 'assembly' && !$form->{bom});
 
-  foreach $item (@columns) {
+  foreach my $item (@columns) {
     if ($form->{"l_$item"} eq "Y") {
       push @column_index, $item;
 
@@ -977,7 +1208,7 @@ sub addtop100 {
     . qq|</a></th>|;
 
   $form->header;
-  $colspan = $#column_index + 1;
+  my $colspan = $#column_index + 1;
 
   print qq|
 <body>
@@ -1011,14 +1242,14 @@ sub addtop100 {
 
   # insert numbers for top100
   my $j = 0;
-  foreach $ref (@{ $form->{parts} }) {
+  foreach my $ref (@{ $form->{parts} }) {
     $j++;
     $ref->{number} = $j;
   }
 
   # if avaible -> insert choice here
   if (($form->{ndxs_counter}) > 0) {
-    for ($i = 1; ($i < $form->{ndxs_counter} + 1); $i++) {
+    for (my $i = 1; ($i < $form->{ndxs_counter} + 1); $i++) {
       $partnumber  = $form->{"totop100_partnumber_$i"};
       $description = $form->{"totop100_description_$i"};
       $unit        = $form->{"totop100_unit_$i"};
@@ -1044,7 +1275,8 @@ sub addtop100 {
     }    #rof
   }    #fi
        # build data for columns
-  foreach $ref (@{ $form->{parts} }) {
+  foreach my $ref (@{ $form->{parts} }) {
+    my $i = 0;
 
     if ($form->{l_subtotal} eq 'Y' && !$ref->{assemblyitem}) {
       if ($sameitem ne $ref->{ $form->{sort} }) {
@@ -1072,7 +1304,7 @@ sub addtop100 {
 
     $column_data{number} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{number}, '', "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{number})
       . "</td>";
     $column_data{partnumber} =
       "<td align=$align>$ref->{partnumber}&nbsp;</a></td>";
@@ -1081,32 +1313,29 @@ sub addtop100 {
 
     $column_data{onhand} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand}, '', "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand})
       . "</td>";
     $column_data{sellprice} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{sellprice}, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{sellprice})
       . "</td>";
     $column_data{listprice} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{listprice}, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{listprice})
       . "</td>";
     $column_data{lastcost} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{lastcost}, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{lastcost})
       . "</td>";
 
     $column_data{linetotalsellprice} = "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice},
-                             2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice}, 2)
       . "</td>";
     $column_data{linetotallastcost} = "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{lastcost},
-                             2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{lastcost}, 2)
       . "</td>";
     $column_data{linetotallistprice} = "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice},
-                             2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice}, 2)
       . "</td>";
 
     if (!$ref->{assemblyitem}) {
@@ -1122,10 +1351,10 @@ sub addtop100 {
 
     $column_data{rop} =
       "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{rop}, '', "&nbsp;") . "</td>";
+      . $form->format_amount(\%myconfig, $ref->{rop}) . "</td>";
     $column_data{weight} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{weight}, '', "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{weight})
       . "</td>";
     $column_data{unit}        = "<td>$ref->{unit}&nbsp;</td>";
     $column_data{bin}         = "<td>$ref->{bin}&nbsp;</td>";
@@ -1133,15 +1362,15 @@ sub addtop100 {
 
     $column_data{invnumber} =
       ($ref->{module} ne 'oe')
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}</a></td>"
       : "<td>$ref->{invnumber}</td>";
     $column_data{ordnumber} =
       ($ref->{module} eq 'oe')
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{ordnumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{ordnumber}</a></td>"
       : "<td>$ref->{ordnumber}</td>";
     $column_data{quonumber} =
       ($ref->{module} eq 'oe' && !$ref->{ordnumber})
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}</a></td>"
       : "<td>$ref->{quonumber}</td>";
 
     $column_data{name} = "<td>$ref->{name}</td>";
@@ -1182,15 +1411,15 @@ sub addtop100 {
     map { $column_data{$_} = "<td>&nbsp;</td>" } @column_index;
     $column_data{linetotalsellprice} =
         "<th class=listtotal align=right>"
-      . $form->format_amount(\%myconfig, $totalsellprice, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $totalsellprice, 2)
       . "</th>";
     $column_data{linetotallastcost} =
         "<th class=listtotal align=right>"
-      . $form->format_amount(\%myconfig, $totallastcost, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $totallastcost, 2)
       . "</th>";
     $column_data{linetotallistprice} =
         "<th class=listtotal align=right>"
-      . $form->format_amount(\%myconfig, $totallistprice, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $totallistprice, 2)
       . "</th>";
 
     print "<tr class=listtotal>";
@@ -1213,7 +1442,6 @@ sub addtop100 {
 
 <form method=post action=$form->{script}>
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>
 
@@ -1240,14 +1468,8 @@ sub addtop100 {
     <input type=hidden name=ndxs_counter value="$form->{ndxs_counter}">
 
     <input class=submit type=submit name=action value="|
-    . $locale->text('choice') . qq|">|;
-
-  if ($form->{menubar}) {
-    require "$form->{path}/menu.pl";
-    &menubar;
-  }
+    . $locale->text('choice') . qq|">
 
-  print qq|
   </form>
 
 </body>
@@ -1257,168 +1479,155 @@ sub addtop100 {
   $lxdebug->leave_sub();
 }    # end addtop100
 
+#
+# Report for Wares.
+# Warning, deep magic ahead.
+# This function parses the requested details, sanity checks them, and converts them into a format thats usable for IC->all_parts
+#
+# flags coming from the form:
+# hardcoded:
+#  searchitems=part revers=0 lastsort=''
+#
+# filter:
+# partnumber ean description partsgroup serialnumber make model drawing microfiche
+# transdatefrom transdateto
+#
+# radio:
+#  itemstatus = active | onhand | short | obsolete | orphaned
+#  action     = continue | top100
+#
+# checkboxes:
+#  bought sold onorder ordered rfq quoted
+#  l_partnumber l_description l_serialnumber l_unit l_listprice l_sellprice l_lastcost
+#  l_linetotal l_priceupdate l_bin l_rop l_weight l_image l_drawing l_microfiche
+#  l_partsgroup l_subtotal l_soldtotal l_deliverydate
+#
+# hiddens: 
+#  nextsub login password revers lastsort sort ndxs_counter
+#
 sub generate_report {
-  $lxdebug->enter_sub();
-
-  $revers   = $form->{revers};
-  $lastsort = $form->{lastsort};
-
-  if (($form->{lastsort} eq "") && ($form->{sort} eq undef)) {
-    $form->{revers}   = 0;
-    $form->{lastsort} = "partnumber";
-    $form->{sort}     = "partnumber";
-  } else {
-
-    # switch between backward sorting of tables
-    if ($form->{lastsort} eq $form->{sort}) {
-      if ($form->{revers} == 0) {
-        $form->{revers} = 1;
-      } else {
-        $form->{revers} = 0;
-      }    #fi
-    } else {
-      $form->{revers} == 0;
-      $form->{lastsort} = $form->{sort};
-    }    #fi
-  }    #fi
-
-  $callback =
-    "$form->{script}?action=generate_report&path=$form->{path}&login=$form->{login}&password=$form->{password}&searchitems=$form->{searchitems}&itemstatus=$form->{itemstatus}&bom=$form->{bom}&l_linetotal=$form->{l_linetotal}&title="
-    . $form->escape($form->{title}, 1);
-
-  # if we have a serialnumber limit search
-  if ($form->{serialnumber} || $form->{l_serialnumber}) {
-    $form->{l_serialnumber} = "Y";
-    unless (   $form->{bought}
-            || $form->{sold}
-            || $form->{rfq}
-            || $form->{quoted}) {
-      $form->{bought} = $form->{sold} = 1;
-    }
-  }
-
-  IC->all_parts(\%myconfig, \%$form);
-
-  if ($form->{itemstatus} eq 'active') {
-    $option .= $locale->text('Active') . " : ";
-  }
-  if ($form->{itemstatus} eq 'obsolete') {
-    $option .= $locale->text('Obsolete') . " : ";
-  }
-  if ($form->{itemstatus} eq 'orphaned') {
-    $option .= $locale->text('Orphaned') . " : ";
-  }
-  if ($form->{itemstatus} eq 'onhand') {
-    $option .= $locale->text('On Hand') . " : ";
-    $form->{l_onhand} = "Y";
-  }
-  if ($form->{itemstatus} eq 'short') {
-    $option .= $locale->text('Short') . " : ";
-    $form->{l_onhand} = "Y";
-  }
-  if ($form->{onorder}) {
-    $form->{l_ordnumber} = "Y";
-    $callback .= "&onorder=$form->{onorder}";
-    $option   .= $locale->text('On Order') . " : ";
-  }
-  if ($form->{ordered}) {
-    $form->{l_ordnumber} = "Y";
-    $callback .= "&ordered=$form->{ordered}";
-    $option   .= $locale->text('Ordered') . " : ";
-  }
-  if ($form->{rfq}) {
-    $form->{l_quonumber} = "Y";
-    $callback .= "&rfq=$form->{rfq}";
-    $option   .= $locale->text('RFQ') . " : ";
-  }
-  if ($form->{quoted}) {
-    $form->{l_quonumber} = "Y";
-    $callback .= "&quoted=$form->{quoted}";
-    $option   .= $locale->text('Quoted') . " : ";
-  }
-  if ($form->{bought}) {
-    $form->{l_invnumber} = "Y";
-    $callback .= "&bought=$form->{bought}";
-    $option   .= $locale->text('Bought') . " : ";
-  }
-  if ($form->{sold}) {
-    $form->{l_invnumber} = "Y";
-    $callback .= "&sold=$form->{sold}";
-    $option   .= $locale->text('Sold') . " : ";
-  }
-  if (   $form->{bought}
-      || $form->{sold}
-      || $form->{onorder}
-      || $form->{ordered}
-      || $form->{rfq}
-      || $form->{quoted}) {
-
-    $form->{l_lastcost} = "";
-    $form->{l_name}     = "Y";
-    if ($form->{transdatefrom}) {
-      $callback .= "&transdatefrom=$form->{transdatefrom}";
-      $option   .= "\n<br>"
-        . $locale->text('From')
-        . "&nbsp;"
-        . $locale->date(\%myconfig, $form->{transdatefrom}, 1);
-    }
-    if ($form->{transdateto}) {
-      $callback .= "&transdateto=$form->{transdateto}";
-      $option   .= "\n<br>"
-        . $locale->text('To')
-        . "&nbsp;"
-        . $locale->date(\%myconfig, $form->{transdateto}, 1);
-    }
-  }
-
-  $option .= "<br>";
-
-  if ($form->{partnumber}) {
-    $callback .= "&partnumber=$form->{partnumber}";
-    $option   .= $locale->text('Part Number') . qq| : $form->{partnumber}<br>|;
-  }
-  if ($form->{partsgroup}) {
-    $callback .= "&partsgroup=$form->{partsgroup}";
-    $option   .= $locale->text('Group') . qq| : $form->{partsgroup}<br>|;
-  }
-  if ($form->{serialnumber}) {
-    $callback .= "&serialnumber=$form->{serialnumber}";
-    $option   .=
-      $locale->text('Serial Number') . qq| : $form->{serialnumber}<br>|;
-  }
-  if ($form->{description}) {
-    $callback .= "&description=$form->{description}";
-    $description = $form->{description};
-    $description =~ s/
-/<br>/g;
-    $option .=
-      $locale->text('Part Description') . qq| : $form->{description}<br>|;
-  }
-  if ($form->{make}) {
-    $callback .= "&make=$form->{make}";
-    $option   .= $locale->text('Make') . qq| : $form->{make}<br>|;
-  }
-  if ($form->{model}) {
-    $callback .= "&model=$form->{model}";
-    $option   .= $locale->text('Model') . qq| : $form->{model}<br>|;
+  $lxdebug->enter_sub();
+
+  my ($revers, $lastsort, $description);
+  my (@column_index, %column_header, %column_data, @columns, @options, @callbacks);
+  my ($totalsellprice, $totallastcost, $totallistprice, $subtotalonhand, $subtotalsellprice, $subtotallastcost, $subtotallistprice);
+  my ($colspan, $sameitem, $onhand, $align);
+
+  $revers   = $form->{revers};
+  $lastsort = $form->{lastsort};
+
+  # sorting and direction of sorting
+  # ToDO: change this to the simpler field+direction method
+  if (($form->{lastsort} eq "") && ($form->{sort} eq undef)) {
+    $form->{revers}   = 0;
+    $form->{lastsort} = "partnumber";
+    $form->{sort}     = "partnumber";
+  } else {
+    if ($form->{lastsort} eq $form->{sort}) {
+      $form->{revers} = 1 - $form->{revers};
+    } else {
+      $form->{revers} = 0;
+      $form->{lastsort} = $form->{sort};
+    }    #fi
+  }    #fi
+
+  # special case if we have a serialnumber limit search
+  # serialnumbers are only given in invoices and orders, 
+  # so they can only pop up in bought, sold, rfq, and quoted stuff
+  $form->{no_sn_joins} = 'Y' if (   !$form->{bought} && !$form->{sold} 
+                                 && !$form->{rfq}    && !$form->{quoted} 
+                                 && ($form->{l_serialnumber} || $form->{serialnumber}));
+
+  # special case for any checkbox of bought | sold | onorder | ordered | rfq | quoted.
+  # if any of these are ticked the behavior changes slightly for lastcost
+  # since all those are aggregation checks for the legder tables this is an internal switch
+  # refered to as ledgerchecks
+  $form->{ledgerchecks} = 'Y' if (   $form->{bought} || $form->{sold} || $form->{onorder}
+                                  || $form->{ordered} || $form->{rfq} || $form->{quoted});
+
+  # if something should be aktivated if something else is active, enter it here
+  my %dependencies = (
+    onhand       => [ qw(l_onhand) ],
+    short        => [ qw(l_onhand) ],
+    onorder      => [ qw(l_ordnumber) ],
+    ordered      => [ qw(l_ordnumber) ],
+    rfq          => [ qw(l_quonumber) ],
+    quoted       => [ qw(l_quonumber) ],
+    bought       => [ qw(l_invnumber) ],
+    sold         => [ qw(l_invnumber) ],
+    ledgerchecks => [ qw(l_name) ],
+    serialnumber => [ qw(l_serialnumber) ],
+    no_sn_joins  => [ qw(bought sold) ],
+  );
+
+  # these strings get displayed at the top of the results to indicate the user which switches were used
+  my %optiontexts = (
+    active        => $locale->text('Active'),
+    obsolete      => $locale->text('Obsolete'),
+    orphaned      => $locale->text('Orphaned'),
+    onhand        => $locale->text('On Hand'),
+    short         => $locale->text('Short'),
+    onorder       => $locale->text('On Order'),
+    ordered       => $locale->text('Ordered'),
+    rfq           => $locale->text('RFQ'),
+    quoted        => $locale->text('Quoted'),
+    bought        => $locale->text('Bought'),
+    sold          => $locale->text('Sold'),
+    transdatefrom => $locale->text('From')       . " " . $locale->date(\%myconfig, $form->{transdatefrom}, 1),
+    transdateto   => $locale->text('To (time)')  . " " . $locale->date(\%myconfig, $form->{transdateto}, 1),
+    partnumber    => $locale->text('Part Number')      . ": '$form->{partnumber}'",
+    partsgroup    => $locale->text('Group')            . ": '$form->{partsgroup}'",
+    serialnumber  => $locale->text('Serial Number')    . ": '$form->{serialnumber}'",
+    description   => $locale->text('Part Description') . ": '$form->{description}'",
+    make          => $locale->text('Make')             . ": '$form->{make}'",
+    model         => $locale->text('Model')            . ": '$form->{model}'",
+    drawing       => $locale->text('Drawing')          . ": '$form->{drawing}'",
+    microfiche    => $locale->text('Microfiche')       . ": '$form->{microfiche}'",
+    l_soldtotal   => $locale->text('soldtotal'),
+  );
+
+  # this local subfunction generates a callback token from the input key.
+  # easy to join into a callback later
+  sub callback_token { 
+    map { /\w+$/; return "&$&=$form->{$&}" } @_;
   }
-  if ($form->{drawing}) {
-    $callback .= "&drawing=$form->{drawing}";
-    $option   .= $locale->text('Drawing') . qq| : $form->{drawing}<br>|;
+
+  my @itemstatus_keys = qw(active obsolete orphaned onhand short);
+  my @callback_keys   = qw(onorder ordered rfq quoted bought sold partnumber partsgroup serialnumber description make model 
+                           drawing microfiche l_soldtotal l_deliverydate transdatefrom transdateto);
+  my $callback           = "$form->{script}?action=generate_report";
+  map { $callback .= "&$_=" . $form->escape($form->{$_}) } qw(login password searchitems itemstatus bom l_linetotal title);
+    
+  # calculate dependencies
+  for (@itemstatus_keys, @callback_keys) { 
+    next if ($form->{itemstatus} ne $_ && !$form->{$_});
+    map { $form->{$_} = 'Y' } @{ $dependencies{$_} } if $dependencies{$_};
   }
-  if ($form->{microfiche}) {
-    $callback .= "&microfiche=$form->{microfiche}";
-    $option   .= $locale->text('Microfiche') . qq| : $form->{microfiche}<br>|;
+
+  # generate callback and optionstrings
+  for my  $key (@itemstatus_keys, @callback_keys) { 
+    next if ($form->{itemstatus} ne $key && !$form->{$key});
+    push @options, $optiontexts{$key};
+    push @callbacks, callback_token($key) if grep { $_ eq $key } @callback_keys;;
   }
+  my $option    = $locale->text('Options') . ': ' . join(', ', grep $_, @options) . '<br>';
+  $callback .= join '', grep $_, @callbacks;
 
-  # table soldtotal aktive
-  if ($form->{l_soldtotal}) {
-    $callback .= "&soldtotal=$form->{soldtotal}";
-    $option   .= $locale->text('soldtotal') . qq| : $form->{soldtotal}<br>|;
+  $lxdebug->message(0, $callback);
+
+  IC->all_parts(\%myconfig, \%$form);
+
+  # special case for lastcost
+  $form->{l_lastcost} = "" if $form->{ledgerchecks};
+
+  if ($form->{description}) {
+    $description = $form->{description};
+    $description =~ s/\n/<br>/g;
   }
 
   @columns = $form->sort_columns(
-    qw(partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal)
+    qw(partnumber description partsgroup bin onhand rop unit listprice linetotallistprice sellprice linetotalsellprice 
+       lastcost linetotallastcost priceupdate weight image drawing microfiche invnumber ordnumber quonumber name serialnumber soldtotal deliverydate)
   );
 
   if ($form->{l_linetotal}) {
@@ -1448,7 +1657,7 @@ sub generate_report {
         || $form->{rfq}
         || $form->{quoted}) {
       $form->{l_onhand} = "Y";
-        } else {
+    } else {
       $form->{l_linetotalsellprice} = "";
       $form->{l_linetotallastcost}  = "";
     }
@@ -1457,7 +1666,7 @@ sub generate_report {
   $form->{l_lastcost} = ""
     if ($form->{searchitems} eq 'assembly' && !$form->{bom});
 
-  foreach $item (@columns) {
+  foreach my $item (@columns) {
     if ($form->{"l_$item"} eq "Y") {
       push @column_index, $item;
 
@@ -1555,6 +1764,11 @@ sub generate_report {
     . $locale->text('soldtotal')
     . qq|</a></th>|;
 
+  $column_header{deliverydate} =
+    qq|<th nowrap><a class=listheading href=$callback&sort=deliverydate&revers=$form->{revers}&lastsort=$form->{lastsort}>|
+    . $locale->text('deliverydate')
+    . qq|</a></th>|;
+
   $form->header;
   $colspan = $#column_index + 1;
 
@@ -1588,7 +1802,8 @@ sub generate_report {
     $sameitem = $form->{parts}->[0]->{ $form->{sort} };
   }
 
-  foreach $ref (@{ $form->{parts} }) {
+  foreach my $ref (@{ $form->{parts} }) {
+    my $i = 0;
 
     if ($form->{l_subtotal} eq 'Y' && !$ref->{assemblyitem}) {
       if ($sameitem ne $ref->{ $form->{sort} }) {
@@ -1615,38 +1830,35 @@ sub generate_report {
 /<br>/g;
 
     $column_data{partnumber} =
-      "<td align=$align><a href=$form->{script}?action=edit&id=$ref->{id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{partnumber}&nbsp;</a></td>";
-    $column_data{description} = "<td>$ref->{description}&nbsp;</td>";
+      "<td align=$align><a href=$form->{script}?action=edit&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{partnumber}&nbsp;</a></td>";
+    $column_data{description} = "<td><a href=$form->{script}?action=edit&id=$ref->{id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{description}&nbsp;</a></td>";
     $column_data{partsgroup}  = "<td>$ref->{partsgroup}&nbsp;</td>";
 
     $column_data{onhand} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand}, '', "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand})
       . "</td>";
     $column_data{sellprice} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{sellprice}, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{sellprice}, -2)
       . "</td>";
     $column_data{listprice} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{listprice}, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{listprice}, -2)
       . "</td>";
     $column_data{lastcost} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{lastcost}, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{lastcost}, -2)
       . "</td>";
 
     $column_data{linetotalsellprice} = "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice},
-                             2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{sellprice}, 2)
       . "</td>";
     $column_data{linetotallastcost} = "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{lastcost},
-                             2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{lastcost}, 2)
       . "</td>";
     $column_data{linetotallistprice} = "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice},
-                             2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{onhand} * $ref->{listprice}, 2)
       . "</td>";
 
     if (!$ref->{assemblyitem}) {
@@ -1662,10 +1874,10 @@ sub generate_report {
 
     $column_data{rop} =
       "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{rop}, '', "&nbsp;") . "</td>";
+      . $form->format_amount(\%myconfig, $ref->{rop}) . "</td>";
     $column_data{weight} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{weight}, '', "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{weight})
       . "</td>";
     $column_data{unit}        = "<td>$ref->{unit}&nbsp;</td>";
     $column_data{bin}         = "<td>$ref->{bin}&nbsp;</td>";
@@ -1673,15 +1885,15 @@ sub generate_report {
 
     $column_data{invnumber} =
       ($ref->{module} ne 'oe')
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=invoice&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{invnumber}</a></td>"
       : "<td>$ref->{invnumber}</td>";
     $column_data{ordnumber} =
       ($ref->{module} eq 'oe')
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{ordnumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{ordnumber}</a></td>"
       : "<td>$ref->{ordnumber}</td>";
     $column_data{quonumber} =
       ($ref->{module} eq 'oe' && !$ref->{ordnumber})
-      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}</a></td>"
+      ? "<td><a href=$ref->{module}.pl?action=edit&type=$ref->{type}&id=$ref->{trans_id}&login=$form->{login}&password=$form->{password}&callback=$callback>$ref->{quonumber}</a></td>"
       : "<td>$ref->{quonumber}</td>";
 
     $column_data{name} = "<td>$ref->{name}</td>";
@@ -1703,9 +1915,11 @@ sub generate_report {
 
     $column_data{soldtotal} =
         "<td align=right>"
-      . $form->format_amount(\%myconfig, $ref->{soldtotal}, '', "&nbsp;")
+      . $form->format_amount(\%myconfig, $ref->{soldtotal})
       . "</td>";
 
+    $column_data{deliverydate} = "<td>$ref->{deliverydate}</td>";
+
     $i++;
     $i %= 2;
     print "<tr class=listrow$i>";
@@ -1726,15 +1940,15 @@ sub generate_report {
     map { $column_data{$_} = "<td>&nbsp;</td>" } @column_index;
     $column_data{linetotalsellprice} =
         "<th class=listtotal align=right>"
-      . $form->format_amount(\%myconfig, $totalsellprice, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $totalsellprice, 2)
       . "</th>";
     $column_data{linetotallastcost} =
         "<th class=listtotal align=right>"
-      . $form->format_amount(\%myconfig, $totallastcost, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $totallastcost, 2)
       . "</th>";
     $column_data{linetotallistprice} =
         "<th class=listtotal align=right>"
-      . $form->format_amount(\%myconfig, $totallistprice, 2, "&nbsp;")
+      . $form->format_amount(\%myconfig, $totallistprice, 2)
       . "</th>";
 
     print "<tr class=listtotal>";
@@ -1761,20 +1975,13 @@ sub generate_report {
 
 <input type=hidden name=item value=$form->{searchitems}>
 
-<input type=hidden name=path value=$form->{path}>
 <input type=hidden name=login value=$form->{login}>
 <input type=hidden name=password value=$form->{password}>|;
 
   print qq|
   <input class=submit type=submit name=action value="|
-    . $locale->text('Add') . qq|">|;
+    . $locale->text('Add') . qq|">
 
-  if ($form->{menubar}) {
-    require "$form->{path}/menu.pl";
-    &menubar;
-  }
-
-  print qq|
   </form>
 
 </body>
@@ -1786,26 +1993,30 @@ sub generate_report {
 
 sub parts_subtotal {
   $lxdebug->enter_sub();
+  
+  # imports
+  our (%column_data, @column_index);
+  our ($subtotalonhand, $totalsellprice, $totallastcost, $totallistprice, $subtotalsellprice, $subtotallastcost, $subtotallistprice);
 
   map { $column_data{$_} = "<td>&nbsp;</td>" } @column_index;
   $subtotalonhand = 0 if ($form->{searchitems} eq 'assembly' && $form->{bom});
 
   $column_data{onhand} =
       "<th class=listsubtotal align=right>"
-    . $form->format_amount(\%myconfig, $subtotalonhand, '', "&nbsp;")
+    . $form->format_amount(\%myconfig, $subtotalonhand)
     . "</th>";
 
   $column_data{linetotalsellprice} =
       "<th class=listsubtotal align=right>"
-    . $form->format_amount(\%myconfig, $subtotalsellprice, 2, "&nbsp;")
+    . $form->format_amount(\%myconfig, $subtotalsellprice, 2)
     . "</th>";
   $column_data{linetotallistprice} =
       "<th class=listsubtotal align=right>"
-    . $form->format_amount(\%myconfig, $subtotallistprice, 2, "&nbsp;")
+    . $form->format_amount(\%myconfig, $subtotallistprice, 2)
     . "</th>";
   $column_data{linetotallastcost} =
       "<th class=listsubtotal align=right>"
-    . $form->format_amount(\%myconfig, $subtotallastcost, 2, "&nbsp;")
+    . $form->format_amount(\%myconfig, $subtotallastcost, 2)
     . "</th>";
 
   $subtotalonhand    = 0;
@@ -1826,9 +2037,13 @@ sub parts_subtotal {
 
 sub edit {
   $lxdebug->enter_sub();
-
+  # show history button
+  $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
+  #/show hhistory button
   IC->get_part(\%myconfig, \%$form);
 
+  $form->{"original_partnumber"} = $form->{"partnumber"};
+
   $form->{title} = $locale->text('Edit ' . ucfirst $form->{item});
 
   &link_part;
@@ -1843,19 +2058,19 @@ sub link_part {
   IC->create_links("IC", \%myconfig, \%$form);
 
   # currencies
-  map { $form->{selectcurrency} .= "<option>$_\n" } split /:/,
-    $form->{currencies};
+  map({ $form->{selectcurrency} .= "<option>$_\n" }
+      split(/:/, $form->{currencies}));
 
   # parts and assemblies have the same links
-  $item = $form->{item};
+  my $item = $form->{item};
   if ($form->{item} eq 'assembly') {
     $item = 'part';
   }
 
   # build the popup menus
   $form->{taxaccounts} = "";
-  foreach $key (keys %{ $form->{IC_links} }) {
-    foreach $ref (@{ $form->{IC_links}{$key} }) {
+  foreach my $key (keys %{ $form->{IC_links} }) {
+    foreach my $ref (@{ $form->{IC_links}{$key} }) {
 
       # if this is a tax field
       if ($key =~ /IC_tax/) {
@@ -1909,7 +2124,7 @@ sub link_part {
 
   if ($form->{item} eq 'assembly') {
 
-    foreach $i (1 .. $form->{assembly_rows}) {
+    foreach my $i (1 .. $form->{assembly_rows}) {
       if ($form->{"partsgroup_id_$i"}) {
         $form->{"partsgroup_$i"} =
           qq|$form->{"partsgroup_$i"}--$form->{"partsgroup_id_$i"}|;
@@ -1932,45 +2147,37 @@ sub link_part {
 sub form_header {
   $lxdebug->enter_sub();
 
-  my $dec = '';
-  
-  #decimalplaces for listprice
-  ($dec) = ($form->{listprice} =~ /\.(\d+)/);
-  $dec = length $dec;
-  my $decimalplaces = ($dec > 2) ? $dec : 2;
-  $form->{listprice} =
-    $form->format_amount(\%myconfig, $form->{listprice}, $decimalplaces);
-
-  #decimalplaces for sellprice and gv
-  ($dec) = ($form->{sellprice} =~ /\.(\d+)/);
-  $dec = length $dec;
-  my $decimalplaces = ($dec > 2) ? $dec : 2;
-
-  map {
-    $form->{$_} =
-      $form->format_amount(\%myconfig, $form->{$_}, $decimalplaces)
-  } qw(sellprice gv);
-
-  ($dec) = ($form->{lastcost} =~ /\.(\d+)/);
-  $dec = length $dec;
-  my $decimalplaces = ($dec > 2) ? $dec : 2;
-
-  $form->{lastcost} =
-    $form->format_amount(\%myconfig, $form->{lastcost}, $decimalplaces);
+  my ($payment, $rows, $notes, $description, $ean, $buchungsgruppe, $partsgroup, $group, $tax, $lastcost, $eur, $linkaccounts, $weight, $n, $rop, $bin, $vegv);
+  my ($notdiscountableok, $notdiscountable);
+  my ($formel, $imagelinks, $obsolete, $shopok, $shop);
+
+
+  map({ $form->{$_} = $form->format_amount(\%myconfig, $form->{$_}, -2) }
+      qw(sellprice listprice lastcost gv));
 
   map { $form->{$_} = $form->format_amount(\%myconfig, $form->{$_}) }
     qw(weight rop stock);
 
-  foreach $item (qw(partnumber description unit notes)) {
+  foreach my $item (qw(partnumber description unit notes)) {
     $form->{$item} =~ s/\"/&quot;/g;
   }
 
+  $payment = qq|<option value=""></option>|;
+  foreach my $item (@{ $form->{payment_terms} }) {
+    if ($form->{payment_id} eq $item->{id}) {
+      $payment .= qq|<option value="$item->{id}" selected>$item->{description}</option>|;
+    } else {
+      $payment .= qq|<option value="$item->{id}">$item->{description}</option>|;
+    }
+  }
+
+
   if (($rows = $form->numtextrows($form->{notes}, 40)) < 2) {
-    $rows = 2;
+    $rows = 4;
   }
 
   $notes =
-    qq|<textarea name=notes rows=$rows cols=40 wrap=soft>$form->{notes}</textarea>|;
+    qq|<textarea name=notes rows=$rows cols=45 wrap=soft>$form->{notes}</textarea>|;
   if (($rows = $form->numtextrows($form->{description}, 40)) > 1) {
     $description =
       qq|<textarea name="description" rows=$rows cols=40 wrap=soft>$form->{description}</textarea>|;
@@ -1979,12 +2186,35 @@ sub form_header {
       qq|<input name=description size=40 value="$form->{description}">|;
   }
 
-  foreach $item (split / /, $form->{taxaccounts}) {
+  $ean =  qq|<input name=ean size=40 value="$form->{ean}">|;
+
+  foreach my $item (split / /, $form->{taxaccounts}) {
     $form->{"IC_tax_$item"} = ($form->{"IC_tax_$item"}) ? "checked" : "";
   }
 
+  IC->retrieve_buchungsgruppen(\%myconfig, $form);
+  if (@{ $form->{BUCHUNGSGRUPPEN} }) {
+    foreach my $item (@{ $form->{BUCHUNGSGRUPPEN} }) {
+      if ($item->{id} == $form->{buchungsgruppen_id}) {
+        $form->{selectbuchungsgruppe} .=
+          "<option value=$item->{id} selected>$item->{description}\n";
+      } elsif (($form->{id} && $form->{orphaned}) || (!$form->{id})) {
+        $form->{selectbuchungsgruppe} .=
+          "<option value=$item->{id}>$item->{description}\n";
+      }
+
+    }
+  }
+
+  $buchungsgruppe = qq|
+             <tr>
+               <th align=right>| . $locale->text('Buchungsgruppe') . qq|</th>
+               <td><select name=buchungsgruppen_id>$form->{selectbuchungsgruppe}</select></td>
+             </tr>|;
+
+
   # set option
-  foreach $item (qw(IC IC_income IC_expense)) {
+  foreach my $item (qw(IC IC_income IC_expense)) {
     if ($form->{$item}) {
       if ($form->{id} && $form->{orphaned}) {
         $form->{"select$item"} =~ s/ selected//;
@@ -2010,7 +2240,7 @@ sub form_header {
   }
 
   # tax fields
-  foreach $item (split / /, $form->{taxaccounts}) {
+  foreach my $item (split / /, $form->{taxaccounts}) {
     $tax .= qq|
       <input class=checkbox type=checkbox name="IC_tax_$item" value=1 $form->{"IC_tax_$item"}>&nbsp;<b>$form->{"IC_tax_${item}_description"}</b>
       <br><input type=hidden name=IC_tax_${item}_description value="$form->{"IC_tax_${item}_description"}">
@@ -2044,7 +2274,7 @@ sub form_header {
                <input name=selectIC_income type=hidden value="$form->{selectIC_income}">
              </tr>
              <tr>
-               <th align=right>| . $locale->text('COGS') . qq|</th>
+               <th align=right>| . $locale->text('Expense') . qq|</th>
                <td><select name=IC_expense>$form->{selectIC_expense}</select></td>
                <input name=selectIC_expense type=hidden value="$form->{selectIC_expense}">
              </tr>
@@ -2059,11 +2289,6 @@ sub form_header {
                      <td>
                        <input name=weight size=10 value=$form->{weight}>
                      </td>
-                     <th>
-                       &nbsp;
-                       $form->{weightunit}
-                       <input type=hidden name=weightunit value=$form->{weightunit}>
-                     </th>
                    </tr>
                  </table>
                </td>
@@ -2094,11 +2319,6 @@ sub form_header {
                        &nbsp;$form->{weight}
                        <input type=hidden name=weight value=$form->{weight}>
                      </td>
-                     <th>
-                       &nbsp;
-                       $form->{weightunit}
-                       <input type=hidden name=weightunit value=$form->{weightunit}>
-                     </th>
                    </tr>
                  </table>
                </td>
@@ -2123,6 +2343,18 @@ sub form_header {
 |;
 
   }
+  $linkaccounts = qq|<input type=hidden name=IC_income value="$form->{IC_income_default}">|;
+
+  if ($form->{IC_cogs_default}) {
+    $form->{IC_expense_default} = $form->{IC_cogs_default};
+  }
+
+  if (($form->{item} eq "service") || ($form->{item} eq "part")) {
+    $linkaccounts .= qq|<input type=hidden name=IC_expense value="$form->{IC_expense_default}">|;
+  }
+  if ($form->{item} eq "part") {
+    $linkaccounts .= qq|<input type=hidden name=IC value="$form->{IC_default}">|;
+  }
 
   if ($form->{item} ne 'service') {
     $n   = ($form->{onhand} > 0) ? "1" : "0";
@@ -2164,10 +2396,21 @@ sub form_header {
              </tr>
               <tr>
                <th align="right" nowrap="true">|
-      . $locale->text('Geschäftsvolumen') . qq|</th>
+      . $locale->text('Business Volume') . qq|</th>
                <td><input name=gv size=10 value=$form->{gv}></td>
              </tr>
 |;
+    $notdiscountableok = ($form->{not_discountable}) == 1 ? "checked" : "";
+    $notdiscountable .= qq|
+              <tr>
+                <th align=right nowrap>|
+    . $locale->text('Not Discountable') . qq|</th>
+                <td><input class=checkbox type=checkbox name=not_discountable value=1 $notdiscountableok></td>
+             </tr>
+|;
+
+  $formel =
+    qq|<ilayer><layer  onmouseover="this.T_STICKY=true;this.T_STATIC=true;return escape('| . $locale->text('The formula needs the following syntax:<br>For regular article:<br>Variablename= Variable Unit;<br>Variablename2= Variable2 Unit2;<br>...<br>###<br>Variable + ( Variable2 / Variable )<br><b>Please be beware of the spaces in the formula</b><br>') . qq|')"><textarea name=formel rows=4 cols=30 wrap=soft>$form->{formel}</textarea></layer><ilayer>|;
     $imagelinks = qq|
   <tr>
     <td>
@@ -2198,7 +2441,7 @@ sub form_header {
 |;
   }
   $shopok = $form->{shop} == 1 ? "checked" : "";
-  $obsolete .= qq|
+  $shop .= qq|
               <tr>
                 <th align=right nowrap>|
     . $locale->text('Shopartikel') . qq|</th>
@@ -2206,6 +2449,7 @@ sub form_header {
              </tr>
 |;
 
+
   # type=submit $locale->text('Add Part')
   # type=submit $locale->text('Add Service')
   # type=submit $locale->text('Add Assembly')
@@ -2214,7 +2458,8 @@ sub form_header {
   # type=submit $locale->text('Edit Service')
   # type=submit $locale->text('Edit Assembly')
   # use JavaScript Calendar or not
-  $form->{jsscript} = $jscalendar;
+  my ($jsscript, $button1);
+  $form->{jsscript} = 1;
   $jsscript = "";
   if ($form->{jsscript}) {
 
@@ -2227,8 +2472,7 @@ sub form_header {
 
     #write Trigger
     $jsscript =
-      Form->write_trigger(\%myconfig, "1", "priceupdate", "BL", "trigger1", "",
-                          "", "");
+      Form->write_trigger(\%myconfig, "1", "priceupdate", "BL", "trigger1");
   } else {
 
     # without JavaScript Calendar
@@ -2236,12 +2480,21 @@ sub form_header {
                               <td><input name=transdatefrom id=transdatefrom size=11 title="$myconfig{dateformat}"></td>|;
   }
 
+  my $unit_select = '<input type="hidden" name="unit_changeable" value="' . $form->{"unit_changeable"} . '">';
+  if (!$form->{"unit_changeable"}) {
+    $unit_select .= '<input type="hidden" name="unit" value="' . $form->{"unit"} . '">' . $form->{"unit"};
+  } else {
+    my $units = AM->retrieve_units(\%myconfig, $form, $form->{"item"} eq "service" ? "service" : "dimension");
+    $unit_select .= AM->unit_select_html($units, "unit", $form->{"unit"});
+  }
+
   $form->{fokus} = "ic.partnumber";
   $form->header;
 
   print qq|
   <body onLoad="fokus()">
-
+ <script type="text/javascript" src="js/common.js"></script>
+ <script type="text/javascript" src="js/parts_language_selection.js"></script>
 
 <form method=post name="ic" action=$form->{script}>
 
@@ -2255,6 +2508,8 @@ sub form_header {
 <input name=taxaccounts type=hidden value="$form->{taxaccounts}">
 <input name=rowcount type=hidden value=$form->{rowcount}>
 <input name=eur type=hidden value=$eur>
+<input name=language_values type=hidden value="$form->{language_values}">
+<input name="original_partnumber" type="hidden" value="| . $form->quote($form->{"original_partnumber"}) . qq|">
 
 <table width="100%">
   <tr>
@@ -2286,16 +2541,47 @@ sub form_header {
             <table width="100%" height="100%">
               <tr class="listheading">
                 <th class="listheading" align="center" colspan=2>|
-    . $locale->text('Link Accounts') . qq|</th>
+    . $locale->text('') . qq|</th>
               </tr>
-              $linkaccounts
+              <td colspan=2>
+                <table>
+                  $buchungsgruppe
+                  $linkaccounts
+                </table>
+              </td>
               <tr>
                 <th align="left">| . $locale->text('Notes') . qq|</th>
+                <th align="left">| . $locale->text('Formula') . qq|</th>
               </tr>
               <tr>
-                <td colspan=2>
+                <td>
                   $notes
                 </td>
+                <td>
+                  $formel
+                </td>
+              </tr>
+              <tr>
+                <th align="left"></th>
+                <th align="left">| . $locale->text('EAN-Code') . qq|</th>
+              </tr>
+              <tr>
+                <td>
+                  <button type="button" onclick="parts_language_selection_window('language_values')">| . $locale->text('Set Language Values') . qq|</button>
+                </td>
+               <td>
+                 $ean  
+               </td>
+              </tr>
+              <tr>
+              <td colspan=2>
+                <table>
+                <tr>
+              <th align=right>| . $locale->text('Payment Terms') . qq|</th>
+                <td><select name=payment_id>$payment</select></td>
+                </tr>
+               </table>
+              </td>
               </tr>
             </table>
           </td>
@@ -2317,12 +2603,14 @@ sub form_header {
              $lastcost
              <tr>
                <th align="right" nowrap="true">| . $locale->text('Unit') . qq|</th>
-               <td><input name=unit size=5 maxlength="10" value="$form->{unit}"></td>
+               <td>$unit_select</td>
              </tr>
              $weight
              $rop
              $bin
+              $notdiscountable
               $vegv
+              $shop
              $obsolete
            </table>
          </td>
@@ -2360,7 +2648,6 @@ sub form_footer {
   }
 
   print qq|
-      <input type=hidden name=path value=$form->{path}>
       <input type=hidden name=login value=$form->{login}>
       <input type=hidden name=password value=$form->{password}>
       <input type=hidden name=callback value="$form->{callback}">
@@ -2417,15 +2704,26 @@ sub form_footer {
 
   if (!$form->{previousform}) {
     if ($form->{menubar}) {
-      require "$form->{path}/menu.pl";
+      require "bin/mozilla/menu.pl";
       &menubar;
     }
   }
-
+# button for saving history
+  if($form->{id} ne "") {
+       print qq|
+               <input type=button class=submit onclick=set_history_window(|
+               . $form->{id} 
+               . qq|); name=history id=history value=|
+               . $locale->text('history') 
+               . qq|>|;
+  }
+# /button for saving history
   print qq|
 
 </form>
 
+<script type="text/javascript" src="js/wz_tooltip.js"></script>
+
 </body>
 </html>
 |;
@@ -2436,10 +2734,7 @@ sub form_footer {
 sub makemodel_row {
   $lxdebug->enter_sub();
   my ($numrows) = @_;
-
-  $form->{"make_$i"}  =~ s/\"/&quot;/g;
-  $form->{"model_$i"} =~ s/\"/&quot;/g;
-
+  
   print qq|
   <tr>
     <td>
@@ -2450,7 +2745,9 @@ sub makemodel_row {
        </tr>
 |;
 
-  for $i (1 .. $numrows) {
+  for my $i (1 .. $numrows) {
+    $form->{"make_$i"}  =~ s/\"/&quot;/g;
+    $form->{"model_$i"} =~ s/\"/&quot;/g;
     print qq|
        <tr>
          <td width=50%><input name="make_$i" size=30 value="$form->{"make_$i"}"></td>
@@ -2471,6 +2768,10 @@ sub makemodel_row {
 sub assembly_row {
   $lxdebug->enter_sub();
   my ($numrows) = @_;
+  my (@column_index, %column_data, %column_header);
+  my ($nochange, $callback, $previousform, $linetotal, $href);
+
+  our ($deliverydate); # ToDO: cjeck if this indeed comes from global context
 
   @column_index =
     qw(runningnumber qty unit bom partnumber description partsgroup total);
@@ -2491,7 +2792,7 @@ sub assembly_row {
     $previousform = "";
 
     # save form variables in a previousform variable
-    foreach $key (sort keys %$form) {
+    foreach my $key (sort keys %$form) {
 
       # escape ampersands
       $form->{$key} =~ s/&/%26/g;
@@ -2538,7 +2839,7 @@ sub assembly_row {
         </tr>
 |;
 
-  for $i (1 .. $numrows) {
+  for my $i (1 .. $numrows) {
     $form->{"partnumber_$i"} =~ s/\"/&quot;/g;
 
     $linetotal =
@@ -2587,7 +2888,7 @@ sub assembly_row {
 
       } else {
         $href =
-          qq|$form->{script}?action=edit&id=$form->{"id_$i"}&path=$form->{path}&login=$form->{login}&password=$form->{password}&rowcount=$i&previousform=$previousform|;
+          qq|$form->{script}?action=edit&id=$form->{"id_$i"}&login=$form->{login}&password=$form->{password}&rowcount=$i&previousform=$previousform|;
         $column_data{partnumber} =
           qq|<td><input type=hidden name="partnumber_$i" value="$form->{"partnumber_$i"}"><a href=$href>$form->{"partnumber_$i"}</a></td>|;
         $column_data{runningnumber} =
@@ -2611,6 +2912,8 @@ sub assembly_row {
 
     $column_data{total} = qq|<td align=right>$linetotal</td>|;
 
+    $column_data{deliverydate} = qq|<td align=right>$deliverydate</td>|;
+
     print qq|
         <tr>|;
 
@@ -2637,7 +2940,7 @@ sub update {
   $lxdebug->enter_sub();
 
   if ($form->{item} eq "assembly") {
-    $i = $form->{assembly_rows};
+    my $i = $form->{assembly_rows};
 
     # if last row is empty check the form otherwise retrieve item
     if (   ($form->{"partnumber_$i"} eq "")
@@ -2646,11 +2949,11 @@ sub update {
 
       &check_form;
 
-        } else {
+    } else {
 
       IC->assembly_item(\%myconfig, \%$form);
 
-      $rows = scalar @{ $form->{item_list} };
+      my $rows = scalar @{ $form->{item_list} };
 
       if ($rows) {
         $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"});
@@ -2687,9 +2990,10 @@ sub update {
   }
 
   if ($form->{item} eq 'service') {
-    map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
-      qw(sellprice listprice);
+    map({ $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) }
+        qw(sellprice listprice lastcost));
     &form_header;
+    &price_row;
     &form_footer;
   }
 
@@ -2699,17 +3003,31 @@ sub update {
 sub save {
   $lxdebug->enter_sub();
 
-  # check if there is a part number
+  my ($parts_id, %newform, $previousform, $amount, $callback);
+
+  # check if there is a part number - commented out, cause there is an automatic allocation of numbers
   # $form->isblank("partnumber", $locale->text(ucfirst $form->{item}." Part Number missing!"));
 
+  # check if there is a description
+  $form->isblank("description", $locale->text("Part Description missing!"));
+
   if ($form->{obsolete}) {
     $form->error(
       $locale->text(
         "Inventory quantity must be zero before you can set this $form->{item} obsolete!"
       ))
-      if ($form->{onhand});
+      if ($form->{onhand} * 1);
+  }
+
+  if (!$form->{buchungsgruppen_id}) {
+    $form->error($locale->text("Parts must have an entry type.") . " " . 
+     $locale->text("If you see this message, you most likely just setup your LX-Office and haven't added any entry types. If this is the case, the option is accessible for administrators in the System menu.") 
+    );
   }
 
+  $form->error($locale->text('Description must not be empty!')) unless $form->{description};
+  $form->error($locale->text('Partnumber must not be set to empty!')) if $form->{id} && !$form->{partnumber};
+
   # expand dynamic strings
   # $locale->text('Inventory quantity must be zero before you can set this part obsolete!')
   # $locale->text('Inventory quantity must be zero before you can set this assembly obsolete!')
@@ -2718,13 +3036,20 @@ sub save {
   # $locale->text('Assembly Number missing!')
 
   # save part
-  $lxdebug->message(LXDebug::DEBUG1, "ic.pl: sellprice in save = $form->{sellprice}\n");
-  $rc = IC->save(\%myconfig, \%$form);
-  if ($rc == 3) {
+  $lxdebug->message($LXDebug::DEBUG1, "ic.pl: sellprice in save = $form->{sellprice}\n");
+  if (IC->save(\%myconfig, \%$form) == 3) {
     $form->error($locale->text('Partnumber not unique!'));
   }
+  # saving the history
+  if(!exists $form->{addition}) {
+    $form->{snumbers} = qq|partnumber_| . $form->{partnumber};
+       $form->{addition} = "SAVED";
+       $form->save_history($form->dbconnect(\%myconfig));
+  }
+  # /saving the history
   $parts_id = $form->{id};
 
+  my $i;
   # load previous variables
   if ($form->{previousform}) {
 
@@ -2737,8 +3062,8 @@ sub save {
     map { delete $form->{$_} } keys %newform;
 
     # now take it apart and restore original values
-    foreach $item (split /&/, $previousform) {
-      ($key, $value) = split /=/, $item, 2;
+    foreach my $item (split /&/, $previousform) {
+      my ($key, $value) = split /=/, $item, 2;
       $value =~ s/%26/&/g;
       $form->{$key} = $value;
     }
@@ -2776,12 +3101,12 @@ sub save {
       if ($form->{exchangerate} != 0) {
         $form->{"sellprice_$i"} /= $form->{exchangerate};
       }
-      $lxdebug->message(LXDebug::DEBUG1, qq|sellprice_$i in previousform 2 = |.$form->{"sellprice_$i"}.qq|\n|);
+      $lxdebug->message($LXDebug::DEBUG1, qq|sellprice_$i in previousform 2 = | . $form->{"sellprice_$i"} . qq|\n|);
       map { $form->{"taxaccounts_$i"} .= "$_ " } split / /,
         $newform{taxaccount};
       chop $form->{"taxaccounts_$i"};
-      foreach $item (qw(description rate taxnumber)) {
-        $index = $form->{"taxaccounts_$i"} . "_$item";
+      foreach my $item (qw(description rate taxnumber)) {
+        my $index = $form->{"taxaccounts_$i"} . "_$item";
         $form->{$index} = $newform{$index};
       }
 
@@ -2797,10 +3122,12 @@ sub save {
 
       $form->{creditremaining} -= $amount;
 
-    # redo number formatting, because invoice parse them!
-    $i = $form->{rowcount};
-    map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}) }
-    qw(weight listprice sellprice rop);
+      # redo number formatting, because invoice parse them!
+      $i = $form->{rowcount};
+      map {
+        $form->{"${_}_$i"} =
+          $form->format_amount(\%myconfig, $form->{"${_}_$i"})
+      } qw(weight listprice sellprice rop);
     }
 
     $form->{"id_$i"} = $parts_id;
@@ -2814,15 +3141,16 @@ sub save {
     $form->{makemodel_rows}--;
 
     # put callback together
-    foreach $key (keys %$form) {
+    foreach my $key (keys %$form) {
 
       # do single escape for Apache 2.0
-      $value = $form->escape($form->{$key}, 1);
+      my $value = $form->escape($form->{$key}, 1);
       $callback .= qq|&$key=$value|;
     }
     $form->{callback} = $callback;
   }
-  $lxdebug->message(LXDebug::DEBUG1, qq|ic.pl: sellprice_$i nach sub save = |.$form->{"sellprice_$i"}.qq|\n|);
+  $lxdebug->message($LXDebug::DEBUG1, qq|ic.pl: sellprice_$i nach sub save = | . $form->{"sellprice_$i"} . qq|\n|);
+
   # redirect
   $form->redirect;
 
@@ -2832,16 +3160,32 @@ sub save {
 sub save_as_new {
   $lxdebug->enter_sub();
 
+  # saving the history
+  if(!exists $form->{addition}) {
+    $form->{snumbers} = qq|partnumber_| . $form->{partnumber};
+       $form->{addition} = "SAVED AS NEW";
+       $form->save_history($form->dbconnect(\%myconfig));
+  }
+  # /saving the history
   $form->{id} = 0;
+  if ($form->{"original_partnumber"} &&
+      ($form->{"partnumber"} eq $form->{"original_partnumber"})) {
+    $form->{partnumber} = "";
+  }
   &save;
-
   $lxdebug->leave_sub();
 }
 
 sub delete {
   $lxdebug->enter_sub();
-
-  $rc = IC->delete(\%myconfig, \%$form);
+  # saving the history
+  if(!exists $form->{addition}) {
+    $form->{snumbers} = qq|partnumber_| . $form->{partnumber};
+       $form->{addition} = "DELETED";
+       $form->save_history($form->dbconnect(\%myconfig));
+  }
+  # /saving the history
+  my $rc = IC->delete(\%myconfig, \%$form);
 
   # redirect
   $form->redirect($locale->text('Item deleted!')) if ($rc > 0);
@@ -2850,181 +3194,6 @@ sub delete {
   $lxdebug->leave_sub();
 }
 
-sub stock_assembly {
-  $lxdebug->enter_sub();
-
-  $form->{title} = $locale->text('Stock Assembly');
-
-  $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 valign=top>
-    <td>
-      <table>
-        <tr>
-          <th align="right" nowrap="true">|
-    . $locale->text('Part Number') . qq|</th>
-          <td><input name=partnumber size=20></td>
-          <td>&nbsp;</td>
-        </tr>
-        <tr>
-          <th align="right" nowrap="true">|
-    . $locale->text('Part Description') . qq|</th>
-          <td><input name=description size=40></td>
-        </tr>
-      </table>
-    </td>
-  </tr>
-  <tr><td><hr size=3 noshade></td></tr>
-</table>
-
-<input type=hidden name=path value=$form->{path}>
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
-<input type=hidden name=nextsub value=list_assemblies>
-
-<br>
-<input class=submit type=submit name=action value="|
-    . $locale->text('Continue') . qq|">
-</form>
-
-</body>
-</html>
-|;
-
-  $lxdebug->leave_sub();
-}
-
-sub list_assemblies {
-  $lxdebug->enter_sub();
-
-  IC->retrieve_assemblies(\%myconfig, \%$form);
-
-  $column_header{partnumber} =
-    qq|<th class=listheading>| . $locale->text('Part Number') . qq|</th>|;
-  $column_header{description} =
-    qq|<th class=listheading>| . $locale->text('Part Description') . qq|</th>|;
-  $column_header{bin} =
-    qq|<th class=listheading>| . $locale->text('Bin') . qq|</th>|;
-  $column_header{onhand} =
-    qq|<th class=listheading>| . $locale->text('Qty') . qq|</th>|;
-  $column_header{rop} =
-    qq|<th class=listheading>| . $locale->text('ROP') . qq|</th>|;
-  $column_header{stock} =
-    qq|<th class=listheading>| . $locale->text('Add') . qq|</th>|;
-
-  @column_index = (qw(partnumber description bin onhand rop stock));
-
-  $form->{title} = $locale->text('Stock Assembly');
-
-  $form->{callback} =
-    "$form->{script}?action=stock_assembly&path=$form->{path}&login=$form->{login}&password=$form->{password}";
-
-  $form->header;
-
-  $colspan = $#column_index + 1;
-
-  print qq|
-<body>
-
-<form method=post action=$form->{script}>
-
-<table width=100%>
-  <tr>
-    <th class=listtop colspan=$colspan>$form->{title}</th>
-  </tr>
-  <tr size=5></tr>
-  <tr class=listheading>|;
-
-  map { print "\n$column_header{$_}" } @column_index;
-
-  print qq|
-  </tr>
-|;
-
-  $i = 1;
-  foreach $ref (@{ $form->{assembly_items} }) {
-
-    map { $ref->{$_} =~ s/\"/&quot;/g } qw(partnumber description);
-
-    $column_data{partnumber}  = qq|<td width=20%>$ref->{partnumber}</td>|;
-    $column_data{description} =
-      qq|<td width=50%>$ref->{description}&nbsp;</td>|;
-    $column_data{bin}    = qq|<td>$ref->{bin}&nbsp;</td>|;
-    $column_data{onhand} =
-        qq|<td align=right>|
-      . $form->format_amount(\%myconfig, $ref->{onhand}, '', "&nbsp;")
-      . qq|</td>|;
-    $column_data{rop} =
-        qq|<td align=right>|
-      . $form->format_amount(\%myconfig, $ref->{rop}, '', "&nbsp;")
-      . qq|</td>|;
-    $column_data{stock} = qq|<td width=10%><input name="qty_$i" size=10></td>|;
-
-    $j++;
-    $j %= 2;
-    print
-      qq|<tr class=listrow$j><input name="id_$i" type=hidden value=$ref->{id}>\n|;
-
-    map { print "\n$column_data{$_}" } @column_index;
-
-    print qq|
-    </tr>
-|;
-
-    $i++;
-
-  }
-
-  $i--;
-  print qq|
-  <tr>
-    <td colspan=6><hr size=3 noshade>
-  </tr>
-</table>
-<input name=rowcount type=hidden value="$i">
-
-<input type=hidden name=path value=$form->{path}>
-<input type=hidden name=login value=$form->{login}>
-<input type=hidden name=password value=$form->{password}>
-
-<input name=callback type=hidden value="$form->{callback}">
-
-<input type=hidden name=nextsub value=restock_assemblies>
-
-<br>
-<input class=submit type=submit name=action value="|
-    . $locale->text('Continue') . qq|">
-
-</form>
-
-</body>
-</html>
-|;
-
-  $lxdebug->leave_sub();
-}
-
-sub restock_assemblies {
-  $lxdebug->enter_sub();
-
-  $form->redirect($locale->text('Assemblies restocked!'))
-    if (IC->restock_assemblies(\%myconfig, \%$form));
-  $form->error($locale->text('Cannot stock assemblies!'));
-
-  $lxdebug->leave_sub();
-}
-
 sub price_row {
   $lxdebug->enter_sub();
 
@@ -3039,7 +3208,7 @@ sub price_row {
           <th class="listheading">| . $locale->text('Preis') . qq|</th>
         </tr>
 |;
-  for $i (1 .. $numrows) {
+  for my $i (1 .. $numrows) {
     print qq|
         <tr>
           <td width=50%><input type=hidden name="pricegroup_$i" size=30  value="$form->{"pricegroup_$i"}">$form->{"pricegroup_$i"}</td>
@@ -3058,4 +3227,37 @@ sub price_row {
   $lxdebug->leave_sub();
 }
 
-sub continue { &{ $form->{nextsub} } }
+sub parts_language_selection {
+  $lxdebug->enter_sub();
+
+  our ($onload);
+
+  my $languages = IC->retrieve_languages(\%myconfig, $form);
+
+
+  my $callback = "$form->{script}?action=parts_language_selection&";
+  map({ $callback .= "$_=" . $form->escape($form->{$_}) . "&" }
+      (qw(login password name input_name), grep({ /^[fl]_/ } keys %$form)));
+
+  my @header_sort = qw(name longdescription);
+  my %header_title = ( "name" => $locale->text("Name"),
+                       "longdescription" => $locale->text("Long Description"),
+                       );
+
+  my @header =
+    map(+{ "column_title" => $header_title{$_},
+           "column" => $_,
+           "callback" => $callback,
+         },
+        @header_sort);
+
+  $form->{"title"} = $locale->text("Language Values");
+  $form->header();
+  print($form->parse_html_template("ic/parts_language_selection", { "HEADER" => \@header,
+                                                                   "LANGUAGES" => $languages,
+                                                                   "onload" => $onload }));
+
+  $lxdebug->leave_sub();
+}
+
+sub continue { call_sub($form->{"nextsub"}); }