View | Details | Raw Unified | Return to bug 20837
Collapse All | Expand All

(-)a/t/db_dependent/Holds.t (-2 / +7 lines)
Lines 7-13 use t::lib::TestBuilder; Link Here
7
7
8
use C4::Context;
8
use C4::Context;
9
9
10
use Test::More tests => 57;
10
use Test::More tests => 58;
11
use MARC::Record;
11
use MARC::Record;
12
12
13
use C4::Biblio;
13
use C4::Biblio;
Lines 375-385 $biblio = $builder->build_sample_biblio({ itemtype => 'CANNOT' }); Link Here
375
is(CanItemBeReserved($borrowernumbers[0], $itemnumber)->{status}, 'notReservable',
375
is(CanItemBeReserved($borrowernumbers[0], $itemnumber)->{status}, 'notReservable',
376
    "CanItemBeReserved should return 'notReservable'");
376
    "CanItemBeReserved should return 'notReservable'");
377
377
378
t::lib::Mocks::mock_preference( 'ReservesControlBranch', 'PatronLibrary' );
378
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem(
379
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem(
379
    { homebranch => $branch_2, holdingbranch => $branch_1, itype => 'CAN' } , $biblio->biblionumber);
380
    { homebranch => $branch_2, holdingbranch => $branch_1, itype => 'CAN' } , $biblio->biblionumber);
380
is(CanItemBeReserved($borrowernumbers[0], $itemnumber)->{status},
381
is(CanItemBeReserved($borrowernumbers[0], $itemnumber)->{status},
381
    'cannotReserveFromOtherBranches',
382
    'cannotReserveFromOtherBranches',
382
    "CanItemBeReserved should return 'cannotReserveFromOtherBranches'");
383
    "CanItemBeReserved should use PatronLibrary rule when ReservesControlBranch set to 'PatronLibrary'");
384
t::lib::Mocks::mock_preference( 'ReservesControlBranch', 'ItemHomeLibrary' );
385
is(CanItemBeReserved($borrowernumbers[0], $itemnumber)->{status},
386
    'OK',
387
    "CanItemBeReserved should use item home library rule when ReservesControlBranch set to 'ItemsHomeLibrary'");
