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

(-)a/C4/Reserves.pm (-2 / +2 lines)
Lines 379-385 sub CanItemBeReserved { Link Here
379
        }
379
        }
380
    );
380
    );
381
    if ( $holds_per_record == 0 ) {
381
    if ( $holds_per_record == 0 ) {
382
        return "noReservesAllowed";
382
        return { status => "noReservesAllowed" };
383
    }
383
    }
384
    if ( $holds->count() >= $holds_per_record ) {
384
    if ( $holds->count() >= $holds_per_record ) {
385
        return { status => "tooManyHoldsForThisRecord", limit => $holds_per_record };
385
        return { status => "tooManyHoldsForThisRecord", limit => $holds_per_record };
Lines 425-431 sub CanItemBeReserved { Link Here
425
425
426
    # we check if it's ok or not
426
    # we check if it's ok or not
427
    if( $allowedreserves == 0 ){
427
    if( $allowedreserves == 0 ){
428
        return 'noReservesAllowed';
428
        return { status => 'noReservesAllowed' };
429
    }
429
    }
430
    if ( $reservecount >= $allowedreserves ) {
430
    if ( $reservecount >= $allowedreserves ) {
431
        return { status => 'tooManyReserves', limit => $allowedreserves };
431
        return { status => 'tooManyReserves', limit => $allowedreserves };
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-1 / +3 lines)
Lines 129-135 Link Here
129
    [% ELSE %]
129
    [% ELSE %]
130
        <h3>Cannot place hold on some items</h3>
130
        <h3>Cannot place hold on some items</h3>
131
        [% IF ( no_reserves_allowed) %]
131
        [% IF ( no_reserves_allowed) %]
132
          <li><strong>No holds allowed: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %] </a> cannot place holds on some of these title's items.</li>
132
          <li><strong>No holds allowed: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber | uri %]">[% borrowerfirstname | html %] [% borrowersurname | html %] </a> cannot place holds on some of these title's items.</li>
133
        [% END %]
133
        [% END %]
134
        [% IF ( exceeded_maxreserves ) %]
134
        [% IF ( exceeded_maxreserves ) %]
135
          <li><strong>Too many holds: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% patron.borrowernumber | uri %]">[% patron.firstname | html %] [% patron.surname | html %] </a> can place [% new_reserves_allowed | html %] of the requested [% new_reserves_count | html %] holds for a maximum of [% maxreserves | html %] total holds.</li>
135
          <li><strong>Too many holds: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% patron.borrowernumber | uri %]">[% patron.firstname | html %] [% patron.surname | html %] </a> can place [% new_reserves_allowed | html %] of the requested [% new_reserves_count | html %] holds for a maximum of [% maxreserves | html %] total holds.</li>
Lines 359-364 Link Here
359
                                Patron already has hold for this item
359
                                Patron already has hold for this item
360
                            [% ELSIF itemloo.not_holdable == 'cannotBeTransferred' %]
360
                            [% ELSIF itemloo.not_holdable == 'cannotBeTransferred' %]
361
                                Cannot be transferred to pickup library
361
                                Cannot be transferred to pickup library
362
                            [% ELSIF itemloo.not_holdable == 'noReservesAllowed' %]
363
                                No reserves are allowed on this item
362
                            [% ELSE %]
364
                            [% ELSE %]
363
                                [% itemloo.not_holdable | html %]
365
                                [% itemloo.not_holdable | html %]
364
                            [% END %]
366
                            [% END %]
(-)a/t/db_dependent/Holds.t (-25 / +25 lines)
Lines 325-332 subtest 'CanItemBeReserved' => sub { Link Here
325
325
326
    delete_all_rules();
326
    delete_all_rules();
327
327
328
    my $itemtype_can  = $builder->build({source => "Itemtype"})->{itemtype};
328
    my $itemtype_can         = $builder->build({source => "Itemtype"})->{itemtype};
329
    my $itemtype_cant = $builder->build({source => "Itemtype"})->{itemtype};
329
    my $itemtype_cant        = $builder->build({source => "Itemtype"})->{itemtype};
330
    my $itemtype_cant_record = $builder->build({source => "Itemtype"})->{itemtype};
330
331
331
    $dbh->do(
332
    $dbh->do(
332
        q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed, holds_per_record) VALUES (?, ?, ?, ?, ?)}, {},
333
        q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed, holds_per_record) VALUES (?, ?, ?, ?, ?)}, {},
Lines 338-344 subtest 'CanItemBeReserved' => sub { Link Here
338
    );
339
    );
339
    $dbh->do(
340
    $dbh->do(
340
        q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed, holds_per_record) VALUES (?, ?, ?, ?, ?)}, {},
341
        q{INSERT INTO issuingrules (categorycode, branchcode, itemtype, reservesallowed, holds_per_record) VALUES (?, ?, ?, ?, ?)}, {},
