X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=t%2Fwh%2Finventory.t;h=3c125a790efef91f5052739c9da31fb07cbd5ff1;hb=0ca7f6f9d4603bb146c2c653a6edb73d70f609d5;hp=94214c914212098a5d9798f58daac9659aa7bf03;hpb=001742d8749cdb9a6788a2451cd12aa370e76be5;p=kivitendo-erp.git diff --git a/t/wh/inventory.t b/t/wh/inventory.t index 94214c914..3c125a790 100644 --- a/t/wh/inventory.t +++ b/t/wh/inventory.t @@ -5,7 +5,7 @@ use Test::Exception; use lib 't'; -use SL::Dev::Part qw(new_part new_assembly); +use SL::Dev::Part qw(new_part new_assembly new_service); use SL::Dev::Inventory qw(create_warehouse_and_bins set_stock); use SL::Dev::Record qw(create_sales_order); @@ -19,7 +19,8 @@ use_ok 'SL::Helper::Inventory'; Support::TestSetup::login(); -my ($wh, $bin1, $bin2, $assembly1, $part1, $part2); +my ($wh, $bin1, $bin2, $assembly1, $assembly_service, $part1, $part2, $wh_moon, $bin_moon, $service1); +my @contents; reset_db(); create_standard_stock(); @@ -150,6 +151,7 @@ is(SL::Helper::Inventory::get_stock(part => $part2), "7.00000", '..the materials # produce the same using auto_allocation +local $::locale = Locale->new('en'); reset_db(); create_standard_stock(); @@ -184,7 +186,7 @@ $::form->{l_warehouse_from} = 'Y'; $::form->{l_warehouse_to} = 'Y'; local $::instance_conf->data->{produce_assembly_same_warehouse} = 1; -my @contents = WH->get_warehouse_journal(sort => 'date'); +@contents = WH->get_warehouse_journal(sort => 'date'); cmp_deeply(\@contents, [ ignore(), ignore(), @@ -204,10 +206,41 @@ cmp_deeply(\@contents, "Comments for assembly productions are ok" ); +# try to produce something for our lunar warehouse, but parts are only available on earth +dies_ok(sub { +SL::Helper::Inventory::produce_assembly( + part => $assembly1, + qty => 1, + auto_allocate => 1, + # where to put it + bin => $bin_moon, + chargenumber => "Lunar Dust inside", +); +}, "producing for wrong warehouse dies"); +# same test, but check exception class +throws_ok{ +SL::Helper::Inventory::produce_assembly( + part => $assembly1, + qty => 1, + auto_allocate => 1, + # where to put it + bin => $bin_moon, + chargenumber => "Lunar Dust inside", +); + } "SL::X::Inventory::Allocation", "producing for wrong warehouse throws correct error class"; - - +# same test, but check user feedback for the error message +throws_ok{ +SL::Helper::Inventory::produce_assembly( + part => $assembly1, + qty => 1, + auto_allocate => 1, + # where to put it + bin => $bin_moon, + chargenumber => "Lunar Dust inside", +); + } qr/Part ap (1|2) Testpart (1|2) exists in warehouse Warehouse, but not in warehouse Our warehouse location at the moon/, "producing for wrong warehouse throws correct error message"; # try to produce without allocations dies @@ -240,6 +273,146 @@ SL::Helper::Inventory::produce_assembly( }, "producing with insufficient allocations dies"); +# assembly with service default tests (services won't be consumed) + +local $::locale = Locale->new('en'); +reset_db(); +create_standard_stock(); + +set_stock( + part => $part1, + qty => 12, + bin => $bin2, +); +set_stock( + part => $part2, + qty => 6.34, + bin => $bin2, +); + +SL::Helper::Inventory::produce_assembly( + part => $assembly_service, + qty => 1, + auto_allocate => 1, + # where to put it + bin => $bin1, +); + +is(SL::Helper::Inventory::get_stock(part => $assembly_service), "1.00000", 'produce with auto allocation works'); +is(SL::Helper::Inventory::get_stock(part => $part1), "0.00000", 'and consumes...'); +is(SL::Helper::Inventory::get_stock(part => $part2), "0.00000", '..the materials'); + +# check comments and warehouses +$::form->{l_comment} = 'Y'; +$::form->{l_warehouse_from} = 'Y'; +$::form->{l_warehouse_to} = 'Y'; +local $::instance_conf->data->{produce_assembly_same_warehouse} = 1; + +@contents = WH->get_warehouse_journal(sort => 'date'); + +cmp_deeply(\@contents, + [ ignore(), ignore(), + superhashof({ + 'comment' => 'Used for assembly '. $assembly_service->partnumber .' Ein Erzeugnis mit Dienstleistungen', + 'warehouse_from' => 'Warehouse' + }), + superhashof({ + 'comment' => 'Used for assembly '. $assembly_service->partnumber .' Ein Erzeugnis mit Dienstleistungen', + 'warehouse_from' => 'Warehouse' + }), + superhashof({ + 'part_type' => 'assembly', + 'warehouse_to' => 'Warehouse' + }), + ], + "Comments for assembly with service productions are ok" +); + +# assembly with service non default tests (services will be consumed) + +local $::instance_conf->data->{produce_assembly_transfer_service} = 1; + +set_stock( + part => $part1, + qty => 12, + bin => $bin2, +); +set_stock( + part => $part2, + qty => 6.34, + bin => $bin2, +); + +throws_ok{ + SL::Helper::Inventory::produce_assembly( + part => $assembly_service, + qty => 1, + auto_allocate => 1, + # where to put it + bin => $bin1, + ); +} qr/can not allocate 1,2 units of service number 1 We really need this service, missing 1,2 units/, "producing assembly with services and unstocked service throws correct error message"; + +is(SL::Helper::Inventory::get_stock(part => $assembly_service), "1.00000", 'produce without service does not work'); +is(SL::Helper::Inventory::get_stock(part => $part1), "12.00000", 'and does not consume...'); +is(SL::Helper::Inventory::get_stock(part => $part2), "6.34000", '..the materials'); + + +# ok, now add the missing service +is('SL::DB::Part', ref $service1); +set_stock( + part => $service1, + qty => 1.2, + bin => $bin2, +); + +SL::Helper::Inventory::produce_assembly( + part => $assembly_service, + qty => 1, + auto_allocate => 1, + # where to put it + bin => $bin1, +); + +is(SL::Helper::Inventory::get_stock(part => $assembly_service), "2.00000", 'produce with service does work if services is needed and stocked'); +is(SL::Helper::Inventory::get_stock(part => $part1), "0.00000", 'and does consume...'); +is(SL::Helper::Inventory::get_stock(part => $part2), "0.00000", '..the materials'); +is(SL::Helper::Inventory::get_stock(part => $service1), "0.00000", '..and service'); + +# check comments and warehouses for assembly with service +$::form->{l_comment} = 'Y'; +$::form->{l_warehouse_from} = 'Y'; +$::form->{l_warehouse_to} = 'Y'; +local $::instance_conf->data->{produce_assembly_same_warehouse} = 1; + +@contents = WH->get_warehouse_journal(sort => 'date'); +#use Data::Dumper; +#diag("hier" . Dumper(@contents)); +cmp_deeply(\@contents, + [ ignore(), ignore(), ignore(), ignore(), ignore(), ignore(), ignore(), ignore(), + superhashof({ + 'comment' => 'Used for assembly '. $assembly_service->partnumber .' Ein Erzeugnis mit Dienstleistungen', + 'warehouse_from' => 'Warehouse' + }), + superhashof({ + 'comment' => 'Used for assembly '. $assembly_service->partnumber .' Ein Erzeugnis mit Dienstleistungen', + 'warehouse_from' => 'Warehouse' + }), + superhashof({ + 'comment' => 'Used for assembly '. $assembly_service->partnumber .' Ein Erzeugnis mit Dienstleistungen', + 'warehouse_from' => 'Warehouse', + 'part_type' => 'service', + 'qty' => '1.20000', + }), + superhashof({ + 'part_type' => 'assembly', + 'warehouse_to' => 'Warehouse' + }), + ], + "Comments for assembly with service productions are ok" +); + + # bestbefore tests @@ -301,12 +474,36 @@ sub reset_db { } sub create_standard_stock { - ($wh, $bin1) = create_warehouse_and_bins(); + ($wh, $bin1) = create_warehouse_and_bins(); + ($wh_moon, $bin_moon) = create_warehouse_and_bins( + warehouse_description => 'Our warehouse location at the moon', + bin_description => 'Lunar crater', + ); $bin2 = SL::DB::Bin->new(description => "Bin 2", warehouse => $wh)->save; $wh->load; $assembly1 = new_assembly(number_of_parts => 2)->save; ($part1, $part2) = map { $_->part } $assembly1->assemblies; + + $service1 = new_service(partnumber => "service number 1", + description => "We really need this service", + )->save; + my $assembly_items; + push( @{$assembly_items}, SL::DB::Assembly->new(parts_id => $part1->id, + qty => 12, + position => 1, + )); + push( @{$assembly_items}, SL::DB::Assembly->new(parts_id => $part2->id, + qty => 6.34, + position => 2, + )); + push( @{$assembly_items}, SL::DB::Assembly->new(parts_id => $service1->id, + qty => 1.2, + position => 3, + )); + $assembly_service = new_assembly(description => 'Ein Erzeugnis mit Dienstleistungen', + assembly_items => $assembly_items + )->save; }