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

(-)a/C4/Biblio.pm (-1 / +1 lines)
Lines 439-445 sub DelBiblio { Link Here
439
    require C4::Reserves;
439
    require C4::Reserves;
440
    my ($count, $reserves) = C4::Reserves::GetReservesFromBiblionumber($biblionumber);
440
    my ($count, $reserves) = C4::Reserves::GetReservesFromBiblionumber($biblionumber);
441
    foreach my $res ( @$reserves ) {
441
    foreach my $res ( @$reserves ) {
442
        C4::Reserves::CancelReserve( $res->{'biblionumber'}, $res->{'itemnumber'}, $res->{'borrowernumber'} );
442
        C4::Reserves::CancelReserve({ reserve_id => $res->{'reserve_id'} });
443
    }
443
    }
444
444
445
    # Delete in Zebra. Be careful NOT to move this line after _koha_delete_biblio
445
    # Delete in Zebra. Be careful NOT to move this line after _koha_delete_biblio
(-)a/C4/ILSDI/Services.pm (-1 / +1 lines)
Lines 762-768 sub CancelHold { Link Here
762
    return { code => 'NotCanceled' } unless any { $itemnumber eq $_ } @reserveditems;
762
    return { code => 'NotCanceled' } unless any { $itemnumber eq $_ } @reserveditems;
763
763
764
    # Cancel the reserve
764
    # Cancel the reserve
765
    CancelReserve( $itemnumber, undef, $borrowernumber );
765
    CancelReserve({ itemnumber => $itemnumber, borrowernumber => $borrowernumber });
766
766
767
    return { code => 'Canceled' };
767
    return { code => 'Canceled' };
768
}
768
}
(-)a/C4/Reserves.pm (-253 / +235 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 417-424 This function return 1 if an item can be issued by this borrower. Link Here
417
437
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;
423
            
443
            
424
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
444
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
Lines 428-454 sub CanItemBeReserved{ Link Here
428
    my $item     = GetItem($itemnumber);
448
    my $item     = GetItem($itemnumber);
429
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
449
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
430
    
450
    
431
    # we retrieve user rights on this itemtype and branchcode
451
    my $querycount = "
432
    my $sth = $dbh->prepare("SELECT categorycode, itemtype, branchcode, reservesallowed 
452
        SELECT count(*) AS count
433
                             FROM issuingrules 
453
        FROM reserves
434
                             WHERE (categorycode in (?,'*') ) 
454
        LEFT JOIN items USING (itemnumber)
435
                             AND (itemtype IN (?,'*')) 
455
        LEFT JOIN biblioitems ON (reserves.biblionumber=biblioitems.biblionumber)
436
                             AND (branchcode IN (?,'*')) 
456
        LEFT JOIN borrowers USING (borrowernumber)
437
                             ORDER BY 
457
        WHERE borrowernumber = ?
438
                               categorycode DESC, 
458
    ";
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
    
459
    
453
    my $itemtype     = $item->{$itype};
460
    my $itemtype     = $item->{$itype};
454
    my $categorycode = $borrower->{categorycode};
461
    my $categorycode = $borrower->{categorycode};
Lines 464-471 sub CanItemBeReserved{ Link Here
464
    }
471
    }
465
    
472
    
466
    # we retrieve rights 
473
    # we retrieve rights 
467
    $sth->execute($categorycode, $itemtype, $branchcode);
474
    my $rights = C4::Circulation::GetIssuingRule( $categorycode, $itemtype, $branchcode );
468
    if(my $rights = $sth->fetchrow_hashref()){
475
    if ( defined $rights ) {
469
        $itemtype        = $rights->{itemtype};
476
        $itemtype        = $rights->{itemtype};
470
        $allowedreserves = $rights->{reservesallowed}; 
477
        $allowedreserves = $rights->{reservesallowed}; 
471
    }else{
478
    }else{
Lines 489-500 sub CanItemBeReserved{ Link Here
489
    if(my $rowcount = $sthcount->fetchrow_hashref()){
496
    if(my $rowcount = $sthcount->fetchrow_hashref()){
490
        $reservecount = $rowcount->{count};
497
        $reservecount = $rowcount->{count};
491
    }
498
    }
492
    
493
    # we check if it's ok or not
499
    # we check if it's ok or not
494
    if( $reservecount < $allowedreserves ){
500
    if( $reservecount >= $allowedreserves ){ ## too many reserves
495
        return 1;
496
    }else{
497
        return 0;
501
        return 0;
502
    }else{
503
        return 1;
498
    }
504
    }
499
}
505
}
500
#--------------------------------------------------------------------------------
506
#--------------------------------------------------------------------------------
Lines 511-521 sub GetReserveCount { Link Here
511
517
512
    my $dbh = C4::Context->dbh;
518
    my $dbh = C4::Context->dbh;
513
519
514
    my $query = '
520
    my $query = "
515
        SELECT COUNT(*) AS counter
521
        SELECT COUNT(*) AS counter
516
        FROM reserves
522
        FROM reserves
517
          WHERE borrowernumber = ?
523
        WHERE borrowernumber = ?
518
    ';
524
    ";
519
    my $sth = $dbh->prepare($query);
525
    my $sth = $dbh->prepare($query);
520
    $sth->execute($borrowernumber);
526
    $sth->execute($borrowernumber);
521
    my $row = $sth->fetchrow_hashref;
527
    my $row = $sth->fetchrow_hashref;
Lines 542-549 sub GetOtherReserves { Link Here
542
            #minus priorities of others reservs
548
            #minus priorities of others reservs
543
            ModReserveMinusPriority(
549
            ModReserveMinusPriority(
544
                $itemnumber,
550
                $itemnumber,
545
                $checkreserves->{'borrowernumber'},
551
                $checkreserves->{'reserve_id'},
546
                $iteminfo->{'biblionumber'}
547
            );
552
            );
548
553
549
            #launch the subroutine dotransfer
554
            #launch the subroutine dotransfer
Lines 560-567 sub GetOtherReserves { Link Here
560
            $messages->{'waiting'} = 1;
565
            $messages->{'waiting'} = 1;
561
            ModReserveMinusPriority(
566
            ModReserveMinusPriority(
562
                $itemnumber,
567
                $itemnumber,
563
                $checkreserves->{'borrowernumber'},
568
                $checkreserves->{'reserve_id'},
564
                $iteminfo->{'biblionumber'}
565
            );
569
            );
566
            ModReserveStatus($itemnumber,'W');
570
            ModReserveStatus($itemnumber,'W');
567
        }
571
        }
Lines 687-693 sub GetReservesToBranch { Link Here
687
    my ( $frombranch ) = @_;
691
    my ( $frombranch ) = @_;
688
    my $dbh = C4::Context->dbh;
692
    my $dbh = C4::Context->dbh;
689
    my $sth = $dbh->prepare(
693
    my $sth = $dbh->prepare(
690
        "SELECT borrowernumber,reservedate,itemnumber,timestamp
694
        "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp
691
         FROM reserves 
695
         FROM reserves 
692
         WHERE priority='0' 
696
         WHERE priority='0' 
693
           AND branchcode=?"
697
           AND branchcode=?"
Lines 710-731 sub GetReservesToBranch { Link Here
710
714
711
sub GetReservesForBranch {
715
sub GetReservesForBranch {
712
    my ($frombranch) = @_;
716
    my ($frombranch) = @_;
713
    my $dbh          = C4::Context->dbh;
717
    my $dbh = C4::Context->dbh;
714
	my $query        = "SELECT borrowernumber,reservedate,itemnumber,waitingdate
718
719
    my $query = "
720
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
715
        FROM   reserves 
721
        FROM   reserves 
716
        WHERE   priority='0'
722
        WHERE   priority='0'
717
            AND found='W' ";
723
        AND found='W'
718
    if ($frombranch){
724
    ";
719
        $query .= " AND branchcode=? ";
725
    $query .= " AND branchcode=? " if ( $frombranch );
720
	}
721
    $query .= "ORDER BY waitingdate" ;
726
    $query .= "ORDER BY waitingdate" ;
727
722
    my $sth = $dbh->prepare($query);
728
    my $sth = $dbh->prepare($query);
723
    if ($frombranch){
729
    if ($frombranch){
724
		$sth->execute($frombranch);
730
     $sth->execute($frombranch);
725
	}
731
    } else {
726
    else {
732
        $sth->execute();
727
		$sth->execute();
733
    }
728
	}
734
729
    my @transreserv;
735
    my @transreserv;
730
    my $i = 0;
736
    my $i = 0;
731
    while ( my $data = $sth->fetchrow_hashref ) {
737
    while ( my $data = $sth->fetchrow_hashref ) {
Lines 880-886 sub CancelExpiredReserves { Link Here
880
    $sth->execute();
886
    $sth->execute();
881
887
882
    while ( my $res = $sth->fetchrow_hashref() ) {
888
    while ( my $res = $sth->fetchrow_hashref() ) {
883
        CancelReserve( $res->{'biblionumber'}, '', $res->{'borrowernumber'} );
889
        CancelReserve({ reserve_id => $res->{'reserve_id'} });
884
    }
890
    }
885
  
891
  
886
    # Cancel reserves that have been waiting too long
892
    # Cancel reserves that have been waiting too long
Lines 897-903 sub CancelExpiredReserves { Link Here
897
                manualinvoice($res->{'borrowernumber'}, $res->{'itemnumber'}, 'Hold waiting too long', 'F', $charge);
903
                manualinvoice($res->{'borrowernumber'}, $res->{'itemnumber'}, 'Hold waiting too long', 'F', $charge);
898
            }
904
            }
899
905
900
            CancelReserve( $res->{'biblionumber'}, '', $res->{'borrowernumber'} );
906
            CancelReserve({ reserve_id => $res->{'reserve_id'} });
901
        }
907
        }
902
    }
908
    }
903
909
Lines 923-1031 sub AutoUnsuspendReserves { Link Here
923
929
924
=head2 CancelReserve
930
=head2 CancelReserve
925
931
926
  &CancelReserve($biblionumber, $itemnumber, $borrowernumber);
932
  CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber ] });
927
933
928
Cancels a reserve.
934
Cancels a reserve.
929
935
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
936
=cut
941
937
942
sub CancelReserve {
938
sub CancelReserve {
943
    my ( $biblio, $item, $borr ) = @_;
939
    my ( $params ) = @_;
940
    
941
    my $reserve_id = $params->{'reserve_id'};
942
    $reserve_id = GetReserveId( $params ) unless ( $reserve_id );
943
944
    return unless ( $reserve_id );
945
944
    my $dbh = C4::Context->dbh;
946
    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
947
1004
        $query = qq/
948
    my $query = "
1005
            INSERT INTO old_reserves
949
        UPDATE reserves
1006
            SELECT * FROM reserves
950
        SET    cancellationdate = now(),
1007
            WHERE  biblionumber     = ?
951
               found            = Null,
1008
              AND  borrowernumber   = ?
952
               priority         = 0
1009
        /;
953
        WHERE  reserve_id = ?
1010
        $sth = $dbh->prepare($query);
954
    ";
1011
        $sth->execute( $biblio, $borr );
955
    my $sth = $dbh->prepare($query);
956
    $sth->execute( $reserve_id );
957
    $sth->finish;
1012
958
1013
        $query = qq/
959
    $query = "
1014
            DELETE FROM reserves
960
        INSERT INTO old_reserves
1015
            WHERE  biblionumber     = ?
961
        SELECT * FROM reserves
1016
              AND  borrowernumber   = ?
962
        WHERE  reserve_id = ?
1017
        /;
963
    ";
1018
        $sth = $dbh->prepare($query);
964
    $sth = $dbh->prepare($query);
1019
        $sth->execute( $biblio, $borr );
965
    $sth->execute( $reserve_id );
1020
966
1021
        # now fix the priority on the others....
967
    $query = "
1022
        _FixPriority( $biblio, $borr );
968
        DELETE FROM reserves
1023
    }
969
        WHERE  reserve_id = ?
970
    ";
971
    $sth = $dbh->prepare($query);
972
    $sth->execute( $reserve_id );
973
974
    # now fix the priority on the others....
975
    _FixPriority( $reserve_id );
1024
}
976
}
1025
977
1026
=head2 ModReserve
978
=head2 ModReserve
1027
979
1028
  ModReserve($rank, $biblio, $borrower, $branch[, $itemnumber])
980
  ModReserve({ rank => $rank, 
981
               reserve_id => $reserve_id, 
982
               branchcode => $branchcode 
983
               [, itemnumber => $itemnumber ] 
984
               [, biblionumber => $biblionumber, $borrowernumber => $borrowernumber ] 
985
              });
1029
986
1030
Change a hold request's priority or cancel it.
987
Change a hold request's priority or cancel it.
1031
988
Lines 1055-1113 itemnumber and supplying itemnumber. Link Here
1055
=cut
1012
=cut
1056
1013
1057
sub ModReserve {
1014
sub ModReserve {
1058
    #subroutine to update a reserve
1015
    my ( $params ) = @_;
1059
    my ( $rank, $biblio, $borrower, $branch , $itemnumber, $suspend_until) = @_;
1016
    
1060
     return if $rank eq "W";
1017
    my $rank = $params->{'rank'};
1061
     return if $rank eq "n";
1018
    my $reserve_id = $params->{'reserve_id'};
1019
    my $branchcode = $params->{'branchcode'};
1020
    my $itemnumber = $params->{'itemnumber'};
1021
    my $suspend_until = $params->{'suspend_until'};
1022
    my $borrowernumber = $params->{'borrowernumber'};
1023
    my $biblionumber = $params->{'biblionumber'};
1024
    
1025
    return if $rank eq "W";
1026
    return if $rank eq "n";
1027
    
1028
    return unless ( $reserve_id || ( $borrowernumber && ( $biblionumber || $itemnumber ) ) );
1029
    $reserve_id = GetReserveId({ biblionumber => $biblionumber, borrowernumber => $borrowernumber, itemnumber => $itemnumber }) unless ( $reserve_id );
1030
1062
    my $dbh = C4::Context->dbh;
1031
    my $dbh = C4::Context->dbh;
1063
    if ( $rank eq "del" ) {
1032
    if ( $rank eq "del" ) {
1064
        my $query = qq/
1033
        my $query = "
1065
            UPDATE reserves
1034
            UPDATE reserves
1066
            SET    cancellationdate=now()
1035
            SET    cancellationdate=now()
1067
            WHERE  biblionumber   = ?
1036
            WHERE  reserve_id = ?
1068
             AND   borrowernumber = ?
1037
        ";
1069
        /;
1070
        my $sth = $dbh->prepare($query);
1038
        my $sth = $dbh->prepare($query);
1071
        $sth->execute( $biblio, $borrower );
1039
        $sth->execute( $reserve_id );
1072
        $sth->finish;
1040
        $sth->finish;
1073
        $query = qq/
1041
        $query = "
1074
            INSERT INTO old_reserves
1042
            INSERT INTO old_reserves
1075
            SELECT *
1043
            SELECT *
1076
            FROM   reserves 
1044
            FROM   reserves 
1077
            WHERE  biblionumber   = ?
1045
            WHERE  reserve_id = ?
1078
             AND   borrowernumber = ?
1046
        ";
1079
        /;
1080
        $sth = $dbh->prepare($query);
1047
        $sth = $dbh->prepare($query);
1081
        $sth->execute( $biblio, $borrower );
1048
        $sth->execute( $reserve_id );
1082
        $query = qq/
1049
        $query = "
1083
            DELETE FROM reserves 
1050
            DELETE FROM reserves 
1084
            WHERE  biblionumber   = ?
1051
            WHERE  reserve_id = ?
1085
             AND   borrowernumber = ?
1052
        ";
1086
        /;
1087
        $sth = $dbh->prepare($query);
1053
        $sth = $dbh->prepare($query);
1088
        $sth->execute( $biblio, $borrower );
1054
        $sth->execute( $reserve_id );
1089
        
1055
        
1090
    }
1056
    }
1091
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1057
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1092
        my $query = "
1058
        my $query = "
1093
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1059
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1094
            WHERE biblionumber   = ?
1060
            WHERE reserve_id = ?
1095
            AND borrowernumber = ?
1096
        ";
1061
        ";
1097
        my $sth = $dbh->prepare($query);
1062
        my $sth = $dbh->prepare($query);
1098
        $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower);
1063
        $sth->execute( $rank, $branchcode, $itemnumber, $reserve_id );
1099
        $sth->finish;
1064
        $sth->finish;
1100
1065
1101
        if ( defined( $suspend_until ) ) {
1066
        if ( defined( $suspend_until ) ) {
1102
            if ( $suspend_until ) {
1067
            if ( $suspend_until ) {
1103
                $suspend_until = C4::Dates->new( $suspend_until )->output("iso");
1068
                $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 ) );
1069
                $dbh->do("UPDATE reserves SET suspend = 1, suspend_until = ? WHERE reserve_id = ?", undef, ( $suspend_until, $reserve_id ) );
1105
            } else {
1070
            } else {
1106
                $dbh->do("UPDATE reserves SET suspend_until = NULL WHERE biblionumber = ? AND borrowernumber = ?", undef, ( $biblio, $borrower ) );
1071
                $dbh->do("UPDATE reserves SET suspend_until = NULL WHERE reserve_id = ?", undef, ( $reserve_id ) );
1107
            }
1072
            }
1108
        }
1073
        }
1109
1074
1110
        _FixPriority( $biblio, $borrower, $rank);
1075
        _FixPriority( $reserve_id, $rank );
1111
    }
1076
    }
1112
}
1077
}
1113
1078
Lines 1127-1132 sub ModReserveFill { Link Here
1127
    my ($res) = @_;
1092
    my ($res) = @_;
1128
    my $dbh = C4::Context->dbh;
1093
    my $dbh = C4::Context->dbh;
1129
    # fill in a reserve record....
1094
    # fill in a reserve record....
1095
    my $reserve_id = $res->{'reserve_id'};
1130
    my $biblionumber = $res->{'biblionumber'};
1096
    my $biblionumber = $res->{'biblionumber'};
1131
    my $borrowernumber    = $res->{'borrowernumber'};
1097
    my $borrowernumber    = $res->{'borrowernumber'};
1132
    my $resdate = $res->{'reservedate'};
1098
    my $resdate = $res->{'reservedate'};
Lines 1175-1181 sub ModReserveFill { Link Here
1175
    # now fix the priority on the others (if the priority wasn't
1141
    # now fix the priority on the others (if the priority wasn't
1176
    # already sorted!)....
1142
    # already sorted!)....
1177
    unless ( $priority == 0 ) {
1143
    unless ( $priority == 0 ) {
1178
        _FixPriority( $biblionumber, $borrowernumber );
1144
        _FixPriority( $reserve_id );
1179
    }
1145
    }
1180
}
1146
}
1181
1147
Lines 1285-1291 sub ModReserveCancelAll { Link Here
1285
    my ( $itemnumber, $borrowernumber ) = @_;
1251
    my ( $itemnumber, $borrowernumber ) = @_;
1286
1252
1287
    #step 1 : cancel the reservation
1253
    #step 1 : cancel the reservation
1288
    my $CancelReserve = CancelReserve( undef, $itemnumber, $borrowernumber );
1254
    my $CancelReserve = CancelReserve({ itemnumber => $itemnumber, borrowernumber => $borrowernumber });
1289
1255
1290
    #step 2 launch the subroutine of the others reserves
1256
    #step 2 launch the subroutine of the others reserves
1291
    ( $messages, $nextreservinfo ) = GetOtherReserves($itemnumber);
1257
    ( $messages, $nextreservinfo ) = GetOtherReserves($itemnumber);
Lines 1297-1321 sub ModReserveCancelAll { Link Here
1297
1263
1298
  &ModReserveMinusPriority($itemnumber,$borrowernumber,$biblionumber)
1264
  &ModReserveMinusPriority($itemnumber,$borrowernumber,$biblionumber)
1299
1265
1300
Reduce the values of queuded list     
1266
Reduce the values of queued list     
1301
1267
1302
=cut
1268
=cut
1303
1269
1304
sub ModReserveMinusPriority {
1270
sub ModReserveMinusPriority {
1305
    my ( $itemnumber, $borrowernumber, $biblionumber ) = @_;
1271
    my ( $itemnumber, $reserve_id ) = @_;
1306
1272
1307
    #first step update the value of the first person on reserv
1273
    #first step update the value of the first person on reserv
1308
    my $dbh   = C4::Context->dbh;
1274
    my $dbh   = C4::Context->dbh;
1309
    my $query = "
1275
    my $query = "
1310
        UPDATE reserves
1276
        UPDATE reserves
1311
        SET    priority = 0 , itemnumber = ? 
1277
        SET    priority = 0 , itemnumber = ? 
1312
        WHERE  borrowernumber=?
1278
        WHERE  reserve_id = ?
1313
          AND  biblionumber=?
1314
    ";
1279
    ";
1315
    my $sth_upd = $dbh->prepare($query);
1280
    my $sth_upd = $dbh->prepare($query);
1316
    $sth_upd->execute( $itemnumber, $borrowernumber, $biblionumber );
1281
    $sth_upd->execute( $itemnumber, $reserve_id );
1317
    # second step update all others reservs
1282
    # second step update all others reservs
1318
    _FixPriority($biblionumber, $borrowernumber, '0');
1283
    _FixPriority( $reserve_id, '0');
1319
}
1284
}
1320
1285
1321
=head2 GetReserveInfo
1286
=head2 GetReserveInfo
Lines 1328-1336 Current implementation this query should have a single result. Link Here
1328
=cut
1293
=cut
1329
1294
1330
sub GetReserveInfo {
1295
sub GetReserveInfo {
1331
	my ( $borrowernumber, $biblionumber ) = @_;
1296
    my ( $reserve_id ) = @_;
1332
    my $dbh = C4::Context->dbh;
1297
    my $dbh = C4::Context->dbh;
1333
	my $strsth="SELECT 
1298
    my $strsth="SELECT
1334
	               reservedate, 
1299
	               reservedate, 
1335
	               reservenotes, 
1300
	               reservenotes, 
1336
	               reserves.borrowernumber,
1301
	               reserves.borrowernumber,
Lines 1360-1376 sub GetReserveInfo { Link Here
1360
				   notes
1325
				   notes
1361
			FROM reserves 
1326
			FROM reserves 
1362
			 LEFT JOIN items USING(itemnumber) 
1327
			 LEFT JOIN items USING(itemnumber) 
1363
		     LEFT JOIN borrowers USING(borrowernumber)
1328
                     LEFT JOIN borrowers USING(borrowernumber)
1364
		     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber) 
1329
                     LEFT JOIN biblio ON  (reserves.biblionumber=biblio.biblionumber)
1365
			WHERE 
1330
                       WHERE reserves.reserve_id = ?";
1366
				reserves.borrowernumber=?
1331
    my $sth = $dbh->prepare($strsth);
1367
				AND reserves.biblionumber=?";
1332
    $sth->execute($reserve_id);
1368
	my $sth = $dbh->prepare($strsth); 
1369
	$sth->execute($borrowernumber,$biblionumber);
1370
1371
	my $data = $sth->fetchrow_hashref;
1372
	return $data;
1373
1333
1334
    my $data = $sth->fetchrow_hashref;
1335
    return $data;
1374
}
1336
}
1375
1337
1376
=head2 IsAvailableForItemLevelRequest
1338
=head2 IsAvailableForItemLevelRequest
Lines 1455-1483 Input: $where is 'up', 'down', 'top' or 'bottom'. Biblionumber, Date reserve was Link Here
1455
=cut
1417
=cut
1456
1418
1457
sub AlterPriority {
1419
sub AlterPriority {
1458
    my ( $where, $borrowernumber, $biblionumber ) = @_;
1420
    my ( $where, $reserve_id ) = @_;
1459
1421
    #warn "C4::Reserves::AlterPriority( $where, $reserve_id )";
1460
    my $dbh = C4::Context->dbh;
1422
    my $dbh = C4::Context->dbh;
1461
1423
1462
    ## Find this reserve
1424
    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
1425
1468
    if ( $where eq 'up' || $where eq 'down' ) {
1426
    if ( $where eq 'up' || $where eq 'down' ) {
1469
    
1427
    
1470
      my $priority = $reserve->{'priority'};        
1428
      my $priority = $reserve->{'priority'};        
1471
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1429
      $priority = $where eq 'up' ? $priority - 1 : $priority + 1;
1472
      _FixPriority( $biblionumber, $borrowernumber, $priority )
1430
      _FixPriority( $reserve_id, $priority )
1473
1431
1474
    } elsif ( $where eq 'top' ) {
1432
    } elsif ( $where eq 'top' ) {
1475
1433
1476
      _FixPriority( $biblionumber, $borrowernumber, '1' )
1434
      _FixPriority( $reserve_id, '1' )
1477
1435
1478
    } elsif ( $where eq 'bottom' ) {
1436
    } elsif ( $where eq 'bottom' ) {
1479
1437
1480
      _FixPriority( $biblionumber, $borrowernumber, '999999' )
1438
      _FixPriority( $reserve_id, '999999' )
1481
1439
1482
    }
1440
    }
1483
}
1441
}
Lines 1491-1517 This function sets the lowestPriority field to true if is false, and false if it Link Here
1491
=cut
1449
=cut
1492
1450
1493
sub ToggleLowestPriority {
1451
sub ToggleLowestPriority {
1494
    my ( $borrowernumber, $biblionumber ) = @_;
1452
    my ( $reserve_id ) = @_;
1495
1453
1496
    my $dbh = C4::Context->dbh;
1454
    my $dbh = C4::Context->dbh;
1497
1455
1498
    my $sth = $dbh->prepare(
1456
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?");
1499
        "UPDATE reserves SET lowestPriority = NOT lowestPriority
1457
    $sth->execute( $reserve_id );
1500
         WHERE biblionumber = ?
1501
         AND borrowernumber = ?"
1502
    );
1503
    $sth->execute(
1504
        $biblionumber,
1505
        $borrowernumber,
1506
    );
1507
    $sth->finish;
1458
    $sth->finish;
1508
    
1459
    
1509
    _FixPriority( $biblionumber, $borrowernumber, '999999' );
1460
    _FixPriority( $reserve_id, '999999' );
1510
}
1461
}
1511
1462
1512
=head2 ToggleSuspend
1463
=head2 ToggleSuspend
1513
1464
1514
  ToggleSuspend( $borrowernumber, $biblionumber );
1465
  ToggleSuspend( $reserve_id );
1515
1466
1516
This function sets the suspend field to true if is false, and false if it is true.
1467
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
1468
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
1471
=cut
1521
1472
1522
sub ToggleSuspend {
1473
sub ToggleSuspend {
1523
    my ( $borrowernumber, $biblionumber, $suspend_until ) = @_;
1474
    my ( $reserve_id, $suspend_until ) = @_;
1524
1475
1525
    $suspend_until = output_pref( dt_from_string( $suspend_until ), 'iso' ) if ( $suspend_until );
1476
    $suspend_until = output_pref( dt_from_string( $suspend_until ), 'iso' ) if ( $suspend_until );
1526
1477
Lines 1531-1544 sub ToggleSuspend { Link Here
1531
    my $sth = $dbh->prepare(
1482
    my $sth = $dbh->prepare(
1532
        "UPDATE reserves SET suspend = NOT suspend,
1483
        "UPDATE reserves SET suspend = NOT suspend,
1533
        suspend_until = CASE WHEN suspend = 0 THEN NULL ELSE $do_until END
1484
        suspend_until = CASE WHEN suspend = 0 THEN NULL ELSE $do_until END
1534
        WHERE biblionumber = ?
1485
        WHERE reserve_id = ?
1535
        AND borrowernumber = ?
1536
    ");
1486
    ");
1537
1487
1538
    my @params;
1488
    my @params;
1539
    push( @params, $suspend_until ) if ( $suspend_until );
1489
    push( @params, $suspend_until ) if ( $suspend_until );
1540
    push( @params, $biblionumber );
1490
    push( @params, $reserve_id );
1541
    push( @params, $borrowernumber );
1542
1491
1543
    $sth->execute( @params );
1492
    $sth->execute( @params );
1544
    $sth->finish;
1493
    $sth->finish;
Lines 1603-1609 sub SuspendAll { Link Here
1603
1552
1604
=head2 _FixPriority
1553
=head2 _FixPriority
1605
1554
1606
  &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank);
1555
  &_FixPriority( $reserve_id, $rank, $ignoreSetLowestRank);
1607
1556
1608
Only used internally (so don't export it)
1557
Only used internally (so don't export it)
1609
Changed how this functions works #
1558
Changed how this functions works #
Lines 1615-1655 in new priority rank Link Here
1615
=cut 
1564
=cut 
1616
1565
1617
sub _FixPriority {
1566
sub _FixPriority {
1618
    my ( $biblio, $borrowernumber, $rank, $ignoreSetLowestRank ) = @_;
1567
    my ( $reserve_id, $rank, $ignoreSetLowestRank ) = @_;
1619
    my $dbh = C4::Context->dbh;
1568
    my $dbh = C4::Context->dbh;
1620
     if ( $rank eq "del" ) {
1569
1621
         CancelReserve( $biblio, undef, $borrowernumber );
1570
    my $res = GetReserve( $reserve_id );
1622
     }
1571
1623
    if ( $rank eq "W" || $rank eq "0" ) {
1572
    if ( $rank eq "del" ) {
1573
         CancelReserve({ reserve_id => $reserve_id });
1574
    }
1575
    elsif ( $rank eq "W" || $rank eq "0" ) {
1624
1576
1625
        # make sure priority for waiting or in-transit items is 0
1577
        # make sure priority for waiting or in-transit items is 0
1626
        my $query = qq/
1578
        my $query = "
1627
            UPDATE reserves
1579
            UPDATE reserves
1628
            SET    priority = 0
1580
            SET    priority = 0
1629
            WHERE biblionumber = ?
1581
            WHERE reserve_id = ?
1630
              AND borrowernumber = ?
1582
            AND found IN ('W', 'T')
1631
              AND found IN ('W', 'T')
1583
        ";
1632
        /;
1633
        my $sth = $dbh->prepare($query);
1584
        my $sth = $dbh->prepare($query);
1634
        $sth->execute( $biblio, $borrowernumber );
1585
        $sth->execute( $reserve_id );
1635
    }
1586
    }
1636
    my @priority;
1587
    my @priority;
1637
    my @reservedates;
1588
    my @reservedates;
1638
1589
1639
    # get whats left
1590
    # get whats left
1640
# FIXME adding a new security in returned elements for changing priority,
1591
    my $query = "
1641
# now, we don't care anymore any reservations with itemnumber linked (suppose a waiting reserve)
1592
        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
1593
        FROM   reserves
1647
        WHERE  biblionumber   = ?
1594
        WHERE  biblionumber   = ?
1648
          AND  ((found <> 'W' AND found <> 'T') or found is NULL)
1595
          AND  ((found <> 'W' AND found <> 'T') OR found IS NULL)
1649
        ORDER BY priority ASC
1596
        ORDER BY priority ASC
1650
    /;
1597
    ";
1651
    my $sth = $dbh->prepare($query);
1598
    my $sth = $dbh->prepare($query);
1652
    $sth->execute($biblio);
1599
    $sth->execute( $res->{'biblionumber'} );
1653
    while ( my $line = $sth->fetchrow_hashref ) {
1600
    while ( my $line = $sth->fetchrow_hashref ) {
1654
        push( @reservedates, $line );
1601
        push( @reservedates, $line );
1655
        push( @priority,     $line );
1602
        push( @priority,     $line );
Lines 1659-1665 sub _FixPriority { Link Here
1659
    my $i;
1606
    my $i;
1660
    my $key = -1;    # to allow for 0 to be a valid result
1607
    my $key = -1;    # to allow for 0 to be a valid result
1661
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1608
    for ( $i = 0 ; $i < @priority ; $i++ ) {
1662
        if ( $borrowernumber == $priority[$i]->{'borrowernumber'} ) {
1609
        if ( $reserve_id == $priority[$i]->{'reserve_id'} ) {
1663
            $key = $i;    # save the index
1610
            $key = $i;    # save the index
1664
            last;
1611
            last;
1665
        }
1612
        }
Lines 1675-1703 sub _FixPriority { Link Here
1675
1622
1676
    # now fix the priority on those that are left....
1623
    # now fix the priority on those that are left....
1677
    $query = "
1624
    $query = "
1678
            UPDATE reserves
1625
        UPDATE reserves
1679
            SET    priority = ?
1626
        SET    priority = ?
1680
                WHERE  biblionumber = ?
1627
        WHERE  reserve_id = ?
1681
                 AND borrowernumber   = ?
1682
                 AND reservedate = ?
1683
         AND found IS NULL
1684
    ";
1628
    ";
1685
    $sth = $dbh->prepare($query);
1629
    $sth = $dbh->prepare($query);
1686
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1630
    for ( my $j = 0 ; $j < @priority ; $j++ ) {
1687
        $sth->execute(
1631
        $sth->execute(
1688
            $j + 1, $biblio,
1632
            $j + 1,
1689
            $priority[$j]->{'borrowernumber'},
1633
            $priority[$j]->{'reserve_id'}
1690
            $priority[$j]->{'reservedate'}
1691
        );
1634
        );
1692
        $sth->finish;
1635
        $sth->finish;
1693
    }
1636
    }
1694
    
1637
    
1695
    $sth = $dbh->prepare( "SELECT borrowernumber FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1638
    $sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1696
    $sth->execute();
1639
    $sth->execute();
1697
    
1640
    
1698
    unless ( $ignoreSetLowestRank ) {
1641
    unless ( $ignoreSetLowestRank ) {
1699
      while ( my $res = $sth->fetchrow_hashref() ) {
1642
      while ( my $res = $sth->fetchrow_hashref() ) {
1700
        _FixPriority( $biblio, $res->{'borrowernumber'}, '999999', 1 );
1643
        _FixPriority( $res->{'reserve_id'}, '999999', 1 );
1701
      }
1644
      }
1702
    }
1645
    }
1703
}
1646
}
Lines 1736-1742 sub _Findgroupreserve { Link Here
1736
               reserves.priority            AS priority,
1679
               reserves.priority            AS priority,
1737
               reserves.timestamp           AS timestamp,
1680
               reserves.timestamp           AS timestamp,
1738
               biblioitems.biblioitemnumber AS biblioitemnumber,
1681
               biblioitems.biblioitemnumber AS biblioitemnumber,
1739
               reserves.itemnumber          AS itemnumber
1682
               reserves.itemnumber          AS itemnumber,
1683
               reserves.reserve_id          AS reserve_id,
1740
        FROM reserves
1684
        FROM reserves
1741
        JOIN biblioitems USING (biblionumber)
1685
        JOIN biblioitems USING (biblionumber)
1742
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
1686
        JOIN hold_fill_targets USING (biblionumber, borrowernumber, itemnumber)
Lines 1969-1975 sub _ShiftPriorityByDateAndPriority { Link Here
1969
1913
1970
=head2 MoveReserve
1914
=head2 MoveReserve
1971
1915
1972
  MoveReserve( $itemnumber, $borrowernumber, $cancelreserve )
1916
  MoveReserve( $reserve_id, $cancelreserve )
1973
1917
1974
Use when checking out an item to handle reserves
1918
Use when checking out an item to handle reserves
1975
If $cancelreserve boolean is set to true, it will remove existing reserve
1919
If $cancelreserve boolean is set to true, it will remove existing reserve
Lines 2011-2018 sub MoveReserve { Link Here
2011
            RevertWaitingStatus({ itemnumber => $itemnumber });
1955
            RevertWaitingStatus({ itemnumber => $itemnumber });
2012
        }
1956
        }
2013
        elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) { # cancel reserves on this item
1957
        elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) { # cancel reserves on this item
2014
            CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
1958
            CancelReserve({ 
2015
            CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
1959
                biblionumber   => $res->{'biblionumber'}, 
1960
                itemnumber     => $res->{'itemnumber'}, 
1961
                borrowernumber => $res->{'borrowernumber'} 
1962
            });
2016
        }
1963
        }
2017
    }
1964
    }
2018
}
1965
}
Lines 2028-2034 This shifts the holds from C<$from_biblio> to C<$to_biblio> and reorders them by Link Here
2028
sub MergeHolds {
1975
sub MergeHolds {
2029
    my ( $dbh, $to_biblio, $from_biblio ) = @_;
1976
    my ( $dbh, $to_biblio, $from_biblio ) = @_;
2030
    my $sth = $dbh->prepare(
1977
    my $sth = $dbh->prepare(
2031
        "SELECT count(*) as reservenumber FROM reserves WHERE biblionumber = ?"
1978
        "SELECT count(*) as reserve_id FROM reserves WHERE biblionumber = ?"
2032
    );
1979
    );
2033
    $sth->execute($from_biblio);
1980
    $sth->execute($from_biblio);
2034
    if ( my $data = $sth->fetchrow_hashref() ) {
1981
    if ( my $data = $sth->fetchrow_hashref() ) {
Lines 2121-2126 sub RevertWaitingStatus { Link Here
2121
    return $sth->execute( $reserve->{'reserve_id'} );
2068
    return $sth->execute( $reserve->{'reserve_id'} );
2122
}
2069
}
2123
2070
2071
=head2 GetReserveId
2072
2073
  $reserve_id = GetReserveId({ biblionumber => $biblionumber, borrowernumber => $borrowernumber [, itemnumber => $itemnumber ] });
2074
2075
  Returnes the first reserve id that matches the given criteria
2076
2077
=cut
2078
2079
sub GetReserveId {
2080
    my ( $params ) = @_;
2081
    
2082
    return unless ( ( $params->{'biblionumber'} || $params->{'itemnumber'} ) && $params->{'borrowernumber'} );
2083
    
2084
    my $dbh = C4::Context->dbh();
2085
2086
    my $sql = "SELECT reserve_id FROM reserves WHERE biblionumber ";
2087
2088
    my @params;
2089
    my @limits;
2090
    foreach my $key ( keys %$params ) {
2091
        if ( defined( $params->{$key} ) ) {
2092
            push( @limits, "$key = ?" );
2093
            push( @params, $params->{$key} );
2094
        }
2095
    }
2096
    
2097
    $sql .= join( " AND ", @limits );
2098
    
2099
    my $sth = $dbh->prepare( $sql );
2100
    $sth->execute( @params );
2101
    my $row = $sth->fetchrow_hashref();
2102
    
2103
    return $row->{'reserve_id'};
2104
}
2105
2124
=head2 ReserveSlip
2106
=head2 ReserveSlip
2125
2107
2126
  ReserveSlip($branchcode, $borrowernumber, $biblionumber)
2108
  ReserveSlip($branchcode, $borrowernumber, $biblionumber)
(-)a/C4/SIP/ILS/Transaction/Hold.pm (-13 / +10 lines)
Lines 85-94 sub drop_hold { Link Here
85
		return $self;
85
		return $self;
86
	}
86
	}
87
	my $bib = GetBiblioFromItemNumber(undef, $self->{item}->id);
87
	my $bib = GetBiblioFromItemNumber(undef, $self->{item}->id);
88
	# FIXME: figure out if it is a item or title hold.  Till then, cancel both.
88
89
	CancelReserve($bib->{biblionumber}, undef, $borrower->{borrowernumber});
89
	CancelReserve({ 
90
	CancelReserve(undef, $self->{item}->id, $borrower->{borrowernumber});
90
	    biblionumber   => $bib->{biblionumber}, 
91
		# unfortunately no meaningful return value here either
91
	    itemnumber     => $self->{item}->id, 
92
	    borrowernumber => $borrower->{borrowernumber} 
93
	});
94
	
92
	$self->ok(1);
95
	$self->ok(1);
93
	return $self;
96
	return $self;
94
}
97
}
Lines 119-135 sub change_hold { Link Here
119
		return $self;
122
		return $self;
120
	}
123
	}
121
	my $bibno = $bib->{biblionumber};
124
	my $bibno = $bib->{biblionumber};
122
	ModReserve($bibno, $borrower->{borrowernumber}, $branch, GetBiblioItemByBiblioNumber($bibno));
125
	ModReserve({ biblionumber => $bibno, borrowernumber => $borrower->{borrowernumber}, branchcode => $branch });
123
		# unfortunately no meaningful return value
126
124
		# ModReserve needs to be fixed to maintain priority by iteself (Feb 2008)
125
	$self->ok(1);
127
	$self->ok(1);
126
	return $self;
128
	return $self;
127
}
129
}
130
128
1;
131
1;
129
__END__
132
__END__
130
131
# 11 friggin arguments
132
AddReserve($branch,$borrowernumber,$biblionumber,$constraint,$bibitems,$priority,$startdate,$notes,$title,$checkitem,$found)
133
134
ModReserve($rank, $biblio, $borrower, $branch , $itemnumber)
135
(-)a/circ/branchtransfers.pl (-2 / +8 lines)
Lines 80-86 my $ignoreRs = 0; Link Here
80
# Deal with the requests....
80
# Deal with the requests....
81
if ( $request eq "KillWaiting" ) {
81
if ( $request eq "KillWaiting" ) {
82
    my $item = $query->param('itemnumber');
82
    my $item = $query->param('itemnumber');
83
    CancelReserve( 0, $item, $borrowernumber );
83
    CancelReserve({ 
84
        itemnumber     => $item, 
85
        borrowernumber => $borrowernumber 
86
    });
84
    $cancelled   = 1;
87
    $cancelled   = 1;
85
    $reqmessage  = 1;
88
    $reqmessage  = 1;
86
}
89
}
Lines 93-99 elsif ( $request eq "SetWaiting" ) { Link Here
93
}
96
}
94
elsif ( $request eq 'KillReserved' ) {
97
elsif ( $request eq 'KillReserved' ) {
95
    my $biblio = $query->param('biblionumber');
98
    my $biblio = $query->param('biblionumber');
96
    CancelReserve( $biblio, 0, $borrowernumber );
99
    CancelReserve({ 
100
        biblionumber   => $biblio, 
101
        borrowernumber => $borrowernumber 
102
    });
97
    $cancelled   = 1;
103
    $cancelled   = 1;
98
    $reqmessage  = 1;
104
    $reqmessage  = 1;
99
}
105
}
(-)a/circ/circulation.pl (-1 / +1 lines)
Lines 354-360 if ($borrowernumber) { Link Here
354
        $getreserv{nottransfered} = 0;
354
        $getreserv{nottransfered} = 0;
355
355
356
        $getreserv{reservedate}    = format_date( $num_res->{'reservedate'} );
356
        $getreserv{reservedate}    = format_date( $num_res->{'reservedate'} );
357
        $getreserv{reservenumber}  = $num_res->{'reservenumber'};
357
        $getreserv{reserve_id}  = $num_res->{'reserve_id'};
358
        $getreserv{title}          = $getiteminfo->{'title'};
358
        $getreserv{title}          = $getiteminfo->{'title'};
359
        $getreserv{itemtype}       = $itemtypeinfo->{'description'};
359
        $getreserv{itemtype}       = $itemtypeinfo->{'description'};
360
        $getreserv{author}         = $getiteminfo->{'author'};
360
        $getreserv{author}         = $getiteminfo->{'author'};
(-)a/opac/opac-modrequest.pl (-3 / +6 lines)
Lines 30-35 use C4::Output; Link Here
30
use C4::Reserves;
30
use C4::Reserves;
31
use C4::Auth;
31
use C4::Auth;
32
my $query = new CGI;
32
my $query = new CGI;
33
33
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
34
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
34
    {   
35
    {   
35
        template_name   => "opac-account.tmpl",
36
        template_name   => "opac-account.tmpl",
Lines 41-48 my ( $template, $borrowernumber, $cookie ) = get_template_and_user( Link Here
41
    }
42
    }
42
);
43
);
43
44
44
my $biblionumber = $query->param('biblionumber');
45
my $reserve_id = $query->param('reserve_id');
45
if ($biblionumber and $borrowernumber) {
46
46
	CancelReserve($biblionumber, '', $borrowernumber);
47
if ($reserve_id && $borrowernumber) {
48
  CancelReserve({ reserve_id => $reserve_id });
47
}
49
}
50
48
print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds");
51
print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds");
(-)a/reserve/modrequest.pl (-10 / +18 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-75 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({
72
            rank => $rank[$i], 
73
            reserve_id => $reserve_id[$i], 
74
            branchcode => $branch[$i], 
75
            itemnumber => $itemnumber[$i], 
76
            suspend_until => $suspend_until[$i] 
77
        });
71
    }
78
    }
72
}
79
}
80
73
my $from=$query->param('from');
81
my $from=$query->param('from');
74
$from ||= q{};
82
$from ||= q{};
75
if ( $from eq 'borrower'){
83
if ( $from eq 'borrower'){
(-)a/reserve/request.pl (-35 / +38 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 => $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-250 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
247
Lines 257-263 foreach my $biblionumber (@biblionumbers) { Link Here
257
    # get existing reserves .....
254
    # get existing reserves .....
258
    my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
255
    my ( $count, $reserves ) = GetReservesFromBiblionumber($biblionumber,1);
259
    my $totalcount = $count;
256
    my $totalcount = $count;
260
    my $alreadyreserved;
257
    my $holds_count = 0;
258
    my $alreadyreserved = 0;
261
259
262
    foreach my $res (@$reserves) {
260
    foreach my $res (@$reserves) {
263
        if ( defined $res->{found} && $res->{found} eq 'W' ) {
261
        if ( defined $res->{found} && $res->{found} eq 'W' ) {
Lines 265-285 foreach my $biblionumber (@biblionumbers) { Link Here
265
        }
263
        }
266
264
267
        if ( defined $borrowerinfo && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) {
265
        if ( defined $borrowerinfo && ($borrowerinfo->{borrowernumber} eq $res->{borrowernumber}) ) {
268
            $warnings = 1;
266
            $holds_count++;
267
        }
268
    }
269
270
    if ( $holds_count >= $max_holds_per_record ) {
269
            $alreadyreserved = 1;
271
            $alreadyreserved = 1;
272
            $warnings = 1;
270
            $biblioloopiter{warn} = 1;
273
            $biblioloopiter{warn} = 1;
271
            $biblioloopiter{alreadyres} = 1;
274
            $biblioloopiter{alreadyres} = 1;
272
        }
273
    }
275
    }
274
276
275
    $template->param( alreadyreserved => $alreadyreserved,
277
    $template->param( alreadyreserved => $alreadyreserved,
276
                      messages => $messages,
278
        messages          => $messages,
277
                      warnings => $warnings,
279
        warnings          => $warnings,
278
                 maxreserves=>$maxreserves,
280
        maxreserves       => $maxreserves,
279
                     alreadypossession => $alreadypossession,
281
        alreadypossession => $alreadypossession,
280
					  );
282
    );
281
283
    
282
283
    # FIXME think @optionloop, is maybe obsolete, or  must be switchable by a systeme preference fixed rank or not
284
    # FIXME think @optionloop, is maybe obsolete, or  must be switchable by a systeme preference fixed rank or not
284
    # make priorities options
285
    # make priorities options
285
286
Lines 304-314 foreach my $biblionumber (@biblionumbers) { Link Here
304
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
305
    if (my $items = get_itemnumbers_of($biblionumber)->{$biblionumber}){
305
        @itemnumbers  = @$items;
306
        @itemnumbers  = @$items;
306
    }
307
    }
307
	my @hostitems = get_hostitemnumbers_of($biblionumber);
308
    my @hostitems = get_hostitemnumbers_of($biblionumber);
308
	if (@hostitems){
309
    if (@hostitems){
309
		$template->param('hostitemsflag' => 1);
310
        $template->param('hostitemsflag' => 1);
310
		push(@itemnumbers, @hostitems);
311
        push(@itemnumbers, @hostitems);
311
	}
312
    }
312
313
313
    if (!@itemnumbers) {
314
    if (!@itemnumbers) {
314
        $template->param('noitems' => 1);
315
        $template->param('noitems' => 1);
Lines 386-392 foreach my $biblionumber (@biblionumbers) { Link Here
386
            }
387
            }
387
388
388
            # checking reserve
389
            # checking reserve
389
            my ($reservedate,$reservedfor,$expectedAt) = GetReservesFromItemnumber($itemnumber);
390
            my ($reservedate,$reservedfor,$expectedAt,$reserve_id) = GetReservesFromItemnumber($itemnumber);
390
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
391
            my $ItemBorrowerReserveInfo = GetMember( borrowernumber => $reservedfor );
391
392
392
            if ( defined $reservedate ) {
393
            if ( defined $reservedate ) {
Lines 583-588 foreach my $biblionumber (@biblionumbers) { Link Here
583
        $reserve{'optionloop'} = \@optionloop;
584
        $reserve{'optionloop'} = \@optionloop;
584
        $reserve{'suspend'} = $res->{'suspend'};
585
        $reserve{'suspend'} = $res->{'suspend'};
585
        $reserve{'suspend_until'} = $res->{'suspend_until'};
586
        $reserve{'suspend_until'} = $res->{'suspend_until'};
587
        $reserve{'reserve_id'} = $res->{'reserve_id'};
588
586
        push( @reserveloop, \%reserve );
589
        push( @reserveloop, \%reserve );
587
    }
590
    }
588
591
(-)a/serials/routing-preview.pl (-2 / +6 lines)
Lines 87-93 if($ok){ Link Here
87
            my $reserve = $sth->fetchrow_hashref;
87
            my $reserve = $sth->fetchrow_hashref;
88
88
89
            if($routing->{borrowernumber} == $reserve->{borrowernumber}){
89
            if($routing->{borrowernumber} == $reserve->{borrowernumber}){
90
                ModReserve($routing->{ranking},$biblio,$routing->{borrowernumber},$branch);
90
                ModReserve({
91
                    rank           => $routing->{ranking},
92
                    biblionumber   => $biblio,
93
                    borrowernumber => $routing->{borrowernumber},
94
                    branchcode     => $branch
95
                });
91
            } else {
96
            } else {
92
                AddReserve($branch,$routing->{borrowernumber},$biblio,$const,\@bibitems,$routing->{ranking}, undef, undef, $notes,$title);
97
                AddReserve($branch,$routing->{borrowernumber},$biblio,$const,\@bibitems,$routing->{ranking}, undef, undef, $notes,$title);
93
        }
98
        }
94
- 

Return to bug 9394