341
        '*', '*', 'CANNOT_RECORD', 0, 0
342
        '*', '*', $itemtype_cant_record, 0, 0
342
    );
343
    );
343
344
344
    subtest 'noReservesAllowed' => sub {
345
    subtest 'noReservesAllowed' => sub {
Lines 346-382 subtest 'CanItemBeReserved' => sub { Link Here
346
347
347
        my $biblionumber_cannot = $builder->build_sample_biblio({ itemtype => $itemtype_cant })->biblionumber;
348
        my $biblionumber_cannot = $builder->build_sample_biblio({ itemtype => $itemtype_cant })->biblionumber;
348
        my $biblionumber_can = $builder->build_sample_biblio({ itemtype => $itemtype_can })->biblionumber;
349
        my $biblionumber_can = $builder->build_sample_biblio({ itemtype => $itemtype_can })->biblionumber;
349
        my ( undef, undef, $itemnumber_1_can ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblionumber_cannot);
350
        my $biblionumber_record_cannot = $builder->build_sample_biblio({ itemtype => $itemtype_cant_record })->biblionumber;
350
        my ( undef, undef, $itemnumber_1_cannot ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CANNOT' } , $biblionumber_cannot);
351
        my ( undef, undef, $itemnumber_1_can ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_can } , $biblionumber_cannot);
352
        my ( undef, undef, $itemnumber_1_cannot ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_cant } , $biblionumber_cannot);
351
353
352
        my ( undef, undef, $itemnumber_2_can ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblionumber_can);
354
        my ( undef, undef, $itemnumber_2_can ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_can } , $biblionumber_can);
353
        my ( undef, undef, $itemnumber_2_cannot ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CANNOT' } , $biblionumber_can);
355
        my ( undef, undef, $itemnumber_2_cannot ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_cant } , $biblionumber_can);
354
356
355
        my ($biblionumber_record_cannot) = create_helper_biblio('CANNOT_RECORD');
357
        my ( undef, undef, $itemnumber_3_cannot ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_cant_record } , $biblionumber_record_cannot);
356
        my ( undef, undef, $itemnumber_3_cannot ) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CANNOT_RECORD' } , $biblionumber_record_cannot);
357
358
358
        Koha::Holds->search({borrowernumber => $borrowernumbers[0]})->delete;
359
        Koha::Holds->search({borrowernumber => $borrowernumbers[0]})->delete;
359
360
360
        t::lib::Mocks::mock_preference('item-level_itypes', 1);
361
        t::lib::Mocks::mock_preference('item-level_itypes', 1);
361
        is(
362
        is(
362
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_2_cannot), 'noReservesAllowed',
363
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_2_cannot)->{status}, 'noReservesAllowed',
363
            "With item level set, rule from item must be picked (CANNOT)"
364
            "With item level set, rule from item must be picked (CANNOT)"
364
        );
365
        );
365
        is(
366
        is(
366
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_1_can), 'OK',
367
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_1_can)->{status}, 'OK',
367
            "With item level set, rule from item must be picked (CAN)"
368
            "With item level set, rule from item must be picked (CAN)"
368
        );
369
        );
369
        t::lib::Mocks::mock_preference('item-level_itypes', 0);
370
        t::lib::Mocks::mock_preference('item-level_itypes', 0);
370
        is(
371
        is(
371
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_1_can), 'noReservesAllowed',
372
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_1_can)->{status}, 'noReservesAllowed',
372
            "With biblio level set, rule from biblio must be picked (CANNOT)"
373
            "With biblio level set, rule from biblio must be picked (CANNOT)"
373
        );
374
        );
374
        is(
375
        is(
375
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_2_cannot), 'OK',
376
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_2_cannot)->{status}, 'OK',
376
            "With biblio level set, rule from biblio must be picked (CAN)"
377
            "With biblio level set, rule from biblio must be picked (CAN)"
377
        );
378
        );
378
        is(
379
        is(
379
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_3_cannot), 'noReservesAllowed',
380
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_3_cannot)->{status}, 'noReservesAllowed',
380
            "When no holds allowed and no holds per record allowed should return noReservesAllowed"
381
            "When no holds allowed and no holds per record allowed should return noReservesAllowed"
381
        );
382
        );
382
    };
383
    };
Lines 385-395 subtest 'CanItemBeReserved' => sub { Link Here
385
        plan tests => 7;
386
        plan tests => 7;
386
387
387
        my $biblionumber_1 = $builder->build_sample_biblio({ itemtype => $itemtype_can })->biblionumber;
388
        my $biblionumber_1 = $builder->build_sample_biblio({ itemtype => $itemtype_can })->biblionumber;
388
        my ( undef, undef, $itemnumber_11) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblionumber_1);
389
        my ( undef, undef, $itemnumber_11) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_can } , $biblionumber_1);
389
        my ( undef, undef, $itemnumber_12) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblionumber_1);
