Bug 22330: Transfer limits should be respected for placing holds in staff interface...
[koha.git] / t / db_dependent / Holds / HoldFulfillmentPolicy.t
1 #!/usr/bin/perl
2
3 use Modern::Perl;
4
5 use C4::Context;
6
7 use Test::More tests => 11;
8
9 use t::lib::TestBuilder;
10 use t::lib::Mocks;
11 use Koha::Holds;
12
13 BEGIN {
14     use_ok('C4::Reserves');
15 }
16
17 my $schema = Koha::Database->schema;
18 $schema->storage->txn_begin;
19 my $dbh = C4::Context->dbh;
20
21 my $builder = t::lib::TestBuilder->new;
22
23 my $library1 = $builder->build({
24     source => 'Branch',
25 });
26 my $library2 = $builder->build({
27     source => 'Branch',
28 });
29 my $library3 = $builder->build({
30     source => 'Branch',
31 });
32 my $itemtype = $builder->build({ source => 'Item' })->{itype};
33
34 my $bib_title = "Test Title";
35
36 my $borrower = $builder->build({
37     source => 'Borrower',
38     value => {
39         branchcode => $library1->{branchcode},
40     }
41 });
42
43 # Test hold_fulfillment_policy
44 my $borrowernumber = $borrower->{borrowernumber};
45 my $library_A = $library1->{branchcode};
46 my $library_B = $library2->{branchcode};
47 my $library_C = $library3->{branchcode};
48 $dbh->do("DELETE FROM transport_cost");
49 $dbh->do("DELETE FROM tmp_holdsqueue");
50 $dbh->do("DELETE FROM hold_fill_targets");
51 $dbh->do("DELETE FROM default_branch_circ_rules");
52 $dbh->do("DELETE FROM default_branch_item_rules");
53 $dbh->do("DELETE FROM default_circ_rules");
54 $dbh->do("DELETE FROM branch_item_rules");
55
56 $dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$bib_title', '2011-02-01')");
57
58 my $biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$bib_title'")
59   or BAIL_OUT("Cannot find newly created biblio record");
60
61 $dbh->do("INSERT INTO biblioitems (biblionumber, itemtype) VALUES ($biblionumber, '$itemtype')");
62
63 my $biblioitemnumber =
64   $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber")
65   or BAIL_OUT("Cannot find newly created biblioitems record");
66
67 $dbh->do("
68     INSERT INTO items (biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
69     VALUES ($biblionumber, $biblioitemnumber, '$library_A', '$library_B', 0, 0, 0, 0, NULL, '$itemtype')
70 ");
71
72 my $itemnumber =
73   $dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber")
74   or BAIL_OUT("Cannot find newly created item");
75
76 # With hold_fulfillment_policy = homebranch, hold should only be picked up if pickup branch = homebranch
77 $dbh->do("DELETE FROM default_circ_rules");
78 $dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'homebranch' )");
79
80 # Home branch matches pickup branch
81 my $reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1 );
82 my ( $status ) = CheckReserves($itemnumber);
83 is( $status, 'Reserved', "Hold where pickup branch matches home branch targeted" );
84 Koha::Holds->find( $reserve_id )->cancel;
85
86 # Holding branch matches pickup branch
87 $reserve_id = AddReserve( $library_B, $borrowernumber, $biblionumber, '', 1 );
88 ( $status ) = CheckReserves($itemnumber);
89 is($status, q{}, "Hold where pickup ne home, pickup eq home not targeted" );
90 Koha::Holds->find( $reserve_id )->cancel;
91
92 # Neither branch matches pickup branch
93 $reserve_id = AddReserve( $library_C, $borrowernumber, $biblionumber, '', 1 );
94 ( $status ) = CheckReserves($itemnumber);
95 is( $status, q{}, "Hold where pickup ne home, pickup ne holding not targeted" );
96 Koha::Holds->find( $reserve_id )->cancel;
97
98 # With hold_fulfillment_policy = holdingbranch, hold should only be picked up if pickup branch = holdingbranch
99 $dbh->do("DELETE FROM default_circ_rules");
100 $dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'holdingbranch' )");
101
102 # Home branch matches pickup branch
103 $reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1 );
104 ( $status ) = CheckReserves($itemnumber);
105 is( $status, q{}, "Hold where pickup eq home, pickup ne holding not targeted" );
106 Koha::Holds->find( $reserve_id )->cancel;
107
108 # Holding branch matches pickup branch
109 $reserve_id = AddReserve( $library_B, $borrowernumber, $biblionumber, '', 1 );
110 ( $status ) = CheckReserves($itemnumber);
111 is( $status, 'Reserved', "Hold where pickup ne home, pickup eq holding targeted" );
112 Koha::Holds->find( $reserve_id )->cancel;
113
114 # Neither branch matches pickup branch
115 $reserve_id = AddReserve( $library_C, $borrowernumber, $biblionumber, '', 1 );
116 ( $status ) = CheckReserves($itemnumber);
117 is( $status, q{}, "Hold where pickup ne home, pickup ne holding not targeted" );
118 Koha::Holds->find( $reserve_id )->cancel;
119
120 # With hold_fulfillment_policy = any, hold should be pikcup up reguardless of matching home or holding branch
121 $dbh->do("DELETE FROM default_circ_rules");
122 $dbh->do("INSERT INTO default_circ_rules ( holdallowed, hold_fulfillment_policy ) VALUES ( 2, 'any' )");
123
124 # Home branch matches pickup branch
125 $reserve_id = AddReserve( $library_A, $borrowernumber, $biblionumber, '', 1 );
126 ( $status ) = CheckReserves($itemnumber);
127 is( $status, 'Reserved', "Hold where pickup eq home, pickup ne holding targeted" );
128 Koha::Holds->find( $reserve_id )->cancel;
129
130 # Holding branch matches pickup branch
131 $reserve_id = AddReserve( $library_B, $borrowernumber, $biblionumber, '', 1 );
132 ( $status ) = CheckReserves($itemnumber);
133 is( $status, 'Reserved', "Hold where pickup ne home, pickup eq holding targeted" );
134 Koha::Holds->find( $reserve_id )->cancel;
135
136 # Neither branch matches pickup branch
137 $reserve_id = AddReserve( $library_C, $borrowernumber, $biblionumber, '', 1 );
138 ( $status ) = CheckReserves($itemnumber);
139 is( $status, 'Reserved', "Hold where pickup ne home, pickup ne holding targeted" );
140 Koha::Holds->find( $reserve_id )->cancel;
141
142 # Test enforement of branch transfer limits
143 t::lib::Mocks::mock_preference( 'UseBranchTransferLimits',  '1' );
144 t::lib::Mocks::mock_preference( 'BranchTransferLimitsType', 'itemtype' );
145 Koha::Holds->search()->delete();
146 my ($item) = Koha::Biblios->find($biblionumber)->items;
147 my $limit = Koha::Item::Transfer::Limit->new(
148     {
149         toBranch   => $library_C,
150         fromBranch => $item->holdingbranch,
151         itemtype   => $item->effective_itemtype,
152     }
153 )->store();
154 $reserve_id = AddReserve( $library_C, $borrowernumber, $biblionumber, '', 1 );
155 ($status) = CheckReserves($itemnumber);
156 is( $status, '',  "No hold where branch transfer is not allowed" );
157 Koha::Holds->find($reserve_id)->cancel;