+sub delivery_plan_query {
+  my ($self) = @_;
+  my $vc     = $self->vc;
+  my $mode   = $self->mode;
+  my $employee_id = SL::DB::Manager::Employee->current->id;
+  my $oe_owner = $_[0]->all_edit_right ? '' : " oe.employee_id = $employee_id AND";
+  # check delivered state for delivery_orders (transferred out) if enabled
+  # OR if we are delivery_value_report mode
+  my $filter_delivered = ($::instance_conf->get_delivery_plan_calculate_transferred_do ||
+                          $mode eq 'delivery_value_report' ) ?
+                          "AND (SELECT delivered from delivery_orders where id = doi.delivery_order_id)" : '';
+  # Show ALL open orders in delivery_value_report mode
+  my $comment_show_all_open_orders = ($mode eq 'delivery_value_report' ) ? "-- " : "";
+  [
+  "order.${vc}_id" => { gt => 0 },
+  'order.closed' => 0,
+  or => [ 'order.quotation' => 0, 'order.quotation' => undef ],
+
+  # filter by shipped_qty < qty, read from innermost to outermost
+  'id' => [ \"
+    -- 3. resolve the desired information about those
+    SELECT oi.id FROM (
+      -- 2. slice only part, orderitem and both quantities from it
+      SELECT parts_id, trans_id, qty, SUM(doi_qty) AS doi_qty FROM (
+        -- 1. join orderitems and deliverorder items via record_links.
+        --    also add customer data to filter for sales_orders
+        SELECT oi.parts_id, oi.trans_id, oi.id, oi.qty, doi.qty AS doi_qty
+        FROM orderitems oi, oe, record_links rl, delivery_order_items doi
+        WHERE
+          oe.id = oi.trans_id AND
+          oe.${vc}_id IS NOT NULL AND
+          (oe.quotation = 'f' OR oe.quotation IS NULL) AND
+          NOT oe.closed AND
+          $oe_owner
+          rl.from_id = oe.id AND
+          rl.from_id = oi.trans_id AND
+          oe.id = oi.trans_id AND
+          rl.from_table = 'oe' AND
+          rl.to_table = 'delivery_orders' AND
+          rl.to_id = doi.delivery_order_id AND
+          oi.parts_id = doi.parts_id
+          $filter_delivered
+      ) tuples GROUP BY parts_id, trans_id, qty
+    ) partials
+    LEFT JOIN orderitems oi ON partials.parts_id = oi.parts_id AND partials.trans_id = oi.trans_id
+    WHERE oi.qty > doi_qty
+
+    UNION ALL
+
+    -- 4. since the join over record_links fails for sales_orders without any delivery order
+    --    retrieve those without record_links at all
+    SELECT oi.id FROM orderitems oi, oe
+    WHERE
+      oe.id = oi.trans_id AND
+      oe.${vc}_id IS NOT NULL AND
+      (oe.quotation = 'f' OR oe.quotation IS NULL) AND
+      NOT oe.closed AND
+      $oe_owner
+      oi.trans_id NOT IN (
+        SELECT from_id
+        FROM record_links rl
+        WHERE
+          rl.from_table ='oe' AND
+          rl.to_table = 'delivery_orders'
+      )
+
+    UNION ALL
+
+    -- 5. now for the really nasty cases.
+    --    If someone partially delivered an order in several delivery orders,
+    --    there will be lots of record_links (4 doesn't catch those) but those
+    --    won't have matching part_ids in delivery_order_items, so 1-3 can't
+    --    find anything
+    --    In this case aggreg record_links - delivery_order - delivery_order_items
+    --    slice only oe.id, parts_id and sum of of qty
+    --    left join that onto orderitems to get matching qtys in doi while retaining
+    --    entrys without matches and then throw out those without record_links
+    --    TODO: join this and 1-3 into a general case
+                  -- need debug info? uncomment these:
+    SELECT oi.id  -- ,oi.trans_id, oi.parts_id, coalesce(sum, 0), agg.parts_id
+    FROM orderitems oi LEFT JOIN (
+      SELECT rl.from_id as oid, doi.parts_id, sum(doi.qty) FROM (
+        SELECT from_id, to_id
+        FROM record_links rl
+        LEFT JOIN oe ON oe.id = from_id
+        WHERE
+          rl.from_table = 'oe' AND
+          rl.to_table = 'delivery_orders' AND
+
+          oe.${vc}_id IS NOT NULL AND
+          $oe_owner
+          (oe.quotation = 'f' OR oe.quotation IS NULL) AND NOT oe.closed
+      ) rl
+      LEFT JOIN delivery_order_items doi ON (rl.to_id = doi.delivery_order_id)
+      WHERE 1 = 1
+      $filter_delivered
+      GROUP BY rl.from_id, doi.parts_id
+    ) agg ON (agg.oid = oi.trans_id AND agg.parts_id = oi.parts_id)
+    LEFT JOIN oe ON oe.id = oi.trans_id
+    WHERE
+      EXISTS (
+        SELECT to_id
+        FROM record_links rl
+        WHERE oi.trans_id = rl.from_id AND rl.from_table = 'oe' AND rl.to_table = 'delivery_orders'
+      ) AND
+      $comment_show_all_open_orders coalesce(sum, 0) < oi.qty AND
+      oe.${vc}_id IS NOT NULL AND
+      $oe_owner
+      (oe.quotation = 'f' OR oe.quotation IS NULL) AND NOT oe.closed
+  " ],
+  ]
+}
+
+sub init_models {
+  my ($self) = @_;
+  my $vc     = $self->vc;
+  my $mode   = $self->mode;
+  SL::Controller::Helper::GetModels->new(
+    controller            => $self,
+    model                 => 'OrderItem',
+    sorted                => {
+      _default              => {
+        by                    => 'reqdate',
+        dir                   => 1,
+      },
+      %sort_columns,
+    },
+    query                 => $self->delivery_plan_query,
+    with_objects          => [ 'order', "order.$vc", 'part' ],
+    additional_url_params => { vc => $vc, mode => $mode},
+  );
+}
+
+sub init_all_edit_right {
+  $::auth->assert('sales_all_edit', 1)
+}
+sub init_vc {
+  return $::form->{vc} if ($::form->{vc} eq 'customer' || $::form->{vc} eq 'vendor') || croak "self (DeliveryPlan) has no vc defined";
+}
+sub init_mode {
+  return $::form->{mode} if ($::form->{mode} eq 'delivery_value_report' || $::form->{mode} eq 'delivery_plan') || croak "self (DeliveryPlan) has no mode defined";
+}
+
+sub init_all_employees {
+  return SL::DB::Manager::Employee->get_all_sorted;
+}
+sub init_all_businesses {
+  return SL::DB::Manager::Business->get_all_sorted;
+}