390
        my ( undef, undef, $itemnumber_12) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_can } , $biblionumber_1);
390
        my $biblionumber_2 = $builder->build_sample_biblio({ itemtype => $itemtype_can })->biblionumber;
391
        my $biblionumber_2 = $builder->build_sample_biblio({ itemtype => $itemtype_can })->biblionumber;
391
        my ( undef, undef, $itemnumber_21) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblionumber_2);
392
        my ( undef, undef, $itemnumber_21) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_can } , $biblionumber_2);
392
        my ( undef, undef, $itemnumber_22) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => 'CAN' } , $biblionumber_2);
393
        my ( undef, undef, $itemnumber_22) = AddItem({ homebranch => $branch_1, holdingbranch => $branch_1, itype => $itemtype_can } , $biblionumber_2);
393
394
394
        Koha::Holds->search({borrowernumber => $borrowernumbers[0]})->delete;
395
        Koha::Holds->search({borrowernumber => $borrowernumbers[0]})->delete;
395
396
Lines 405-411 subtest 'CanItemBeReserved' => sub { Link Here
405
            t::lib::Mocks::mock_preference('item-level_itypes', $item_level);
406
            t::lib::Mocks::mock_preference('item-level_itypes', $item_level);
406
            is(
407
            is(
407
                # FIXME This is not really correct, but CanItemBeReserved does not check if biblio-level holds already exist
408
                # FIXME This is not really correct, but CanItemBeReserved does not check if biblio-level holds already exist
408
                CanItemBeReserved( $borrowernumbers[0], $itemnumber_11), 'OK',
409
                CanItemBeReserved( $borrowernumbers[0], $itemnumber_11)->{status}, 'OK',
409
                "A biblio-level hold already exists - another hold can be placed on a specific item item"
410
                "A biblio-level hold already exists - another hold can be placed on a specific item item"
410
            );
411
            );
411
        }
412
        }
Lines 422-438 subtest 'CanItemBeReserved' => sub { Link Here
422
        );
423
        );
423
        $dbh->do(q{UPDATE issuingrules set reservesallowed=5, holds_per_record=1});
424
        $dbh->do(q{UPDATE issuingrules set reservesallowed=5, holds_per_record=1});
424
        is(
425
        is(
425
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_12), 'tooManyHoldsForThisRecord',
426
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_12)->{status}, 'tooManyHoldsForThisRecord',
426
            "A item-level hold already exists and holds_per_record=1, another hold cannot be placed on this record"
427
            "A item-level hold already exists and holds_per_record=1, another hold cannot be placed on this record"
427
        );
428
        );
428
        $dbh->do(q{UPDATE issuingrules set reservesallowed=1, holds_per_record=1});
429
        $dbh->do(q{UPDATE issuingrules set reservesallowed=1, holds_per_record=1});
429
        is(
430
        is(
430
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_12), 'tooManyHoldsForThisRecord',
431
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_12)->{status}, 'tooManyHoldsForThisRecord',
431
            "A item-level hold already exists and holds_per_record=1 - tooManyHoldsForThisRecord has priority over tooManyReserves"
432
            "A item-level hold already exists and holds_per_record=1 - tooManyHoldsForThisRecord has priority over tooManyReserves"
432
        );
433
        );
433
        $dbh->do(q{UPDATE issuingrules set reservesallowed=5, holds_per_record=2});
434
        $dbh->do(q{UPDATE issuingrules set reservesallowed=5, holds_per_record=2});
434
        is(
435
        is(
435
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_12), 'OK',
436
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_12)->{status}, 'OK',
436
            "A item-level hold already exists but holds_per_record=2- another item-level hold can be placed on this record"
437
            "A item-level hold already exists but holds_per_record=2- another item-level hold can be placed on this record"
437
        );
438
        );
438
439
Lines 446-456 subtest 'CanItemBeReserved' => sub { Link Here
446
        );
447
        );
447
        $dbh->do(q{UPDATE issuingrules set reservesallowed=2, holds_per_record=2});
448
        $dbh->do(q{UPDATE issuingrules set reservesallowed=2, holds_per_record=2});
448
        is(
449
        is(
449
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_21), 'itemAlreadyOnHold',
450
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_21)->{status}, 'itemAlreadyOnHold',
450
            "A item-level holds already exists on this item, itemAlreadyOnHold should be raised"
451
            "A item-level holds already exists on this item, itemAlreadyOnHold should be raised"
451
        );
452
        );
452
        is(
453
        is(
453
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_22), 'tooManyReserves',
454
            CanItemBeReserved( $borrowernumbers[0], $itemnumber_22)->{status}, 'tooManyReserves',
454
            "This patron has already placed reservesallowed holds, tooManyReserves should be raised"
455
            "This patron has already placed reservesallowed holds, tooManyReserves should be raised"
455
        );
456
        );
456
    };
457
    };
457
- 

Return to bug 16787