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

(-)a/C4/Reserves.pm (-230 / +188 lines)
Lines 93-99 BEGIN { Link Here
93
    @ISA = qw(Exporter);
93
    @ISA = qw(Exporter);
94
    @EXPORT = qw(
94
    @EXPORT = qw(
95
        &AddReserve
95
        &AddReserve
96
  
96
97
        &GetReserve
97
        &GetReservesFromItemnumber
98
        &GetReservesFromItemnumber
98
        &GetReservesFromBiblionumber
99
        &GetReservesFromBiblionumber
99
        &GetReservesFromBorrowernumber
100
        &GetReservesFromBorrowernumber
Lines 244-249 sub AddReserve { Link Here
244
    return;     # FIXME: why not have a useful return value?
245
    return;     # FIXME: why not have a useful return value?
245
}
246
}
246
247
248
=head2 GetReserve
249
250
    $res = GetReserve( $reserve_id );
251
252
=cut
253
254
sub GetReserve {
255
    my ($reserve_id) = @_;
256
    #warn "C4::Reserves::GetReserve( $reserve_id )";
257
258
    my $dbh = C4::Context->dbh;
259
    my $query = "SELECT * FROM reserves WHERE reserve_id = ?";
260
    my $sth = $dbh->prepare( $query );
261
    $sth->execute( $reserve_id );
262
    my $res = $sth->fetchrow_hashref();
263
    return $res;
264
}
265
247
=head2 GetReservesFromBiblionumber
266
=head2 GetReservesFromBiblionumber
248
267
249
  ($count, $title_reserves) = &GetReserves($biblionumber);
268
  ($count, $title_reserves) = &GetReserves($biblionumber);
Lines 260-266 sub GetReservesFromBiblionumber { Link Here
260
279
261
    # Find the desired items in the reserves
280
    # Find the desired items in the reserves
262
    my $query = "
281
    my $query = "
263
        SELECT  branchcode,
282
        SELECT  reserve_id,
283
                branchcode,
264
                timestamp AS rtimestamp,
284
                timestamp AS rtimestamp,
265
                priority,
285
                priority,
266
                biblionumber,
286
                biblionumber,
Lines 328-334 sub GetReservesFromBiblionumber { Link Here
328
348
329
=head2 GetReservesFromItemnumber
349
=head2 GetReservesFromItemnumber
330
350
331
 ( $reservedate, $borrowernumber, $branchcode ) = GetReservesFromItemnumber($itemnumber);
351
 ( $reservedate, $borrowernumber, $branchcode, $reserve_id ) = GetReservesFromItemnumber($itemnumber);
332
352
333
TODO :: Description here
353
TODO :: Description here
334
354
Lines 338-344 sub GetReservesFromItemnumber { Link Here
338
    my ( $itemnumber, $all_dates ) = @_;
358
    my ( $itemnumber, $all_dates ) = @_;
339
    my $dbh   = C4::Context->dbh;
359
    my $dbh   = C4::Context->dbh;
340
    my $query = "
360
    my $query = "
341
    SELECT reservedate,borrowernumber,branchcode
361
    SELECT reservedate,borrowernumber,branchcode,reserve_id
342
    FROM   reserves
362
    FROM   reserves
343
    WHERE  itemnumber=?
363
    WHERE  itemnumber=?
344
    ";
364
    ";
Lines 418-425 This function return 1 if an item can be issued by this borrower. Link Here
418
sub CanItemBeReserved{
438
sub CanItemBeReserved{
419
    my ($borrowernumber, $itemnumber) = @_;
439
    my ($borrowernumber, $itemnumber) = @_;
420
    
440
    
421
    my $dbh             = C4::Context->dbh;
441
    my $dbh = C4::Context->dbh;
422
    my $allowedreserves = 0;
442
    my $allowedreserves = 0;
443
    my $multi_holds_allowed_same = 0;
444
    my $multi_holds_allowed_diff = 0;
423
            
445
            
424
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
446
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
425
    my $itype         = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype";
447
    my $itype         = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype";
Lines 428-454 sub CanItemBeReserved{ Link Here
428
    my $item     = GetItem($itemnumber);
450
    my $item     = GetItem($itemnumber);
429
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
451
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
430
    
452
    
431
    # we retrieve user rights on this itemtype and branchcode
453
    my $querycount = "
432
    my $sth = $dbh->prepare("SELECT categorycode, itemtype, branchcode, reservesallowed 
454
        SELECT count(*) AS count
433
                             FROM issuingrules 
455
        FROM reserves
434
                             WHERE (categorycode in (?,'*') ) 
456
        LEFT JOIN items USING (itemnumber)
435
                             AND (itemtype IN (?,'*')) 
457
        LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
436
                             AND (branchcode IN (?,'*')) 
458
        LEFT JOIN borrowers USING (borrowernumber)
437
                             ORDER BY 
459
        WHERE borrowernumber = ?
438
                               categorycode DESC, 
460
    ";
439
                               itemtype     DESC, 
440
                               branchcode   DESC;"
441
                           );
442
                           
443
    my $querycount ="SELECT 
444
                            count(*) as count
445
                            FROM reserves
446
                                LEFT JOIN items USING (itemnumber)
447
                                LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
448
                                LEFT JOIN borrowers USING (borrowernumber)
449
                            WHERE borrowernumber = ?
450
                                ";
451
    
452
    
461
    
453
    my $itemtype     = $item->{$itype};
462
    my $itemtype     = $item->{$itype};
454
    my $categorycode = $borrower->{categorycode};
463
    my $categorycode = $borrower->{categorycode};
Lines 464-477 sub CanItemBeReserved{ Link Here
464
    }
473
    }
465
    
474
    
466
    # we retrieve rights 
475
    # we retrieve rights 
467
    $sth->execute($categorycode, $itemtype, $branchcode);
476
    my $rights = C4::Circulation::GetIssuingRule( $categorycode, $itemtype, $branchcode );
468
    if(my $rights = $sth->fetchrow_hashref()){
477
    if ( defined $rights ) {
469
        $itemtype        = $rights->{itemtype};
478
        $itemtype        = $rights->{itemtype};
470
        $allowedreserves = $rights->{reservesallowed}; 
479
        $allowedreserves = $rights->{reservesallowed}; 
471
    }else{
480
    }else{
472
        $itemtype = '*';
481
        $itemtype = '*';
473
    }
482
    }
474
    
483
    
484
    my $multi_holds_same = GetMultiHoldsCountSameEnum(
485
        borrowernumber => $borrowernumber,
486
        itemnumber => $itemnumber
487
    );
488
475
    # we retrieve count
489
    # we retrieve count
476
    
490
    
477
    $querycount .= "AND $branchfield = ?";
491
    $querycount .= "AND $branchfield = ?";
Lines 491-500 sub CanItemBeReserved{ Link Here
491
    }
505
    }
492
    
506
    
493
    # we check if it's ok or not
507
    # we check if it's ok or not
494
    if( $reservecount < $allowedreserves ){
508
    if( $reservecount >= $allowedreserves ){ ## too many reserves
495
        return 1;
496
    }else{
497
        return 0;
509
        return 0;
510
    }else{
511
        return 1;
498
    }
512
    }
499
}
513
}
500
#--------------------------------------------------------------------------------
514
#--------------------------------------------------------------------------------
Lines 511-521 sub GetReserveCount { Link Here
511
525
512
    my $dbh = C4::Context->dbh;
526
    my $dbh = C4::Context->dbh;
513
527
514
    my $query = '
528
    my $query = "
515
        SELECT COUNT(*) AS counter
529
        SELECT COUNT(*) AS counter
516
        FROM reserves
530
        FROM reserves
517
          WHERE borrowernumber = ?
531
        WHERE borrowernumber = ?
518
    ';
532
    ";
519
    my $sth = $dbh->prepare($query);
533
    my $sth = $dbh->prepare($query);
520
    $sth->execute($borrowernumber);
534
    $sth->execute($borrowernumber);
521
    my $row = $sth->fetchrow_hashref;
535
    my $row = $sth->fetchrow_hashref;
Lines 687-693 sub GetReservesToBranch { Link Here
687
    my ( $frombranch ) = @_;
701
    my ( $frombranch ) = @_;
688
    my $dbh = C4::Context->dbh;
702
    my $dbh = C4::Context->dbh;
689
    my $sth = $dbh->prepare(
703
    my $sth = $dbh->prepare(
690
        "SELECT borrowernumber,reservedate,itemnumber,timestamp
704
        "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp
691
         FROM reserves 
705
         FROM reserves 
692
         WHERE priority='0' 
706
         WHERE priority='0' 
693
           AND branchcode=?"
707
           AND branchcode=?"
Lines 710-731 sub GetReservesToBranch { Link Here
710
724
711
sub GetReservesForBranch {
725
sub GetReservesForBranch {
712
    my ($frombranch) = @_;
726
    my ($frombranch) = @_;
713
    my $dbh          = C4::Context->dbh;
727
    my $dbh = C4::Context->dbh;
714
	my $query        = "SELECT borrowernumber,reservedate,itemnumber,waitingdate
728
729
    my $query = "
730
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
715
        FROM   reserves 
731
        FROM   reserves 
716
        WHERE   priority='0'
732
        WHERE   priority='0'
717
            AND found='W' ";
733
        AND found='W'
718
    if ($frombranch){
734
    ";
719
        $query .= " AND branchcode=? ";
735
    $query .= " AND branchcode=? " if ( $frombranch );
720
	}
721
    $query .= "ORDER BY waitingdate" ;
736
    $query .= "ORDER BY waitingdate" ;
737
722
    my $sth = $dbh->prepare($query);
738
    my $sth = $dbh->prepare($query);
723
    if ($frombranch){
739
    if ($frombranch){
724
		$sth->execute($frombranch);
740
	$sth->execute($frombranch);
725
	}
741
    } else {
726
    else {
742
        $sth->execute();
727
		$sth->execute();
743
    }
728
	}
744
729
    my @transreserv;
745
    my @transreserv;
730
    my $i = 0;
746
    my $i = 0;
731
    while ( my $data = $sth->fetchrow_hashref ) {
747
    while ( my $data = $sth->fetchrow_hashref ) {
Lines 923-1031 sub AutoUnsuspendReserves { Link Here
923
939
924
=head2 CancelReserve
940
=head2 CancelReserve
925
941
926
  &CancelReserve($biblionumber, $itemnumber, $borrowernumber);
942
  &CancelReserve( $reserve_id );
927
943
928
Cancels a reserve.
944
Cancels a reserve.
929
945
930
Use either C<$biblionumber> or C<$itemnumber> to specify the item to
931
cancel, but not both: if both are given, C<&CancelReserve> uses
932
C<$itemnumber>.
933
934
C<$borrowernumber> is the borrower number of the patron on whose
935
behalf the book was reserved.
936
937
If C<$biblionumber> was given, C<&CancelReserve> also adjusts the
938
priorities of the other people who are waiting on the book.
939
940
=cut
946
=cut
941
947
942
sub CancelReserve {
948
sub CancelReserve {
943
    my ( $biblio, $item, $borr ) = @_;
949
    my ( $reserve_id ) = @_;
944
    my $dbh = C4::Context->dbh;
950
    my $dbh = C4::Context->dbh;
945
        if ( $item and $borr ) {
946
        # removing a waiting reserve record....
947
        # update the database...
948
        my $query = "
949
            UPDATE reserves
950
            SET    cancellationdate = now(),
951
                   found            = Null,
952
                   priority         = 0
953
            WHERE  itemnumber       = ?
954
             AND   borrowernumber   = ?
955
        ";
956
        my $sth = $dbh->prepare($query);
957
        $sth->execute( $item, $borr );
958
        $sth->finish;
959
        $query = "
960
            INSERT INTO old_reserves
961
            SELECT * FROM reserves
962
            WHERE  itemnumber       = ?
963
             AND   borrowernumber   = ?
964
        ";
965
        $sth = $dbh->prepare($query);
966
        $sth->execute( $item, $borr );
967
        $query = "
968
            DELETE FROM reserves
969
            WHERE  itemnumber       = ?
970
             AND   borrowernumber   = ?
971
        ";
972
        $sth = $dbh->prepare($query);
973
        $sth->execute( $item, $borr );
974
    }
975
    else {
976
        # removing a reserve record....
977
        # get the prioritiy on this record....
978
        my $priority;
979
        my $query = qq/
980
            SELECT priority FROM reserves
981
            WHERE biblionumber   = ?
982
              AND borrowernumber = ?
983
              AND cancellationdate IS NULL
984
              AND itemnumber IS NULL
985
        /;
986
        my $sth = $dbh->prepare($query);
987
        $sth->execute( $biblio, $borr );
988
        ($priority) = $sth->fetchrow_array;
989
        $sth->finish;
990
        $query = qq/
991
            UPDATE reserves
992
            SET    cancellationdate = now(),
993
                   found            = Null,
994
                   priority         = 0
995
            WHERE  biblionumber     = ?
996
              AND  borrowernumber   = ?
997
        /;
998
999
        # update the database, removing the record...
1000
        $sth = $dbh->prepare($query);
1001
        $sth->execute( $biblio, $borr );
1002
        $sth->finish;
1003
951
1004
        $query = qq/
952
    my $query = "
1005
            INSERT INTO old_reserves
953
        UPDATE reserves
1006
            SELECT * FROM reserves
954
        SET    cancellationdate = now(),
1007
            WHERE  biblionumber     = ?
955
               found            = Null,
1008
              AND  borrowernumber   = ?
956
               priority         = 0
1009
        /;
957
        WHERE  reserve_id = ?
1010
        $sth = $dbh->prepare($query);
958
    ";
1011
        $sth->execute( $biblio, $borr );
959
    my $sth = $dbh->prepare($query);
960
    $sth->execute( $reserve_id );
961
    $sth->finish;
1012
962
1013
        $query = qq/
963
    $query = "
1014
            DELETE FROM reserves
964
        INSERT INTO old_reserves
1015
            WHERE  biblionumber     = ?
965
        SELECT * FROM reserves
1016
              AND  borrowernumber   = ?
966
        WHERE  reserve_id = ?
1017
        /;
967
    ";
1018
        $sth = $dbh->prepare($query);
968
    $sth = $dbh->prepare($query);
1019
        $sth->execute( $biblio, $borr );
969
    $sth->execute( $reserve_id );
1020
970
1021
        # now fix the priority on the others....
971
    $query = "
1022
        _FixPriority( $biblio, $borr );
972
        DELETE FROM reserves
1023
    }
973
        WHERE  reserve_id = ?
974
    ";
975
    $sth = $dbh->prepare($query);
976
    $sth->execute( $reserve_id );
977
978
    # now fix the priority on the others....
979
    _FixPriority( $reserve_id );
1024
}
980
}
1025
981
1026
=head2 ModReserve
982
=head2 ModReserve
1027
983
1028
  ModReserve($rank, $biblio, $borrower, $branch[, $itemnumber])
984
  ModReserve($rank, $reserve_id, $branch[, $itemnumber])
1029
985
1030
Change a hold request's priority or cancel it.
986
Change a hold request's priority or cancel it.
1031
987
Lines 1056-1113 itemnumber and supplying itemnumber. Link Here
1056
1012
1057
sub ModReserve {
1013
sub ModReserve {
1058
    #subroutine to update a reserve
1014
    #subroutine to update a reserve
1059
    my ( $rank, $biblio, $borrower, $branch , $itemnumber, $suspend_until) = @_;
1015
    my ( $rank, $reserve_id, $branch , $itemnumber, $suspend_until) = @_;
1060
     return if $rank eq "W";
1016
     return if $rank eq "W";
1061
     return if $rank eq "n";
1017
     return if $rank eq "n";
1062
    my $dbh = C4::Context->dbh;
1018
    my $dbh = C4::Context->dbh;
1063
    if ( $rank eq "del" ) {
1019
    if ( $rank eq "del" ) {
1064
        my $query = qq/
1020
        my $query = "
1065
            UPDATE reserves
1021
            UPDATE reserves
1066
            SET    cancellationdate=now()
1022
            SET    cancellationdate=now()
1067
            WHERE  biblionumber   = ?
1023
            WHERE  reserve_id = ?
1068
             AND   borrowernumber = ?
1024
        ";
1069
        /;
1070
        my $sth = $dbh->prepare($query);
1025
        my $sth = $dbh->prepare($query);
1071
        $sth->execute( $biblio, $borrower );
1026
        $sth->execute( $reserve_id );
1072
        $sth->finish;
1027
        $sth->finish;
1073
        $query = qq/
1028
        $query = "
1074
            INSERT INTO old_reserves
1029
            INSERT INTO old_reserves
1075
            SELECT *
1030
            SELECT *
1076
            FROM   reserves 
1031
            FROM   reserves 
1077
            WHERE  biblionumber   = ?
1032
            WHERE  reserve_id = ?
1078
             AND   borrowernumber = ?
1033
        ";
1079
        /;
1080
        $sth = $dbh->prepare($query);
1034
        $sth = $dbh->prepare($query);
1081
        $sth->execute( $biblio, $borrower );
1035
        $sth->execute( $reserve_id );
1082
        $query = qq/
1036
        $query = "
1083
            DELETE FROM reserves 
1037
            DELETE FROM reserves 
1084
            WHERE  biblionumber   = ?
1038
            WHERE  reserve_id = ?
1085
             AND   borrowernumber = ?
1039
        ";
1086
        /;
1087
        $sth = $dbh->prepare($query);
1040
        $sth = $dbh->prepare($query);
1088
        $sth->execute( $biblio, $borrower );
1041
        $sth->execute( $reserve_id );
1089
        
1042
        
1090
    }
1043
    }
1091
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1044
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1092
        my $query = "
1045
        my $query = "
1093
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1046
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1094
            WHERE biblionumber   = ?
1047
            WHERE reserve_id = ?
1095
            AND borrowernumber = ?
1096
        ";
1048
        ";
1097
        my $sth = $dbh->prepare($query);
1049
        my $sth = $dbh->prepare($query);
1098
        $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower);
1050
        $sth->execute( $rank, $branch, $itemnumber, $reserve_id );
1099
        $sth->finish;
1051
        $sth->finish;
1100
1052
1101
        if ( defined( $suspend_until ) ) {
1053
        if ( defined( $suspend_until ) ) {
1102
            if ( $suspend_until ) {
1054
            if ( $suspend_until ) {
1103
                $suspend_until = C4::Dates->new( $suspend_until )->output("iso");
1055
                $suspend_until = C4::Dates->new( $suspend_until )->output("iso");
1104
                $dbh->do("UPDATE reserves SET suspend = 1, suspend_until = ? WHERE biblionumber = ? AND borrowernumber = ?", undef, ( $suspend_until, $biblio, $borrower ) );
1056
                $dbh->do("UPDATE reserves SET suspend = 1, suspend_until = ? WHERE reserve_id = ?", undef, ( $suspend_until, $reserve_id ) );
1105
            } else {
1057
            } else {
1106
                $dbh->do("UPDATE reserves SET suspend_until = NULL WHERE biblionumber = ? AND borrowernumber = ?", undef, ( $biblio, $borrower ) );
1058
                $dbh->do("UPDATE reserves SET suspend_until = NULL WHERE reserve_id = ?", undef, ( $reserve_id ) );
1107
            }
1059
            }
1108
        }
1060
        }
1109
1061
1110
        _FixPriority( $biblio, $borrower, $rank);
1062
        _FixPriority( $reserve_id, $rank );
1111
    }
1063
    }
1112
}
1064
}
1113
1065
Lines 1127-1132 sub ModReserveFill { Link Here
1127
    my ($res) = @_;
1079
    my ($res) = @_;
1128
    my $dbh = C4::Context->dbh;
1080
    my $dbh = C4::Context->dbh;
1129
    # fill in a reserve record....
1081
    # fill in a reserve record....
1082
    my $reserve_id = $res->{'reserve_id'};
1130
    my $biblionumber = $res->{'biblionumber'};
1083
    my $biblionumber = $res->{'biblionumber'};
1131
    my $borrowernumber    = $res->{'borrowernumber'};
1084
    my $borrowernumber    = $res->{'borrowernumber'};
1132
    my $resdate = $res->{'reservedate'};
1085
    my $resdate = $res->{'reservedate'};
Lines 1175-1181 sub ModReserveFill { Link Here
1175
    # now fix the priority on the others (if the priority wasn't
1128
    # now fix the priority on the others (if the priority wasn't
1176
    # already sorted!)....
1129
    # already sorted!)....
1177
    unless ( $priority == 0 ) {
1130
    unless ( $priority == 0 ) {
1178
        _FixPriority( $biblionumber, $borrowernumber );
1131
        _FixPriority( $reserve_id );
1179
    }
1132
    }
1180
}
1133
}
1181
1134
Lines 1302-1321 Reduce the values of queuded list Link Here
1302
=cut
1255
=cut
1303
1256
1304
sub ModReserveMinusPriority {
1257
sub ModReserveMinusPriority {
1305
    my ( $itemnumber, $borrowernumber, $biblionumber ) = @_;
1258
    my ( $itemnumber, $reserve_id ) = @_;
1306
1259
1307
    #first step update the value of the first person on reserv
1260
    #first step update the value of the first person on reserv
1308
    my $dbh   = C4::Context->dbh;
1261
    my $dbh   = C4::Context->dbh;
1309
    my $query = "
1262
    my $query = "
1310
        UPDATE reserves
1263
        UPDATE reserves
1311
        SET    priority = 0 , itemnumber = ? 
1264
        SET    priority = 0 , itemnumber = ? 
1312
        WHERE  borrowernumber=?
1265
        WHERE  reserve_id = ?
1313
          AND  biblionumber=?
1314
    ";
1266
    ";
1315
    my $sth_upd = $dbh->prepare($query);
1267
    my $sth_upd = $dbh->prepare($query);
1316
    $sth_upd->execute( $itemnumber, $borrowernumber, $biblionumber );
1268
    $sth_upd->execute( $itemnumber, $reserve_id );
1317
    # second step update all others reservs
1269
    # second step update all others reservs
1318
    _FixPriority($biblionumber, $borrowernumber, '0');
1270
    _FixPriority( $reserve_id, '0');
1319
}
1271
}
1320
1272
1321
=head2 GetReserveInfo
1273
=head2 GetReserveInfo
Lines 1328-1334 Current implementation this query should have a single result. Link Here
1328
=cut
1280
=cut
1329
1281
1330
sub GetReserveInfo {
1282
sub GetReserveInfo {
1331
	my ( $borrowernumber, $biblionumber ) = @_;
1283
	my ( $reserve_id ) = @_;
1332
    my $dbh = C4::Context->dbh;
1284
    my $dbh = C4::Context->dbh;
1333
	my $strsth="SELECT 
1285
	my $strsth="SELECT 
1334
	               reservedate, 
1286
	               reservedate, 
Lines 1362-1372 sub GetReserveInfo { Link Here
1362
			 LEFT JOIN items USING(itemnumber) 
1314
			 LEFT JOIN items USING(itemnumber) 
1363
		     LEFT JOIN borrowers USING(borrowernumber)
1315
		     LEFT JOIN borrowers USING(borrowernumber)
1364
		     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber) 
1316
		     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber) 
1365
			WHERE 
1317
			WHERE reserves.reserve_id = ?";
1366
				reserves.borrowernumber=?
1367
				AND reserves.biblionumber=?";
1368
	my $sth = $dbh->prepare($strsth); 
1318
	my $sth = $dbh->prepare($strsth); 
1369
	$sth->execute($borrowernumber,$biblionumber);
1319
	$sth->execute($reserve_id);
1370
1320
1371
	my $data = $sth->fetchrow_hashref;
1321
	my $data = $sth->fetchrow_hashref;
1372
	return $data;
1322
	return $data;
Lines 1455-1483 Input: $where is 'up', 'down', 'top' or 'bottom'. Biblionumber, Date reserve was Link Here
1455
=cut
1405
=cut
1456
1406
1457
sub AlterPriority {
1407
sub AlterPriority {
1458
    my ( $where, $borrowernumber, $biblionumber ) = @_;
1408
    my ( $where, $reserve_id ) = @_;
1459
1409
    #warn "C4::Reserves::AlterPriority( $where, $reserve_id )";
1460
    my $dbh = C4::Context->dbh;
1410
    my $dbh = C4::Context->dbh;
1461
1411
1462
    ## Find this reserve
1412
    my $reserve = GetReserve( $reserve_id );
1463
    my $sth = $dbh->prepare('SELECT * FROM reserves WHERE biblionumber = ? AND borrowernumber = ? AND cancellationdate IS NULL');
1464
    $sth->execute( $biblionumber, $borrowernumber );
1465
    my $reserve = $sth->fetchrow_hashref();
1466
    $sth->finish();
1467
1413
1468
    if ( $where eq 'up' || $where eq 'down' ) {
1414
    if ( $where eq 'up' || $where eq 'down' ) {
1469
    
1415
    
1470
      my $priority = $reserve->{'priority'};        
1416
      my $priority = $reserve->{'priority'};        
1471
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1417
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1472
      _FixPriority( $biblionumber, $borrowernumber, $priority )
1418
      _FixPriority( $reserve_id, $priority )
1473
1419
1474
    } elsif ( $where eq 'top' ) {
1420
    } elsif ( $where eq 'top' ) {
1475
1421
1476
      _FixPriority( $biblionumber, $borrowernumber, '1' )
1422
      _FixPriority( $reserve_id, '1' )
1477
1423
1478
    } elsif ( $where eq 'bottom' ) {
1424
    } elsif ( $where eq 'bottom' ) {
1479
1425
1480
      _FixPriority( $biblionumber, $borrowernumber, '999999' )
1426
      _FixPriority( $reserve_id, '999999' )
1481
1427
1482
    }
1428
    }
1483
}
1429
}
Lines 1491-1517 This function sets the lowestPriority field to true if is false, and false if it Link Here
1491
=cut
1437
=cut
1492
1438
1493
sub ToggleLowestPriority {
1439
sub ToggleLowestPriority {
1494
    my ( $borrowernumber, $biblionumber ) = @_;
1440
    my ( $reserve_id ) = @_;
1495
1441
1496
    my $dbh = C4::Context->dbh;
1442
    my $dbh = C4::Context->dbh;
1497
1443
1498
    my $sth = $dbh->prepare(
1444
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?");
1499
        "UPDATE reserves SET lowestPriority = NOT lowestPriority
1445
    $sth->execute( $reserve_id );
1500
         WHERE biblionumber = ?
1501
         AND borrowernumber = ?"
1502
    );
1503
    $sth->execute(
1504
        $biblionumber,
1505
        $borrowernumber,
1506
    );
1507
    $sth->finish;
1446
    $sth->finish;
1508
    
1447
    
1509
    _FixPriority( $biblionumber, $borrowernumber, '999999' );
1448
    _FixPriority( $reserve_id, '999999' );
1510
}
1449
}
1511
1450
1512
=head2 ToggleSuspend
1451
=head2 ToggleSuspend
1513
1452
1514
  ToggleSuspend( $borrowernumber, $biblionumber );
1453
  ToggleSuspend( $reserve_id );
1515
1454
1516
This function sets the suspend field to true if is false, and false if it is true.
1455
This function sets the suspend field to true if is false, and false if it is true.
1517
If the reserve is currently suspended with a suspend_until date, that date will
1456
If the reserve is currently suspended with a suspend_until date, that date will
Lines 1520-1526 be cleared when it is unsuspended. Link Here
1520
=cut
1459
=cut
1521
1460
1522
sub ToggleSuspend {
1461
sub ToggleSuspend {
1523
    my ( $borrowernumber, $biblionumber, $suspend_until ) = @_;
1462
    my ( $reserve_id, $suspend_until ) = @_;
1524
1463
1525
    $suspend_until = output_pref( dt_from_string( $suspend_until ), 'iso' ) if ( $suspend_until );
1464
    $suspend_until = output_pref( dt_from_string( $suspend_until ), 'iso' ) if ( $suspend_until );
1526
1465
Lines 1531-1544 sub ToggleSuspend { Link Here
1531
    my $sth = $dbh->prepare(
1470
    my $sth = $dbh->prepare(
1532
        "UPDATE reserves SET suspend = NOT suspend,
1471
        "UPDATE reserves SET suspend = NOT suspend,
1533
        suspend_until = CASE WHEN suspend = 0 THEN NULL ELSE $do_until END
1472
        suspend_until = CASE WHEN suspend = 0 THEN NULL ELSE $do_until END
1534
        WHERE biblionumber = ?
1473
        WHERE reserve_id = ?
1535
        AND borrowernumber = ?
1536
    ");
1474
    ");
1537
1475
1538
    my @params;
1476
    my @params;
1539
    push( @params, $suspend_until ) if ( $suspend_until );
1477
    push( @params, $suspend_until ) if ( $suspend_until );
1540
    push( @params, $biblionumber );
1478
    push( @params, $reserve_id );
1541
    push( @params, $borrowernumber );
1542
1479
1543
    $sth->execute( @params );
1480
    $sth->execute( @params );
1544
    $sth->finish;
1481
    $sth->finish;
Lines 1603-1609 sub SuspendAll { Link Here
1603
1540
1604
=head2 _FixPriority
1541
=head2 _FixPriority
1605
1542
1606
  &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank);
1543
  &_FixPriority( $reserve_id, $rank, $ignoreSetLowestRank);
1607
1544
1608
Only used internally (so don't export it)
1545
Only used internally (so don't export it)
1609
Changed how this functions works #
1546
Changed how this functions works #
Lines 1615-1655 in new priority rank Link Here
1615
=cut 
1552
=cut 
1616
1553
1617
sub _FixPriority {
1554
sub _FixPriority {
1618
    my ( $biblio, $borrowernumber, $rank, $ignoreSetLowestRank ) = @_;
1555
    my ( $reserve_id, $rank, $ignoreSetLowestRank ) = @_;
1619
    my $dbh = C4::Context->dbh;
1556
    my $dbh = C4::Context->dbh;
1620
     if ( $rank eq "del" ) {
1557
1621
         CancelReserve( $biblio, undef, $borrowernumber );
1558
    my $res = GetReserve( $reserve_id );
1622
     }
1559
1623
    if ( $rank eq "W" || $rank eq "0" ) {
1560
    if ( $rank eq "del" ) {
1561
         CancelReserve( $reserve_id );
1562
    }
1563
    elsif ( $rank eq "W" || $rank eq "0" ) {
1624
1564
1625
        # make sure priority for waiting or in-transit items is 0
1565
        # make sure priority for waiting or in-transit items is 0
1626
        my $query = qq/
1566
        my $query = "
1627
            UPDATE reserves
1567
            UPDATE reserves
1628
            SET    priority = 0
1568
            SET    priority = 0
1629
            WHERE biblionumber = ?
1569
            WHERE reserve_id = ?
1630
              AND borrowernumber = ?
1570
            AND found IN ('W', 'T')
1631
              AND found IN ('W', 'T')
1571
        ";
1632
        /;
1633
        my $sth = $dbh->prepare($query);
1572
        my $sth = $dbh->prepare($query);
1634
        $sth->execute( $biblio, $borrowernumber );
1573
        $sth->execute( $reserve_id );
1635
    }
1574
    }
1636
    my @priority;
1575
    my @priority;
1637
    my @reservedates;
1576
    my @reservedates;
1638
1577
1639
    # get whats left
1578
    # get whats left
1640
# FIXME adding a new security in returned elements for changing priority,
1579
    my $query = "
1641
# now, we don't care anymore any reservations with itemnumber linked (suppose a waiting reserve)
1580
        SELECT reserve_id, borrowernumber, reservedate, constrainttype
1642
	# This is wrong a waiting reserve has W set
1643
	# The assumption that having an itemnumber set means waiting is wrong and should be corrected any place it occurs
1644
    my $query = qq/
1645
        SELECT borrowernumber, reservedate, constrainttype
1646
        FROM   reserves
1581
        FROM   reserves
1647
        WHERE  biblionumber   = ?
1582
        WHERE  biblionumber   = ?
1648
          AND  ((found <> 'W' AND found <> 'T') or found is NULL)
1583
          AND  ((found <> 'W' AND found <> 'T') OR found IS NULL)
1649
        ORDER BY priority ASC
1584
        ORDER BY priority ASC
1650
    /;
1585
    ";
1651
    my $sth = $dbh->prepare($query);
1586
    my $sth = $dbh->prepare($query);
1652
    $sth->execute($biblio);
1587
    $sth->execute( $res->{'biblionumber'} );
1653
    while ( my $line = $sth->fetchrow_hashref ) {
1588
    while ( my $line = $sth->fetchrow_hashref ) {
1654
        push( @reservedates, $line );
1589
        push( @reservedates, $line );
1655
        push( @priority,     $line );
1590
        push( @priority,     $line );
Lines 1659-1665 sub _FixPriority { Link Here
1659
    my $i;
1594
    my $i;
1660
    my $key = -1;    # to allow for 0 to be a valid result
1595
    my $key = -1;    # to allow for 0 to be a valid result
1661
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1596
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1662
        if ( $borrowernumber == $priority[$i]->{'borrowernumber'} ) {
1597
        if ( $reserve_id == $priority[$i]->{'reserve_id'} ) {
1663
            $key = $i;    # save the index
1598
            $key = $i;    # save the index
1664
            last;
1599
            last;
1665
        }
1600
        }
Lines 1675-1703 sub _FixPriority { Link Here
1675
1610
1676
    # now fix the priority on those that are left....
1611
    # now fix the priority on those that are left....
1677
    $query = "
1612
    $query = "
1678
            UPDATE reserves
1613
        UPDATE reserves
1679
            SET    priority = ?
1614
        SET    priority = ?
1680
                WHERE  biblionumber = ?
1615
        WHERE  reserve_id = ?
1681
                 AND borrowernumber   = ?
1682
                 AND reservedate = ?
1683
         AND found IS NULL
1684
    ";
1616
    ";
1685
    $sth = $dbh->prepare($query);
1617
    $sth = $dbh->prepare($query);
1686
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1618
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1687
        $sth->execute(
1619
        $sth->execute(
1688
            $j + 1, $biblio,
1620
            $j + 1,
1689
            $priority[$j]->{'borrowernumber'},
1621
            $priority[$j]->{'reserve_id'}
1690
            $priority[$j]->{'reservedate'}
1691
        );
1622
        );
1692
        $sth->finish;
1623
        $sth->finish;
1693
    }
1624
    }
1694
    
1625
    
1695
    $sth = $dbh->prepare( "SELECT borrowernumber FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1626
    $sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1696
    $sth->execute();
1627
    $sth->execute();
1697
    
1628
    
1698
    unless ( $ignoreSetLowestRank ) {
1629
    unless ( $ignoreSetLowestRank ) {
1699
      while ( my $res = $sth->fetchrow_hashref() ) {
1630
      while ( my $res = $sth->fetchrow_hashref() ) {
1700
        _FixPriority( $biblio, $res->{'borrowernumber'}, '999999', 1 );
1631
        _FixPriority( $res->{'reserve_id'}, '999999', 1 );
1701
      }
1632
      }
1702
    }
1633
    }
1703
}
1634
}
Lines 1969-1975 sub _ShiftPriorityByDateAndPriority { Link Here
1969
1900
1970
=head2 MoveReserve
1901
=head2 MoveReserve
1971
1902
1972
  MoveReserve( $itemnumber, $borrowernumber, $cancelreserve )
1903
  MoveReserve( $reserve_id, $cancelreserve )
1973
1904
1974
Use when checking out an item to handle reserves
1905
Use when checking out an item to handle reserves
1975
If $cancelreserve boolean is set to true, it will remove existing reserve
1906
If $cancelreserve boolean is set to true, it will remove existing reserve
Lines 2025-2031 This shifts the holds from C<$from_biblio> to C<$to_biblio> and reorders them by Link Here
2025
sub MergeHolds {
1956
sub MergeHolds {
2026
    my ( $dbh, $to_biblio, $from_biblio ) = @_;
1957
    my ( $dbh, $to_biblio, $from_biblio ) = @_;
2027
    my $sth = $dbh->prepare(
1958
    my $sth = $dbh->prepare(
2028
        "SELECT count(*) as reservenumber FROM reserves WHERE biblionumber = ?"
1959
        "SELECT count(*) as reserve_id FROM reserves WHERE biblionumber = ?"
2029
    );
1960
    );
2030
    $sth->execute($from_biblio);
1961
    $sth->execute($from_biblio);
2031
    if ( my $data = $sth->fetchrow_hashref() ) {
1962
    if ( my $data = $sth->fetchrow_hashref() ) {
Lines 2088-2093 sub ReserveSlip { Link Here
2088
    );
2019
    );
2089
}
2020
}
2090
2021
2022
=head2 GetMultiHoldsCountSameEnum
2023
2024
    my $count = GetMultiHoldsCountSameEnum(
2025
        borrowernumber => $borrowernumber,
2026
        itemnumber     => $itemnumber,
2027
    )
2028
2029
    This function returns the number of holds a borrower has placed
2030
    on specific items with the same enumchron field as the given
2031
    item, on the same bibliographic record.
2032
2033
=cut
2034
2035
sub GetMultiHoldsCountSameEnum {
2036
    my %params = @_;
2037
    my $borrowernumber = $params{'borrowernumber'};
2038
    my $itemnumber     = $params{'itemnumber'};
2039
2040
    return unless ( $borrowernumber && $itemnumber );
2041
2042
    my $dbh = C4::Context->dbh;
2043
    my $query = "
2044
        SELECT COUNT(*) AS count FROM reserves
2045
        LEFT JOIN items ON ( reserves.itemnumber = items.itemnumber )
2046
    ";
2047
}
2048
2091
=head1 AUTHOR
2049
=head1 AUTHOR
2092
2050
2093
Koha Development Team <http://koha-community.org/>
2051
Koha Development Team <http://koha-community.org/>
(-)a/circ/circulation.pl (-1 / +1 lines)
Lines 352-358 if ($borrowernumber) { Link Here
352
        $getreserv{nottransfered} = 0;
352
        $getreserv{nottransfered} = 0;
353
353
354
        $getreserv{reservedate}    = format_date( $num_res->{'reservedate'} );
354
        $getreserv{reservedate}    = format_date( $num_res->{'reservedate'} );
355
        $getreserv{reservenumber}  = $num_res->{'reservenumber'};
355
        $getreserv{reserve_id}  = $num_res->{'reserve_id'};
356
        $getreserv{title}          = $getiteminfo->{'title'};
356
        $getreserv{title}          = $getiteminfo->{'title'};
357
        $getreserv{itemtype}       = $itemtypeinfo->{'description'};
357
        $getreserv{itemtype}       = $itemtypeinfo->{'description'};
358
        $getreserv{author}         = $getiteminfo->{'author'};
358
        $getreserv{author}         = $getiteminfo->{'author'};
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 375-377 INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ( Link Here
375
INSERT INTO systempreferences (variable,value,explanation,type) VALUES('EnableBorrowerFiles','0','If enabled, allows librarians to upload and attach arbitrary files to a borrower record.','YesNo');
375
INSERT INTO systempreferences (variable,value,explanation,type) VALUES('EnableBorrowerFiles','0','If enabled, allows librarians to upload and attach arbitrary files to a borrower record.','YesNo');
376
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UpdateTotalIssuesOnCirc','0','Whether to update the totalissues field in the biblio on each circ.',NULL,'YesNo');
376
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UpdateTotalIssuesOnCirc','0','Whether to update the totalissues field in the biblio on each circ.',NULL,'YesNo');
377
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('IntranetSlipPrinterJS','','Use this JavaScript for printing slips. Define at least function printThenClose(). For use e.g. with Firefox PlugIn jsPrintSetup, see http://jsprintsetup.mozdev.org/','','Free');
377
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('IntranetSlipPrinterJS','','Use this JavaScript for printing slips. Define at least function printThenClose(). For use e.g. with Firefox PlugIn jsPrintSetup, see http://jsprintsetup.mozdev.org/','','Free');
378
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('MaxHoldsPerRecord', '1', 'The maximum number of holds allowed per bibliographic record per borrower', NULL, NULL);
(-)a/installer/data/mysql/updatedatabase.pl (+7 lines)
Lines 5536-5541 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { Link Here
5536
    SetVersion($DBversion);
5536
    SetVersion($DBversion);
5537
}
5537
}
5538
5538
5539
$DBversion = "3.09.00.XXX";
5540
if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
5541
    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('MaxHoldsPerRecord', '1', 'The maximum number of holds allowed per bibliographic record per borrower', NULL, NULL)");
5542
    print "Upgrade to $DBversion done (Add syspref MaxHoldsPerRecord)\n";
5543
    SetVersion ($DBversion);
5544
}
5545
5539
=head1 FUNCTIONS
5546
=head1 FUNCTIONS
5540
5547
5541
=head2 TableExists($table)
5548
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (-1 / +6 lines)
Lines 339-345 Circulation: Link Here
339
            - Patrons can only have
339
            - Patrons can only have
340
            - pref: maxreserves
340
            - pref: maxreserves
341
              class: integer
341
              class: integer
342
            - holds at once.
342
            - total holds at a time.
343
        -
344
            - Patrons can only place
345
            - pref: MaxHoldsPerRecord
346
              class: integer
347
            - holds on a single record at a time.
343
        -
348
        -
344
            - pref: emailLibrarianWhenHoldIsPlaced
349
            - pref: emailLibrarianWhenHoldIsPlaced
345
              choices:
350
              choices:
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-12 / +13 lines)
Lines 55-61 function check() { Link Here
55
    }
55
    }
56
56
57
    if (alreadyreserved > "0"){
57
    if (alreadyreserved > "0"){
58
		msg += (_("- This patron had already placed a hold on this item") + "\n" + _("Please cancel the previous hold first") + "\n");
58
		msg += (_("This patron has already placed the maximum number of holds for this record") + "\n" + _("Please cancel a previous hold first") + "\n");
59
    }
59
    }
60
60
61
	if (msg == "") return(true);
61
	if (msg == "") return(true);
Lines 208-214 function checkMultiHold() { Link Here
208
          <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
          <li><strong>Too Many Holds: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %] </a> has too many holds.</li>
209
        [% END %]
209
        [% END %]
210
        [% IF ( alreadyreserved ) %]
210
        [% IF ( alreadyreserved ) %]
211
          <li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %]</a> <strong>already has a hold</strong> on this item </li>
211
          <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>
212
        [% END %]
212
        [% END %]
213
        [% IF ( none_available ) %]
213
        [% IF ( none_available ) %]
214
          <li> <strong>No copies are available</strong> to be placed on hold</li>
214
          <li> <strong>No copies are available</strong> to be placed on hold</li>
Lines 553-558 function checkMultiHold() { Link Here
553
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
553
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
554
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
554
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
555
        <td>
555
        <td>
556
          <input type="hidden" name="reserve_id" value="[% reserveloo.reserve_id %]" />
556
          <input type="hidden" name="borrowernumber" value="[% reserveloo.borrowernumber %]" />
557
          <input type="hidden" name="borrowernumber" value="[% reserveloo.borrowernumber %]" />
557
          <input type="hidden" name="biblionumber" value="[% reserveloo.biblionumber %]" />
558
          <input type="hidden" name="biblionumber" value="[% reserveloo.biblionumber %]" />
558
          <select name="rank-request">
559
          <select name="rank-request">
Lines 572-590 function checkMultiHold() { Link Here
572
573
573
     [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
574
     [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
574
        <td style="white-space:nowrap;">
575
        <td style="white-space:nowrap;">
575
	        <a title="Move Hold Up" href="request.pl?action=move&amp;where=up&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
576
	        <a title="Move Hold Up" href="request.pl?action=move&amp;where=up&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reserve_id=[% reserveloo.reserve_id %]&amp;date=[% reserveloo.date %]">
576
            <img src="/intranet-tmpl/[% theme %]/img/go-up.png" border="0" alt="Go up" />
577
            <img src="/intranet-tmpl/[% theme %]/img/go-up.png" border="0" alt="Go up" />
577
                </a>
578
                </a>
578
579
579
        <a title="Move hold to top" href="request.pl?action=move&amp;where=top&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
580
		<a title="Move Hold To Top" href="request.pl?action=move&amp;where=top&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reserve_id=[% reserveloo.reserve_id %]&amp;date=[% reserveloo.date %]">
580
                    <img src="/intranet-tmpl/[% theme %]/img/go-top.png" border="0" alt="Go top" />
581
                    <img src="/intranet-tmpl/[% theme %]/img/go-top.png" border="0" alt="Go top" />
581
                </a>
582
                </a>
582
583
583
                <a title="Move hold to bottom" href="request.pl?action=move&amp;where=bottom&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
584
                <a title="Move Hold To Bottom" href="request.pl?action=move&amp;where=bottom&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reserve_id=[% reserveloo.reserve_id %]&amp;date=[% reserveloo.date %]">
584
                    <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Go bottom" />
585
                    <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Go bottom" />
585
                </a>
586
                </a>
586
587
587
                <a title="Move hold down" href="request.pl?action=move&amp;where=down&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
588
                <a title="Move Hold Down" href="request.pl?action=move&amp;where=down&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reserve_id=[% reserveloo.reserve_id %]&amp;date=[% reserveloo.date %]">
588
                    <img src="/intranet-tmpl/[% theme %]/img/go-down.png" border="0" alt="Go down" />
589
                    <img src="/intranet-tmpl/[% theme %]/img/go-down.png" border="0" alt="Go down" />
589
                </a>
590
                </a>
590
        </td>
591
        </td>
Lines 664-670 function checkMultiHold() { Link Here
664
665
665
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
666
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
666
	<td>
667
	<td>
667
        <a title="Toggle lowest priority" href="request.pl?action=setLowestPriority&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
668
		<a title="Toggle Lowest Priority" href="request.pl?action=setLowestPriority&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reserve_id=[% reserveloo.reserve_id %]&amp;date=[% reserveloo.date %]">
668
			[% IF ( reserveloo.lowestPriority ) %]
669
			[% IF ( reserveloo.lowestPriority ) %]
669
                        <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Unset Lowest Priority" />
670
                        <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Unset Lowest Priority" />
670
		        [% ELSE %]
671
		        [% ELSE %]
Lines 675-681 function checkMultiHold() { Link Here
675
    [% END %]
676
    [% END %]
676
677
677
	<td>
678
	<td>
678
        <a title="Cancel hold" href="request.pl?action=cancel&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
679
		<a title="Cancel Hold" href="request.pl?action=cancel&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reserve_id=[% reserveloo.reserve_id %]&amp;date=[% reserveloo.date %]">
679
                    <img src="/intranet-tmpl/[% theme %]/img/x.png" border="0" alt="Cancel" />
680
                    <img src="/intranet-tmpl/[% theme %]/img/x.png" border="0" alt="Cancel" />
680
                </a>
681
                </a>
681
	</td>
682
	</td>
Lines 683-694 function checkMultiHold() { Link Here
683
        [% IF SuspendHoldsIntranet %]
684
        [% IF SuspendHoldsIntranet %]
684
	<td>
685
	<td>
685
	[% UNLESS ( reserveloo.wait ) %]
686
	[% UNLESS ( reserveloo.wait ) %]
686
            <input type="button" value="[% IF ( reserveloo.suspend ) %]Unsuspend[% ELSE %]Suspend[% END %]" onclick="window.location.href='request.pl?action=toggleSuspend&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]&amp;suspend_until=' + $('#suspend_until_[% reserveloo.borrowernumber %]').val()" />
687
            <input type="button" value="[% IF ( reserveloo.suspend ) %]Unsuspend[% ELSE %]Suspend[% END %]" onclick="window.location.href='request.pl?action=toggleSuspend&amp;reserve_id=[% reserveloo.reserve_id %]&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]&amp;suspend_until=' + $('#suspend_until_[% reserveloo.reserve_id %]').val()" />
687
688
688
            [% IF AutoResumeSuspendedHolds %]
689
            [% IF AutoResumeSuspendedHolds %]
689
	    <label for="suspend_until_[% reserveloo.borrowernumber %]">[% IF ( reserveloo.suspend ) %] on [% ELSE %] until [% END %]</label>
690
	    <label for="suspend_until_[% reserveloo.reserve_id %]">[% IF ( reserveloo.suspend ) %] on [% ELSE %] until [% END %]</label>
690
        <input name="suspend_until" id="suspend_until_[% reserveloo.borrowernumber %]" size="10" readonly="readonly" value="[% reserveloo.suspend_until | $KohaDates %]" class="datepicker" />
691
            <input name="suspend_until" id="suspend_until_[% reserveloo.reserve_id %]" size="10" readonly="readonly" value="[% reserveloo.suspend_until | $KohaDates %]" class="datepicker" />
691
	    <a href='#' onclick="document.getElementById('suspend_until_[% reserveloo.borrowernumber %]').value='';">Clear Date</a>
692
	    <a href='#' onclick="document.getElementById('suspend_until_[% reserveloo.reserve_id %]').value='';">Clear Date</a>
692
            [% END %]
693
            [% END %]
693
	[% ELSE %]
694
	[% ELSE %]
694
		<input type="hidden" name="suspend_until" value="" />
695
		<input type="hidden" name="suspend_until" value="" />
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt (-1 / +1 lines)
Lines 408-414 $.tablesorter.addParser({ Link Here
408
		[% IF ( RESERVE.cancelable ) %]
408
		[% IF ( RESERVE.cancelable ) %]
409
			<form action="/cgi-bin/koha/opac-modrequest.pl" method="post">
409
			<form action="/cgi-bin/koha/opac-modrequest.pl" method="post">
410
			<input type="hidden" name="biblionumber" value="[% RESERVE.biblionumber %]" />
410
			<input type="hidden" name="biblionumber" value="[% RESERVE.biblionumber %]" />
411
		<input type="hidden" name="reservenumber" value="[% RESERVE.reservenumber %]" />
411
		        <input type="hidden" name="reservenumber" value="[% RESERVE.reservenumber %]" />
412
			<input type="submit" name="submit" class="icon delete cancel" value="Cancel" onclick="return confirmDelete('Are you sure you want to cancel this hold?');" /></form>
412
			<input type="submit" name="submit" class="icon delete cancel" value="Cancel" onclick="return confirmDelete('Are you sure you want to cancel this hold?');" /></form>
413
		[% ELSE %]
413
		[% ELSE %]
414
		[% END %]
414
		[% END %]
(-)a/opac/opac-modrequest.pl (-3 / +3 lines)
Lines 41-48 my ( $template, $borrowernumber, $cookie ) = get_template_and_user( Link Here
41
    }
41
    }
42
);
42
);
43
43
44
my $biblionumber = $query->param('biblionumber');
44
my $reserve_id = $query->param('reserve_id');
45
if ($biblionumber and $borrowernumber) {
45
if ($reserve_id && $borrowernumber) {
46
	CancelReserve($biblionumber, '', $borrowernumber);
46
	CancelReserve( $reserve_id );
47
}
47
}
48
print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds");
48
print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds");
(-)a/opac/opac-reserve.pl (-8 / +11 lines)
Lines 37-43 use C4::Debug; Link Here
37
use Koha::DateUtils;
37
use Koha::DateUtils;
38
# use Data::Dumper;
38
# use Data::Dumper;
39
39
40
my $MAXIMUM_NUMBER_OF_RESERVES = C4::Context->preference("maxreserves");
40
my $maxreserves = C4::Context->preference("maxreserves");
41
my $max_holds_per_record = C4::Context->preference('MaxHoldsPerRecord');
41
42
42
my $query = new CGI;
43
my $query = new CGI;
43
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
44
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
Lines 298-304 if ( CheckBorrowerDebarred($borrowernumber) ) { Link Here
298
299
299
my @reserves = GetReservesFromBorrowernumber( $borrowernumber );
300
my @reserves = GetReservesFromBorrowernumber( $borrowernumber );
300
$template->param( RESERVES => \@reserves );
301
$template->param( RESERVES => \@reserves );
301
if ( $MAXIMUM_NUMBER_OF_RESERVES && (scalar(@reserves) >= $MAXIMUM_NUMBER_OF_RESERVES) ) {
302
if ( $maxreserves && (scalar(@reserves) >= $maxreserves) ) {
302
    $template->param( message => 1 );
303
    $template->param( message => 1 );
303
    $noreserves = 1;
304
    $noreserves = 1;
304
    $template->param( too_many_reserves => scalar(@reserves));
305
    $template->param( too_many_reserves => scalar(@reserves));
Lines 306-317 if ( $MAXIMUM_NUMBER_OF_RESERVES && (scalar(@reserves) >= $MAXIMUM_NUMBER_OF_RES Link Here
306
foreach my $res (@reserves) {
307
foreach my $res (@reserves) {
307
    foreach my $biblionumber (@biblionumbers) {
308
    foreach my $biblionumber (@biblionumbers) {
308
        if ( $res->{'biblionumber'} == $biblionumber && $res->{'borrowernumber'} == $borrowernumber) {
309
        if ( $res->{'biblionumber'} == $biblionumber && $res->{'borrowernumber'} == $borrowernumber) {
309
#            $template->param( message => 1 );
310
            $biblioDataHash{$biblionumber}->{holds_count}++;
310
#            $noreserves = 1;
311
#            $template->param( already_reserved => 1 );
312
            $biblioDataHash{$biblionumber}->{already_reserved} = 1;
313
        }
311
        }
314
    }
312
    }
313
315
}
314
}
316
315
317
unless ($noreserves) {
316
unless ($noreserves) {
Lines 353-359 foreach my $biblioNum (@biblionumbers) { Link Here
353
    $biblioLoopIter{author} = $biblioData->{author};
352
    $biblioLoopIter{author} = $biblioData->{author};
354
    $biblioLoopIter{rank} = $biblioData->{rank};
353
    $biblioLoopIter{rank} = $biblioData->{rank};
355
    $biblioLoopIter{reservecount} = $biblioData->{reservecount};
354
    $biblioLoopIter{reservecount} = $biblioData->{reservecount};
356
    $biblioLoopIter{already_reserved} = $biblioData->{already_reserved};
355
    $biblioLoopIter{holds_count} = $biblioData->{holds_count};
357
356
358
    if (!$itemLevelTypes && $biblioData->{itemtype}) {
357
    if (!$itemLevelTypes && $biblioData->{itemtype}) {
359
        $biblioLoopIter{description} = $itemTypes->{$biblioData->{itemtype}}{description};
358
        $biblioLoopIter{description} = $itemTypes->{$biblioData->{itemtype}}{description};
Lines 480-486 foreach my $biblioNum (@biblionumbers) { Link Here
480
            $policy_holdallowed = 0;
479
            $policy_holdallowed = 0;
481
        }
480
        }
482
481
483
        if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed and CanItemBeReserved($borrowernumber,$itemNum) and ($itemLoopIter->{already_reserved} ne 1)) {
482
        if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed and CanItemBeReserved($borrowernumber,$itemNum) and ($itemLoopIter->{holds_count} < $max_holds_per_record )) {
484
            $itemLoopIter->{available} = 1;
483
            $itemLoopIter->{available} = 1;
485
            $numCopiesAvailable++;
484
            $numCopiesAvailable++;
486
        }
485
        }
Lines 513-518 foreach my $biblioNum (@biblionumbers) { Link Here
513
        $biblioLoopIter{holdable} = undef;
512
        $biblioLoopIter{holdable} = undef;
514
        $anyholdable = undef;
513
        $anyholdable = undef;
515
    }
514
    }
515
    if ($biblioLoopIter{holds_count} >= $max_holds_per_record) {
516
        $biblioLoopIter{holdable} = undef;
517
        $anyholdable = undef;
518
    }
516
    if(not CanBookBeReserved($borrowernumber,$biblioNum)){
519
    if(not CanBookBeReserved($borrowernumber,$biblioNum)){
517
        $biblioLoopIter{holdable} = undef;
520
        $biblioLoopIter{holdable} = undef;
518
        $anyholdable = undef;
521
        $anyholdable = undef;
(-)a/reserve/modrequest.pl (-10 / +11 lines)
Lines 41-63 my ( $template, $loggedinuser, $cookie ) = get_template_and_user( Link Here
41
    }
41
    }
42
);
42
);
43
43
44
my @rank=$query->param('rank-request');
44
my @reserve_id = $query->param('reserve_id');
45
my @biblionumber=$query->param('biblionumber');
45
my @rank = $query->param('rank-request');
46
my @borrower=$query->param('borrowernumber');
46
my @biblionumber = $query->param('biblionumber');
47
my @branch=$query->param('pickup');
47
my @borrower = $query->param('borrowernumber');
48
my @itemnumber=$query->param('itemnumber');
48
my @branch = $query->param('pickup');
49
my @itemnumber = $query->param('itemnumber');
49
my @suspend_until=$query->param('suspend_until');
50
my @suspend_until=$query->param('suspend_until');
50
my $multi_hold = $query->param('multi_hold');
51
my $multi_hold = $query->param('multi_hold');
51
my $biblionumbers = $query->param('biblionumbers');
52
my $biblionumbers = $query->param('biblionumbers');
52
my $count=@rank;
53
my $count=@rank;
53
54
54
my $CancelBiblioNumber=$query->param('CancelBiblioNumber');
55
my $CancelBiblioNumber = $query->param('CancelBiblioNumber');
55
my $CancelBorrowerNumber=$query->param('CancelBorrowerNumber');
56
my $CancelBorrowerNumber = $query->param('CancelBorrowerNumber');
56
my $CancelItemnumber=$query->param('CancelItemnumber');
57
my $CancelItemnumber = $query->param('CancelItemnumber');
57
58
58
# 2 possibilitys : cancel an item reservation, or modify or cancel the queded list
59
# 2 possibilitys : cancel an item reservation, or modify or cancel the queded list
59
60
60
# 1) cancel an item reservation by fonction ModReserveCancelAll (in reserves.pm)
61
# 1) cancel an item reservation by function ModReserveCancelAll (in reserves.pm)
61
if ($CancelBorrowerNumber) {
62
if ($CancelBorrowerNumber) {
62
    ModReserveCancelAll($CancelItemnumber, $CancelBorrowerNumber);
63
    ModReserveCancelAll($CancelItemnumber, $CancelBorrowerNumber);
63
    $biblionumber[0] = $CancelBiblioNumber,
64
    $biblionumber[0] = $CancelBiblioNumber,
Lines 67-73 if ($CancelBorrowerNumber) { Link Here
67
else {
68
else {
68
    for (my $i=0;$i<$count;$i++){
69
    for (my $i=0;$i<$count;$i++){
69
        undef $itemnumber[$i] unless $itemnumber[$i] ne '';
70
        undef $itemnumber[$i] unless $itemnumber[$i] ne '';
70
        ModReserve($rank[$i],$biblionumber[$i],$borrower[$i],$branch[$i],$itemnumber[$i],$suspend_until[$i]); #from C4::Reserves
71
        ModReserve($rank[$i],$reserve_id[$i],$branch[$i],$itemnumber[$i],$suspend_until[$i]); #from C4::Reserves
71
    }
72
    }
72
}
73
}
73
my $from=$query->param('from');
74
my $from=$query->param('from');
(-)a/reserve/request.pl (-33 / +36 lines)
Lines 99-120 $action ||= q{}; Link Here
99
99
100
if ( $action eq 'move' ) {
100
if ( $action eq 'move' ) {
101
  my $where = $input->param('where');
101
  my $where = $input->param('where');
102
  my $borrowernumber = $input->param('borrowernumber');
102
  my $reserve_id = $input->param('reserve_id');
103
  my $biblionumber = $input->param('biblionumber');
103
  AlterPriority( $where, $reserve_id );
104
  AlterPriority( $where, $borrowernumber, $biblionumber );
105
} elsif ( $action eq 'cancel' ) {
104
} elsif ( $action eq 'cancel' ) {
106
  my $borrowernumber = $input->param('borrowernumber');
105
  my $reserve_id = $input->param('reserve_id');
107
  my $biblionumber = $input->param('biblionumber');
106
  CancelReserve( $reserve_id );
108
  CancelReserve( $biblionumber, '', $borrowernumber );
109
} elsif ( $action eq 'setLowestPriority' ) {
107
} elsif ( $action eq 'setLowestPriority' ) {
110
  my $borrowernumber = $input->param('borrowernumber');
108
  my $reserve_id = $input->param('reserve_id');
111
  my $biblionumber   = $input->param('biblionumber');
109
  ToggleLowestPriority( $reserve_id );
112
  ToggleLowestPriority( $borrowernumber, $biblionumber );
113
} elsif ( $action eq 'toggleSuspend' ) {
110
} elsif ( $action eq 'toggleSuspend' ) {
114
  my $borrowernumber = $input->param('borrowernumber');
111
  my $reserve_id = $input->param('reserve_id');
115
  my $biblionumber   = $input->param('biblionumber');
116
  my $suspend_until  = $input->param('suspend_until');
112
  my $suspend_until  = $input->param('suspend_until');
117
  ToggleSuspend( $borrowernumber, $biblionumber, $suspend_until );
113
  ToggleSuspend( $reserve_id, $suspend_until );
118
}
114
}
119
115
120
if ($findborrower) {
116
if ($findborrower) {
Lines 148-154 if ($borrowernumber_hold && !$action) { Link Here
148
      GetReserveCount( $borrowerinfo->{'borrowernumber'} );
144
      GetReserveCount( $borrowerinfo->{'borrowernumber'} );
149
145
150
    if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
146
    if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
151
		$warnings = 1;
147
	$warnings = 1;
152
        $maxreserves = 1;
148
        $maxreserves = 1;
153
    }
149
    }
154
150
Lines 162-168 if ($borrowernumber_hold && !$action) { Link Here
162
158
163
    # check if the borrower make the reserv in a different branch
159
    # check if the borrower make the reserv in a different branch
164
    if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) {
160
    if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) {
165
		$messages = 1;
161
	$messages = 1;
166
        $diffbranch = 1;
162
        $diffbranch = 1;
167
    }
163
    }
168
164
Lines 184-191 if ($borrowernumber_hold && !$action) { Link Here
184
                maxreserves         => $maxreserves,
180
                maxreserves         => $maxreserves,
185
                expiry              => $expiry,
181
                expiry              => $expiry,
186
                diffbranch          => $diffbranch,
182
                diffbranch          => $diffbranch,
187
				messages            => $messages,
183
		messages            => $messages,
188
				warnings            => $warnings
184
		warnings            => $warnings
189
    );
185
    );
190
}
186
}
191
187
Lines 225-230 if ($borrowerslist) { Link Here
225
221
226
# FIXME launch another time GetMember perhaps until
222
# FIXME launch another time GetMember perhaps until
227
my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
223
my $borrowerinfo = GetMember( borrowernumber => $borrowernumber_hold );
224
my $max_holds_per_record = C4::Context->preference('MaxHoldsPerRecord');
228
225
229
my @biblionumbers = ();
226
my @biblionumbers = ();
230
my $biblionumbers = $input->param('biblionumbers');
227
my $biblionumbers = $input->param('biblionumbers');
Lines 239-256 my @biblioloop = (); Link Here
239
foreach my $biblionumber (@biblionumbers) {
236
foreach my $biblionumber (@biblionumbers) {
240
237
241
    my %biblioloopiter = ();
238
    my %biblioloopiter = ();
242
	my $maxreserves;
239
    my $maxreserves;
243
240
244
    my $dat          = GetBiblioData($biblionumber);
241
    my $dat = GetBiblioData($biblionumber);
245
242
246
    unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
243
    unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
247
 		$warnings = 1;
244
	$warnings = 1;
248
        $maxreserves = 1;
245
        $maxreserves = 1;
249
    }
246
    }
250
    # get existing reserves .....
247
    # get existing reserves .....
251
    my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
248
    my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
252
    my $totalcount = $count;
249
    my $totalcount = $count;
253
    my $alreadyreserved;
250
    my $holds_count = 0;
251
    my $alreadyreserved = 0;
254
252
255
    foreach my $res (@$reserves) {
253
    foreach my $res (@$reserves) {
256
        if ( defined $res->{found} && $res->{found} eq 'W' ) {
254
        if ( defined $res->{found} && $res->{found} eq 'W' ) {
Lines 258-275 foreach my $biblionumber (@biblionumbers) { Link Here
258
        }
256
        }
259
257
260
        if ( defined $borrowerinfo && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) {
258
        if ( defined $borrowerinfo && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) {
261
            $warnings = 1;
259
            $holds_count++;
260
        }
261
    }
262
263
    if ( $holds_count >= $max_holds_per_record ) {
262
            $alreadyreserved = 1;
264
            $alreadyreserved = 1;
265
            $warnings = 1;
263
            $biblioloopiter{warn} = 1;
266
            $biblioloopiter{warn} = 1;
264
            $biblioloopiter{alreadyres} = 1;
267
            $biblioloopiter{alreadyres} = 1;
265
        }
266
    }
268
    }
267
269
268
    $template->param( alreadyreserved => $alreadyreserved,
270
    $template->param( alreadyreserved => $alreadyreserved,
269
                      messages => $messages,
271
        messages =>   $messages,
270
                      warnings => $warnings,
272
        warnings =>   $warnings,
271
					  maxreserves=>$maxreserves
273
        maxreserves=> $maxreserves
272
					  );
274
    );
273
275
274
276
275
    # FIXME think @optionloop, is maybe obsolete, or  must be switchable by a systeme preference fixed rank or not
277
    # FIXME think @optionloop, is maybe obsolete, or  must be switchable by a systeme preference fixed rank or not
Lines 296-306 foreach my $biblionumber (@biblionumbers) { Link Here
296
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
298
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
297
        @itemnumbers  = @$items;
299
        @itemnumbers  = @$items;
298
    }
300
    }
299
	my @hostitems = get_hostitemnumbers_of($biblionumber);
301
    my @hostitems = get_hostitemnumbers_of($biblionumber);
300
	if (@hostitems){
302
    if (@hostitems){
301
		$template->param('hostitemsflag' => 1);
303
        $template->param('hostitemsflag' => 1);
302
		push(@itemnumbers, @hostitems);
304
        push(@itemnumbers, @hostitems);
303
	}
305
    }
304
306
305
    if (!@itemnumbers) {
307
    if (!@itemnumbers) {
306
        $template->param('noitems' => 1);
308
        $template->param('noitems' => 1);
Lines 378-384 foreach my $biblionumber (@biblionumbers) { Link Here
378
            }
380
            }
379
381
380
            # checking reserve
382
            # checking reserve
381
            my ($reservedate,$reservedfor,$expectedAt) = GetReservesFromItemnumber($itemnumber);
383
            my ($reservedate,$reservedfor,$expectedAt,$reserve_id) = GetReservesFromItemnumber($itemnumber);
382
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
384
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
383
385
384
            if ( defined $reservedate ) {
386
            if ( defined $reservedate ) {
Lines 575-580 foreach my $biblionumber (@biblionumbers) { Link Here
575
        $reserve{'optionloop'} = \@optionloop;
577
        $reserve{'optionloop'} = \@optionloop;
576
        $reserve{'suspend'} = $res->{'suspend'};
578
        $reserve{'suspend'} = $res->{'suspend'};
577
        $reserve{'suspend_until'} = $res->{'suspend_until'};
579
        $reserve{'suspend_until'} = $res->{'suspend_until'};
580
        $reserve{'reserve_id'} = $res->{'reserve_id'};
581
578
        push( @reserveloop, \%reserve );
582
        push( @reserveloop, \%reserve );
579
    }
583
    }
580
584
581
- 

Return to bug 7710