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

(-)a/C4/Reserves.pm (-27 / +48 lines)
Lines 429-436 This function return 1 if an item can be issued by this borrower. Link Here
429
sub CanItemBeReserved{
429
sub CanItemBeReserved{
430
    my ($borrowernumber, $itemnumber) = @_;
430
    my ($borrowernumber, $itemnumber) = @_;
431
    
431
    
432
    my $dbh             = C4::Context->dbh;
432
    my $dbh = C4::Context->dbh;
433
    my $allowedreserves = 0;
433
    my $allowedreserves = 0;
434
    my $multi_holds_allowed_same = 0;
435
    my $multi_holds_allowed_diff = 0;
434
            
436
            
435
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
437
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
436
    my $itype         = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype";
438
    my $itype         = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype";
Lines 439-465 sub CanItemBeReserved{ Link Here
439
    my $item     = GetItem($itemnumber);
441
    my $item     = GetItem($itemnumber);
440
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
442
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
441
    
443
    
442
    # we retrieve user rights on this itemtype and branchcode
444
    my $querycount = "
443
    my $sth = $dbh->prepare("SELECT categorycode, itemtype, branchcode, reservesallowed 
445
        SELECT count(*) AS count
444
                             FROM issuingrules 
446
        FROM reserves
445
                             WHERE (categorycode in (?,'*') ) 
447
        LEFT JOIN items USING (itemnumber)
446
                             AND (itemtype IN (?,'*')) 
448
        LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
447
                             AND (branchcode IN (?,'*')) 
449
        LEFT JOIN borrowers USING (borrowernumber)
448
                             ORDER BY 
450
        WHERE borrowernumber = ?
449
                               categorycode DESC, 
451
    ";
450
                               itemtype     DESC, 
451
                               branchcode   DESC;"
452
                           );
453
                           
454
    my $querycount ="SELECT 
455
                            count(*) as count
456
                            FROM reserves
457
                                LEFT JOIN items USING (itemnumber)
458
                                LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
459
                                LEFT JOIN borrowers USING (borrowernumber)
460
                            WHERE borrowernumber = ?
461
                                ";
462
    
463
    
452
    
464
    my $itemtype     = $item->{$itype};
453
    my $itemtype     = $item->{$itype};
465
    my $categorycode = $borrower->{categorycode};
454
    my $categorycode = $borrower->{categorycode};
Lines 475-488 sub CanItemBeReserved{ Link Here
475
    }
464
    }
476
    
465
    
477
    # we retrieve rights 
466
    # we retrieve rights 
478
    $sth->execute($categorycode, $itemtype, $branchcode);
467
    my $rights = C4::Circulation::GetIssuingRule( $categorycode, $itemtype, $branchcode );
479
    if(my $rights = $sth->fetchrow_hashref()){
468
    if ( defined $rights ) {
480
        $itemtype        = $rights->{itemtype};
469
        $itemtype        = $rights->{itemtype};
481
        $allowedreserves = $rights->{reservesallowed}; 
470
        $allowedreserves = $rights->{reservesallowed}; 
482
    }else{
471
    }else{
483
        $itemtype = '*';
472
        $itemtype = '*';
484
    }
473
    }
485
    
474
    
475
    my $multi_holds_same = GetMultiHoldsCountSameEnum( 
476
        borrowernumber => $borrowernumber, 
477
        itemnumber => $itemnumber
478
    );
479
    
486
    # we retrieve count
480
    # we retrieve count
487
    
481
    
488
    $querycount .= "AND $branchfield = ?";
482
    $querycount .= "AND $branchfield = ?";
Lines 502-511 sub CanItemBeReserved{ Link Here
502
    }
496
    }
503
    
497
    
504
    # we check if it's ok or not
498
    # we check if it's ok or not
505
    if( $reservecount < $allowedreserves ){
499
    if( $reservecount >= $allowedreserves ){ ## too many reserves
506
        return 1;
507
    }else{
508
        return 0;
500
        return 0;
501
    }else{
502
        return 1;
509
    }
503
    }
510
}
504
}
511
#--------------------------------------------------------------------------------
505
#--------------------------------------------------------------------------------
Lines 1893-1898 sub ReserveSlip { Link Here
1893
    );
1887
    );
1894
}
1888
}
1895
1889
1890
=head2 GetMultiHoldsCountSameEnum
1891
1892
    my $count = GetMultiHoldsCountSameEnum( 
1893
        borrowernumber => $borrowernumber,
1894
        itemnumber     => $itemnumber,
1895
    )
1896
1897
    This function returns the number of holds a borrower has placed
1898
    on specific items with the same enumchron field as the given
