Koha-clms/t/db_dependent/Koha/MarcOrder.t

718 lines
21 KiB
Perl
Executable File

#!/usr/bin/perl
# This file is part of Koha
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <https://www.gnu.org/licenses>.
use Modern::Perl;
use Test::More tests => 6;
use Koha::MarcOrder;
use Koha::MarcOrderAccount;
use Koha::Acquisition::Baskets;
use Koha::Acquisition::Bookseller;
use MARC::Record;
use Koha::Import::Records;
use Koha::Database;
use t::lib::Mocks;
use t::lib::TestBuilder;
use File::Temp qw|tempfile|;
use MARC::Field;
use MARC::File::XML;
my $schema = Koha::Database->new->schema;
my $builder = t::lib::TestBuilder->new;
subtest '_get_syspref_mappings() MarcItemFieldsToOrder' => sub {
plan tests => 14;
$schema->storage->txn_begin;
t::lib::Mocks::mock_preference(
'MarcItemFieldsToOrder', 'homebranch: 975$a
holdingbranch: 975$b
itype: 975$y
nonpublic_note: 975$x
public_note: 975$z
loc: 975$c
ccode: 975$8
notforloan: 975$7
uri: 975$u
copyno: 975$n
quantity: 975$q
budget_code: 975$h
price: 975$p
replacementprice: 975$v'
);
my $record = MARC::Record->new();
$record->add_fields(
[ '001', '1234' ],
[
'975', ' ', ' ', p => 10, q => 1, h => 1, a => 'CPL', b => 'CPL', y => 'Book',
x => 'Private note', z => 'Public note', c => 'Shelf', 8 => 'ccode', 7 => 0,
u => '12345abcde', n => '12345', v => 10
],
);
my $marc_item_fields_to_order = @{
Koha::MarcOrder::_get_syspref_mappings(
$record, 'MarcItemFieldsToOrder',
)
}[0];
is(
$marc_item_fields_to_order->{price}, 10,
"price has been read correctly"
);
is(
$marc_item_fields_to_order->{quantity}, 1,
"quantity has been read correctly"
);
is(
$marc_item_fields_to_order->{budget_code}, 1,
"budget_code has been read correctly"
);
is(
$marc_item_fields_to_order->{homebranch}, 'CPL',
"homebranch has been read correctly"
);
is(
$marc_item_fields_to_order->{holdingbranch}, 'CPL',
"holdingbranch has been read correctly"
);
is(
$marc_item_fields_to_order->{itype}, 'Book',
"itype has been read correctly"
);
is(
$marc_item_fields_to_order->{nonpublic_note}, 'Private note',
"nonpublic_note has been read correctly"
);
is(
$marc_item_fields_to_order->{public_note}, 'Public note',
"public_note has been read correctly"
);
is(
$marc_item_fields_to_order->{loc}, 'Shelf',
"loc has been read correctly"
);
is(
$marc_item_fields_to_order->{ccode}, 'ccode',
"ccode has been read correctly"
);
is(
$marc_item_fields_to_order->{notforloan}, 0,
"notforloan has been read correctly"
);
is(
$marc_item_fields_to_order->{uri}, '12345abcde',
"uri has been read correctly"
);
is(
$marc_item_fields_to_order->{copyno}, '12345',
"copyno has been read correctly"
);
is(
$marc_item_fields_to_order->{replacementprice}, 10,
"replacementprice has been read correctly"
);
$schema->storage->txn_rollback;
};
subtest '_get_syspref_mappings() MarcFieldsToOrder' => sub {
plan tests => 3;
$schema->storage->txn_begin;
t::lib::Mocks::mock_preference(
'MarcFieldsToOrder', 'price: 975$p
quantity: 975$q
budget_code: 975$h'
);
my $record = MARC::Record->new();
$record->add_fields(
[ '001', '1234' ],
[ '975', ' ', ' ', p => 10, q => 1, h => 1 ],
);
my $marc_fields_to_order = Koha::MarcOrder::_get_syspref_mappings(
$record, 'MarcFieldsToOrder',
);
is(
$marc_fields_to_order->{price}, 10,
"Price has been read correctly"
);
is(
$marc_fields_to_order->{quantity}, 1,
"Quantity has been read correctly"
);
is(
$marc_fields_to_order->{budget_code}, 1,
"Budget code has been read correctly"
);
$schema->storage->txn_rollback;
};
subtest 'add_biblio_from_import_record()' => sub {
plan tests => 5;
$schema->storage->txn_begin;
my $sample_import_batch = {
matcher_id => 1,
template_id => 1,
branchcode => 'CPL',
overlay_action => 'create_new',
nomatch_action => 'create_new',
item_action => 'always_add',
import_status => 'staged',
batch_type => 'z3950',
file_name => 'test.mrc',
comments => 'test',
record_type => 'auth',
};
my $import_batch_id = C4::ImportBatch::AddImportBatch($sample_import_batch);
my $record = MARC::Record->new();
$record->add_fields(
[ '001', '1234' ],
[ '020', ' ', ' ', a => '9780596004931' ],
[ '975', ' ', ' ', p => 10, q => 1, h => 1 ],
);
my $import_record_id = C4::ImportBatch::AddBiblioToBatch( $import_batch_id, 0, $record, 'utf8', 0 );
my $import_record = Koha::Import::Records->find($import_record_id);
my $result = Koha::MarcOrder::add_biblio_from_import_record(
{
import_record => $import_record,
matcher_id => $sample_import_batch->{matcher_id},
overlay_action => $sample_import_batch->{overlay_action},
agent => 'cron',
import_batch_id => $import_batch_id
}
);
isnt(
$result->{record_result}->{biblionumber}, undef,
'A new biblionumber is added or an existing biblionumber is returned'
);
my $match_biblio = $builder->build_sample_biblio();
my $match_biblio_id = $match_biblio->biblionumber;
$match_biblio->delete;
my $match_record = MARC::Record->new();
$match_record->add_fields(
[ '001', '1234' ],
[ '020', ' ', ' ', a => '9780596004931' ],
[ '975', ' ', ' ', p => 10, q => 1, h => 1 ],
);
my $match_import_record_id = C4::ImportBatch::AddBiblioToBatch( $import_batch_id, 0, $match_record, 'utf8', 0 );
my $match_import_record = Koha::Import::Records->find($match_import_record_id);
my $import_record_match = Koha::Import::Record::Match->new(
{
import_record_id => $match_import_record_id,
candidate_match_id => $match_biblio_id,
chosen => 1,
}
)->store;
my $match_result = Koha::MarcOrder::add_biblio_from_import_record(
{
import_record => $match_import_record,
matcher_id => $sample_import_batch->{matcher_id},
overlay_action => 'replace',
agent => 'interface',
import_batch_id => $import_batch_id
}
);
isnt(
$match_result->{record_result}->{biblionumber}, $match_biblio_id,
'A new biblionumber is added when the matched biblionumber does not exist'
);
# Check that records are skipped if not selected when called from addorderiso2709.pl
# Pass in an empty array and the record should be skipped
my @import_record_id_selected = ();
my $result2 = Koha::MarcOrder::add_biblio_from_import_record(
{
import_record => $import_record,
matcher_id => $sample_import_batch->{matcher_id},
overlay_action => $sample_import_batch->{overlay_action},
import_record_id_selected => \@import_record_id_selected,
agent => 'client',
import_batch_id => $import_batch_id
}
);
is( $result2->{skip}, 1, 'Record was skipped' );
is( $result2->{duplicates_in_batch}, 0, 'Record was skipped - no duplicate checking needed' );
is( $result2->{record_result}, 0, 'Record was skipped' );
$schema->storage->txn_rollback;
};
subtest 'add_items_from_import_record() - addorderiso2709.pl' => sub {
plan tests => 2;
$schema->storage->txn_begin;
my $branch = $builder->build_object( { class => 'Koha::Libraries' } );
my $branchcode = $branch->branchcode;
my $bpid = C4::Budgets::AddBudgetPeriod(
{
budget_period_startdate => '2008-01-01', budget_period_enddate => '2008-12-31'
, budget_period_active => 1
, budget_period_description => "MAPERI"
}
);
my $budgetid = C4::Budgets::AddBudget(
{
budget_code => "BC_1",
budget_name => "budget_name_test_1",
budget_period_id => $bpid,
}
);
my $budgetid2 = C4::Budgets::AddBudget(
{
budget_code => "BC_2",
budget_name => "budget_name_test_2",
budget_period_id => $bpid,
}
);
my $fund1 = C4::Budgets::GetBudget($budgetid);
my $fund2 = C4::Budgets::GetBudget($budgetid2);
my $budget_code_1 = $fund1->{budget_code};
my $budget_code_2 = $fund2->{budget_code};
my $sample_import_batch = {
matcher_id => 1,
template_id => 1,
branchcode => $branchcode,
overlay_action => 'create_new',
nomatch_action => 'create_new',
item_action => 'always_add',
import_status => 'staged',
batch_type => 'z3950',
file_name => 'test.mrc',
comments => 'test',
record_type => 'auth',
};
my $import_batch_id = C4::ImportBatch::AddImportBatch($sample_import_batch);
my $record = MARC::Record->new();
$record->add_fields(
[ '001', '1234' ],
[ '020', ' ', ' ', a => '9780596004931' ],
[ '975', ' ', ' ', p => 10, q => 1, h => $budget_code_2 ],
);
my $import_record_id = C4::ImportBatch::AddBiblioToBatch( $import_batch_id, 0, $record, 'utf8', 0 );
my $import_record = Koha::Import::Records->find($import_record_id);
my @import_record_id_selected = ($import_record_id);
my $result = Koha::MarcOrder::add_biblio_from_import_record(
{
import_record => $import_record,
matcher_id => $sample_import_batch->{matcher_id},
overlay_action => $sample_import_batch->{overlay_action},
agent => 'client',
import_batch_id => $import_batch_id,
import_record_id_selected => \@import_record_id_selected
}
);
my $bookseller = Koha::Acquisition::Bookseller->new(
{
name => "my vendor",
address1 => "bookseller's address",
phone => "0123456",
active => 1,
deliverytime => 5,
}
)->store;
my $basket = $builder->build_object(
{
class => "Koha::Acquisition::Baskets",
value => {
booksellerid => $bookseller->id,
create_items => 'ordering',
is_standing => 0,
closedate => undef
}
}
);
subtest "Using MarcItemFieldsToOrder" => sub {
plan tests => 6;
my $client_item_fields = {
'notforloans' => [
'',
],
'c_budget_id' => 2,
'replacementprices' => [
'0.00',
],
'uris' => [
'',
],
'c_replacement_price' => '0.00',
'public_notes' => [''],
'itemcallnumbers' => [
'',
],
'budget_codes' => [
'',
],
'nonpublic_notes' => [
'',
],
'homebranches' => [
$branchcode,
$branchcode
],
'copynos' => [
'',
],
'holdingbranches' => [
$branchcode,
$branchcode
],
'ccodes' => [
'',
],
'locs' => [
'',
''
],
'itemprices' => [
'10.00',
],
'c_discount' => '',
'c_price' => '0.00',
'c_sort2' => '',
'c_sort1' => '',
'c_quantity' => '1',
'itypes' => [
'BK',
],
'coded_location_qualifiers' => [],
'barcodes' => [],
'enumchrons' => []
};
my $itemnumbers = Koha::MarcOrder::add_items_from_import_record(
{
record_result => $result->{record_result},
basket_id => $basket->basketno,
vendor => $bookseller,
budget_id => $budgetid,
agent => 'client',
client_item_fields => $client_item_fields,
}
);
my $orders =
Koha::Acquisition::Orders->search( { biblionumber => $result->{record_result}->{biblionumber} } )
->unblessed;
is(
@{$orders}[0]->{rrp} + 0, '10',
"Price has been read correctly"
);
my $active_currency = Koha::Acquisition::Currencies->get_active;
is(
sprintf( "%.6f", @{$orders}[0]->{listprice} + 0 ), sprintf( "%.6f", 10 / $active_currency->rate + 0 ),
"Listprice has been created successfully"
);
is(
@{$orders}[0]->{quantity}, 1,
"Quantity has been read correctly"
);
is(
@{$orders}[0]->{budget_id}, $budgetid,
"Budget code has been read correctly"
);
my $new_item = Koha::Items->find( ${$itemnumbers}[0] );
isnt(
$new_item, undef,
'Item was successfully created'
);
is(
$new_item->price, '10.00',
'Item values mapped correctly'
);
};
subtest "Using MarcFieldsToOrder only" => sub {
plan tests => 9;
t::lib::Mocks::mock_userenv( { branchcode => $branchcode } );
my $client_item_fields = {
'tags' => [
'952',
'952',
'952',
'952',
],
'subfields' => [
'a',
'b',
'g',
'y'
],
field_values => [
$branchcode,
$branchcode,
"10.00",
'BK'
],
'notforloans' => [
'',
],
'c_budget_id' => $budgetid2,
'replacementprices' => [
'0.00',
],
'uris' => [
'',
],
'c_replacement_price' => '0.00',
'public_notes' => [''],
'itemcallnumbers' => [
'',
],
'budget_codes' => [
'',
],
'nonpublic_notes' => [
'',
],
'homebranches' => [],
'copynos' => [
'',
],
'holdingbranches' => [],
'ccodes' => [
'',
],
'locs' => [
'',
''
],
'itemprices' => [
'10.00',
],
'c_discount' => '',
'c_price' => '0.00',
'c_sort2' => '',
'c_sort1' => '',
'c_quantity' => '1',
'itypes' => [],
'coded_location_qualifiers' => [],
'barcodes' => [],
'enumchrons' => []
};
my $itemnumbers = Koha::MarcOrder::add_items_from_import_record(
{
record_result => $result->{record_result},
basket_id => $basket->basketno,
vendor => $bookseller,
budget_id => $budgetid,
agent => 'client',
client_item_fields => $client_item_fields,
}
);
my $orders =
Koha::Acquisition::Orders->search( { biblionumber => $result->{record_result}->{biblionumber} } )
->unblessed;
is(
@{$orders}[0]->{rrp} + 0, '10',
"Price has been read correctly"
);
my $active_currency = Koha::Acquisition::Currencies->get_active;
is(
sprintf( "%.6f", @{$orders}[0]->{listprice} + 0 ), sprintf( "%.6f", 10 / $active_currency->rate + 0 ),
"Listprice has been created successfully"
);
is(
@{$orders}[0]->{quantity}, 1,
"Quantity has been read correctly"
);
is(
@{$orders}[0]->{budget_id}, $budgetid,
"Budget code has been read correctly"
);
my $new_item = Koha::Items->find( ${$itemnumbers}[0] );
isnt(
$new_item, undef,
'Item was successfully created'
);
is(
$new_item->price, '10.00',
'Item value for price mapped correctly'
);
is(
$new_item->homebranch, $branchcode,
'Item value for homebranch mapped correctly'
);
is(
$new_item->holdingbranch, $branchcode,
'Item value for holdingbranch mapped correctly'
);
is(
$new_item->itype, 'BK',
'Item value for itemtype mapped correctly'
);
};
$schema->storage->txn_rollback;
};
subtest 'match_file_to_account' => sub {
plan tests => 2;
$schema->storage->txn_begin;
my ( $fh, $name ) = tempfile( SUFFIX => '.marcxml' );
my $rec = MARC::Record->new;
my $fld = MARC::Field->new( '975', '', '', 'p', '12345' );
$rec->append_fields($fld);
my $str = $rec->as_xml;
print $fh $str;
close $fh;
my $account1 = Koha::MarcOrderAccount->new(
{
match_field => '975$p',
match_value => '12345',
encoding => 'UTF-8',
description => 'test',
}
)->store;
my $file_match = Koha::MarcOrder->match_file_to_account(
{
filename => $name,
filepath => $name,
profile => $account1,
}
);
is( $file_match, 1, 'File matched correctly to the account' );
my $account2 = Koha::MarcOrderAccount->new(
{
match_field => '975$p',
match_value => 'abcde',
encoding => 'UTF-8',
description => 'test',
}
)->store;
my $file_match2 = Koha::MarcOrder->match_file_to_account(
{
filename => $name,
filepath => $name,
profile => $account2,
}
);
is( $file_match2, 0, 'File not matched to the account' );
$schema->storage->txn_rollback;
};
subtest '_check_file_for_basket_name' => sub {
plan tests => 2;
$schema->storage->txn_begin;
my ( $fh, $name ) = tempfile( SUFFIX => '.marcxml' );
my $rec = MARC::Record->new;
my $fld = MARC::Field->new( '975', '', '', 'p', 'This is a basket' );
$rec->append_fields($fld);
my $str = $rec->as_xml;
print $fh $str;
close $fh;
my $account1 = Koha::MarcOrderAccount->new(
{
basket_name_field => '975$p',
encoding => 'UTF-8',
description => 'test',
}
)->store;
my $basket_name = Koha::MarcOrder::_check_file_for_basket_name(
{
filename => $name,
filepath => $name,
profile => $account1,
}
);
is( $basket_name, "This is a basket", 'Basket name identified correctly' );
my $account2 = Koha::MarcOrderAccount->new(
{
basket_name_field => '975$z',
encoding => 'UTF-8',
description => 'test',
}
)->store;
my $basket_name2 = Koha::MarcOrder::_check_file_for_basket_name(
{
filename => $name,
filepath => $name,
profile => $account2,
}
);
is( $basket_name2, $name, 'No filename provided in the file' );
$schema->storage->txn_rollback;
};