+sub transfer_stock {
+ my (%params) = @_;
+
+ # check params:
+ die "missing params" unless ( $params{parts_id} or $params{part} ) and $params{from_bin} and $params{to_bin};
+
+ my $part;
+ if ( $params{parts_id} ) {
+ $part = SL::DB::Manager::Part->find_by( id => delete $params{parts_id} ) or die "illegal parts_id";
+ } else {
+ $part = delete $params{part};
+ }
+ die "illegal part" unless ref($part) eq 'SL::DB::Part';
+
+ my $from_bin = delete $params{from_bin};
+ my $to_bin = delete $params{to_bin};
+ die "illegal bins" unless ref($from_bin) eq 'SL::DB::Bin' and ref($to_bin) eq 'SL::DB::Bin';
+
+ my $qty = delete($params{qty});
+ die "qty must be > 0" unless $qty > 0;
+
+ # set defaults
+ my $transfer_type = SL::DB::Manager::TransferType->find_by(description => 'transfer') or die "can't determine transfer type";
+ my $employee_id = delete $params{employee_id} // SL::DB::Manager::Employee->current->id;
+
+ my $WH_params = {
+ 'bestbefore' => undef,
+ 'change_default_bin' => undef,
+ 'chargenumber' => '',
+ 'comment' => delete $params{comment} // '',
+ 'dst_bin_id' => $to_bin->id,
+ 'dst_warehouse_id' => $to_bin->warehouse_id,
+ 'parts_id' => $part->id,
+ 'qty' => $qty,
+ 'src_bin_id' => $from_bin->id,
+ 'src_warehouse_id' => $from_bin->warehouse_id,
+ 'transfer_type_id' => $transfer_type->id,
+ };
+
+ WH->transfer($WH_params);
+
+ return 1;
+
+ # do it manually via rose:
+ # my $trans_id;
+
+ # my $db = SL::DB::Inventory->new->db;
+ # $db->with_transaction(sub{
+ # ($trans_id) = $db->dbh->selectrow_array("select nextval('id')", {});
+ # die "no trans_id" unless $trans_id;
+
+ # my %params = (
+ # shippingdate => delete $params{shippingdate} // DateTime->today,
+ # employee_id => $employee_id,
+ # trans_id => $trans_id,
+ # trans_type_id => $transfer_type->id,
+ # parts_id => $part->id,
+ # comment => delete $params{comment} || 'Umlagerung',
+ # );
+
+ # SL::DB::Inventory->new(
+ # warehouse_id => $from_bin->warehouse_id,
+ # bin_id => $from_bin->id,
+ # qty => $qty * -1,
+ # %params,
+ # )->save;
+
+ # SL::DB::Inventory->new(
+ # warehouse_id => $to_bin->warehouse_id,
+ # bin_id => $to_bin->id,
+ # qty => $qty,
+ # %params,
+ # )->save;
+ # }) or die $@ . "\n";
+ # return 1;
+}
+