Inventory: Parameter oe_id in for_object_id umbenannt und besser dokumentiert
[kivitendo-erp.git] / t / wh / inventory.t
1 use strict;
2 use Test::More;
3
4 use lib 't';
5
6 use SL::Dev::Part qw(new_part new_assembly);
7 use SL::Dev::Inventory qw(create_warehouse_and_bins set_stock);
8 use SL::Dev::Record qw(create_sales_order);
9 use SL::DB::Helper::Reservation qw(make_reservation);
10
11 use_ok 'Support::TestSetup';
12 use_ok 'SL::DB::Bin';
13 use_ok 'SL::DB::Part';
14 use_ok 'SL::DB::Warehouse';
15 use_ok 'SL::DB::Inventory';
16 use_ok 'SL::WH';
17 use_ok 'SL::Helper::Inventory';
18
19 Support::TestSetup::login();
20
21 my ($wh, $bin1, $bin2, $assembly1);
22
23 reset_db();
24 create_standard_stock();
25
26
27 # simple stock in, get_stock, get_onhand
28 set_stock(
29   part => $assembly1,
30   qty => 25,
31   bin => $bin1,
32 );
33
34 is(SL::Helper::Inventory::get_stock(part => $assembly1), "25.00000", 'simple get_stock works');
35 is(SL::Helper::Inventory::get_onhand(part => $assembly1), "25.00000", 'simple get_onhand works');
36
37 # stock on some more, get_stock, get_onhand
38
39 WH->transfer({
40   parts_id          => $assembly1->id,
41   qty               => 15,
42   transfer_type     => 'stock',
43   dst_warehouse_id  => $bin1->warehouse_id,
44   dst_bin_id        => $bin1->id,
45   comment           => 'more',
46 });
47
48 WH->transfer({
49   parts_id          => $assembly1->id,
50   qty               => 20,
51   transfer_type     => 'stock',
52   chargenumber      => '298345',
53   dst_warehouse_id  => $bin1->warehouse_id,
54   dst_bin_id        => $bin1->id,
55   comment           => 'more',
56 });
57
58 is(SL::Helper::Inventory::get_stock(part => $assembly1), "60.00000", 'normal get_stock works');
59 is(SL::Helper::Inventory::get_onhand(part => $assembly1), "60.00000", 'normal get_onhand works');
60
61 # reserve some of it, get_stock, get_onhand
62
63 my $order = create_sales_order(save => 1);
64
65 make_reservation(
66   part        => $assembly1,
67   bin         => $bin1,
68   reserve_for => $order,
69   qty         => 25,
70 );
71
72 is(WH->get_stock_(part => $assembly1), "60.00000", 'normal get_stock works');
73 is(WH->get_onhand_(part => $assembly1), "35.00000", 'normal get_onhand works');
74
75 # allocate some stuff
76
77 my @allocations = SL::Helper::Inventory::allocate(
78   part => $assembly1,
79   qty  => 12,
80 );
81
82 is_deeply(\%{ $allocations[0] }, {
83    bestbefore        => undef,
84    bin_id            => $bin1->id,
85    chargenumber      => '',
86    parts_id          => $assembly1->id,
87    qty               => 12,
88    reserve_for_id    => undef,
89    reserve_for_table => undef,
90    warehouse_id      => $wh->id,
91    comment           => undef,
92    for_object_id     => undef,
93  }, 'allocation works');
94
95 # simple
96
97 # with reservation
98
99 # more than exists
100
101 # produce something
102
103 # produce the same using auto_allocation
104
105
106 sub reset_db {
107   SL::DB::Manager::Order->delete_all(all => 1);
108   SL::DB::Manager::Inventory->delete_all(all => 1);
109   SL::DB::Manager::Assembly->delete_all(all => 1);
110   SL::DB::Manager::Part->delete_all(all => 1);
111   SL::DB::Manager::Bin->delete_all(all => 1);
112   SL::DB::Manager::Warehouse->delete_all(all => 1);
113 }
114
115 sub create_standard_stock {
116   ($wh, $bin1) = create_warehouse_and_bins();
117   $bin2 = SL::DB::Bin->new(description => "Bin 2", warehouse => $wh)->save;
118   $wh->load;
119
120   $assembly1  =  new_assembly()->save;
121 }
122
123
124 reset();
125
126 done_testing();
127
128 1;