383
388
384
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem(
389
($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem(
385
    { homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblio->biblionumber);
390
    { homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblio->biblionumber);
(-)a/t/db_dependent/Holds/DisallowHoldIfItemsAvailable.t (-59 / +48 lines)
Lines 7-13 use C4::Circulation; Link Here
7
use C4::Items;
7
use C4::Items;
8
use Koha::IssuingRule;
8
use Koha::IssuingRule;
9
use Koha::Items;
9
use Koha::Items;
10
11
use Test::More tests => 6;
10
use Test::More tests => 6;
12
11
13
use t::lib::TestBuilder;
12
use t::lib::TestBuilder;
Lines 29-39 my $library1 = $builder->build({ Link Here
29
my $library2 = $builder->build({
28
my $library2 = $builder->build({
30
    source => 'Branch',
29
    source => 'Branch',
31
});
30
});
32
31
my $itemtype = $builder->build({
32
    source => 'Itemtype',
33
    value  => { notforloan => 0 }
34
})->{itemtype};
33
35
34
t::lib::Mocks::mock_userenv({ branchcode => $library1->{branchcode} });
36
t::lib::Mocks::mock_userenv({ branchcode => $library1->{branchcode} });
35
37
36
my $bib_title = "Test Title";
37
38
38
my $borrower1 = $builder->build({
39
my $borrower1 = $builder->build({
39
    source => 'Borrower',
40
    source => 'Borrower',
Lines 51-101 my $borrower2 = $builder->build({ Link Here
51
    }
52
    }
52
});
53
});
53
54
54
# Test hold_fulfillment_policy
55
my $borrower3 = $builder->build({
55
my ( $itemtype ) = @{ $dbh->selectrow_arrayref("SELECT itemtype FROM itemtypes LIMIT 1") };
56
    source => 'Borrower',
57
    value => {
58
        branchcode => $library2->{branchcode},
59
        dateexpiry => '3000-01-01',
60
    }
61
});
62
56
my $borrowernumber1 = $borrower1->{borrowernumber};
63
my $borrowernumber1 = $borrower1->{borrowernumber};
57
my $borrowernumber2 = $borrower2->{borrowernumber};
64
my $borrowernumber2 = $borrower2->{borrowernumber};
58
my $library_A = $library1->{branchcode};
65
my $library_A = $library1->{branchcode};
59
my $library_B = $library2->{branchcode};
66
my $library_B = $library2->{branchcode};
60
67
61
$dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$bib_title', '2011-02-01')");
68
my $biblio = $builder->build_sample_biblio({itemtype=>$itemtype});
62
69
my $biblionumber = $biblio->biblionumber;
63
my $biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$bib_title'")
70
my $item1  = $builder->build_sample_item({
64
  or BAIL_OUT("Cannot find newly created biblio record");
71
    biblionumber=>$biblionumber,
65
72
    itype=>$itemtype,
66
$dbh->do("INSERT INTO biblioitems (biblionumber, itemtype) VALUES ($biblionumber, '$itemtype')");
73
    homebranch => $library_A,
67
74
    holdingbranch => $library_A
68
my $biblioitemnumber =
75
})->unblessed;
69
  $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber")
76
my $item2  = $builder->build_sample_item({
70
  or BAIL_OUT("Cannot find newly created biblioitems record");
77
    biblionumber=>$biblionumber,
71
78
    itype=>$itemtype,
72
$dbh->do("
79
    homebranch => $library_A,
73
    INSERT INTO items (barcode, biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
80
    holdingbranch => $library_A
74
    VALUES ('AllowHoldIf1', $biblionumber, $biblioitemnumber, '$library_A', '$library_A', 0, 0, 0, 0, NULL, '$itemtype')
81
})->unblessed;
75
");
76
82
77
my $itemnumber1 =
83
# Test hold_fulfillment_policy
78
  $dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber")
79
  or BAIL_OUT("Cannot find newly created item");
80
81
my $item1 = Koha::Items->find( $itemnumber1 )->unblessed;
82
83
$dbh->do("
84
    INSERT INTO items (barcode, biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)
85
    VALUES ('AllowHoldIf2', $biblionumber, $biblioitemnumber, '$library_A', '$library_A', 0, 0, 0, 0, NULL, '$itemtype')
86
");
87
84
88
my $itemnumber2 =
89
  $dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber ORDER BY itemnumber DESC")
90
  or BAIL_OUT("Cannot find newly created item");
91
85
92
my $item2 = Koha::Items->find( $itemnumber2 )->unblessed;
93
86
94
$dbh->do("DELETE FROM issuingrules");
95
my $rule = Koha::IssuingRule->new(
87
my $rule = Koha::IssuingRule->new(
96
    {
88
    {
97
        categorycode => '*',
89
        categorycode => '*',
98
        itemtype     => '*',
90
        itemtype     => $itemtype,
99
        branchcode   => '*',
91
        branchcode   => '*',
100
        issuelength  => 7,
92
        issuelength  => 7,
101
        lengthunit   => 8,
93
        lengthunit   => 8,
Lines 128-136 AddReturn( $item1->{barcode} ); Link Here
128
        my $hold_allowed_from_any_libraries = 2;
120
        my $hold_allowed_from_any_libraries = 2;
129
        my $sth_delete_rules = $dbh->prepare(q|DELETE FROM default_circ_rules|);
121
        my $sth_delete_rules = $dbh->prepare(q|DELETE FROM default_circ_rules|);
130
        my $sth_insert_rule = $dbh->prepare(q|INSERT INTO default_circ_rules(singleton, holdallowed, hold_fulfillment_policy, returnbranch) VALUES ('singleton', ?, 'any', 'homebranch');|);
122
        my $sth_insert_rule = $dbh->prepare(q|INSERT INTO default_circ_rules(singleton, holdallowed, hold_fulfillment_policy, returnbranch) VALUES ('singleton', ?, 'any', 'homebranch');|);
123
        my $sth_insert_branch_rule = $dbh->prepare(q|INSERT INTO default_branch_circ_rules(branchcode, holdallowed, hold_fulfillment_policy, returnbranch) VALUES (?, ?, 'any', 'homebranch');|);
131
124
132
        subtest 'Item is available at a different library' => sub {
125
        subtest 'Item is available at a different library' => sub {
133
            plan tests => 4;
126
            plan tests => 7;
134
127
135
            $item1 = Koha::Items->find( $item1->{itemnumber} );
128
            $item1 = Koha::Items->find( $item1->{itemnumber} );
136
            $item1->set({homebranch => $library_B, holdingbranch => $library_B })->store;
129
            $item1->set({homebranch => $library_B, holdingbranch => $library_B })->store;
Lines 140-147 AddReturn( $item1->{barcode} ); Link Here
140
            #Item 1 homebranch library B is available
133
            #Item 1 homebranch library B is available
141
            #Item 2 homebranch library A is checked out
134
            #Item 2 homebranch library A is checked out
142
            #Borrower1 is from library A
135
            #Borrower1 is from library A
143
            #CircControl has no effect - same rule for all branches as set at line 96
144
            #FIXME: ReservesControlBranch is not checked in these subs we are testing
145
136
146
            {
137
            {
147
                $sth_delete_rules->execute;
138
                $sth_delete_rules->execute;
Lines 150-159 AddReturn( $item1->{barcode} ); Link Here
150
                t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary');
141
                t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary');
151
                $is = IsAvailableForItemLevelRequest( $item1, $borrower1);
142
                $is = IsAvailableForItemLevelRequest( $item1, $borrower1);
152
                is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );
143
                is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );
144
                $is = IsAvailableForItemLevelRequest( $item1, $borrower2);
145
                is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at home library, holdable = one available => the hold is not allowed at item level" );
146
                $sth_insert_branch_rule->execute( $library_B, $hold_allowed_from_any_libraries );
147
                #Adding a rule for the item's home library affects the availability for a borrower from another library because ReservesControlBranch is set to ItemHomeLibrary
148
                $is = IsAvailableForItemLevelRequest( $item1, $borrower1);
149
                is( $is, 0, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, holdable = one available => the hold is not allowed at item level" );
153
150
154
                t::lib::Mocks::mock_preference('ReservesControlBranch', 'PatronLibrary');
151
                t::lib::Mocks::mock_preference('ReservesControlBranch', 'PatronLibrary');
155
                $is = IsAvailableForItemLevelRequest( $item1, $borrower1);
152
                $is = IsAvailableForItemLevelRequest( $item1, $borrower1);
156
                is( $is, 1, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );
153
                is( $is, 1, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );
154
                #Adding a rule for the patron's home library affects the availability for an item from another library because ReservesControlBranch is set to PatronLibrary
155
                $sth_insert_branch_rule->execute( $library_A, $hold_allowed_from_any_libraries );
156
                $is = IsAvailableForItemLevelRequest( $item1, $borrower1);
157
                is( $is, 0, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, holdable = one available => the hold is not allowed at item level" );
157
            }
158
            }
158
159
159
            {
160
            {
Lines 213-247 AddReturn( $item1->{barcode} ); Link Here
213
    };
214
    };
214
}
215
}
215
216
216
my $biblio = $builder->build({
217
my $itemtype2 = $builder->build({
217
    source => 'Biblio',
218
    source => 'Itemtype',
218
});
219
    value  => { notforloan => 0 }
219
220
})->{itemtype};
220
my $item3 = $builder->build({
221
my $item3 = $builder->build_sample_item({ itype => $itemtype2 });
221
    source => 'Item',
222
    value => {
223
        biblionumber => $biblio->{biblionumber},
224
        itemlost     => 0,
225
        notforloan   => 0,
226
        withdrawn    => 0,
227
        damaged      => 0,
228
        onloan       => undef,
229
    }
230
});
231
222
232
my $hold = $builder->build({
223
my $hold = $builder->build({
233
    source => 'Reserve',
224
    source => 'Reserve',
234
    value =>{
225
    value =>{
235
        itemnumber => $item3->{itemnumber},
226
        itemnumber => $item3->itemnumber,
236
        found => 'T'
227
        found => 'T'
237
    }
228
    }
238
});
229
});
239
230
240
$dbh->do("DELETE FROM issuingrules");
241
$rule = Koha::IssuingRule->new(
231
$rule = Koha::IssuingRule->new(
242
    {
232
    {
243
        categorycode => '*',
233
        categorycode => '*',
244
        itemtype     => '*',
234
        itemtype     => $itemtype2,
245
        branchcode   => '*',
235
        branchcode   => '*',
246
        issuelength  => 7,
236
        issuelength  => 7,
247
        lengthunit   => 8,
237
        lengthunit   => 8,
Lines 251-257 $rule = Koha::IssuingRule->new( Link Here
251
);
241
);
252
$rule->store();
242
$rule->store();
253
243
254
$is = IsAvailableForItemLevelRequest( $item3, $borrower1);
244
$is = IsAvailableForItemLevelRequest( $item3->unblessed, $borrower1);
255
is( $is, 1, "Item can be held, items in transit are not available" );
245
is( $is, 1, "Item can be held, items in transit are not available" );
256
246
257
# Cleanup
247
# Cleanup
258
- 

Return to bug 20837