X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fhelper%2Fshipped_qty.t;h=dc2f9dd3b4e1ef19892f61738a5f5e81de569a4e;hb=a8fb17eaa5b626f00321bfa6b661488849c736e5;hp=ed60f5685a44975532bc0ff3a3f7ce3f36f0a8f8;hpb=c50467096da70f299a297214cfd0808b3cdbecf4;p=kivitendo-erp.git diff --git a/t/helper/shipped_qty.t b/t/helper/shipped_qty.t index ed60f5685..dc2f9dd3b 100644 --- a/t/helper/shipped_qty.t +++ b/t/helper/shipped_qty.t @@ -18,7 +18,7 @@ use SL::DB::DeliveryOrderItemsStock; use SL::DB::Bin; use SL::WH; use SL::AM; -use SL::Dev::ALL; +use SL::Dev::ALL qw(:ALL); use SL::Helper::ShippedQty; use DateTime; @@ -28,13 +28,13 @@ clear_up(); my ($customer, $vendor, @parts, $unit); -$customer = SL::Dev::CustomerVendor::create_customer(name => 'Testkunde' )->save; -$vendor = SL::Dev::CustomerVendor::create_vendor( name => 'Testlieferant')->save; +$customer = new_customer(name => 'Testkunde' )->save; +$vendor = new_vendor( name => 'Testlieferant')->save; my $default_sellprice = 10; my $default_lastcost = 4; -my ($wh) = SL::Dev::Inventory::create_warehouse_and_bins(); +my ($wh) = create_warehouse_and_bins(); my $bin1 = SL::DB::Manager::Bin->find_by(description => "Bin 1"); my $bin2 = SL::DB::Manager::Bin->find_by(description => "Bin 2"); @@ -46,7 +46,7 @@ my %part_defaults = ( # create 3 parts to be used in test for my $i ( 1 .. 4 ) { - SL::Dev::Part::create_part( %part_defaults, partnumber => $i, description => "part $i test" )->save; + new_part( %part_defaults, partnumber => $i, description => "part $i test" )->save; }; my $part1 = SL::DB::Manager::Part->find_by( partnumber => '1' ); @@ -63,42 +63,45 @@ my %default_transfer_params = ( wh => $wh, bin => $bin1, unit => 'Stck'); note("testing purchases, no fill_up"); -my $purchase_order = SL::Dev::Record::create_purchase_order( +my $purchase_order = create_purchase_order( save => 1, - orderitems => [ SL::Dev::Record::create_order_item(part => $part1, qty => 11), - SL::Dev::Record::create_order_item(part => $part2, qty => 12), - SL::Dev::Record::create_order_item(part => $part3, qty => 13), + orderitems => [ create_order_item(part => $part1, qty => 11), + create_order_item(part => $part2, qty => 12), + create_order_item(part => $part3, qty => 13), ] ); +Rose::DB::Object::Helpers::forget_related($purchase_order, 'orderitems'); +$purchase_order->orderitems; + SL::Helper::ShippedQty ->new(require_stock_out => 1) # should make no difference while there is no delivery order ->calculate($purchase_order) ->write_to_objects; -is($purchase_order->orderitems->[0]->{shipped_qty}, undef, "first purchase orderitem has no shipped_qty"); -is($purchase_order->orderitems->[0]->{delivered}, '', "first purchase orderitem is not delivered"); +is($purchase_order->items_sorted->[0]->{shipped_qty}, 0, "first purchase orderitem has no shipped_qty"); +ok(!$purchase_order->items_sorted->[0]->{delivered}, "first purchase orderitem is not delivered"); my $purchase_orderitem_part1 = SL::DB::Manager::OrderItem->find_by( parts_id => $part1->id, trans_id => $purchase_order->id); -is($purchase_orderitem_part1->shipped_qty, undef, "OrderItem shipped_qty method ok"); +is($purchase_orderitem_part1->shipped_qty, 0, "OrderItem shipped_qty method ok"); is($purchase_order->closed, 0, 'purchase order is open'); -is($purchase_order->delivered, '', 'purchase order is not delivered'); +ok(!$purchase_order->delivered, 'purchase order is not delivered'); note('converting purchase order to delivery order'); # create purchase delivery order from purchase order my $purchase_delivery_order = $purchase_order->convert_to_delivery_order; is($purchase_order->closed, 0, 'purchase order is open'); -is($purchase_order->delivered, 1, 'purchase order is now delivered'); +ok($purchase_order->delivered, 'purchase order is now delivered'); SL::Helper::ShippedQty ->new(require_stock_out => 0) ->calculate($purchase_order) ->write_to_objects; -is($purchase_order->orderitems->[0]->{shipped_qty}, 11, "require_stock_out => 0: first purchase orderitem has shipped_qty"); -is($purchase_order->orderitems->[0]->{delivered}, 1, "require_stock_out => 0: first purchase orderitem is delivered"); +is($purchase_order->items_sorted->[0]->{shipped_qty}, 11, "require_stock_out => 0: first purchase orderitem has shipped_qty"); +ok($purchase_order->items_sorted->[0]->{delivered}, "require_stock_out => 0: first purchase orderitem is delivered"); Rose::DB::Object::Helpers::forget_related($purchase_order, 'orderitems'); $purchase_order->orderitems; @@ -108,50 +111,53 @@ SL::Helper::ShippedQty ->calculate($purchase_order) ->write_to_objects; -is($purchase_order->orderitems->[0]->{shipped_qty}, undef, "require_stock_out => 1: first purchase orderitem has no shipped_qty"); -is($purchase_order->orderitems->[0]->{delivered}, '', "require_stock_out => 1: first purchase orderitem is not delivered"); +is($purchase_order->items_sorted->[0]->{shipped_qty}, 0, "require_stock_out => 1: first purchase orderitem has no shipped_qty"); +ok(!$purchase_order->items_sorted->[0]->{delivered}, "require_stock_out => 1: first purchase orderitem is not delivered"); # ship items from delivery order -SL::Dev::Inventory::transfer_purchase_delivery_order($purchase_delivery_order); +transfer_purchase_delivery_order($purchase_delivery_order); Rose::DB::Object::Helpers::forget_related($purchase_order, 'orderitems'); $purchase_order->orderitems; SL::Helper::ShippedQty - ->new(require_stock_out => 1) # shouldn't make a difference now after shipping + ->new(require_stock_out => 1, keep_matches => 1) # shouldn't make a difference now after shipping ->calculate($purchase_order) ->write_to_objects; -is($purchase_order->orderitems->[0]->{shipped_qty}, 11, "require_stock_out => 1: first purchase orderitem has shipped_qty"); -is($purchase_order->orderitems->[0]->{delivered}, 1, "require_stock_out => 1: first purchase orderitem is delivered"); +is($purchase_order->items_sorted->[0]->{shipped_qty}, 11, "require_stock_out => 1: first purchase orderitem has shipped_qty"); +ok($purchase_order->items_sorted->[0]->{delivered}, "require_stock_out => 1: first purchase orderitem is delivered"); -my $purchase_orderitem_part1 = SL::DB::Manager::OrderItem->find_by(parts_id => $part1->id, trans_id => $purchase_order->id); +my $purchase_orderitem_part2 = SL::DB::Manager::OrderItem->find_by(parts_id => $part1->id, trans_id => $purchase_order->id); -is($purchase_orderitem_part1->shipped_qty(require_stock_out => 1), 11, "OrderItem shipped_qty from helper ok"); +is($purchase_orderitem_part2->shipped_qty(require_stock_out => 1), 11, "OrderItem shipped_qty from helper ok"); note('testing sales, no fill_up'); -my $sales_order = SL::Dev::Record::create_sales_order( +my $sales_order = create_sales_order( save => 1, - orderitems => [ SL::Dev::Record::create_order_item(part => $part1, qty => 5), - SL::Dev::Record::create_order_item(part => $part2, qty => 6), - SL::Dev::Record::create_order_item(part => $part3, qty => 7), + orderitems => [ create_order_item(part => $part1, qty => 5), + create_order_item(part => $part2, qty => 6), + create_order_item(part => $part3, qty => 7), ] ); +Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems'); +$sales_order->orderitems; + SL::Helper::ShippedQty ->new(require_stock_out => 1) # should make no difference while there is no delivery order ->calculate($sales_order) ->write_to_objects; -is($sales_order->orderitems->[0]->{shipped_qty}, undef, "first sales orderitem has no shipped_qty"); -is($sales_order->orderitems->[0]->{delivered}, '', "first sales orderitem is not delivered"); +is($sales_order->items_sorted->[0]->{shipped_qty}, 0, "first sales orderitem has no shipped_qty"); +ok(!$sales_order->items_sorted->[0]->{delivered}, "first sales orderitem is not delivered"); my $orderitem_part1 = SL::DB::Manager::OrderItem->find_by(parts_id => $part1->id, trans_id => $sales_order->id); my $orderitem_part2 = SL::DB::Manager::OrderItem->find_by(parts_id => $part2->id, trans_id => $sales_order->id); -is($orderitem_part1->shipped_qty, undef, "OrderItem shipped_qty method ok"); +is($orderitem_part1->shipped_qty, 0, "OrderItem shipped_qty method ok"); # create sales delivery order from sales order my $sales_delivery_order = $sales_order->convert_to_delivery_order; @@ -161,8 +167,8 @@ SL::Helper::ShippedQty ->calculate($sales_order) ->write_to_objects; -is($sales_order->orderitems->[0]->{shipped_qty}, 5, "require_stock_out => 0: first sales orderitem has shipped_qty"); -is($sales_order->orderitems->[0]->{delivered}, 1, "require_stock_out => 0: first sales orderitem is delivered"); +is($sales_order->items_sorted->[0]->{shipped_qty}, 5, "require_stock_out => 0: first sales orderitem has shipped_qty"); +ok($sales_order->items_sorted->[0]->{delivered}, "require_stock_out => 0: first sales orderitem is delivered"); Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems'); $sales_order->orderitems; @@ -172,11 +178,11 @@ SL::Helper::ShippedQty ->calculate($sales_order) ->write_to_objects; -is($sales_order->orderitems->[0]->{shipped_qty}, undef, "require_stock_out => 1: first sales orderitem has no shipped_qty"); -is($sales_order->orderitems->[0]->{delivered}, '', "require_stock_out => 1: first sales orderitem is not delivered"); +is($sales_order->items_sorted->[0]->{shipped_qty}, 0, "require_stock_out => 1: first sales orderitem has no shipped_qty"); +ok(!$sales_order->items_sorted->[0]->{delivered}, "require_stock_out => 1: first sales orderitem is not delivered"); # ship items from delivery order -SL::Dev::Inventory::transfer_sales_delivery_order($sales_delivery_order); +transfer_sales_delivery_order($sales_delivery_order); Rose::DB::Object::Helpers::forget_related($sales_order, 'orderitems'); $sales_order->orderitems; @@ -186,8 +192,8 @@ SL::Helper::ShippedQty ->calculate($sales_order) ->write_to_objects; -is($sales_order->orderitems->[0]->{shipped_qty}, 5, "require_stock_out => 1: first sales orderitem has no shipped_qty"); -is($sales_order->orderitems->[0]->{delivered}, 1, "require_stock_out => 1: first sales orderitem is not delivered"); +is($sales_order->items_sorted->[0]->{shipped_qty}, 5, "require_stock_out => 1: first sales orderitem has no shipped_qty"); +ok($sales_order->items_sorted->[0]->{delivered}, "require_stock_out => 1: first sales orderitem is not delivered"); $orderitem_part1 = SL::DB::Manager::OrderItem->find_by(parts_id => $part1->id, trans_id => $sales_order->id); @@ -200,6 +206,57 @@ is ($number_of_linked_items , 6, "6 record_links for items, 3 from sales order, clear_up(); +{ +# legacy unlinked scenario: +# +# order with two positions of the same part, qtys: 5, 3. +# 3 linked delivery orders, with positions: +# 1: 3 unlinked +# 2: 1 linked to 1, 3 linked to 2 +# 3: 1 linked to 1 +# +# should be resolved under fill_up as 5/3, but gets resolved as 4/4 + my $part = new_part()->save; + my $order = create_sales_order( + orderitems => [ + create_order_item(part => $part, qty => 5), + create_order_item(part => $part, qty => 3), + ], + )->save; + my $do1 = create_sales_delivery_order( + orderitems => [ + create_delivery_order_item(part => $part, qty => 3), + ], + ); + my $do2 = create_sales_delivery_order( + orderitems => [ + create_delivery_order_item(part => $part, qty => 1), + create_delivery_order_item(part => $part, qty => 3), + ], + ); + my $do3 = create_sales_delivery_order( + orderitems => [ + create_delivery_order_item(part => $part, qty => 1), + ], + ); + $order->link_to_record($do1); + $order->link_to_record($do2); + $order->items_sorted->[0]->link_to_record($do2->items_sorted->[0]); + $order->items_sorted->[1]->link_to_record($do2->items_sorted->[1]); + $order->link_to_record($do3); + $order->items_sorted->[0]->link_to_record($do3->items->[0]); + + SL::Helper::ShippedQty + ->new(fill_up => 1, require_stock_out => 0) + ->calculate($order) + ->write_to_objects; + + is $order->items_sorted->[0]->{shipped_qty}, 5, 'unlinked legacy position test 1'; + is $order->items_sorted->[1]->{shipped_qty}, 3, 'unlinked legacy position test 2'; +} + +clear_up(); + done_testing; sub clear_up {