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

(-)a/C4/Reserves.pm (-81 / +64 lines)
Lines 414-419 sub CanItemBeReserved { Link Here
414
    my $patron = Koha::Patrons->find( $borrowernumber );
414
    my $patron = Koha::Patrons->find( $borrowernumber );
415
    my $borrower = $patron->unblessed;
415
    my $borrower = $patron->unblessed;
416
416
417
    # We check item branch if IndependentBranches is ON
418
    # and canreservefromotherbranches is OFF
419
    if ( C4::Context->preference('IndependentBranches')
420
        and !C4::Context->preference('canreservefromotherbranches') )
421
    {
422
        if ( $item->homebranch ne $patron->branchcode ) {
423
            return { status => 'cannotReserveFromOtherBranches' };
424
        }
425
    }
426
417
    # If an item is damaged and we don't allow holds on damaged items, we can stop right here
427
    # If an item is damaged and we don't allow holds on damaged items, we can stop right here
418
    return { status =>'damaged' }
428
    return { status =>'damaged' }
419
      if ( $item->damaged
429
      if ( $item->damaged
Lines 439-463 sub CanItemBeReserved { Link Here
439
449
440
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
450
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
441
451
442
    my $querycount = q{
452
    my $reserves_control_branch;
443
        SELECT count(*) AS count
444
          FROM reserves
445
     LEFT JOIN items USING (itemnumber)
446
     LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
447
     LEFT JOIN borrowers USING (borrowernumber)
448
         WHERE borrowernumber = ?
449
    };
450
451
    my $branchcode  = "";
452
    my $branchfield = "reserves.branchcode";
453
    my $branchfield = "reserves.branchcode";
453
454
454
    if ( $controlbranch eq "ItemHomeLibrary" ) {
455
    if ( $controlbranch eq "ItemHomeLibrary" ) {
455
        $branchfield = "items.homebranch";
456
        $branchfield = "items.homebranch";
456
        $branchcode  = $item->homebranch;
457
        $reserves_control_branch  = $item->homebranch;
457
    }
458
    }
458
    elsif ( $controlbranch eq "PatronLibrary" ) {
459
    elsif ( $controlbranch eq "PatronLibrary" ) {
459
        $branchfield = "borrowers.branchcode";
460
        $branchfield = "borrowers.branchcode";
460
        $branchcode  = $borrower->{branchcode};
461
        $reserves_control_branch  = $borrower->{branchcode};
461
    }
462
    }
462
463
463
    # we retrieve rights
464
    # we retrieve rights
Lines 465-471 sub CanItemBeReserved { Link Here
465
        my $reservesallowed = Koha::CirculationRules->get_effective_rule({
466
        my $reservesallowed = Koha::CirculationRules->get_effective_rule({
466
                itemtype     => $item->effective_itemtype,
467
                itemtype     => $item->effective_itemtype,
467
                categorycode => $borrower->{categorycode},
468
                categorycode => $borrower->{categorycode},
468
                branchcode   => $branchcode,
469
                branchcode   => $reserves_control_branch,
469
                rule_name    => 'reservesallowed',
470
                rule_name    => 'reservesallowed',
470
        })
471
        })
471
    ) {
472
    ) {
Lines 479-559 sub CanItemBeReserved { Link Here
479
    my $rights = Koha::CirculationRules->get_effective_rules({
480
    my $rights = Koha::CirculationRules->get_effective_rules({
480
        categorycode => $borrower->{'categorycode'},
481
        categorycode => $borrower->{'categorycode'},
481
        itemtype     => $item->effective_itemtype,
482
        itemtype     => $item->effective_itemtype,
482
        branchcode   => $branchcode,
483
        branchcode   => $reserves_control_branch,
483
        rules        => ['holds_per_record','holds_per_day']
484
        rules        => ['holds_per_record','holds_per_day']
484
    });
485
    });
485
    my $holds_per_record = $rights->{holds_per_record} // 1;
486
    my $holds_per_record = $rights->{holds_per_record} // 1;
486
    my $holds_per_day    = $rights->{holds_per_day};
487
    my $holds_per_day    = $rights->{holds_per_day};
487
488
488
    my $search_params = {
489
        borrowernumber => $borrowernumber,
490
        biblionumber   => $item->biblionumber,
491
    };
492
    $search_params->{found} = undef if $params->{ignore_found_holds};
493
494
    my $holds = Koha::Holds->search($search_params);
495
    if (   defined $holds_per_record && $holds_per_record ne '' ){
489
    if (   defined $holds_per_record && $holds_per_record ne '' ){
496
        if ( $holds_per_record == 0 ) {
490
        if ( $holds_per_record == 0 ) {
497
            return { status => "noReservesAllowed" };
491
            return { status => "noReservesAllowed" };
498
        }
492
        }
499
        if ( !$params->{ignore_hold_counts} && $holds->count() >= $holds_per_record ) {
493
        if ( !$params->{ignore_hold_counts} ) {
500
            return { status => "tooManyHoldsForThisRecord", limit => $holds_per_record };
494
            my $search_params = {
495
                borrowernumber => $borrowernumber,
496
                biblionumber   => $item->biblionumber,
497
            };
498
            $search_params->{found} = undef if $params->{ignore_found_holds};
499
            my $holds = Koha::Holds->search($search_params);
500
            return { status => "tooManyHoldsForThisRecord", limit => $holds_per_record } if $holds->count() >= $holds_per_record;
501
        }
501
        }
502
    }
502
    }
503
503
504
    my $today_holds = Koha::Holds->search({
504
    if (!$params->{ignore_hold_counts} && defined $holds_per_day && $holds_per_day ne '')
505
        borrowernumber => $borrowernumber,
506
        reservedate    => dt_from_string->date
507
    });
508
509
    if (!$params->{ignore_hold_counts} && defined $holds_per_day && $holds_per_day ne ''
510
        && $today_holds->count() >= $holds_per_day )
511
    {
505
    {
512
        return { status => 'tooManyReservesToday', limit => $holds_per_day };
506
        my $today_holds = Koha::Holds->search({
507
            borrowernumber => $borrowernumber,
508
            reservedate    => dt_from_string->date
509
        });
510
        return { status => 'tooManyReservesToday', limit => $holds_per_day } if $today_holds->count() >= $holds_per_day;
513
    }
511
    }
514
512
515
    # we retrieve count
513
    # we check if it's ok or not
516
514
    if ( defined $allowedreserves && $allowedreserves ne '' ){
517
    $querycount .= "AND ( $branchfield = ? OR $branchfield IS NULL )";
515
        if( $allowedreserves == 0 ){
518
516
            return { status => 'noReservesAllowed' };
519
    # If using item-level itypes, fall back to the record
520
    # level itemtype if the hold has no associated item
521
    if ( defined $ruleitemtype ) {
522
        if ( C4::Context->preference('item-level_itypes') ) {
523
            $querycount .= q{
524
                AND ( COALESCE( items.itype, biblioitems.itemtype ) = ?
525
                   OR reserves.itemtype = ? )
526
            };
527
        }
517
        }
528
        else {
518
        if ( !$params->{ignore_hold_counts} ) {
529
            $querycount .= q{
519
            # we retrieve count
530
                AND ( biblioitems.itemtype = ?
520
            my $querycount = q{
531
                   OR reserves.itemtype = ? )
521
                SELECT count(*) AS count
522
                  FROM reserves
523
             LEFT JOIN items USING (itemnumber)
524
             LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
525
             LEFT JOIN borrowers USING (borrowernumber)
526
                 WHERE borrowernumber = ?
532
            };
527
            };
533
        }
528
            $querycount .= "AND ( $branchfield = ? OR $branchfield IS NULL )";
534
    }
535
529
536
    my $sthcount = $dbh->prepare($querycount);
530
            # If using item-level itypes, fall back to the record
531
            # level itemtype if the hold has no associated item
532
            $querycount .=
533
              C4::Context->preference('item-level_itypes')
534
              ? " AND ( COALESCE( items.itype, biblioitems.itemtype ) = ? OR reserves.itemtype = ? )"
535
              : " AND ( biblioitems.itemtype = ? OR reserves.itemtype = ? )"
536
              if defined $ruleitemtype;
537
537
538
    if ( defined $ruleitemtype ) {
538
            my $sthcount = $dbh->prepare($querycount);
539
        $sthcount->execute( $borrowernumber, $branchcode, $ruleitemtype, $ruleitemtype );
540
    }
541
    else {
542
        $sthcount->execute( $borrowernumber, $branchcode );
543
    }
544
539
545
    my $reservecount = "0";
540
            if ( defined $ruleitemtype ) {
546
    if ( my $rowcount = $sthcount->fetchrow_hashref() ) {
541
                $sthcount->execute( $borrowernumber, $reserves_control_branch, $ruleitemtype, $ruleitemtype );
547
        $reservecount = $rowcount->{count};
542
            }
548
    }
543
            else {
544
                $sthcount->execute( $borrowernumber, $reserves_control_branch );
545
            }
549
546
550
    # we check if it's ok or not
547
            my $reservecount = "0";
551
    if ( defined $allowedreserves && $allowedreserves ne '' ){
548
            if ( my $rowcount = $sthcount->fetchrow_hashref() ) {
552
        if( $allowedreserves == 0 ){
549
                $reservecount = $rowcount->{count};
553
            return { status => 'noReservesAllowed' };
550
            }
554
        }
551
555
        if ( !$params->{ignore_hold_counts} && $reservecount >= $allowedreserves ) {
552
            return { status => 'tooManyReserves', limit => $allowedreserves } if $reservecount >= $allowedreserves;
556
            return { status => 'tooManyReserves', limit => $allowedreserves };
557
        }
553
        }
558
    }
554
    }
559
555
Lines 561-567 sub CanItemBeReserved { Link Here
561
    my $rule = Koha::CirculationRules->get_effective_rule(
557
    my $rule = Koha::CirculationRules->get_effective_rule(
562
        {
558
        {
563
            categorycode => $borrower->{categorycode},
559
            categorycode => $borrower->{categorycode},
564
            branchcode   => $branchcode,
560
            branchcode   => $reserves_control_branch,
565
            rule_name    => 'max_holds',
561
            rule_name    => 'max_holds',
566
        }
562
        }
567
    );
563
    );
Lines 575-582 sub CanItemBeReserved { Link Here
575
        return { status => 'tooManyReserves', limit => $rule->rule_value} if $total_holds_count >= $rule->rule_value;
571
        return { status => 'tooManyReserves', limit => $rule->rule_value} if $total_holds_count >= $rule->rule_value;
576
    }
572
    }
577
573
578
    my $reserves_control_branch =
579
      GetReservesControlBranch( $item->unblessed(), $borrower );
580
    my $branchitemrule =
574
    my $branchitemrule =
581
      C4::Circulation::GetBranchItemRule( $reserves_control_branch, $item->effective_itemtype );
575
      C4::Circulation::GetBranchItemRule( $reserves_control_branch, $item->effective_itemtype );
582
576
Lines 597-612 sub CanItemBeReserved { Link Here
597
        }
591
        }
598
    }
592
    }
599
593
600
    # If reservecount is ok, we check item branch if IndependentBranches is ON
601
    # and canreservefromotherbranches is OFF
602
    if ( C4::Context->preference('IndependentBranches')
603
        and !C4::Context->preference('canreservefromotherbranches') )
604
    {
605
        if ( $item->homebranch ne $borrower->{branchcode} ) {
606
            return { status => 'cannotReserveFromOtherBranches' };
607
        }
608
    }
609
610
    if ($pickup_branchcode) {
594
    if ($pickup_branchcode) {
611
        my $destination = Koha::Libraries->find({
595
        my $destination = Koha::Libraries->find({
612
            branchcode => $pickup_branchcode,
596
            branchcode => $pickup_branchcode,
613
- 

Return to bug 30085