+    my %oeitems_by_id       = map { $_->{id} => $_ } @{ $orderitems };
+
+
+    $placeholders = join(', ', ('?') x scalar @do_ids);
+    $query  = qq|SELECT doi.parts_id, doi.id, doi.qty, doi.unit, doi.position,
+               doi.delivery_order_id, COALESCE(rlitem.from_id,0) as from_id,
+               p.unit AS partunit
+               FROM delivery_order_items doi
+               LEFT JOIN parts p ON (doi.parts_id = p.id)
+               LEFT JOIN record_links rlitem
+               ON (rlitem.to_id = doi.id AND rlitem.to_table='delivery_order_items')
+               WHERE doi.delivery_order_id IN (${placeholders})|;
+
+    my $deliveryorderitems = selectall_hashref_query($form, $dbh, $query, @do_ids);
+
+    # erst mal qty der links bearbeiten
+    foreach my $do_entry (@{ $deliveryorderitems }) {
+      $do_entry->{qty} *= AM->convert_unit($do_entry->{unit}, $do_entry->{partunit}, $all_units);
+      if ($do_entry->{from_id} > 0 ) {
+        # record link zwischen items vorhanden, kann auch von anderem Auftrag sein
+        my $oe_entry = $oeitems_by_id{$do_entry->{from_id}};
+        if ( $oe_entry ) {
+          $oe_entry->{qty_notdelivered} -= $do_entry->{qty};
+          # derzeit nur ein link pro do_item
+          $do_entry->{oe_entry} = $oe_entry;
+        }
+      } else {
+        $main::lxdebug->message(LXDebug->DEBUG2(),"no entry for=".$do_entry->{id}." part=".$do_entry->{parts_id});
+      }
+    }
+    # nun den rest ohne links bearbeiten
+    foreach my $do_entry (@{ $deliveryorderitems }) {
+      next if $do_entry->{from_id} > 0;
+      next if $do_entry->{qty} == 0;
+
+      foreach my $oe_entry (@{ $orderitems }) {
+        next if $oe_entry->{qty_notdelivered} == 0;
+        if ( $do_entry->{parts_id} == $oe_entry->{parts_id} ) {
+          # zu viele geliefert auf andere position ?
+          if ( $oe_entry->{qty_notdelivered} < 0 ) {
+            $do_entry->{qty} += - $oe_entry->{qty_notdelivered};
+            $oe_entry->{qty_notdelivered} = 0;
+          } else {
+            if ( $do_entry->{qty} < $oe_entry->{qty_notdelivered} ) {
+              $oe_entry->{qty_notdelivered} -= $do_entry->{qty};
+              $do_entry->{qty} = 0;
+            } else {
+              $do_entry->{qty} -= $oe_entry->{qty_notdelivered};
+              $oe_entry->{qty_notdelivered} = 0;
+            }
+            # derzeit nur ein link pro do_item
+            $do_entry->{oe_entry} = $oe_entry if !$do_entry->{oe_entry};
+          }
+        }
+        last if $do_entry->{qty} <= 0;
+      }
+    }
+    if ( $params{oe_id} ) {
+      $ship{$_->{position}}->{qty_notdelivered} = $_->{qty_notdelivered} for @{ $orderitems };
+    }
+    elsif ($params{do_id} && $params{delivered}) {
+      foreach my $oe_entry (@{ $orderitems }) {
+        if ( !$ship{$oe_entry->{trans_id}} ) {
+            $ship{$oe_entry->{trans_id}} = { 'delivered' => 1 };
+        }
+        $ship{$oe_entry->{trans_id}}->{delivered} = 0 if $oe_entry->{qty_notdelivered} > 0;
+      }
+    }
+    elsif ($params{do_id}) {
+      foreach my $do_entry (@{ $deliveryorderitems }) {
+        next if $params{do_id} != $do_entry->{delivery_order_id};
+        my $position = $do_entry->{position};
+        if ( $position > 0 && $do_entry->{oe_entry}) {
+          if ( !$ship{$position} ) {
+            $ship{$position} = {
+              'qty_ordered'      => $do_entry->{oe_entry}->{qty} ,
+              'qty_notdelivered' => $do_entry->{oe_entry}->{qty_notdelivered}
+            };
+          } else {
+            $ship{$position}->{qty_ordered}      += $do_entry->{oe_entry}->{qty};
+            $ship{$position}->{qty_notdelivered} += $do_entry->{oe_entry}->{qty_notdelivered};
+          }
+        }
+      }