# safety
-__PACKAGE__->run_before('check_auth');
+__PACKAGE__->run_before('check_auth',
+ except => [ qw(pack_stock_information) ]);
__PACKAGE__->run_before('get_unalterable_data',
only => [ qw(save save_as_new save_and_delivery_order save_and_invoice save_and_ap_transaction
sub action_stock_in_out_dialog {
my ($self) = @_;
- my $part = SL::DB::Part->load_cached($::form->{parts_id}) or die "need parts_id";
- my $stock = $::form->{stock};
- my $unit = $::form->{unit};
- my $qty = _parse_number($::form->{qty_as_number});
+ my $part = SL::DB::Part->load_cached($::form->{parts_id}) or die "need parts_id";
+ my $stock = $::form->{stock};
+ my $unit = $::form->{unit};
+ my $row = $::form->{row};
+ my $item_id = $::form->{item_id};
+ my $qty = _parse_number($::form->{qty_as_number});
my $inout = $self->type_data->transfer;
$self->render("delivery_order/stock_dialog", { layout => 0 },
WHCONTENTS => $self->order->delivered ? $stock_info : \@contents,
- part => $part,
- do_qty => $qty,
- do_unit => $unit,
+ part => $part,
+ do_qty => $qty,
+ do_unit => $unit,
+ delivered => $self->order->delivered,
+ row => $row,
+ item_id => $item_id,
);
+}
+
+# we're using the old YAML based stock packing, but don't want to do this in
+# the frontend so we're doing a tiny roundtrip to the backend, back the info in
+# perl, serve it back to the frontend and store it in the DOM there
+sub action_pack_stock_information {
+ my ($self) = @_;
+
+ my $stock_info = $::form->{stock_info};
+ my $yaml = SL::YAML::Dump($stock_info);
+ $self->render(\$yaml, { layout => 0, process => 0 });
}
sub merge_stock_data {
# You need a custom shipto object to call cvars_by_config to get the cvars.
$self->order->custom_shipto(SL::DB::Shipto->new(module => 'OE', custom_variables => [])) if !$self->order->custom_shipto;
+ $self->prepare_stock_info($_) for $self->order->items;
+
return $self->order;
}
push @items, $item;
$pos++;
}
+
+ $self->prepare_stock_info($_) for $order->items, @items;
+
$order->add_items(grep {!$_->id} @items);
return $order;
# saved. Adding empty custom_variables to new orderitem here solves this problem.
$item ||= SL::DB::DeliveryOrderItem->new(custom_variables => []);
+ # handle stock info
+ if (my $stock_info = delete $attr->{stock_info}) {
+ my %existing = map { $_->id => $_ } $item->delivery_order_stock_entries;
+ my @save;
+
+ for my $line (@{ DO->unpack_stock_information(packed => $stock_info) }) {
+ # lookup existing or make new
+ my $obj = delete $existing{$line->{delivery_order_items_stock_id}}
+ // SL::DB::DeliveryOrderItemsStock->new;
+
+ # assign attributes
+ $obj->$_($line->{$_}) for qw(bin_id warehouse_id chargenumber qty unit);
+ $obj->bestbefore_as_date($line->{bestfbefore})
+ if $line->{bestbefore} && $::instance_conf->get_show_bestbefore;
+ push @save, $obj;
+ }
+
+ $item->delivery_order_stock_entries(@save);
+ }
+
$item->assign_attributes(%$attr);
if ($is_new) {
return $item;
}
+sub prepare_stock_info {
+ my ($self, $item) = @_;
+
+ $item->{stock_info} = SL::YAML::Dump([
+ map +{
+ delivery_order_items_stock_id => $_->id,
+ qty => $_->qty,
+ warehouse_id => $_->warehouse_id,
+ bin_id => $_->bin_id,
+ chargenumber => $_->chargenumber,
+ unit => $_->unit,
+ }, $item->delivery_order_stock_entries
+ ]);
+}
+
sub setup_order_from_cv {
my ($order) = @_;