+sub action_stock_in_out_dialog {
+ my ($self) = @_;
+
+ my $part = SL::DB::Part->load_cached($::form->{parts_id}) or die "need parts_id";
+ my $unit = SL::DB::Unit->load_cached($::form->{unit}) or die "need unit";
+ my $stock = $::form->{stock};
+ my $row = $::form->{row};
+ my $item_id = $::form->{item_id};
+ my $qty = _parse_number($::form->{qty_as_number});
+
+ my $inout = $self->type_data->transfer;
+
+ my @contents = DO->get_item_availability(parts_id => $part->id);
+ my $stock_info = DO->unpack_stock_information(packed => $stock);
+
+ $self->merge_stock_data($stock_info, \@contents, $part, $unit);
+
+ $self->render("delivery_order/stock_dialog", { layout => 0 },
+ WHCONTENTS => $self->order->delivered ? $stock_info : \@contents,
+ part => $part,
+ do_qty => $qty,
+ do_unit => $unit->unit,
+ delivered => $self->order->delivered,
+ row => $row,
+ item_id => $item_id,
+ );
+}
+
+sub action_update_stock_information {
+ my ($self) = @_;
+
+ my $stock_info = $::form->{stock_info};
+ my $unit = $::form->{unit};
+ my $yaml = SL::YAML::Dump($stock_info);
+ my $stock_qty = $self->calculate_stock_in_out_from_stock_info($unit, $stock_info);
+
+ my $response = {
+ stock_info => $yaml,
+ stock_qty => $stock_qty,
+ };
+ $self->render(\ SL::JSON::to_json($response), { layout => 0, type => 'json', process => 0 });
+}
+
+sub merge_stock_data {
+ my ($self, $stock_info, $contents, $part, $unit) = @_;
+ # TODO rewrite to mapping
+
+ if (!$self->order->delivered) {
+ for my $row (@$contents) {
+ # row here is in parts units. stock is in item units
+ $row->{available_qty} = _format_number($part->unit_obj->convert_to($row->{qty}, $unit));
+
+ for my $sinfo (@{ $stock_info }) {
+ next if $row->{bin_id} != $sinfo->{bin_id} ||
+ $row->{warehouse_id} != $sinfo->{warehouse_id} ||
+ $row->{chargenumber} ne $sinfo->{chargenumber} ||
+ $row->{bestbefore} ne $sinfo->{bestbefore};
+
+ $row->{"stock_$_"} = $sinfo->{$_}
+ for qw(qty unit error delivery_order_items_stock_id);
+ }
+ }
+
+ } else {
+ for my $sinfo (@{ $stock_info }) {
+ my $bin = SL::DB::Bin->load_cached($sinfo->{bin_id});
+ $sinfo->{warehousedescription} = $bin->warehouse->description;
+ $sinfo->{bindescription} = $bin->description;
+ map { $sinfo->{"stock_$_"} = $sinfo->{$_} } qw(qty unit);
+ }
+ }
+}
+