b85cd68ce0d5fcb9911b1071ab0b55d244010a1c
[kivitendo-erp.git] / t / wh / transfer.t
1 use strict;
2 use Test::More;
3
4 use lib 't';
5
6 use SL::Dev::Part qw(new_part);
7
8 use_ok 'Support::TestSetup';
9 use_ok 'SL::DB::Bin';
10 use_ok 'SL::DB::Part';
11 use_ok 'SL::DB::Warehouse';
12 use_ok 'SL::WH';
13
14 use_ok('SL::DB::Inventory');
15
16 use constant NAME => 'UnitTestObject';
17
18 Support::TestSetup::login();
19
20 # Clean up: remove test objects for part, warehouse, bin
21 my $part = SL::DB::Manager::Part->get_first(partnumber => NAME(), description => NAME());
22 if ($part) {
23   SL::DB::Manager::Inventory->delete_all(where => [ parts_id => $part->id ]);
24   $part->delete;
25 }
26
27 SL::DB::Manager::Bin      ->delete_all(where => [ or => [ description => NAME() . "1", description => NAME() . "2" ] ]);
28 SL::DB::Manager::Warehouse->delete_all(where => [ description => NAME() ]);
29
30 # Create test data
31 $part = new_part(unit => 'mg', description => NAME(), partnumber => NAME())->save();
32
33 is(ref($part), 'SL::DB::Part', 'loading a part to test with id ' . $part->id);
34
35 my $wh = SL::DB::Warehouse->new(description => NAME(), invalid => 0);
36 $wh->save;
37 is(ref $wh, 'SL::DB::Warehouse', 'loading a warehouse to test with id ' . $wh->id);
38
39 my $bin1 = SL::DB::Bin->new(description => NAME() . "1", warehouse_id => $wh->id);
40 $bin1->save;
41 is(ref $bin1, 'SL::DB::Bin', 'getting first bin to test with id ' . $bin1->id);
42
43 my $bin2 = SL::DB::Bin->new(description => NAME() . "2", warehouse_id => $wh->id);
44 $bin2->save;
45 is(ref $bin2, 'SL::DB::Bin', 'getting another bin to test with id ' . $bin2->id);
46
47 my $report = sub {
48   $::form->{l_warehouseid} = 'Y';
49   $::form->{l_binid} = 'Y';
50   my ($result) = WH->get_warehouse_report(
51     warehouse_id => $wh->id,
52     bin_id       => $bin1->id,
53     partsid      => $part->id,
54     chargenumber => '',
55   );
56   $result->{qty} ||= 0;
57   return $result;
58 };
59
60 sub test (&@) {
61   my ($arg_sub, @transfers) = @_;
62   my $before = $report->();
63
64   WH->transfer(@transfers);
65
66   my $after  = $report->();
67   my @args   = $arg_sub->($before, $after);
68
69   is $args[0], $args[1], $args[2];
70 }
71
72 test { shift->{qty}, shift->{qty} + 4, 'transfer one way' } {
73    transfer_type    => 'transfer',
74    parts_id         => $part->id,
75    src_warehouse_id => $wh->id,
76    dst_warehouse_id => $wh->id,
77    src_bin_id       => $bin1->id,
78    dst_bin_id       => $bin2->id,
79    qty              => 4,
80    chargenumber     => '',
81 };
82
83 #################################################
84
85 test { shift->{qty}, shift->{qty} - 4, 'and back' } {
86    transfer_type    => 'transfer',
87    parts_id         => $part->id,
88    src_warehouse_id => $wh->id,
89    dst_warehouse_id => $wh->id,
90    src_bin_id       => $bin2->id,
91    dst_bin_id       => $bin1->id,
92    qty              => 4,
93    chargenumber     => '',
94 };
95
96 #################################################
97
98 test {shift->{qty}, shift->{qty} + 4000000000, 'transfer one way with unit'} {
99    transfer_type    => 'transfer',
100    parts_id         => $part->id,
101    src_warehouse_id => $wh->id,
102    dst_warehouse_id => $wh->id,
103    src_bin_id       => $bin1->id,
104    dst_bin_id       => $bin2->id,
105    qty              => 4,
106    unit             => 't',
107    chargenumber     => '',
108 };
109
110 ##############################################
111
112 use_ok 'SL::DB::TransferType';
113
114 # object interface test
115
116 test { shift->{qty}, shift->{qty} + 6.2, 'object transfer one way' } {
117    transfer_type    => SL::DB::Manager::TransferType->find_by(description => 'transfer'),
118    parts            => $part,
119    src_bin          => $bin1,
120    dst_bin          => $bin2,
121    qty              => 6.2,
122    chargenumber     => '',
123 };
124
125 #############################################
126
127 test { shift->{qty}, shift->{qty} - 6.2, 'full object transfer back' } {
128    transfer_type    => SL::DB::Manager::TransferType->find_by(description => 'transfer'),
129    parts            => $part,
130    src_bin          => $bin2,
131    src_warehouse    => $wh,
132    dst_bin          => $bin1,
133    dst_warehouse    => $wh,
134    qty              => 6.2,
135    chargenumber     => '',
136 };
137
138 #############################################
139
140 test { shift->{qty}, shift->{qty}, 'back and forth in one transaction' } {
141    transfer_type    => SL::DB::Manager::TransferType->find_by(description => 'transfer'),
142    parts            => $part,
143    src_bin          => $bin2,
144    src_warehouse    => $wh,
145    dst_bin          => $bin1,
146    dst_warehouse    => $wh,
147    qty              => 1,
148 },
149 {
150    transfer_type    => SL::DB::Manager::TransferType->find_by(description => 'transfer'),
151    parts            => $part,
152    src_bin          => $bin1,
153    src_warehouse    => $wh,
154    dst_bin          => $bin2,
155    dst_warehouse    => $wh,
156    qty              => 1,
157 };
158
159 #############################################
160
161 test { shift->{qty}, shift->{qty}, 'warehouse reduced interface' } {
162    transfer_type    => SL::DB::Manager::TransferType->find_by(description => 'transfer'),
163    parts            => $part,
164    src_bin          => $bin2,
165    dst_bin          => $bin1,
166    qty              => 1,
167 },
168 {
169    transfer_type    => SL::DB::Manager::TransferType->find_by(description => 'transfer'),
170    parts            => $part,
171    src_bin          => $bin1,
172    dst_bin          => $bin2,
173    qty              => 1,
174 };
175
176
177 SL::DB::Manager::Inventory->delete_objects(where => [parts_id => $part->id]);
178
179 $bin1->delete;
180 $bin2->delete;
181 $wh->delete;
182 $part->delete;
183
184 done_testing;
185
186 1;