1899
    item, on the same bibliographic record.
1900
1901
=cut 
1902
1903
sub GetMultiHoldsCountSameEnum {
1904
    my %params = @_;
1905
    my $borrowernumber = $params{'borrowernumber'};
1906
    my $itemnumber     = $params{'itemnumber'};
1907
    
1908
    return unless ( $borrowernumber && $itemnumber );
1909
    
1910
    my $dbh = C4::Context->dbh;
1911
    my $query = "
1912
        SELECT COUNT(*) AS count FROM reserves 
1913
        LEFT JOIN items ON ( reserves.itemnumber = items.itemnumber )
1914
    ";
1915
}
1916
1896
=head1 AUTHOR
1917
=head1 AUTHOR
1897
1918
1898
Koha Development Team <http://koha-community.org/>
1919
Koha Development Team <http://koha-community.org/>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-2 / +2 lines)
Lines 54-60 function check() { Link Here
54
    }
54
    }
55
55
56
    if (alreadyreserved > "0"){
56
    if (alreadyreserved > "0"){
57
		msg += (_("- This patron had already placed a hold on this item") + "\n" + _("Please cancel the previous hold first") + "\n");
57
		msg += (_("This patron has already placed the maximum number of holds for this record") + "\n" + _("Please cancel a previous hold first") + "\n");
58
    }
58
    }
59
59
60
	if (msg == "") return(true);
60
	if (msg == "") return(true);
Lines 207-213 function checkMultiHold() { Link Here
207
          <li><strong>Too Many Holds: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %] </a> has too many holds.</li>
207
          <li><strong>Too Many Holds: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %] </a> has too many holds.</li>
208
        [% END %]
208
        [% END %]
209
        [% IF ( alreadyreserved ) %]
209
        [% IF ( alreadyreserved ) %]
210
          <li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %]</a> <strong>already has a hold</strong> on this item </li>
210
          <li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %]</a> <strong>has already placed the maximum allowed number of holds</strong> on this record</li>
211
        [% END %]
211
        [% END %]
212
        [% IF ( none_available ) %]
212
        [% IF ( none_available ) %]
213
          <li> <strong>No copies are available</strong> to be placed on hold</li>
213
          <li> <strong>No copies are available</strong> to be placed on hold</li>
(-)a/reserve/request.pl (-8 / +13 lines)
Lines 216-221 if ($borrowerslist) { Link Here
216
216
217
# FIXME launch another time GetMember perhaps until
217
# FIXME launch another time GetMember perhaps until
218
my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
218
my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
219
my $max_holds_per_record = C4::Context->preference('MaxHoldsPerRecord');
219
220
220
my @biblionumbers = ();
221
my @biblionumbers = ();
221
my $biblionumbers = $input->param('biblionumbers');
222
my $biblionumbers = $input->param('biblionumbers');
Lines 241-247 foreach my $biblionumber (@biblionumbers) { Link Here
241
    # get existing reserves .....
242
    # get existing reserves .....
242
    my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
243
    my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
243
    my $totalcount = $count;
244
    my $totalcount = $count;
244
    my $alreadyreserved;
245
    my $holds_count = 0;
246
    my $alreadyreserved = 0;
245
247
246
    foreach my $res (@$reserves) {
248
    foreach my $res (@$reserves) {
247
        if ( defined $res->{found} && $res->{found} eq 'W' ) {
249
        if ( defined $res->{found} && $res->{found} eq 'W' ) {
Lines 249-265 foreach my $biblionumber (@biblionumbers) { Link Here
249
        }
251
        }
250
252
251
        if ( defined $borrowerinfo && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) {
253
        if ( defined $borrowerinfo && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) {
252
            $warnings = 1;
254
            $holds_count++;
255
        }
256
    }
257
258
    if ( $holds_count >= $max_holds_per_record ) {
253
            $alreadyreserved = 1;
259
            $alreadyreserved = 1;
260
            $warnings = 1;
254
            $biblioloopiter{warn} = 1;
261
            $biblioloopiter{warn} = 1;
255
            $biblioloopiter{alreadyres} = 1;
262
            $biblioloopiter{alreadyres} = 1;    
256
        }
257
    }
263
    }
258
264
259
    $template->param( alreadyreserved => $alreadyreserved,
265
    $template->param( alreadyreserved => $alreadyreserved,
260
                      messages => $messages,
266
        messages =>   $messages,
261
                      warnings => $warnings,
267
        warnings =>   $warnings,
262
                       maxreserves=>$maxreserves
268
        maxreserves=> $maxreserves
263
    );
269
    );
264
270
265
271
266
- 

Return to bug 7710