+# "Flavoured" tests (tests that required a run for each marc flavour)
+# Tests should be added to the run_flavoured_tests sub below
+my $biblio_module = Test::MockModule->new('C4::Biblio');
+$biblio_module->mock(
+ 'GetMarcSubfieldStructure',
+ sub {
+ my ($self) = shift;
+
+ my ( $title_field, $title_subfield ) = get_title_field();
+ my ( $isbn_field, $isbn_subfield ) = get_isbn_field();
+ my ( $issn_field, $issn_subfield ) = get_issn_field();
+ my ( $biblionumber_field, $biblionumber_subfield ) = ( '999', 'c' );
+ my ( $biblioitemnumber_field, $biblioitemnumber_subfield ) = ( '999', '9' );
+ my ( $itemnumber_field, $itemnumber_subfield ) = get_itemnumber_field();
+
+ return {
+ 'biblio.title' => [ { tagfield => $title_field, tagsubfield => $title_subfield } ],
+ 'biblio.biblionumber' => [ { tagfield => $biblionumber_field, tagsubfield => $biblionumber_subfield } ],
+ 'biblioitems.isbn' => [ { tagfield => $isbn_field, tagsubfield => $isbn_subfield } ],
+ 'biblioitems.issn' => [ { tagfield => $issn_field, tagsubfield => $issn_subfield } ],
+ 'biblioitems.biblioitemnumber' => [ { tagfield => $biblioitemnumber_field, tagsubfield => $biblioitemnumber_subfield } ],
+ 'items.itemnumber' => [ { tagfield => $itemnumber_subfield, tagsubfield => $itemnumber_subfield } ],
+ };
+ }
+);
+
+sub run_flavoured_tests {
+ my $marcflavour = shift;
+ t::lib::Mocks::mock_preference('marcflavour', $marcflavour);
+
+ #
+ # Test SearchWithISBNVariations syspref
+ #
+ my $marc_record = MARC::Record->new;
+ $marc_record->append_fields( create_isbn_field( '9780136019701', $marcflavour ) );
+ my ( $biblionumber6, $biblioitemnumber6 ) = AddBiblio( $marc_record, '' );
+
+ # Create order
+ my $ordernumber = Koha::Acquisition::Order->new( {
+ basketno => $basketno,
+ biblionumber => $biblionumber6,
+ budget_id => $budget->{budget_id},
+ order_internalnote => "internal note",
+ order_vendornote => "vendor note",
+ quantity => 1,
+ ecost => 10,
+ rrp => 10,
+ listprice => 10,
+ ecost => 10,
+ rrp => 10,
+ discount => 0,
+ uncertainprice => 0,
+ } )->store->ordernumber;
+
+ t::lib::Mocks::mock_preference('SearchWithISBNVariations', 0);
+ $orders = GetHistory( isbn => '0136019706' );
+ is( scalar(@$orders), 0, "GetHistory searches correctly by ISBN" );
+
+ t::lib::Mocks::mock_preference('SearchWithISBNVariations', 1);
+ $orders = GetHistory( isbn => '0136019706' );
+ is( scalar(@$orders), 1, "GetHistory searches correctly by ISBN" );
+
+ Koha::Acquisition::Orders->find($ordernumber)->cancel;
+}
+
+# Do "flavoured" tests
+subtest 'MARC21' => sub {
+ plan tests => 2;
+ run_flavoured_tests('MARC21');
+};
+
+subtest 'UNIMARC' => sub {
+ plan tests => 2;
+ run_flavoured_tests('UNIMARC');
+};
+
+subtest 'NORMARC' => sub {
+ plan tests => 2;
+ run_flavoured_tests('NORMARC');
+};
+
+### Functions required for "flavoured" tests
+sub get_title_field {
+ my $marc_flavour = C4::Context->preference('marcflavour');
+ return ( $marc_flavour eq 'UNIMARC' ) ? ( '200', 'a' ) : ( '245', 'a' );
+}
+
+sub get_isbn_field {
+ my $marc_flavour = C4::Context->preference('marcflavour');
+ return ( $marc_flavour eq 'UNIMARC' ) ? ( '010', 'a' ) : ( '020', 'a' );
+}
+
+sub get_issn_field {
+ my $marc_flavour = C4::Context->preference('marcflavour');
+ return ( $marc_flavour eq 'UNIMARC' ) ? ( '011', 'a' ) : ( '022', 'a' );
+}
+
+sub get_itemnumber_field {
+ my $marc_flavour = C4::Context->preference('marcflavour');
+ return ( $marc_flavour eq 'UNIMARC' ) ? ( '995', '9' ) : ( '952', '9' );
+}
+
+sub create_isbn_field {
+ my ( $isbn, $marcflavour ) = @_;
+
+ my ( $isbn_field, $isbn_subfield ) = get_isbn_field();
+ my $field = MARC::Field->new( $isbn_field, '', '', $isbn_subfield => $isbn );
+
+ # Add the price subfield
+ my $price_subfield = ( $marcflavour eq 'UNIMARC' ) ? 'd' : 'c';
+ $field->add_subfields( $price_subfield => '$100' );
+
+ return $field;
+}
+
+subtest 'ModReceiveOrder replacementprice tests' => sub {
+ plan tests => 2;
+ #Let's build an order, we need a couple things though
+ my $builder = t::lib::TestBuilder->new;
+ my $order_biblio = $builder->build_sample_biblio;
+ my $order_basket = $builder->build({ source => 'Aqbasket', value => { is_standing => 0 } });
+ my $order_invoice = $builder->build({ source => 'Aqinvoice'});
+ my $order_currency = $builder->build({ source => 'Currency', value => { active => 1, archived => 0, symbol => 'F', rate => 2, isocode => undef, currency => 'FOO' } });
+ my $order_vendor = $builder->build({ source => 'Aqbookseller',value => { listincgst => 0, listprice => $order_currency->{currency}, invoiceprice => $order_currency->{currency} } });
+ my $orderinfo ={
+ basketno => $order_basket->{basketno},
+ booksellerid => $order_vendor->{id},
+ rrp => 19.99,
+ replacementprice => undef,
+ quantity => 1,
+ quantityreceived => 0,
+ datereceived => undef,
+ datecancellationprinted => undef,
+ };
+ my $receive_order = $builder->build({ source => 'Aqorder', value => $orderinfo });
+ (undef, my $received_ordernumber) = ModReceiveOrder({
+ biblionumber => $order_biblio->biblionumber,
+ order => $receive_order,
+ invoice => $order_invoice,
+ quantityreceived => $receive_order->{quantity},
+ budget_id => $order->{budget_id},
+ });
+ my $received_order = GetOrder($received_ordernumber);
+ is ($received_order->{replacementprice},undef,"No price set if none passed in");
+ $orderinfo->{replacementprice} = 16.12;
+ $receive_order = $builder->build({ source => 'Aqorder', value => $orderinfo });
+ (undef, $received_ordernumber) = ModReceiveOrder({
+ biblionumber => $order_biblio->biblionumber,
+ order => $receive_order,
+ invoice => $order_invoice,
+ quantityreceived => $receive_order->{quantity},
+ budget_id => $order->{budget_id},
+ });
+ $received_order = GetOrder($received_ordernumber);
+ is ($received_order->{replacementprice},'16.120000',"Replacement price set if none passed in");
+};
+
+subtest 'ModReceiveOrder and subscription' => sub {
+ plan tests => 2;
+
+ my $builder = t::lib::TestBuilder->new;
+ my $first_note = 'first note';
+ my $second_note = 'second note';
+ my $subscription = $builder->build_object( { class => 'Koha::Subscriptions' } );
+ my $order = $builder->build_object(
+ {
+ class => 'Koha::Acquisition::Orders',
+ value => {
+ subscriptionid => $subscription->subscriptionid,
+ order_internalnote => $first_note,
+ quantity => 5,
+ quantityreceived => 0,
+ ecost_tax_excluded => 42,
+ unitprice_tax_excluded => 42,
+ }
+ }
+ );
+ my $order_info = $order->unblessed;
+ # We do not want the note from the original note to be modified
+ # Keeping it will permit to display it for future receptions
+ $order_info->{order_internalnote} = $second_note;
+ my ( undef, $received_ordernumber ) = ModReceiveOrder(
+ {
+ biblionumber => $order->biblionumber,
+ order => $order_info,
+ invoice => $order->{invoiceid},
+ quantityreceived => 1,
+ budget_id => $order->budget_id,
+ }
+ );
+ my $received_order = Koha::Acquisition::Orders->find($received_ordernumber);
+ is( $received_order->order_internalnote,
+ $second_note, "No price set if none passed in" );
+
+ $order->get_from_storage;
+ is( $order->get_from_storage->order_internalnote, $first_note );
+};
+
+subtest 'GetHistory with additional fields' => sub {
+ plan tests => 3;
+ my $builder = t::lib::TestBuilder->new;
+ my $order_basket = $builder->build({ source => 'Aqbasket', value => { is_standing => 0 } });
+ my $orderinfo ={
+ basketno => $order_basket->{basketno},
+ rrp => 19.99,
+ replacementprice => undef,
+ quantity => 1,
+ quantityreceived => 0,
+ datereceived => undef,
+ datecancellationprinted => undef,
+ };
+ my $order = $builder->build({ source => 'Aqorder', value => $orderinfo });
+ my $history = GetHistory(ordernumber => $order->{ordernumber});
+ is( scalar( @$history ), 1, 'GetHistory returns the one order');
+
+ my $additional_field = $builder->build({source => 'AdditionalField', value => {
+ tablename => 'aqbasket',
+ name => 'snakeoil',
+ authorised_value_category => "",
+ }
+ });
+ $history = GetHistory( ordernumber => $order->{ordernumber}, additional_fields => [{ id => $additional_field->{id}, value=>'delicious'}]);
+ is( scalar ( @$history ), 0, 'GetHistory returns no order for an unused additional field');
+ my $basket = Koha::Acquisition::Baskets->find({ basketno => $order_basket->{basketno} });
+ $basket->set_additional_fields([{
+ id => $additional_field->{id},
+ value => 'delicious',
+ }]);
+
+ $history = GetHistory( ordernumber => $order->{ordernumber}, additional_fields => [{ id => $additional_field->{id}, value=>'delicious'}]);
+ is( scalar( @$history ), 1, 'GetHistory returns the order when additional field is set');
+};
+
+subtest 'Tests for get_rounding_sql' => sub {
+
+ plan tests => 2;
+
+ my $value = '3.141592';
+
+ t::lib::Mocks::mock_preference( 'OrderPriceRounding', q{} );
+ my $no_rounding_result = C4::Acquisition::get_rounding_sql($value);
+ t::lib::Mocks::mock_preference( 'OrderPriceRounding', q{nearest_cent} );
+ my $rounding_result = C4::Acquisition::get_rounding_sql($value);
+
+ ok( $no_rounding_result eq $value, "Value ($value) not to be rounded" );
+ ok( $rounding_result =~ /CAST/, "Value ($value) will be rounded" );
+
+};
+
+subtest 'Test for get_rounded_price' => sub {
+
+ plan tests => 6;
+
+ my $exact_price = 3.14;
+ my $up_price = 3.145592;
+ my $down_price = 3.141592;
+ my $round_up_price = sprintf( '%0.2f', $up_price );
+ my $round_down_price = sprintf( '%0.2f', $down_price );
+
+ t::lib::Mocks::mock_preference( 'OrderPriceRounding', q{} );
+ my $not_rounded_result1 = C4::Acquisition::get_rounded_price($exact_price);
+ my $not_rounded_result2 = C4::Acquisition::get_rounded_price($up_price);
+ my $not_rounded_result3 = C4::Acquisition::get_rounded_price($down_price);
+ t::lib::Mocks::mock_preference( 'OrderPriceRounding', q{nearest_cent} );
+ my $rounded_result1 = C4::Acquisition::get_rounded_price($exact_price);
+ my $rounded_result2 = C4::Acquisition::get_rounded_price($up_price);
+ my $rounded_result3 = C4::Acquisition::get_rounded_price($down_price);
+
+ is( $not_rounded_result1, $exact_price, "Price ($exact_price) was correctly not rounded ($not_rounded_result1)" );
+ is( $not_rounded_result2, $up_price, "Price ($up_price) was correctly not rounded ($not_rounded_result2)" );
+ is( $not_rounded_result3, $down_price, "Price ($down_price) was correctly not rounded ($not_rounded_result3)" );
+ is( $rounded_result1, $exact_price, "Price ($exact_price) was correctly rounded ($rounded_result1)" );
+ is( $rounded_result2, $round_up_price, "Price ($up_price) was correctly rounded ($rounded_result2)" );
+ is( $rounded_result3, $round_down_price, "Price ($down_price) was correctly rounded ($rounded_result3)" );
+
+};
+
+subtest 'GetHistory - managing library' => sub {
+
+ plan tests => 1;
+
+ my $orders = GetHistory(managing_library => 'CPL');
+
+ my $builder = t::lib::TestBuilder->new;
+
+ my $order_basket1 = $builder->build({ source => 'Aqbasket', value => { branch => 'CPL' } });
+ my $orderinfo1 ={
+ basketno => $order_basket1->{basketno},
+ rrp => 19.99,
+ replacementprice => undef,
+ quantity => 1,
+ quantityreceived => 0,
+ datereceived => undef,
+ datecancellationprinted => undef,
+ };
+ my $order1 = $builder->build({ source => 'Aqorder', value => $orderinfo1 });
+
+ my $order_basket2 = $builder->build({ source => 'Aqbasket', value => { branch => 'LIB' } });
+ my $orderinfo2 ={
+ basketno => $order_basket2->{basketno},
+ rrp => 19.99,
+ replacementprice => undef,
+ quantity => 1,
+ quantityreceived => 0,
+ datereceived => undef,
+ datecancellationprinted => undef,
+ };
+ my $order2 = $builder->build({ source => 'Aqorder', value => $orderinfo2 });
+
+ my $history = GetHistory(managing_library => 'CPL');
+ is( scalar( @$history), scalar ( @$orders ) +1, "GetHistory returns number of orders");
+
+};
+
+subtest 'GetHistory - is_standing' => sub {
+
+ plan tests => 1;
+
+ my $orders = GetHistory( is_standing => '1' );
+
+ my $builder = t::lib::TestBuilder->new;
+
+ my $order_basket1 = $builder->build( { source => 'Aqbasket', value => { is_standing => 0 } } );
+ my $orderinfo1 = {
+ basketno => $order_basket1->{basketno},
+ rrp => 19.99,
+ replacementprice => undef,
+ quantity => 1,
+ quantityreceived => 0,
+ datereceived => undef,
+ datecancellationprinted => undef,
+ };
+ my $order1 = $builder->build( { source => 'Aqorder', value => $orderinfo1 } );
+
+ my $order_basket2 = $builder->build( { source => 'Aqbasket', value => { is_standing => 1 } } );
+ my $orderinfo2 = {
+ basketno => $order_basket2->{basketno},
+ rrp => 19.99,
+ replacementprice => undef,
+ quantity => 1,
+ quantityreceived => 0,
+ datereceived => undef,
+ datecancellationprinted => undef,
+ };
+ my $order2 = $builder->build( { source => 'Aqorder', value => $orderinfo2 } );
+
+ my $history = GetHistory( is_standing => 1 );
+ is(
+ scalar(@$history),
+ scalar(@$orders) + 1,
+ "GetHistory returns number of standing orders"
+ );
+
+};
+
+subtest 'Acquisition logging' => sub {
+
+ plan tests => 5;
+
+ t::lib::Mocks::mock_preference('AcquisitionLog', 1);
+
+ Koha::ActionLogs->delete;
+ my $basketno = NewBasket( $booksellerid, 1 );
+ my @create_logs = Koha::ActionLogs->search({ module =>'ACQUISITIONS', action => 'ADD_BASKET', object => $basketno });
+ is (scalar @create_logs, 1, 'Basket creation is logged');
+
+ Koha::ActionLogs->delete;
+ C4::Acquisition::ReopenBasket($basketno);
+ my @reopen_logs = Koha::ActionLogs->search({ module =>'ACQUISITIONS', action => 'REOPEN_BASKET', object => $basketno });
+ is (scalar @reopen_logs, 1, 'Basket reopen is logged');
+
+ Koha::ActionLogs->delete;
+ C4::Acquisition::ModBasket({
+ basketno => $basketno,
+ booksellerid => $booksellerid
+ });
+ my @mod_logs = Koha::ActionLogs->search({ module =>'ACQUISITIONS', action => 'MODIFY_BASKET', object => $basketno });
+ is (scalar @mod_logs, 1, 'Basket modify is logged');
+
+ Koha::ActionLogs->delete;
+ C4::Acquisition::ModBasketHeader($basketno,"Test","","","",$booksellerid);
+ my @mod_header_logs = Koha::ActionLogs->search({ module =>'ACQUISITIONS', action => 'MODIFY_BASKET_HEADER', object => $basketno });
+ is (scalar @mod_header_logs, 1, 'Basket header modify is logged');
+
+ Koha::ActionLogs->delete;
+ C4::Acquisition::ModBasketUsers($basketno,(1));
+ my @mod_users_logs = Koha::ActionLogs->search({ module =>'ACQUISITIONS', action => 'MODIFY_BASKET_USERS', object => $basketno });
+ is (scalar @mod_users_logs, 1, 'Basket users modify is logged');
+
+ t::lib::Mocks::mock_preference('AcquisitionLog', 0);
+};
+