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

(-)a/C4/Reserves.pm (-195 / +134 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 511-521 sub GetReserveCount { Link Here
511
531
512
    my $dbh = C4::Context->dbh;
532
    my $dbh = C4::Context->dbh;
513
533
514
    my $query = '
534
    my $query = "
515
        SELECT COUNT(*) AS counter
535
        SELECT COUNT(*) AS counter
516
        FROM reserves
536
        FROM reserves
517
          WHERE borrowernumber = ?
537
        WHERE borrowernumber = ?
518
    ';
538
    ";
519
    my $sth = $dbh->prepare($query);
539
    my $sth = $dbh->prepare($query);
520
    $sth->execute($borrowernumber);
540
    $sth->execute($borrowernumber);
521
    my $row = $sth->fetchrow_hashref;
541
    my $row = $sth->fetchrow_hashref;
Lines 687-693 sub GetReservesToBranch { Link Here
687
    my ( $frombranch ) = @_;
707
    my ( $frombranch ) = @_;
688
    my $dbh = C4::Context->dbh;
708
    my $dbh = C4::Context->dbh;
689
    my $sth = $dbh->prepare(
709
    my $sth = $dbh->prepare(
690
        "SELECT borrowernumber,reservedate,itemnumber,timestamp
710
        "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp
691
         FROM reserves 
711
         FROM reserves 
692
         WHERE priority='0' 
712
         WHERE priority='0' 
693
           AND branchcode=?"
713
           AND branchcode=?"
Lines 710-731 sub GetReservesToBranch { Link Here
710
730
711
sub GetReservesForBranch {
731
sub GetReservesForBranch {
712
    my ($frombranch) = @_;
732
    my ($frombranch) = @_;
713
    my $dbh          = C4::Context->dbh;
733
    my $dbh = C4::Context->dbh;
714
	my $query        = "SELECT borrowernumber,reservedate,itemnumber,waitingdate
734
    
735
    my $query = "
736
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
715
        FROM   reserves 
737
        FROM   reserves 
716
        WHERE   priority='0'
738
        WHERE   priority='0'
717
            AND found='W' ";
739
        AND found='W'
718
    if ($frombranch){
740
    ";    
719
        $query .= " AND branchcode=? ";
741
    $query .= " AND branchcode=? " if ( $frombranch );
720
	}
721
    $query .= "ORDER BY waitingdate" ;
742
    $query .= "ORDER BY waitingdate" ;
743
722
    my $sth = $dbh->prepare($query);
744
    my $sth = $dbh->prepare($query);
723
    if ($frombranch){
745
    if ($frombranch){
724
		$sth->execute($frombranch);
746
	$sth->execute($frombranch);
725
	}
747
    } else {
726
    else {
748
        $sth->execute();
727
		$sth->execute();
749
    }
728
	}
750
    
729
    my @transreserv;
751
    my @transreserv;
730
    my $i = 0;
752
    my $i = 0;
731
    while ( my $data = $sth->fetchrow_hashref ) {
753
    while ( my $data = $sth->fetchrow_hashref ) {
Lines 923-1031 sub AutoUnsuspendReserves { Link Here
923
945
924
=head2 CancelReserve
946
=head2 CancelReserve
925
947
926
  &CancelReserve($biblionumber, $itemnumber, $borrowernumber);
948
  &CancelReserve( $reserve_id );
927
949
928
Cancels a reserve.
950
Cancels a reserve.
929
951
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
952
=cut
941
953
942
sub CancelReserve {
954
sub CancelReserve {
943
    my ( $biblio, $item, $borr ) = @_;
955
    my ( $reserve_id ) = @_;
944
    my $dbh = C4::Context->dbh;
956
    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
957
1004
        $query = qq/
958
    my $query = "
1005
            INSERT INTO old_reserves
959
        UPDATE reserves
1006
            SELECT * FROM reserves
960
        SET    cancellationdate = now(),
1007
            WHERE  biblionumber     = ?
961
               found            = Null,
1008
              AND  borrowernumber   = ?
962
               priority         = 0
1009
        /;
963
        WHERE  reserve_id = ?
1010
        $sth = $dbh->prepare($query);
964
    ";
1011
        $sth->execute( $biblio, $borr );
965
    my $sth = $dbh->prepare($query);
966
    $sth->execute( $reserve_id );
967
    $sth->finish;
1012
968
1013
        $query = qq/
969
    $query = "
1014
            DELETE FROM reserves
970
        INSERT INTO old_reserves
1015
            WHERE  biblionumber     = ?
971
        SELECT * FROM reserves
1016
              AND  borrowernumber   = ?
972
        WHERE  reserve_id = ?
1017
        /;
973
    ";
1018
        $sth = $dbh->prepare($query);
974
    $sth = $dbh->prepare($query);
1019
        $sth->execute( $biblio, $borr );
975
    $sth->execute( $reserve_id );
1020
976
1021
        # now fix the priority on the others....
977
    $query = "
1022
        _FixPriority( $biblio, $borr );
978
        DELETE FROM reserves
1023
    }
979
        WHERE  reserve_id = ?
980
    ";
981
    $sth = $dbh->prepare($query);
982
    $sth->execute( $reserve_id );
983
984
    # now fix the priority on the others....
985
    _FixPriority( $reserve_id );
1024
}
986
}
1025
987
1026
=head2 ModReserve
988
=head2 ModReserve
1027
989
1028
  ModReserve($rank, $biblio, $borrower, $branch[, $itemnumber])
990
  ModReserve($rank, $reserve_id, $branch[, $itemnumber])
1029
991
1030
Change a hold request's priority or cancel it.
992
Change a hold request's priority or cancel it.
1031
993
Lines 1056-1101 itemnumber and supplying itemnumber. Link Here
1056
1018
1057
sub ModReserve {
1019
sub ModReserve {
1058
    #subroutine to update a reserve
1020
    #subroutine to update a reserve
1059
    my ( $rank, $biblio, $borrower, $branch , $itemnumber, $suspend_until) = @_;
1021
    my ( $rank, $reserve_id, $branch , $itemnumber, $suspend_until) = @_;
1060
     return if $rank eq "W";
1022
     return if $rank eq "W";
1061
     return if $rank eq "n";
1023
     return if $rank eq "n";
1062
    my $dbh = C4::Context->dbh;
1024
    my $dbh = C4::Context->dbh;
1063
    if ( $rank eq "del" ) {
1025
    if ( $rank eq "del" ) {
1064
        my $query = qq/
1026
        my $query = "
1065
            UPDATE reserves
1027
            UPDATE reserves
1066
            SET    cancellationdate=now()
1028
            SET    cancellationdate=now()
1067
            WHERE  biblionumber   = ?
1029
            WHERE  reserve_id = ?
1068
             AND   borrowernumber = ?
1030
        ";
1069
        /;
1070
        my $sth = $dbh->prepare($query);
1031
        my $sth = $dbh->prepare($query);
1071
        $sth->execute( $biblio, $borrower );
1032
        $sth->execute( $reserve_id );
1072
        $sth->finish;
1033
        $sth->finish;
1073
        $query = qq/
1034
        $query = "
1074
            INSERT INTO old_reserves
1035
            INSERT INTO old_reserves
1075
            SELECT *
1036
            SELECT *
1076
            FROM   reserves 
1037
            FROM   reserves 
1077
            WHERE  biblionumber   = ?
1038
            WHERE  reserve_id = ?
1078
             AND   borrowernumber = ?
1039
        ";
1079
        /;
1080
        $sth = $dbh->prepare($query);
1040
        $sth = $dbh->prepare($query);
1081
        $sth->execute( $biblio, $borrower );
1041
        $sth->execute( $reserve_id );
1082
        $query = qq/
1042
        $query = "
1083
            DELETE FROM reserves 
1043
            DELETE FROM reserves 
1084
            WHERE  biblionumber   = ?
1044
            WHERE  reserve_id = ?
1085
             AND   borrowernumber = ?
1045
        ";
1086
        /;
1087
        $sth = $dbh->prepare($query);
1046
        $sth = $dbh->prepare($query);
1088
        $sth->execute( $biblio, $borrower );
1047
        $sth->execute( $reserve_id );
1089
        
1048
        
1090
    }
1049
    }
1091
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1050
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1092
        my $query = "
1051
        my $query = "
1093
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1052
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1094
            WHERE biblionumber   = ?
1053
            WHERE reserve_id = ?
1095
            AND borrowernumber = ?
1096
        ";
1054
        ";
1097
        my $sth = $dbh->prepare($query);
1055
        my $sth = $dbh->prepare($query);
1098
        $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower);
1056
        $sth->execute( $rank, $branch, $itemnumber, $reserve_id );
1099
        $sth->finish;
1057
        $sth->finish;
1100
1058
1101
        if ( defined( $suspend_until ) ) {
1059
        if ( defined( $suspend_until ) ) {
Lines 1107-1113 sub ModReserve { Link Here
1107
            }
1065
            }
1108
        }
1066
        }
1109
1067
1110
        _FixPriority( $biblio, $borrower, $rank);
1068
        _FixPriority( $reserve_id, $rank );
1111
    }
1069
    }
1112
}
1070
}
1113
1071
Lines 1127-1132 sub ModReserveFill { Link Here
1127
    my ($res) = @_;
1085
    my ($res) = @_;
1128
    my $dbh = C4::Context->dbh;
1086
    my $dbh = C4::Context->dbh;
1129
    # fill in a reserve record....
1087
    # fill in a reserve record....
1088
    my $reserve_id = $res->{'reserve_id'};
1130
    my $biblionumber = $res->{'biblionumber'};
1089
    my $biblionumber = $res->{'biblionumber'};
1131
    my $borrowernumber    = $res->{'borrowernumber'};
1090
    my $borrowernumber    = $res->{'borrowernumber'};
1132
    my $resdate = $res->{'reservedate'};
1091
    my $resdate = $res->{'reservedate'};
Lines 1175-1181 sub ModReserveFill { Link Here
1175
    # now fix the priority on the others (if the priority wasn't
1134
    # now fix the priority on the others (if the priority wasn't
1176
    # already sorted!)....
1135
    # already sorted!)....
1177
    unless ( $priority == 0 ) {
1136
    unless ( $priority == 0 ) {
1178
        _FixPriority( $biblionumber, $borrowernumber );
1137
        _FixPriority( $reserve_id );
1179
    }
1138
    }
1180
}
1139
}
1181
1140
Lines 1302-1321 Reduce the values of queuded list Link Here
1302
=cut
1261
=cut
1303
1262
1304
sub ModReserveMinusPriority {
1263
sub ModReserveMinusPriority {
1305
    my ( $itemnumber, $borrowernumber, $biblionumber ) = @_;
1264
    my ( $itemnumber, $reserve_id ) = @_;
1306
1265
1307
    #first step update the value of the first person on reserv
1266
    #first step update the value of the first person on reserv
1308
    my $dbh   = C4::Context->dbh;
1267
    my $dbh   = C4::Context->dbh;
1309
    my $query = "
1268
    my $query = "
1310
        UPDATE reserves
1269
        UPDATE reserves
1311
        SET    priority = 0 , itemnumber = ? 
1270
        SET    priority = 0 , itemnumber = ? 
1312
        WHERE  borrowernumber=?
1271
        WHERE  reserve_id = ?
1313
          AND  biblionumber=?
1314
    ";
1272
    ";
1315
    my $sth_upd = $dbh->prepare($query);
1273
    my $sth_upd = $dbh->prepare($query);
1316
    $sth_upd->execute( $itemnumber, $borrowernumber, $biblionumber );
1274
    $sth_upd->execute( $itemnumber, $reserve_id );
1317
    # second step update all others reservs
1275
    # second step update all others reservs
1318
    _FixPriority($biblionumber, $borrowernumber, '0');
1276
    _FixPriority( $reserve_id, '0');
1319
}
1277
}
1320
1278
1321
=head2 GetReserveInfo
1279
=head2 GetReserveInfo
Lines 1328-1334 Current implementation this query should have a single result. Link Here
1328
=cut
1286
=cut
1329
1287
1330
sub GetReserveInfo {
1288
sub GetReserveInfo {
1331
	my ( $borrowernumber, $biblionumber ) = @_;
1289
	my ( $reserve_id ) = @_;
1332
    my $dbh = C4::Context->dbh;
1290
    my $dbh = C4::Context->dbh;
1333
	my $strsth="SELECT 
1291
	my $strsth="SELECT 
1334
	               reservedate, 
1292
	               reservedate, 
Lines 1362-1372 sub GetReserveInfo { Link Here
1362
			 LEFT JOIN items USING(itemnumber) 
1320
			 LEFT JOIN items USING(itemnumber) 
1363
		     LEFT JOIN borrowers USING(borrowernumber)
1321
		     LEFT JOIN borrowers USING(borrowernumber)
1364
		     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber) 
1322
		     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber) 
1365
			WHERE 
1323
			WHERE reserves.reserve_id = ?";
1366
				reserves.borrowernumber=?
1367
				AND reserves.biblionumber=?";
1368
	my $sth = $dbh->prepare($strsth); 
1324
	my $sth = $dbh->prepare($strsth); 
1369
	$sth->execute($borrowernumber,$biblionumber);
1325
	$sth->execute($reserve_id);
1370
1326
1371
	my $data = $sth->fetchrow_hashref;
1327
	my $data = $sth->fetchrow_hashref;
1372
	return $data;
1328
	return $data;
Lines 1455-1483 Input: $where is 'up', 'down', 'top' or 'bottom'. Biblionumber, Date reserve was Link Here
1455
=cut
1411
=cut
1456
1412
1457
sub AlterPriority {
1413
sub AlterPriority {
1458
    my ( $where, $borrowernumber, $biblionumber ) = @_;
1414
    my ( $where, $reserve_id ) = @_;
1459
1415
    #warn "C4::Reserves::AlterPriority( $where, $reserve_id )";
1460
    my $dbh = C4::Context->dbh;
1416
    my $dbh = C4::Context->dbh;
1461
1417
    
1462
    ## Find this reserve
1418
    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
1419
1468
    if ( $where eq 'up' || $where eq 'down' ) {
1420
    if ( $where eq 'up' || $where eq 'down' ) {
1469
    
1421
    
1470
      my $priority = $reserve->{'priority'};        
1422
      my $priority = $reserve->{'priority'};        
1471
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1423
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1472
      _FixPriority( $biblionumber, $borrowernumber, $priority )
1424
      _FixPriority( $reserve_id, $priority )
1473
1425
1474
    } elsif ( $where eq 'top' ) {
1426
    } elsif ( $where eq 'top' ) {
1475
1427
1476
      _FixPriority( $biblionumber, $borrowernumber, '1' )
1428
      _FixPriority( $reserve_id, '1' )
1477
1429
1478
    } elsif ( $where eq 'bottom' ) {
1430
    } elsif ( $where eq 'bottom' ) {
1479
1431
1480
      _FixPriority( $biblionumber, $borrowernumber, '999999' )
1432
      _FixPriority( $reserve_id, '999999' )
1481
1433
1482
    }
1434
    }
1483
}
1435
}
Lines 1491-1512 This function sets the lowestPriority field to true if is false, and false if it Link Here
1491
=cut
1443
=cut
1492
1444
1493
sub ToggleLowestPriority {
1445
sub ToggleLowestPriority {
1494
    my ( $borrowernumber, $biblionumber ) = @_;
1446
    my ( $reserve_id ) = @_;
1495
1447
1496
    my $dbh = C4::Context->dbh;
1448
    my $dbh = C4::Context->dbh;
1497
1449
1498
    my $sth = $dbh->prepare(
1450
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?");
1499
        "UPDATE reserves SET lowestPriority = NOT lowestPriority
1451
    $sth->execute( $reserve_id );
1500
         WHERE biblionumber = ?
1501
         AND borrowernumber = ?"
1502
    );
1503
    $sth->execute(
1504
        $biblionumber,
1505
        $borrowernumber,
1506
    );
1507
    $sth->finish;
1452
    $sth->finish;
1508
    
1453
    
1509
    _FixPriority( $biblionumber, $borrowernumber, '999999' );
1454
    _FixPriority( $reserve_id, '999999' );
1510
}
1455
}
1511
1456
1512
=head2 ToggleSuspend
1457
=head2 ToggleSuspend
Lines 1603-1609 sub SuspendAll { Link Here
1603
1548
1604
=head2 _FixPriority
1549
=head2 _FixPriority
1605
1550
1606
  &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank);
1551
  &_FixPriority( $reserve_id, $rank, $ignoreSetLowestRank);
1607
1552
1608
Only used internally (so don't export it)
1553
Only used internally (so don't export it)
1609
Changed how this functions works #
1554
Changed how this functions works #
Lines 1615-1655 in new priority rank Link Here
1615
=cut 
1560
=cut 
1616
1561
1617
sub _FixPriority {
1562
sub _FixPriority {
1618
    my ( $biblio, $borrowernumber, $rank, $ignoreSetLowestRank ) = @_;
1563
    my ( $reserve_id, $rank, $ignoreSetLowestRank ) = @_;
1619
    my $dbh = C4::Context->dbh;
1564
    my $dbh = C4::Context->dbh;
1620
     if ( $rank eq "del" ) {
1565
    
1621
         CancelReserve( $biblio, undef, $borrowernumber );
1566
    my $res = GetReserve( $reserve_id );
1622
     }
1567
1623
    if ( $rank eq "W" || $rank eq "0" ) {
1568
    if ( $rank eq "del" ) {
1569
         CancelReserve( $reserve_id );
1570
    }
1571
    elsif ( $rank eq "W" || $rank eq "0" ) {
1624
1572
1625
        # make sure priority for waiting or in-transit items is 0
1573
        # make sure priority for waiting or in-transit items is 0
1626
        my $query = qq/
1574
        my $query = "
1627
            UPDATE reserves
1575
            UPDATE reserves
1628
            SET    priority = 0
1576
            SET    priority = 0
1629
            WHERE biblionumber = ?
1577
            WHERE reserve_id = ?
1630
              AND borrowernumber = ?
1578
            AND found IN ('W', 'T')
1631
              AND found IN ('W', 'T')
1579
        ";
1632
        /;
1633
        my $sth = $dbh->prepare($query);
1580
        my $sth = $dbh->prepare($query);
1634
        $sth->execute( $biblio, $borrowernumber );
1581
        $sth->execute( $reserve_id );
1635
    }
1582
    }
1636
    my @priority;
1583
    my @priority;
1637
    my @reservedates;
1584
    my @reservedates;
1638
1585
1639
    # get whats left
1586
    # get whats left
1640
# FIXME adding a new security in returned elements for changing priority,
1587
    my $query = "
1641
# now, we don't care anymore any reservations with itemnumber linked (suppose a waiting reserve)
1588
        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
1589
        FROM   reserves
1647
        WHERE  biblionumber   = ?
1590
        WHERE  biblionumber   = ?
1648
          AND  ((found <> 'W' AND found <> 'T') or found is NULL)
1591
          AND  ((found <> 'W' AND found <> 'T') OR found IS NULL)
1649
        ORDER BY priority ASC
1592
        ORDER BY priority ASC
1650
    /;
1593
    ";
1651
    my $sth = $dbh->prepare($query);
1594
    my $sth = $dbh->prepare($query);
1652
    $sth->execute($biblio);
1595
    $sth->execute( $res->{'biblionumber'} );
1653
    while ( my $line = $sth->fetchrow_hashref ) {
1596
    while ( my $line = $sth->fetchrow_hashref ) {
1654
        push( @reservedates, $line );
1597
        push( @reservedates, $line );
1655
        push( @priority,     $line );
1598
        push( @priority,     $line );
Lines 1659-1665 sub _FixPriority { Link Here
1659
    my $i;
1602
    my $i;
1660
    my $key = -1;    # to allow for 0 to be a valid result
1603
    my $key = -1;    # to allow for 0 to be a valid result
1661
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1604
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1662
        if ( $borrowernumber == $priority[$i]->{'borrowernumber'} ) {
1605
        if ( $reserve_id == $priority[$i]->{'reserve_id'} ) {
1663
            $key = $i;    # save the index
1606
            $key = $i;    # save the index
1664
            last;
1607
            last;
1665
        }
1608
        }
Lines 1675-1703 sub _FixPriority { Link Here
1675
1618
1676
    # now fix the priority on those that are left....
1619
    # now fix the priority on those that are left....
1677
    $query = "
1620
    $query = "
1678
            UPDATE reserves
1621
        UPDATE reserves
1679
            SET    priority = ?
1622
        SET    priority = ?
1680
                WHERE  biblionumber = ?
1623
        WHERE  reserve_id = ?
1681
                 AND borrowernumber   = ?
1682
                 AND reservedate = ?
1683
         AND found IS NULL
1684
    ";
1624
    ";
1685
    $sth = $dbh->prepare($query);
1625
    $sth = $dbh->prepare($query);
1686
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1626
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1687
        $sth->execute(
1627
        $sth->execute(
1688
            $j + 1, $biblio,
1628
            $j + 1,
1689
            $priority[$j]->{'borrowernumber'},
1629
            $priority[$j]->{'reserve_id'}
1690
            $priority[$j]->{'reservedate'}
1691
        );
1630
        );
1692
        $sth->finish;
1631
        $sth->finish;
1693
    }
1632
    }
1694
    
1633
    
1695
    $sth = $dbh->prepare( "SELECT borrowernumber FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1634
    $sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1696
    $sth->execute();
1635
    $sth->execute();
1697
    
1636
    
1698
    unless ( $ignoreSetLowestRank ) {
1637
    unless ( $ignoreSetLowestRank ) {
1699
      while ( my $res = $sth->fetchrow_hashref() ) {
1638
      while ( my $res = $sth->fetchrow_hashref() ) {
1700
        _FixPriority( $biblio, $res->{'borrowernumber'}, '999999', 1 );
1639
        _FixPriority( $res->{'reserve_id'}, '999999', 1 );
1701
      }
1640
      }
1702
    }
1641
    }
1703
}
1642
}
Lines 1967-1973 sub _ShiftPriorityByDateAndPriority { Link Here
1967
1906
1968
=head2 MoveReserve
1907
=head2 MoveReserve
1969
1908
1970
  MoveReserve( $itemnumber, $borrowernumber, $cancelreserve )
1909
  MoveReserve( $reserve_id, $cancelreserve )
1971
1910
1972
Use when checking out an item to handle reserves
1911
Use when checking out an item to handle reserves
1973
If $cancelreserve boolean is set to true, it will remove existing reserve
1912
If $cancelreserve boolean is set to true, it will remove existing reserve
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-6 / +7 lines)
Lines 603-608 function checkMultiHold() { Link Here
603
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
603
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
604
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
604
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
605
        <td>
605
        <td>
606
          <input type="hidden" name="reserve_id" value="[% reserveloo.reserve_id %]" />
606
          <input type="hidden" name="borrowernumber" value="[% reserveloo.borrowernumber %]" />
607
          <input type="hidden" name="borrowernumber" value="[% reserveloo.borrowernumber %]" />
607
          <input type="hidden" name="biblionumber" value="[% reserveloo.biblionumber %]" />
608
          <input type="hidden" name="biblionumber" value="[% reserveloo.biblionumber %]" />
608
          <select name="rank-request">
609
          <select name="rank-request">
Lines 622-640 function checkMultiHold() { Link Here
622
623
623
     [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
624
     [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
624
        <td style="white-space:nowrap;">
625
        <td style="white-space:nowrap;">
625
	        <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 %]">
626
	        <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 %]">
626
            <img src="/intranet-tmpl/[% theme %]/img/go-up.png" border="0" alt="Go up" />
627
            <img src="/intranet-tmpl/[% theme %]/img/go-up.png" border="0" alt="Go up" />
627
                </a>
628
                </a>
628
629
629
        <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 %]">
630
		<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 %]">
630
                    <img src="/intranet-tmpl/[% theme %]/img/go-top.png" border="0" alt="Go top" />
631
                    <img src="/intranet-tmpl/[% theme %]/img/go-top.png" border="0" alt="Go top" />
631
                </a>
632
                </a>
632
633
633
                <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 %]">
634
                <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 %]">
634
                    <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Go bottom" />
635
                    <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Go bottom" />
635
                </a>
636
                </a>
636
637
637
                <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 %]">
638
                <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 %]">
638
                    <img src="/intranet-tmpl/[% theme %]/img/go-down.png" border="0" alt="Go down" />
639
                    <img src="/intranet-tmpl/[% theme %]/img/go-down.png" border="0" alt="Go down" />
639
                </a>
640
                </a>
640
        </td>
641
        </td>
Lines 714-720 function checkMultiHold() { Link Here
714
715
715
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
716
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
716
	<td>
717
	<td>
717
        <a title="Toggle lowest priority" href="request.pl?action=setLowestPriority&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
718
		<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 %]"> 
718
			[% IF ( reserveloo.lowestPriority ) %]
719
			[% IF ( reserveloo.lowestPriority ) %]
719
                        <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Unset Lowest Priority" />
720
                        <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Unset Lowest Priority" />
720
		        [% ELSE %]
721
		        [% ELSE %]
Lines 725-731 function checkMultiHold() { Link Here
725
    [% END %]
726
    [% END %]
726
727
727
	<td>
728
	<td>
728
        <a title="Cancel hold" href="request.pl?action=cancel&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
729
		<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 %]">
729
                    <img src="/intranet-tmpl/[% theme %]/img/x.png" border="0" alt="Cancel" />
730
                    <img src="/intranet-tmpl/[% theme %]/img/x.png" border="0" alt="Cancel" />
730
                </a>
731
                </a>
731
	</td>
732
	</td>
(-)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/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 (-24 / +23 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 $borrowernumber = $input->param('borrowernumber');
111
  my $biblionumber   = $input->param('biblionumber');
109
  my $biblionumber   = $input->param('biblionumber');
112
  ToggleLowestPriority( $borrowernumber, $biblionumber );
110
  ToggleLowestPriority( $reserve_id );
113
} elsif ( $action eq 'toggleSuspend' ) {
111
} elsif ( $action eq 'toggleSuspend' ) {
114
  my $borrowernumber = $input->param('borrowernumber');
112
  my $borrowernumber = $input->param('borrowernumber');
115
  my $biblionumber   = $input->param('biblionumber');
113
  my $biblionumber   = $input->param('biblionumber');
116
  my $suspend_until  = $input->param('suspend_until');
114
  my $suspend_until  = $input->param('suspend_until');
117
  ToggleSuspend( $borrowernumber, $biblionumber, $suspend_until );
115
  ToggleSuspend( $reserve_id, $suspend_until );
118
}
116
}
119
117
120
if ($findborrower) {
118
if ($findborrower) {
Lines 148-154 if ($borrowernumber_hold && !$action) { Link Here
148
      GetReserveCount( $borrowerinfo->{'borrowernumber'} );
146
      GetReserveCount( $borrowerinfo->{'borrowernumber'} );
149
147
150
    if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
148
    if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
151
		$warnings = 1;
149
	$warnings = 1;
152
        $maxreserves = 1;
150
        $maxreserves = 1;
153
    }
151
    }
154
152
Lines 162-168 if ($borrowernumber_hold && !$action) { Link Here
162
160
163
    # check if the borrower make the reserv in a different branch
161
    # check if the borrower make the reserv in a different branch
164
    if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) {
162
    if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) {
165
		$messages = 1;
163
	$messages = 1;
166
        $diffbranch = 1;
164
        $diffbranch = 1;
167
    }
165
    }
168
166
Lines 184-191 if ($borrowernumber_hold && !$action) { Link Here
184
                maxreserves         => $maxreserves,
182
                maxreserves         => $maxreserves,
185
                expiry              => $expiry,
183
                expiry              => $expiry,
186
                diffbranch          => $diffbranch,
184
                diffbranch          => $diffbranch,
187
				messages            => $messages,
185
		messages            => $messages,
188
				warnings            => $warnings
186
		warnings            => $warnings
189
    );
187
    );
190
}
188
}
191
189
Lines 239-250 my @biblioloop = (); Link Here
239
foreach my $biblionumber (@biblionumbers) {
237
foreach my $biblionumber (@biblionumbers) {
240
238
241
    my %biblioloopiter = ();
239
    my %biblioloopiter = ();
242
	my $maxreserves;
240
    my $maxreserves;
243
241
244
    my $dat          = GetBiblioData($biblionumber);
242
    my $dat = GetBiblioData($biblionumber);
245
243
246
    unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
244
    unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
247
 		$warnings = 1;
245
	$warnings = 1;
248
        $maxreserves = 1;
246
        $maxreserves = 1;
249
    }
247
    }
250
    # get existing reserves .....
248
    # get existing reserves .....
Lines 268-275 foreach my $biblionumber (@biblionumbers) { Link Here
268
    $template->param( alreadyreserved => $alreadyreserved,
266
    $template->param( alreadyreserved => $alreadyreserved,
269
                      messages => $messages,
267
                      messages => $messages,
270
                      warnings => $warnings,
268
                      warnings => $warnings,
271
					  maxreserves=>$maxreserves
269
                       maxreserves=>$maxreserves
272
					  );
270
    );
273
271
274
272
275
    # FIXME think @optionloop, is maybe obsolete, or  must be switchable by a systeme preference fixed rank or not
273
    # 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}){
294
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
297
        @itemnumbers  = @$items;
295
        @itemnumbers  = @$items;
298
    }
296
    }
299
	my @hostitems = get_hostitemnumbers_of($biblionumber);
297
    my @hostitems = get_hostitemnumbers_of($biblionumber);
300
	if (@hostitems){
298
    if (@hostitems){
301
		$template->param('hostitemsflag' => 1);
299
        $template->param('hostitemsflag' => 1);
302
		push(@itemnumbers, @hostitems);
300
        push(@itemnumbers, @hostitems);
303
	}
301
    }
304
302
305
    if (!@itemnumbers) {
303
    if (!@itemnumbers) {
306
        $template->param('noitems' => 1);
304
        $template->param('noitems' => 1);
Lines 378-384 foreach my $biblionumber (@biblionumbers) { Link Here
378
            }
376
            }
379
377
380
            # checking reserve
378
            # checking reserve
381
            my ($reservedate,$reservedfor,$expectedAt) = GetReservesFromItemnumber($itemnumber);
379
            my ($reservedate,$reservedfor,$expectedAt,$reserve_id) = GetReservesFromItemnumber($itemnumber);
382
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
380
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
383
381
384
            if ( defined $reservedate ) {
382
            if ( defined $reservedate ) {
Lines 575-580 foreach my $biblionumber (@biblionumbers) { Link Here
575
        $reserve{'optionloop'} = \@optionloop;
573
        $reserve{'optionloop'} = \@optionloop;
576
        $reserve{'suspend'} = $res->{'suspend'};
574
        $reserve{'suspend'} = $res->{'suspend'};
577
        $reserve{'suspend_until'} = $res->{'suspend_until'};
575
        $reserve{'suspend_until'} = $res->{'suspend_until'};
576
        $reserve{'reserve_id'} = $res->{'reserve_id'};
577
578
        push( @reserveloop, \%reserve );
578
        push( @reserveloop, \%reserve );
579
    }
579
    }
580
580
581
- 

Return to bug 7710