1 use Test::More tests => 28;
8 use Support::TestSetup;
10 use List::MoreUtils qw(none any);
12 use SL::Controller::CsvImport;
13 use_ok 'SL::Controller::CsvImport::DeliveryOrder';
15 use SL::Dev::ALL qw(:ALL);
17 Support::TestSetup::login();
21 my ($file, $settings) = @_;
23 my $controller = SL::Controller::CsvImport->new(
24 type => 'delivery_orders',
26 $controller->load_default_profile;
27 $controller->profile->set(
33 my $worker = SL::Controller::CsvImport::DeliveryOrder->new(
34 controller => $controller,
37 $worker->run(test => 0);
39 return if $worker->controller->errors;
41 # don't try and save objects that have errors
42 $worker->save_objects unless scalar @{$worker->controller->data->[0]->{errors}};
44 return $worker->controller->data;
48 foreach (qw(RecordLink Order DeliveryOrder Customer Part)) {
49 "SL::DB::Manager::${_}"->delete_all(all => 1);
51 SL::DB::Manager::Employee->delete_all(where => [ '!login' => 'unittests' ]);
56 # set numberformat and locale (so we can match errors)
57 my $old_numberformat = $::myconfig{numberformat};
58 $::myconfig{numberformat} = '1.000,00';
59 my $old_locale = $::locale;
60 $::locale = Locale->new('en');
73 @customers = (new_customer(name => 'TestCustomer1', discount => 0)->save);
75 new_part(description => 'TestPart1', ean => '')->save,
76 new_part(description => 'TestPart2', ean => '')->save
81 datatype;description;qty
83 DeliveryOrder;TestCustomer1
85 OrderItem;TestPart2;10
88 $entries = do_import($file);
90 $entry = $entries->[0];
91 is $entry->{object}->customer_id, $customers[0]->id, 'simple import: customer_id';
93 $entry = $entries->[1];
94 is $entry->{object}->parts_id, $parts[0]->id, 'simple import: part 1: parts_id';
95 is $entry->{object}->qty, 5, 'simple import: part 1: qty';
97 $entry = $entries->[2];
98 is $entry->{object}->parts_id, $parts[1]->id, 'simple import: part 2: parts_id';
99 is $entry->{object}->qty, 10, 'simple import: part 2: qty';
107 @customers = (new_customer(name => 'TestCustomer1', discount => 0)->save);
109 new_part(description => 'TestPart1', ean => '')->save,
110 new_part(description => 'TestPart2', ean => '')->save,
111 new_part(description => 'TestPart3', ean => '')->save
116 customer => $customers[0],
118 orderitems => [ create_order_item(part => $parts[0], qty => 3, sellprice => 70),
119 create_order_item(part => $parts[1], qty => 10, sellprice => 50),
120 create_order_item(part => $parts[2], qty => 8, sellprice => 80),
121 create_order_item(part => $parts[2], qty => 11, sellprice => 80)
127 datatype;customer;ordnumber
128 datatype;description;qty
130 DeliveryOrder;TestCustomer1;1234
131 OrderItem;TestPart1;5
132 OrderItem;TestPart2;10
133 OrderItem;TestPart3;7
134 OrderItem;TestPart3;1
135 OrderItem;TestPart3;11
138 1; # make emacs happy
141 # delivery oder pos/qty <- order pos/qty
148 $entries = do_import($file);
149 $orders[0]->load; # reload order to get correct delivered status
151 $entry = $entries->[0];
152 is $entry->{object}->ordnumber, '1234', 'with source order: ordnumber';
154 my $linked = $orders[0]->linked_records(to => 'DeliveryOrder');
155 ok(scalar @$linked == 1, 'with source order: order linked to one delivery order');
156 ok($linked->[0]->id == $entry->{object}->id, 'with source order: order linked to imported delivery order');
159 $linked = $entry->{object}->linked_records(from => 'Order');
160 ok(scalar @$linked == 1, 'with source order: delivery order linked from one order');
161 ok($linked->[0]->id == $orders[0]->id, 'with source order: delivery order linked from source order');
163 $entry = $entries->[1];
164 $linked = $entry->{object}->linked_records(from => 'OrderItem');
165 ok(scalar @$linked == 0, 'with source order: delivered qty > ordered qty: delivery order item not linked');
167 $entry = $entries->[2];
168 $linked = $entry->{object}->linked_records(from => 'OrderItem');
169 ok(scalar @$linked == 1, 'with source order: same qtys: delivery order item linked');
170 ok($linked->[0]->id == $orders[0]->items_sorted->[1]->id, 'with source order: same qtys: delivery order item linked from source order item');
172 $entry = $entries->[3];
173 $linked = $entry->{object}->linked_records(from => 'OrderItem');
174 ok(scalar @$linked == 1, 'with source order: delivered qty < ordered qty: delivery order item linked (fill up)');
175 ok($linked->[0]->position == 3, 'with source order: delivered qty < ordered qty: order position ok (fill up)');
177 $entry = $entries->[4];
178 $linked = $entry->{object}->linked_records(from => 'OrderItem');
179 ok(scalar @$linked == 1, 'with source order: delivered qty < ordered qty: delivery order item linked (fill up) 2');
180 ok($linked->[0]->position == 3, 'with source order: delivered qty < ordered qty: order position ok (fill up) 2');
182 $entry = $entries->[5];
183 $linked = $entry->{object}->linked_records(from => 'OrderItem');
184 ok(scalar @$linked == 1, 'with source order: delivered qty == ordered qty: found exact match after fill up');
185 ok($linked->[0]->position == 4, 'with source order: delivered qty == ordered qty: order position ok after fill up');
187 ok(!$orders[0]->delivered, 'with source order: order not completely delivered');
193 @customers = (new_customer(name => 'TestCustomer1', discount => 0)->save);
195 new_part(description => 'TestPart1', ean => '')->save,
196 new_part(description => 'TestPart2', ean => '')->save,
197 new_part(description => 'TestPart3', ean => '')->save
202 customer => $customers[0],
204 orderitems => [ create_order_item(part => $parts[0], qty => 3, sellprice => 70),
205 create_order_item(part => $parts[1], qty => 10, sellprice => 50),
206 create_order_item(part => $parts[2], qty => 8, sellprice => 80),
207 create_order_item(part => $parts[2], qty => 11, sellprice => 80)
213 datatype;customer;ordnumber
214 datatype;description;qty
216 DeliveryOrder;TestCustomer1;1234
217 OrderItem;TestPart1;1
218 OrderItem;TestPart2;10
219 OrderItem;TestPart1;2
220 OrderItem;TestPart3;7
221 OrderItem;TestPart3;11
222 OrderItem;TestPart3;1
226 1; # make emacs happy
229 # delivery oder pos/qty <- order pos/qty
237 $entries = do_import($file);
238 $orders[0]->load; # reload order to get correct delivered status
240 $entry = $entries->[1];
241 $linked = $entry->{object}->linked_records(from => 'OrderItem');
242 ok($linked->[0]->position == 1, 'with source order: mixed qtys and fill up: order position ok 1');
244 $entry = $entries->[2];
245 $linked = $entry->{object}->linked_records(from => 'OrderItem');
246 ok($linked->[0]->position == 2, 'with source order: mixed qtys and fill up: order position ok 2');
248 $entry = $entries->[3];
249 $linked = $entry->{object}->linked_records(from => 'OrderItem');
250 ok($linked->[0]->position == 1, 'with source order: mixed qtys and fill up: order position ok 3');
252 $entry = $entries->[4];
253 $linked = $entry->{object}->linked_records(from => 'OrderItem');
254 ok($linked->[0]->position == 3, 'with source order: mixed qtys and fill up: order position ok 4');
256 $entry = $entries->[5];
257 $linked = $entry->{object}->linked_records(from => 'OrderItem');
258 ok($linked->[0]->position == 4, 'with source order: mixed qtys and fill up: order position ok 5');
260 $entry = $entries->[6];
261 $linked = $entry->{object}->linked_records(from => 'OrderItem');
262 ok($linked->[0]->position == 3, 'with source order: mixed qtys and fill up: order position ok 6');
264 ok(!!$orders[0]->delivered, 'with source order: mixed qtys and fill up: order completely delivered');
272 $::myconfig{numberformat} = $old_numberformat;
273 $::locale = $old_locale;
279 # set emacs to perl mode