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

(-)a/C4/Reserves.pm (-198 / +137 lines)
Lines 90-96 BEGIN { Link Here
90
    @ISA = qw(Exporter);
90
    @ISA = qw(Exporter);
91
    @EXPORT = qw(
91
    @EXPORT = qw(
92
        &AddReserve
92
        &AddReserve
93
  
93
94
        &GetReserve  
94
        &GetReservesFromItemnumber
95
        &GetReservesFromItemnumber
95
        &GetReservesFromBiblionumber
96
        &GetReservesFromBiblionumber
96
        &GetReservesFromBorrowernumber
97
        &GetReservesFromBorrowernumber
Lines 237-242 sub AddReserve { Link Here
237
    return;     # FIXME: why not have a useful return value?
238
    return;     # FIXME: why not have a useful return value?
238
}
239
}
239
240
241
=head2 GetReserve
242
243
    $res = GetReserve( $reservenumber );
244
    
245
=cut
246
247
sub GetReserve {
248
    my ($reservenumber) = @_;
249
    #warn "C4::Reserves::GetReserve( $reservenumber )";
250
    
251
    my $dbh = C4::Context->dbh;
252
    my $query = "SELECT * FROM reserves WHERE reservenumber = ?";
253
    my $sth = $dbh->prepare( $query );
254
    $sth->execute( $reservenumber );
255
    my $res = $sth->fetchrow_hashref();
256
    return $res;
257
}
258
240
=head2 GetReservesFromBiblionumber
259
=head2 GetReservesFromBiblionumber
241
260
242
  ($count, $title_reserves) = &GetReserves($biblionumber);
261
  ($count, $title_reserves) = &GetReserves($biblionumber);
Lines 253-259 sub GetReservesFromBiblionumber { Link Here
253
272
254
    # Find the desired items in the reserves
273
    # Find the desired items in the reserves
255
    my $query = "
274
    my $query = "
256
        SELECT  branchcode,
275
        SELECT  reservenumber,
276
                branchcode,
257
                timestamp AS rtimestamp,
277
                timestamp AS rtimestamp,
258
                priority,
278
                priority,
259
                biblionumber,
279
                biblionumber,
Lines 319-325 sub GetReservesFromBiblionumber { Link Here
319
339
320
=head2 GetReservesFromItemnumber
340
=head2 GetReservesFromItemnumber
321
341
322
 ( $reservedate, $borrowernumber, $branchcode ) = GetReservesFromItemnumber($itemnumber);
342
 ( $reservedate, $borrowernumber, $branchcode, $reservenumber ) = GetReservesFromItemnumber($itemnumber);
323
343
324
TODO :: Description here
344
TODO :: Description here
325
345
Lines 329-335 sub GetReservesFromItemnumber { Link Here
329
    my ( $itemnumber, $all_dates ) = @_;
349
    my ( $itemnumber, $all_dates ) = @_;
330
    my $dbh   = C4::Context->dbh;
350
    my $dbh   = C4::Context->dbh;
331
    my $query = "
351
    my $query = "
332
    SELECT reservedate,borrowernumber,branchcode
352
    SELECT reservedate,borrowernumber,branchcode,reservenumber
333
    FROM   reserves
353
    FROM   reserves
334
    WHERE  itemnumber=?
354
    WHERE  itemnumber=?
335
    ";
355
    ";
Lines 502-512 sub GetReserveCount { Link Here
502
522
503
    my $dbh = C4::Context->dbh;
523
    my $dbh = C4::Context->dbh;
504
524
505
    my $query = '
525
    my $query = "
506
        SELECT COUNT(*) AS counter
526
        SELECT COUNT(*) AS counter
507
        FROM reserves
527
        FROM reserves
508
          WHERE borrowernumber = ?
528
        WHERE borrowernumber = ?
509
    ';
529
    ";
510
    my $sth = $dbh->prepare($query);
530
    my $sth = $dbh->prepare($query);
511
    $sth->execute($borrowernumber);
531
    $sth->execute($borrowernumber);
512
    my $row = $sth->fetchrow_hashref;
532
    my $row = $sth->fetchrow_hashref;
Lines 678-684 sub GetReservesToBranch { Link Here
678
    my ( $frombranch ) = @_;
698
    my ( $frombranch ) = @_;
679
    my $dbh = C4::Context->dbh;
699
    my $dbh = C4::Context->dbh;
680
    my $sth = $dbh->prepare(
700
    my $sth = $dbh->prepare(
681
        "SELECT borrowernumber,reservedate,itemnumber,timestamp
701
        "SELECT reservenumber,borrowernumber,reservedate,itemnumber,timestamp
682
         FROM reserves 
702
         FROM reserves 
683
         WHERE priority='0' 
703
         WHERE priority='0' 
684
           AND branchcode=?"
704
           AND branchcode=?"
Lines 701-722 sub GetReservesToBranch { Link Here
701
721
702
sub GetReservesForBranch {
722
sub GetReservesForBranch {
703
    my ($frombranch) = @_;
723
    my ($frombranch) = @_;
704
    my $dbh          = C4::Context->dbh;
724
    my $dbh = C4::Context->dbh;
705
	my $query        = "SELECT borrowernumber,reservedate,itemnumber,waitingdate
725
    
726
    my $query = "
727
        SELECT reservenumber,borrowernumber,reservedate,itemnumber,waitingdate
706
        FROM   reserves 
728
        FROM   reserves 
707
        WHERE   priority='0'
729
        WHERE   priority='0'
708
            AND found='W' ";
730
        AND found='W'
709
    if ($frombranch){
731
    ";    
710
        $query .= " AND branchcode=? ";
732
    $query .= " AND branchcode=? " if ( $frombranch );
711
	}
712
    $query .= "ORDER BY waitingdate" ;
733
    $query .= "ORDER BY waitingdate" ;
734
713
    my $sth = $dbh->prepare($query);
735
    my $sth = $dbh->prepare($query);
714
    if ($frombranch){
736
    if ($frombranch){
715
		$sth->execute($frombranch);
737
	$sth->execute($frombranch);
716
	}
738
    } else {
717
    else {
739
        $sth->execute();
718
		$sth->execute();
740
    }
719
	}
741
    
720
    my @transreserv;
742
    my @transreserv;
721
    my $i = 0;
743
    my $i = 0;
722
    while ( my $data = $sth->fetchrow_hashref ) {
744
    while ( my $data = $sth->fetchrow_hashref ) {
Lines 896-1004 sub CancelExpiredReserves { Link Here
896
918
897
=head2 CancelReserve
919
=head2 CancelReserve
898
920
899
  &CancelReserve($biblionumber, $itemnumber, $borrowernumber);
921
  &CancelReserve( $reservenumber );
900
922
901
Cancels a reserve.
923
Cancels a reserve.
902
924
903
Use either C<$biblionumber> or C<$itemnumber> to specify the item to
904
cancel, but not both: if both are given, C<&CancelReserve> uses
905
C<$itemnumber>.
906
907
C<$borrowernumber> is the borrower number of the patron on whose
908
behalf the book was reserved.
909
910
If C<$biblionumber> was given, C<&CancelReserve> also adjusts the
911
priorities of the other people who are waiting on the book.
912
913
=cut
925
=cut
914
926
915
sub CancelReserve {
927
sub CancelReserve {
916
    my ( $biblio, $item, $borr ) = @_;
928
    my ( $reservenumber ) = @_;
917
    my $dbh = C4::Context->dbh;
929
    my $dbh = C4::Context->dbh;
918
        if ( $item and $borr ) {
919
        # removing a waiting reserve record....
920
        # update the database...
921
        my $query = "
922
            UPDATE reserves
923
            SET    cancellationdate = now(),
924
                   found            = Null,
925
                   priority         = 0
926
            WHERE  itemnumber       = ?
927
             AND   borrowernumber   = ?
928
        ";
929
        my $sth = $dbh->prepare($query);
930
        $sth->execute( $item, $borr );
931
        $sth->finish;
932
        $query = "
933
            INSERT INTO old_reserves
934
            SELECT * FROM reserves
935
            WHERE  itemnumber       = ?
936
             AND   borrowernumber   = ?
937
        ";
938
        $sth = $dbh->prepare($query);
939
        $sth->execute( $item, $borr );
940
        $query = "
941
            DELETE FROM reserves
942
            WHERE  itemnumber       = ?
943
             AND   borrowernumber   = ?
944
        ";
945
        $sth = $dbh->prepare($query);
946
        $sth->execute( $item, $borr );
947
    }
948
    else {
949
        # removing a reserve record....
950
        # get the prioritiy on this record....
951
        my $priority;
952
        my $query = qq/
953
            SELECT priority FROM reserves
954
            WHERE biblionumber   = ?
955
              AND borrowernumber = ?
956
              AND cancellationdate IS NULL
957
              AND itemnumber IS NULL
958
        /;
959
        my $sth = $dbh->prepare($query);
960
        $sth->execute( $biblio, $borr );
961
        ($priority) = $sth->fetchrow_array;
962
        $sth->finish;
963
        $query = qq/
964
            UPDATE reserves
965
            SET    cancellationdate = now(),
966
                   found            = Null,
967
                   priority         = 0
968
            WHERE  biblionumber     = ?
969
              AND  borrowernumber   = ?
970
        /;
971
972
        # update the database, removing the record...
973
        $sth = $dbh->prepare($query);
974
        $sth->execute( $biblio, $borr );
975
        $sth->finish;
976
930
977
        $query = qq/
931
    my $query = "
978
            INSERT INTO old_reserves
932
        UPDATE reserves
979
            SELECT * FROM reserves
933
        SET    cancellationdate = now(),
980
            WHERE  biblionumber     = ?
934
               found            = Null,
981
              AND  borrowernumber   = ?
935
               priority         = 0
982
        /;
936
        WHERE  reservenumber = ?
983
        $sth = $dbh->prepare($query);
937
    ";
984
        $sth->execute( $biblio, $borr );
938
    my $sth = $dbh->prepare($query);
939
    $sth->execute( $reservenumber );
940
    $sth->finish;
985
941
986
        $query = qq/
942
    $query = "
987
            DELETE FROM reserves
943
        INSERT INTO old_reserves
988
            WHERE  biblionumber     = ?
944
        SELECT * FROM reserves
989
              AND  borrowernumber   = ?
945
        WHERE  reservenumber = ?
990
        /;
946
    ";
991
        $sth = $dbh->prepare($query);
947
    $sth = $dbh->prepare($query);
992
        $sth->execute( $biblio, $borr );
948
    $sth->execute( $reservenumber );
993
949
994
        # now fix the priority on the others....
950
    $query = "
995
        _FixPriority( $biblio, $borr );
951
        DELETE FROM reserves
996
    }
952
        WHERE  reservenumber = ?
953
    ";
954
    $sth = $dbh->prepare($query);
955
    $sth->execute( $reservenumber );
956
957
    # now fix the priority on the others....
958
    _FixPriority( $reservenumber );
997
}
959
}
998
960
999
=head2 ModReserve
961
=head2 ModReserve
1000
962
1001
  ModReserve($rank, $biblio, $borrower, $branch[, $itemnumber])
963
  ModReserve($rank, $reservenumber, $branch[, $itemnumber])
1002
964
1003
Change a hold request's priority or cancel it.
965
Change a hold request's priority or cancel it.
1004
966
Lines 1029-1076 itemnumber and supplying itemnumber. Link Here
1029
991
1030
sub ModReserve {
992
sub ModReserve {
1031
    #subroutine to update a reserve
993
    #subroutine to update a reserve
1032
    my ( $rank, $biblio, $borrower, $branch , $itemnumber) = @_;
994
    my ( $rank, $reservenumber, $branch , $itemnumber) = @_;
1033
     return if $rank eq "W";
995
     return if $rank eq "W";
1034
     return if $rank eq "n";
996
     return if $rank eq "n";
1035
    my $dbh = C4::Context->dbh;
997
    my $dbh = C4::Context->dbh;
1036
    if ( $rank eq "del" ) {
998
    if ( $rank eq "del" ) {
1037
        my $query = qq/
999
        my $query = "
1038
            UPDATE reserves
1000
            UPDATE reserves
1039
            SET    cancellationdate=now()
1001
            SET    cancellationdate=now()
1040
            WHERE  biblionumber   = ?
1002
            WHERE  reservenumber = ?
1041
             AND   borrowernumber = ?
1003
        ";
1042
        /;
1043
        my $sth = $dbh->prepare($query);
1004
        my $sth = $dbh->prepare($query);
1044
        $sth->execute( $biblio, $borrower );
1005
        $sth->execute( $reservenumber );
1045
        $sth->finish;
1006
        $sth->finish;
1046
        $query = qq/
1007
        $query = "
1047
            INSERT INTO old_reserves
1008
            INSERT INTO old_reserves
1048
            SELECT *
1009
            SELECT *
1049
            FROM   reserves 
1010
            FROM   reserves 
1050
            WHERE  biblionumber   = ?
1011
            WHERE  reservenumber = ?
1051
             AND   borrowernumber = ?
1012
        ";
1052
        /;
1053
        $sth = $dbh->prepare($query);
1013
        $sth = $dbh->prepare($query);
1054
        $sth->execute( $biblio, $borrower );
1014
        $sth->execute( $reservenumber );
1055
        $query = qq/
1015
        $query = "
1056
            DELETE FROM reserves 
1016
            DELETE FROM reserves 
1057
            WHERE  biblionumber   = ?
1017
            WHERE  reservenumber = ?
1058
             AND   borrowernumber = ?
1018
        ";
1059
        /;
1060
        $sth = $dbh->prepare($query);
1019
        $sth = $dbh->prepare($query);
1061
        $sth->execute( $biblio, $borrower );
1020
        $sth->execute( $reservenumber );
1062
        
1021
        
1063
    }
1022
    }
1064
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1023
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1065
        my $query = qq/
1024
        my $query = "
1066
        UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1025
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1067
            WHERE biblionumber   = ?
1026
            WHERE reservenumber = ?
1068
             AND borrowernumber = ?
1027
        ";
1069
        /;
1070
        my $sth = $dbh->prepare($query);
1028
        my $sth = $dbh->prepare($query);
1071
        $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower);
1029
        $sth->execute( $rank, $branch, $itemnumber, $reservenumber );
1072
        $sth->finish;
1030
        $sth->finish;
1073
        _FixPriority( $biblio, $borrower, $rank);
1031
        _FixPriority( $reservenumber, $rank );
1074
    }
1032
    }
1075
}
1033
}
1076
1034
Lines 1090-1095 sub ModReserveFill { Link Here
1090
    my ($res) = @_;
1048
    my ($res) = @_;
1091
    my $dbh = C4::Context->dbh;
1049
    my $dbh = C4::Context->dbh;
1092
    # fill in a reserve record....
1050
    # fill in a reserve record....
1051
    my $reservenumber = $res->{'reservenumber'};
1093
    my $biblionumber = $res->{'biblionumber'};
1052
    my $biblionumber = $res->{'biblionumber'};
1094
    my $borrowernumber    = $res->{'borrowernumber'};
1053
    my $borrowernumber    = $res->{'borrowernumber'};
1095
    my $resdate = $res->{'reservedate'};
1054
    my $resdate = $res->{'reservedate'};
Lines 1138-1144 sub ModReserveFill { Link Here
1138
    # now fix the priority on the others (if the priority wasn't
1097
    # now fix the priority on the others (if the priority wasn't
1139
    # already sorted!)....
1098
    # already sorted!)....
1140
    unless ( $priority == 0 ) {
1099
    unless ( $priority == 0 ) {
1141
        _FixPriority( $biblionumber, $borrowernumber );
1100
        _FixPriority( $reservenumber );
1142
    }
1101
    }
1143
}
1102
}
1144
1103
Lines 1265-1284 Reduce the values of queuded list Link Here
1265
=cut
1224
=cut
1266
1225
1267
sub ModReserveMinusPriority {
1226
sub ModReserveMinusPriority {
1268
    my ( $itemnumber, $borrowernumber, $biblionumber ) = @_;
1227
    my ( $itemnumber, $reservenumber ) = @_;
1269
1228
1270
    #first step update the value of the first person on reserv
1229
    #first step update the value of the first person on reserv
1271
    my $dbh   = C4::Context->dbh;
1230
    my $dbh   = C4::Context->dbh;
1272
    my $query = "
1231
    my $query = "
1273
        UPDATE reserves
1232
        UPDATE reserves
1274
        SET    priority = 0 , itemnumber = ? 
1233
        SET    priority = 0 , itemnumber = ? 
1275
        WHERE  borrowernumber=?
1234
        WHERE  reservenumber = ?
1276
          AND  biblionumber=?
1277
    ";
1235
    ";
1278
    my $sth_upd = $dbh->prepare($query);
1236
    my $sth_upd = $dbh->prepare($query);
1279
    $sth_upd->execute( $itemnumber, $borrowernumber, $biblionumber );
1237
    $sth_upd->execute( $itemnumber, $reservenumber );
1280
    # second step update all others reservs
1238
    # second step update all others reservs
1281
    _FixPriority($biblionumber, $borrowernumber, '0');
1239
    _FixPriority( $reservenumber, '0');
1282
}
1240
}
1283
1241
1284
=head2 GetReserveInfo
1242
=head2 GetReserveInfo
Lines 1291-1297 Current implementation this query should have a single result. Link Here
1291
=cut
1249
=cut
1292
1250
1293
sub GetReserveInfo {
1251
sub GetReserveInfo {
1294
	my ( $borrowernumber, $biblionumber ) = @_;
1252
	my ( $reservenumber ) = @_;
1295
    my $dbh = C4::Context->dbh;
1253
    my $dbh = C4::Context->dbh;
1296
	my $strsth="SELECT 
1254
	my $strsth="SELECT 
1297
	               reservedate, 
1255
	               reservedate, 
Lines 1325-1335 sub GetReserveInfo { Link Here
1325
			 LEFT JOIN items USING(itemnumber) 
1283
			 LEFT JOIN items USING(itemnumber) 
1326
		     LEFT JOIN borrowers USING(borrowernumber)
1284
		     LEFT JOIN borrowers USING(borrowernumber)
1327
		     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber) 
1285
		     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber) 
1328
			WHERE 
1286
			WHERE reserves.reservenumber = ?";
1329
				reserves.borrowernumber=?
1330
				AND reserves.biblionumber=?";
1331
	my $sth = $dbh->prepare($strsth); 
1287
	my $sth = $dbh->prepare($strsth); 
1332
	$sth->execute($borrowernumber,$biblionumber);
1288
	$sth->execute($reservenumber);
1333
1289
1334
	my $data = $sth->fetchrow_hashref;
1290
	my $data = $sth->fetchrow_hashref;
1335
	return $data;
1291
	return $data;
Lines 1418-1446 Input: $where is 'up', 'down', 'top' or 'bottom'. Biblionumber, Date reserve was Link Here
1418
=cut
1374
=cut
1419
1375
1420
sub AlterPriority {
1376
sub AlterPriority {
1421
    my ( $where, $borrowernumber, $biblionumber ) = @_;
1377
    my ( $where, $reservenumber ) = @_;
1422
1378
    #warn "C4::Reserves::AlterPriority( $where, $reservenumber )";
1423
    my $dbh = C4::Context->dbh;
1379
    my $dbh = C4::Context->dbh;
1424
1380
    
1425
    ## Find this reserve
1381
    my $reserve = GetReserve( $reservenumber );
1426
    my $sth = $dbh->prepare('SELECT * FROM reserves WHERE biblionumber = ? AND borrowernumber = ? AND cancellationdate IS NULL');
1427
    $sth->execute( $biblionumber, $borrowernumber );
1428
    my $reserve = $sth->fetchrow_hashref();
1429
    $sth->finish();
1430
1382
1431
    if ( $where eq 'up' || $where eq 'down' ) {
1383
    if ( $where eq 'up' || $where eq 'down' ) {
1432
    
1384
    
1433
      my $priority = $reserve->{'priority'};        
1385
      my $priority = $reserve->{'priority'};        
1434
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1386
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1435
      _FixPriority( $biblionumber, $borrowernumber, $priority )
1387
      _FixPriority( $reservenumber, $priority )
1436
1388
1437
    } elsif ( $where eq 'top' ) {
1389
    } elsif ( $where eq 'top' ) {
1438
1390
1439
      _FixPriority( $biblionumber, $borrowernumber, '1' )
1391
      _FixPriority( $reservenumber, '1' )
1440
1392
1441
    } elsif ( $where eq 'bottom' ) {
1393
    } elsif ( $where eq 'bottom' ) {
1442
1394
1443
      _FixPriority( $biblionumber, $borrowernumber, '999999' )
1395
      _FixPriority( $reservenumber, '999999' )
1444
1396
1445
    }
1397
    }
1446
}
1398
}
Lines 1454-1480 This function sets the lowestPriority field to true if is false, and false if it Link Here
1454
=cut
1406
=cut
1455
1407
1456
sub ToggleLowestPriority {
1408
sub ToggleLowestPriority {
1457
    my ( $borrowernumber, $biblionumber ) = @_;
1409
    my ( $reservenumber ) = @_;
1458
1410
1459
    my $dbh = C4::Context->dbh;
1411
    my $dbh = C4::Context->dbh;
1460
1412
1461
    my $sth = $dbh->prepare(
1413
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reservenumber = ?");
1462
        "UPDATE reserves SET lowestPriority = NOT lowestPriority
1414
    $sth->execute( $reservenumber );
1463
         WHERE biblionumber = ?
1464
         AND borrowernumber = ?"
1465
    );
1466
    $sth->execute(
1467
        $biblionumber,
1468
        $borrowernumber,
1469
    );
1470
    $sth->finish;
1415
    $sth->finish;
1471
    
1416
    
1472
    _FixPriority( $biblionumber, $borrowernumber, '999999' );
1417
    _FixPriority( $reservenumber, '999999' );
1473
}
1418
}
1474
1419
1475
=head2 _FixPriority
1420
=head2 _FixPriority
1476
1421
1477
  &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank);
1422
  &_FixPriority( $reservenumber, $rank, $ignoreSetLowestRank);
1478
1423
1479
Only used internally (so don't export it)
1424
Only used internally (so don't export it)
1480
Changed how this functions works #
1425
Changed how this functions works #
Lines 1486-1526 in new priority rank Link Here
1486
=cut 
1431
=cut 
1487
1432
1488
sub _FixPriority {
1433
sub _FixPriority {
1489
    my ( $biblio, $borrowernumber, $rank, $ignoreSetLowestRank ) = @_;
1434
    my ( $reservenumber, $rank, $ignoreSetLowestRank ) = @_;
1490
    my $dbh = C4::Context->dbh;
1435
    my $dbh = C4::Context->dbh;
1491
     if ( $rank eq "del" ) {
1436
    
1492
         CancelReserve( $biblio, undef, $borrowernumber );
1437
    my $res = GetReserve( $reservenumber );
1493
     }
1438
1494
    if ( $rank eq "W" || $rank eq "0" ) {
1439
    if ( $rank eq "del" ) {
1440
         CancelReserve( $reservenumber );
1441
    }
1442
    elsif ( $rank eq "W" || $rank eq "0" ) {
1495
1443
1496
        # make sure priority for waiting or in-transit items is 0
1444
        # make sure priority for waiting or in-transit items is 0
1497
        my $query = qq/
1445
        my $query = "
1498
            UPDATE reserves
1446
            UPDATE reserves
1499
            SET    priority = 0
1447
            SET    priority = 0
1500
            WHERE biblionumber = ?
1448
            WHERE reservenumber = ?
1501
              AND borrowernumber = ?
1449
            AND found IN ('W', 'T')
1502
              AND found IN ('W', 'T')
1450
        ";
1503
        /;
1504
        my $sth = $dbh->prepare($query);
1451
        my $sth = $dbh->prepare($query);
1505
        $sth->execute( $biblio, $borrowernumber );
1452
        $sth->execute( $reservenumber );
1506
    }
1453
    }
1507
    my @priority;
1454
    my @priority;
1508
    my @reservedates;
1455
    my @reservedates;
1509
1456
1510
    # get whats left
1457
    # get whats left
1511
# FIXME adding a new security in returned elements for changing priority,
1458
    my $query = "
1512
# now, we don't care anymore any reservations with itemnumber linked (suppose a waiting reserve)
1459
        SELECT reservenumber, borrowernumber, reservedate, constrainttype
1513
	# This is wrong a waiting reserve has W set
1514
	# The assumption that having an itemnumber set means waiting is wrong and should be corrected any place it occurs
1515
    my $query = qq/
1516
        SELECT borrowernumber, reservedate, constrainttype
1517
        FROM   reserves
1460
        FROM   reserves
1518
        WHERE  biblionumber   = ?
1461
        WHERE  biblionumber   = ?
1519
          AND  ((found <> 'W' AND found <> 'T') or found is NULL)
1462
          AND  ((found <> 'W' AND found <> 'T') OR found IS NULL)
1520
        ORDER BY priority ASC
1463
        ORDER BY priority ASC
1521
    /;
1464
    ";
1522
    my $sth = $dbh->prepare($query);
1465
    my $sth = $dbh->prepare($query);
1523
    $sth->execute($biblio);
1466
    $sth->execute( $res->{'biblionumber'} );
1524
    while ( my $line = $sth->fetchrow_hashref ) {
1467
    while ( my $line = $sth->fetchrow_hashref ) {
1525
        push( @reservedates, $line );
1468
        push( @reservedates, $line );
1526
        push( @priority,     $line );
1469
        push( @priority,     $line );
Lines 1530-1536 sub _FixPriority { Link Here
1530
    my $i;
1473
    my $i;
1531
    my $key = -1;    # to allow for 0 to be a valid result
1474
    my $key = -1;    # to allow for 0 to be a valid result
1532
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1475
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1533
        if ( $borrowernumber == $priority[$i]->{'borrowernumber'} ) {
1476
        if ( $reservenumber == $priority[$i]->{'reservenumber'} ) {
1534
            $key = $i;    # save the index
1477
            $key = $i;    # save the index
1535
            last;
1478
            last;
1536
        }
1479
        }
Lines 1546-1574 sub _FixPriority { Link Here
1546
1489
1547
    # now fix the priority on those that are left....
1490
    # now fix the priority on those that are left....
1548
    $query = "
1491
    $query = "
1549
            UPDATE reserves
1492
        UPDATE reserves
1550
            SET    priority = ?
1493
        SET    priority = ?
1551
                WHERE  biblionumber = ?
1494
        WHERE  reservenumber = ?
1552
                 AND borrowernumber   = ?
1553
                 AND reservedate = ?
1554
         AND found IS NULL
1555
    ";
1495
    ";
1556
    $sth = $dbh->prepare($query);
1496
    $sth = $dbh->prepare($query);
1557
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1497
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1558
        $sth->execute(
1498
        $sth->execute(
1559
            $j + 1, $biblio,
1499
            $j + 1,
1560
            $priority[$j]->{'borrowernumber'},
1500
            $priority[$j]->{'reservenumber'}
1561
            $priority[$j]->{'reservedate'}
1562
        );
1501
        );
1563
        $sth->finish;
1502
        $sth->finish;
1564
    }
1503
    }
1565
    
1504
    
1566
    $sth = $dbh->prepare( "SELECT borrowernumber FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1505
    $sth = $dbh->prepare( "SELECT reservenumber FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1567
    $sth->execute();
1506
    $sth->execute();
1568
    
1507
    
1569
    unless ( $ignoreSetLowestRank ) {
1508
    unless ( $ignoreSetLowestRank ) {
1570
      while ( my $res = $sth->fetchrow_hashref() ) {
1509
      while ( my $res = $sth->fetchrow_hashref() ) {
1571
        _FixPriority( $biblio, $res->{'borrowernumber'}, '999999', 1 );
1510
        _FixPriority( $res->{'reservenumber'}, '999999', 1 );
1572
      }
1511
      }
1573
    }
1512
    }
1574
}
1513
}
Lines 1835-1841 sub _ShiftPriorityByDateAndPriority { Link Here
1835
1774
1836
=head2 MoveReserve
1775
=head2 MoveReserve
1837
1776
1838
  MoveReserve( $itemnumber, $borrowernumber, $cancelreserve )
1777
  MoveReserve( $reservenumber, $cancelreserve )
1839
1778
1840
Use when checking out an item to handle reserves
1779
Use when checking out an item to handle reserves
1841
If $cancelreserve boolean is set to true, it will remove existing reserve
1780
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 601-606 function checkMultiHold() { Link Here
601
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
601
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
602
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
602
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
603
        <td>
603
        <td>
604
          <input type="hidden" name="reservenumber" value="[% reserveloo.reservenumber %]" />
604
          <input type="hidden" name="borrowernumber" value="[% reserveloo.borrowernumber %]" />
605
          <input type="hidden" name="borrowernumber" value="[% reserveloo.borrowernumber %]" />
605
          <input type="hidden" name="biblionumber" value="[% reserveloo.biblionumber %]" />
606
          <input type="hidden" name="biblionumber" value="[% reserveloo.biblionumber %]" />
606
          <select name="rank-request">
607
          <select name="rank-request">
Lines 620-638 function checkMultiHold() { Link Here
620
621
621
     [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
622
     [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
622
        <td style="white-space:nowrap;">
623
        <td style="white-space:nowrap;">
623
	        <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 %]">
624
	        <a title="Move Hold Up" href="request.pl?action=move&amp;where=up&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reservenumber=[% reserveloo.reservenumber %]&amp;date=[% reserveloo.date %]">
624
            <img src="/intranet-tmpl/[% theme %]/img/go-up.png" border="0" alt="Go up" />
625
            <img src="/intranet-tmpl/[% theme %]/img/go-up.png" border="0" alt="Go up" />
625
                </a>
626
                </a>
626
627
627
		<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 %]">
628
		<a title="Move Hold To Top" href="request.pl?action=move&amp;where=top&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reservenumber=[% reserveloo.reservenumber %]&amp;date=[% reserveloo.date %]">
628
                    <img src="/intranet-tmpl/[% theme %]/img/go-top.png" border="0" alt="Go top" />
629
                    <img src="/intranet-tmpl/[% theme %]/img/go-top.png" border="0" alt="Go top" />
629
                </a>
630
                </a>
630
631
631
                <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 %]">
632
                <a title="Move Hold To Bottom" href="request.pl?action=move&amp;where=bottom&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reservenumber=[% reserveloo.reservenumber %]&amp;date=[% reserveloo.date %]">
632
                    <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Go bottom" />
633
                    <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Go bottom" />
633
                </a>
634
                </a>
634
635
635
                <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 %]">
636
                <a title="Move Hold Down" href="request.pl?action=move&amp;where=down&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reservenumber=[% reserveloo.reservenumber %]&amp;date=[% reserveloo.date %]">
636
                    <img src="/intranet-tmpl/[% theme %]/img/go-down.png" border="0" alt="Go down" />
637
                    <img src="/intranet-tmpl/[% theme %]/img/go-down.png" border="0" alt="Go down" />
637
                </a>
638
                </a>
638
        </td>
639
        </td>
Lines 712-718 function checkMultiHold() { Link Here
712
713
713
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
714
    [% IF ( CAN_user_reserveforothers_modify_holds_priority ) %]
714
	<td>
715
	<td>
715
		<a title="Toggle Lowest Priority" href="request.pl?action=setLowestPriority&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]"> 
716
		<a title="Toggle Lowest Priority" href="request.pl?action=setLowestPriority&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reservenumber=[% reserveloo.reservenumber %]&amp;date=[% reserveloo.date %]"> 
716
			[% IF ( reserveloo.lowestPriority ) %]
717
			[% IF ( reserveloo.lowestPriority ) %]
717
                        <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Unset Lowest Priority" />
718
                        <img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Unset Lowest Priority" />
718
		        [% ELSE %]
719
		        [% ELSE %]
Lines 723-729 function checkMultiHold() { Link Here
723
    [% END %]
724
    [% END %]
724
725
725
	<td>
726
	<td>
726
		<a title="Cancel Hold" href="request.pl?action=cancel&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]">
727
		<a title="Cancel Hold" href="request.pl?action=cancel&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;reservenumber=[% reserveloo.reservenumber %]&amp;date=[% reserveloo.date %]">
727
                    <img src="/intranet-tmpl/[% theme %]/img/x.png" border="0" alt="Cancel" />
728
                    <img src="/intranet-tmpl/[% theme %]/img/x.png" border="0" alt="Cancel" />
728
                </a>
729
                </a>
729
	</td>
730
	</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 $reservenumber = $query->param('reservenumber');
45
if ($biblionumber and $borrowernumber) {
45
if ($reservenumber && $borrowernumber) {
46
	CancelReserve($biblionumber, '', $borrowernumber);
46
	CancelReserve( $reservenumber );
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-62 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 @reservenumber = $query->param('reservenumber');
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 $multi_hold = $query->param('multi_hold');
50
my $multi_hold = $query->param('multi_hold');
50
my $biblionumbers = $query->param('biblionumbers');
51
my $biblionumbers = $query->param('biblionumbers');
51
my $count=@rank;
52
my $count=@rank;
52
53
53
my $CancelBiblioNumber=$query->param('CancelBiblioNumber');
54
my $CancelBiblioNumber = $query->param('CancelBiblioNumber');
54
my $CancelBorrowerNumber=$query->param('CancelBorrowerNumber');
55
my $CancelBorrowerNumber = $query->param('CancelBorrowerNumber');
55
my $CancelItemnumber=$query->param('CancelItemnumber');
56
my $CancelItemnumber = $query->param('CancelItemnumber');
56
57
57
# 2 possibilitys : cancel an item reservation, or modify or cancel the queded list
58
# 2 possibilitys : cancel an item reservation, or modify or cancel the queded list
58
59
59
# 1) cancel an item reservation by fonction ModReserveCancelAll (in reserves.pm)
60
# 1) cancel an item reservation by function ModReserveCancelAll (in reserves.pm)
60
if ($CancelBorrowerNumber) {
61
if ($CancelBorrowerNumber) {
61
    ModReserveCancelAll($CancelItemnumber, $CancelBorrowerNumber);
62
    ModReserveCancelAll($CancelItemnumber, $CancelBorrowerNumber);
62
    $biblionumber[0] = $CancelBiblioNumber,
63
    $biblionumber[0] = $CancelBiblioNumber,
Lines 66-72 if ($CancelBorrowerNumber) { Link Here
66
else {
67
else {
67
    for (my $i=0;$i<$count;$i++){
68
    for (my $i=0;$i<$count;$i++){
68
        undef $itemnumber[$i] unless $itemnumber[$i] ne '';
69
        undef $itemnumber[$i] unless $itemnumber[$i] ne '';
69
        ModReserve($rank[$i],$biblionumber[$i],$borrower[$i],$branch[$i],$itemnumber[$i]); #from C4::Reserves
70
        ModReserve($rank[$i],$reservenumber[$i],$branch[$i],$itemnumber[$i]); #from C4::Reserves
70
    }
71
    }
71
}
72
}
72
my $from=$query->param('from');
73
my $from=$query->param('from');
(-)a/reserve/request.pl (-25 / +22 lines)
Lines 98-114 $action ||= q{}; Link Here
98
98
99
if ( $action eq 'move' ) {
99
if ( $action eq 'move' ) {
100
  my $where = $input->param('where');
100
  my $where = $input->param('where');
101
  my $borrowernumber = $input->param('borrowernumber');
101
  my $reservenumber = $input->param('reservenumber');
102
  my $biblionumber = $input->param('biblionumber');
102
  AlterPriority( $where, $reservenumber );
103
  AlterPriority( $where, $borrowernumber, $biblionumber );
104
} elsif ( $action eq 'cancel' ) {
103
} elsif ( $action eq 'cancel' ) {
105
  my $borrowernumber = $input->param('borrowernumber');
104
  my $reservenumber = $input->param('reservenumber');
106
  my $biblionumber = $input->param('biblionumber');
105
  CancelReserve( $reservenumber );
107
  CancelReserve( $biblionumber, '', $borrowernumber );
108
} elsif ( $action eq 'setLowestPriority' ) {
106
} elsif ( $action eq 'setLowestPriority' ) {
109
  my $borrowernumber = $input->param('borrowernumber');
107
  my $reservenumber = $input->param('reservenumber');
110
  my $biblionumber   = $input->param('biblionumber');
108
  ToggleLowestPriority( $reservenumber );
111
  ToggleLowestPriority( $borrowernumber, $biblionumber );
112
}
109
}
113
110
114
if ($findborrower) {
111
if ($findborrower) {
Lines 142-148 if ($borrowernumber_hold && !$action) { Link Here
142
      GetReserveCount( $borrowerinfo->{'borrowernumber'} );
139
      GetReserveCount( $borrowerinfo->{'borrowernumber'} );
143
140
144
    if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
141
    if ( C4::Context->preference('maxreserves') && ($number_reserves >= C4::Context->preference('maxreserves')) ) {
145
		$warnings = 1;
142
	$warnings = 1;
146
        $maxreserves = 1;
143
        $maxreserves = 1;
147
    }
144
    }
148
145
Lines 156-162 if ($borrowernumber_hold && !$action) { Link Here
156
153
157
    # check if the borrower make the reserv in a different branch
154
    # check if the borrower make the reserv in a different branch
158
    if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) {
155
    if ( $borrowerinfo->{'branchcode'} ne C4::Context->userenv->{'branch'} ) {
159
		$messages = 1;
156
	$messages = 1;
160
        $diffbranch = 1;
157
        $diffbranch = 1;
161
    }
158
    }
162
159
Lines 178-185 if ($borrowernumber_hold && !$action) { Link Here
178
                maxreserves         => $maxreserves,
175
                maxreserves         => $maxreserves,
179
                expiry              => $expiry,
176
                expiry              => $expiry,
180
                diffbranch          => $diffbranch,
177
                diffbranch          => $diffbranch,
181
				messages            => $messages,
178
		messages            => $messages,
182
				warnings            => $warnings
179
		warnings            => $warnings
183
    );
180
    );
184
}
181
}
185
182
Lines 233-244 my @biblioloop = (); Link Here
233
foreach my $biblionumber (@biblionumbers) {
230
foreach my $biblionumber (@biblionumbers) {
234
231
235
    my %biblioloopiter = ();
232
    my %biblioloopiter = ();
236
	my $maxreserves;
233
    my $maxreserves;
237
234
238
    my $dat          = GetBiblioData($biblionumber);
235
    my $dat = GetBiblioData($biblionumber);
239
236
240
    unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
237
    unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
241
 		$warnings = 1;
238
	$warnings = 1;
242
        $maxreserves = 1;
239
        $maxreserves = 1;
243
    }
240
    }
244
    # get existing reserves .....
241
    # get existing reserves .....
Lines 262-269 foreach my $biblionumber (@biblionumbers) { Link Here
262
    $template->param( alreadyreserved => $alreadyreserved,
259
    $template->param( alreadyreserved => $alreadyreserved,
263
                      messages => $messages,
260
                      messages => $messages,
264
                      warnings => $warnings,
261
                      warnings => $warnings,
265
					  maxreserves=>$maxreserves
262
                       maxreserves=>$maxreserves
266
					  );
263
    );
267
264
268
265
269
    # FIXME think @optionloop, is maybe obsolete, or  must be switchable by a systeme preference fixed rank or not
266
    # FIXME think @optionloop, is maybe obsolete, or  must be switchable by a systeme preference fixed rank or not
Lines 290-300 foreach my $biblionumber (@biblionumbers) { Link Here
290
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
287
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
291
        @itemnumbers  = @$items;
288
        @itemnumbers  = @$items;
292
    }
289
    }
293
	my @hostitems = get_hostitemnumbers_of($biblionumber);
290
    my @hostitems = get_hostitemnumbers_of($biblionumber);
294
	if (@hostitems){
291
    if (@hostitems){
295
		$template->param('hostitemsflag' => 1);
292
        $template->param('hostitemsflag' => 1);
296
		push(@itemnumbers, @hostitems);
293
        push(@itemnumbers, @hostitems);
297
	}
294
    }
298
295
299
    if (!@itemnumbers) {
296
    if (!@itemnumbers) {
300
        $template->param('noitems' => 1);
297
        $template->param('noitems' => 1);
Lines 372-378 foreach my $biblionumber (@biblionumbers) { Link Here
372
            }
369
            }
373
370
374
            # checking reserve
371
            # checking reserve
375
            my ($reservedate,$reservedfor,$expectedAt) = GetReservesFromItemnumber($itemnumber);
372
            my ($reservedate,$reservedfor,$expectedAt,$reservenumber) = GetReservesFromItemnumber($itemnumber);
376
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
373
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
377
374
378
            if ( defined $reservedate ) {
375
            if ( defined $reservedate ) {
Lines 567-572 foreach my $biblionumber (@biblionumbers) { Link Here
567
        $reserve{'lowestPriority'}    = $res->{'lowestPriority'};
564
        $reserve{'lowestPriority'}    = $res->{'lowestPriority'};
568
        $reserve{'branchloop'} = GetBranchesLoop($res->{'branchcode'});
565
        $reserve{'branchloop'} = GetBranchesLoop($res->{'branchcode'});
569
        $reserve{'optionloop'} = \@optionloop;
566
        $reserve{'optionloop'} = \@optionloop;
567
        $reserve{'reservenumber'} = $res->{'reservenumber'};
570
568
571
        push( @reserveloop, \%reserve );
569
        push( @reserveloop, \%reserve );
572
    }
570
    }
573
- 

Return to bug 7710