| Lines 117-126
          BEGIN {
      
      
        Link Here | 
        
          | 117 |         &CancelReserve | 117 |         &CancelReserve | 
        
          | 118 |         &CancelExpiredReserves | 118 |         &CancelExpiredReserves | 
        
          | 119 |  | 119 |  | 
            
              |  |  | 120 |         &AutoUnsuspendReserves | 
            
              | 121 |  | 
        
          | 120 |         &IsAvailableForItemLevelRequest | 122 |         &IsAvailableForItemLevelRequest | 
        
          | 121 |          | 123 |          | 
        
          | 122 |         &AlterPriority | 124 |         &AlterPriority | 
        
          | 123 |         &ToggleLowestPriority | 125 |         &ToggleLowestPriority | 
            
              |  |  | 126 |         &ToggleSuspend | 
            
              | 127 |         &SuspendAll | 
        
          | 124 |     ); | 128 |     ); | 
        
          | 125 |     @EXPORT_OK = qw( MergeHolds ); | 129 |     @EXPORT_OK = qw( MergeHolds ); | 
        
          | 126 | }     | 130 | }     | 
  
    | Lines 263-269
          sub GetReservesFromBiblionumber {
      
      
        Link Here | 
        
          | 263 |                 itemnumber, | 267 |                 itemnumber, | 
        
          | 264 |                 reservenotes, | 268 |                 reservenotes, | 
        
          | 265 |                 expirationdate, | 269 |                 expirationdate, | 
          
            
              | 266 |                 lowestPriority | 270 |                 lowestPriority, | 
            
              |  |  | 271 |                 suspend, | 
            
              | 272 |                 suspend_until | 
        
          | 267 |         FROM     reserves | 273 |         FROM     reserves | 
        
          | 268 |         WHERE biblionumber = ? "; | 274 |         WHERE biblionumber = ? "; | 
        
          | 269 |     unless ( $all_dates ) { | 275 |     unless ( $all_dates ) { | 
  
    | Lines 873-878
          sub CancelExpiredReserves {
      
      
        Link Here | 
        
          | 873 |    | 879 |    | 
        
          | 874 | } | 880 | } | 
        
          | 875 |  | 881 |  | 
            
              |  |  | 882 | =head2 AutoUnsuspendReserves | 
            
              | 883 |  | 
            
              | 884 |   AutoUnsuspendReserves(); | 
            
              | 885 |  | 
            
              | 886 | Unsuspends all suspended reserves with a suspend_until date from before today. | 
            
              | 887 |  | 
            
              | 888 | =cut | 
            
              | 889 |  | 
            
              | 890 | sub AutoUnsuspendReserves { | 
            
              | 891 |  | 
            
              | 892 |     my $dbh = C4::Context->dbh; | 
            
              | 893 |      | 
            
              | 894 |     my $query = "UPDATE reserves SET suspend = 0, suspend_until = NULL WHERE DATE( suspend_until ) < DATE( CURDATE() )"; | 
            
              | 895 |     my $sth = $dbh->prepare( $query ); | 
            
              | 896 |     $sth->execute(); | 
            
              | 897 |  | 
            
              | 898 | } | 
            
              | 899 |  | 
        
          | 876 | =head2 CancelReserve | 900 | =head2 CancelReserve | 
        
          | 877 |  | 901 |  | 
        
          | 878 |   &CancelReserve($biblionumber, $itemnumber, $borrowernumber); | 902 |   &CancelReserve($biblionumber, $itemnumber, $borrowernumber); | 
  
    | Lines 1008-1014
          itemnumber and supplying itemnumber.
      
      
        Link Here | 
        
          | 1008 |  | 1032 |  | 
        
          | 1009 | sub ModReserve { | 1033 | sub ModReserve { | 
        
          | 1010 |     #subroutine to update a reserve | 1034 |     #subroutine to update a reserve | 
          
            
              | 1011 |     my ( $rank, $biblio, $borrower, $branch , $itemnumber) = @_; | 1035 |     my ( $rank, $biblio, $borrower, $branch , $itemnumber, $suspend_until) = @_; | 
        
          | 1012 |      return if $rank eq "W"; | 1036 |      return if $rank eq "W"; | 
        
          | 1013 |      return if $rank eq "n"; | 1037 |      return if $rank eq "n"; | 
        
          | 1014 |     my $dbh = C4::Context->dbh; | 1038 |     my $dbh = C4::Context->dbh; | 
  
    | Lines 1041-1054
          sub ModReserve {
      
      
        Link Here | 
        
          | 1041 |          | 1065 |          | 
        
          | 1042 |     } | 1066 |     } | 
        
          | 1043 |     elsif ($rank =~ /^\d+/ and $rank > 0) { | 1067 |     elsif ($rank =~ /^\d+/ and $rank > 0) { | 
          
            
              | 1044 |         my $query = qq/ | 1068 |         my $query = " | 
            
              | 1045 |         UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL | 1069 |             UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL | 
        
          | 1046 |             WHERE biblionumber   = ? | 1070 |             WHERE biblionumber   = ? | 
          
            
              | 1047 |              AND borrowernumber = ? | 1071 |             AND borrowernumber = ? | 
            
              | 1048 |         /; | 1072 |         "; | 
        
          | 1049 |         my $sth = $dbh->prepare($query); | 1073 |         my $sth = $dbh->prepare($query); | 
        
          | 1050 |         $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower); | 1074 |         $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower); | 
        
          | 1051 |         $sth->finish; | 1075 |         $sth->finish; | 
            
              |  |  | 1076 |  | 
            
              | 1077 |         if ( defined( $suspend_until ) ) { | 
            
              | 1078 |             if ( $suspend_until ) { | 
            
              | 1079 |                 $suspend_until = C4::Dates->new( $suspend_until )->output("iso"); | 
            
              | 1080 |                 warn "SUSPEND UNTIL: $suspend_until"; | 
            
              | 1081 |                 $dbh->do("UPDATE reserves SET suspend = 1, suspend_until = ? WHERE biblionumber = ? AND borrowernumber = ?", undef, ( $suspend_until, $biblio, $borrower ) );  | 
            
              | 1082 |             } else { | 
            
              | 1083 |                 $dbh->do("UPDATE reserves SET suspend_until = NULL WHERE biblionumber = ? AND borrowernumber = ?", undef, ( $biblio, $borrower ) );  | 
            
              | 1084 |             } | 
            
              | 1085 |         }         | 
            
              | 1086 |  | 
        
          | 1052 |         _FixPriority( $biblio, $borrower, $rank); | 1087 |         _FixPriority( $biblio, $borrower, $rank); | 
        
          | 1053 |     } | 1088 |     } | 
        
          | 1054 | } | 1089 | } | 
  
    | Lines 1455-1460
          sub ToggleLowestPriority {
      
      
        Link Here | 
        
          | 1455 |     _FixPriority( $biblionumber, $borrowernumber, '999999' ); | 1490 |     _FixPriority( $biblionumber, $borrowernumber, '999999' ); | 
        
          | 1456 | } | 1491 | } | 
        
          | 1457 |  | 1492 |  | 
            
              |  |  | 1493 | =head2 ToggleSuspend | 
            
              | 1494 |  | 
            
              | 1495 |   ToggleSuspend( $borrowernumber, $biblionumber ); | 
            
              | 1496 |  | 
            
              | 1497 | This function sets the suspend field to true if is false, and false if it is true. | 
            
              | 1498 | If the reserve is currently suspended with a suspend_until date, that date will | 
            
              | 1499 | be cleared when it is unsuspended. | 
            
              | 1500 |  | 
            
              | 1501 | =cut | 
            
              | 1502 |  | 
            
              | 1503 | sub ToggleSuspend { | 
            
              | 1504 |     my ( $borrowernumber, $biblionumber ) = @_; | 
            
              | 1505 |  | 
            
              | 1506 |     my $dbh = C4::Context->dbh; | 
            
              | 1507 |  | 
            
              | 1508 |     my $sth = $dbh->prepare( | 
            
              | 1509 |         "UPDATE reserves SET suspend = NOT suspend, | 
            
              | 1510 |         suspend_until = CASE WHEN suspend = 0 THEN NULL ELSE suspend_until END | 
            
              | 1511 |         WHERE biblionumber = ? | 
            
              | 1512 |         AND borrowernumber = ? | 
            
              | 1513 |     "); | 
            
              | 1514 |     $sth->execute( | 
            
              | 1515 |         $biblionumber, | 
            
              | 1516 |         $borrowernumber, | 
            
              | 1517 |     ); | 
            
              | 1518 |     $sth->finish; | 
            
              | 1519 | } | 
            
              | 1520 |  | 
            
              | 1521 | =head2 SuspendAll | 
            
              | 1522 |  | 
            
              | 1523 |   SuspendAll(  | 
            
              | 1524 |       borrowernumber   => $borrowernumber, | 
            
              | 1525 |       [ biblionumber   => $biblionumber, ] | 
            
              | 1526 |       [ suspend_until  => $suspend_until, ] | 
            
              | 1527 |       [ suspend        => $suspend ] | 
            
              | 1528 |   ); | 
            
              | 1529 |  | 
            
              | 1530 |   This function accepts a set of hash keys as its parameters. | 
            
              | 1531 |   It requires either borrowernumber or biblionumber, or both. | 
            
              | 1532 |    | 
            
              | 1533 |   suspend_until is wholly optional. | 
            
              | 1534 |    | 
            
              | 1535 | =cut | 
            
              | 1536 |  | 
            
              | 1537 | sub SuspendAll { | 
            
              | 1538 |     my %params = @_; | 
            
              | 1539 |  | 
            
              | 1540 |     my $borrowernumber = $params{'borrowernumber'} || undef; | 
            
              | 1541 |     my $biblionumber   = $params{'biblionumber'}   || undef; | 
            
              | 1542 |     my $suspend_until  = $params{'suspend_until'}  || undef; | 
            
              | 1543 |     my $suspend        = defined( $params{'suspend'} ) ? $params{'suspend'} :  1; | 
            
              | 1544 |      | 
            
              | 1545 |     warn "C4::Reserves::SuspendAll( borrowernumber => $borrowernumber, biblionumber => $biblionumber, suspend_until => $suspend_until, suspend => $suspend )"; | 
            
              | 1546 |      | 
            
              | 1547 |     $suspend_until = C4::Dates->new( $suspend_until )->output("iso") if ( defined( $suspend_until ) ); | 
            
              | 1548 |  | 
            
              | 1549 |     return unless ( $borrowernumber || $biblionumber ); | 
            
              | 1550 |  | 
            
              | 1551 |     my ( $query, $sth, $dbh, @query_params ); | 
            
              | 1552 |  | 
            
              | 1553 |     $query = "UPDATE reserves SET suspend = ? "; | 
            
              | 1554 |     push( @query_params, $suspend ); | 
            
              | 1555 |     if ( !$suspend ) { | 
            
              | 1556 |         $query .= ", suspend_until = NULL "; | 
            
              | 1557 |     } elsif ( $suspend_until ) { | 
            
              | 1558 |         $query .= ", suspend_until = ? "; | 
            
              | 1559 |         push( @query_params, $suspend_until ); | 
            
              | 1560 |     } | 
            
              | 1561 |     $query .= " WHERE "; | 
            
              | 1562 |     if ( $borrowernumber ) { | 
            
              | 1563 |         $query .= " borrowernumber = ? "; | 
            
              | 1564 |         push( @query_params, $borrowernumber ); | 
            
              | 1565 |     } | 
            
              | 1566 |     $query .= " AND " if ( $borrowernumber && $biblionumber ); | 
            
              | 1567 |     if ( $biblionumber ) { | 
            
              | 1568 |         $query .= " biblionumber = ? "; | 
            
              | 1569 |         push( @query_params, $biblionumber ); | 
            
              | 1570 |     } | 
            
              | 1571 |     $query .= " AND found IS NULL "; | 
            
              | 1572 |  | 
            
              | 1573 |     $dbh = C4::Context->dbh; | 
            
              | 1574 |     $sth = $dbh->prepare( $query ); | 
            
              | 1575 |     $sth->execute( @query_params ); | 
            
              | 1576 |     $sth->finish; | 
            
              | 1577 | } | 
            
              | 1578 |  | 
            
              | 1579 |  | 
        
          | 1458 | =head2 _FixPriority | 1580 | =head2 _FixPriority | 
        
          | 1459 |  | 1581 |  | 
        
          | 1460 |   &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank); | 1582 |   &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank); | 
  
    | Lines 1599-1604
          sub _Findgroupreserve {
      
      
        Link Here | 
        
          | 1599 |         AND item_level_request = 1 | 1721 |         AND item_level_request = 1 | 
        
          | 1600 |         AND itemnumber = ? | 1722 |         AND itemnumber = ? | 
        
          | 1601 |         AND reservedate <= CURRENT_DATE() | 1723 |         AND reservedate <= CURRENT_DATE() | 
            
              |  |  | 1724 |         AND suspend = 0 | 
        
          | 1602 |     /; | 1725 |     /; | 
        
          | 1603 |     my $sth = $dbh->prepare($item_level_target_query); | 1726 |     my $sth = $dbh->prepare($item_level_target_query); | 
        
          | 1604 |     $sth->execute($itemnumber); | 1727 |     $sth->execute($itemnumber); | 
  
    | Lines 1629-1634
          sub _Findgroupreserve {
      
      
        Link Here | 
        
          | 1629 |         AND item_level_request = 0 | 1752 |         AND item_level_request = 0 | 
        
          | 1630 |         AND hold_fill_targets.itemnumber = ? | 1753 |         AND hold_fill_targets.itemnumber = ? | 
        
          | 1631 |         AND reservedate <= CURRENT_DATE() | 1754 |         AND reservedate <= CURRENT_DATE() | 
            
              |  |  | 1755 |         AND suspend = 0 | 
        
          | 1632 |     /; | 1756 |     /; | 
        
          | 1633 |     $sth = $dbh->prepare($title_level_target_query); | 1757 |     $sth = $dbh->prepare($title_level_target_query); | 
        
          | 1634 |     $sth->execute($itemnumber); | 1758 |     $sth->execute($itemnumber); | 
  
    | Lines 1660-1665
          sub _Findgroupreserve {
      
      
        Link Here | 
        
          | 1660 |           OR  reserves.constrainttype='a' ) | 1784 |           OR  reserves.constrainttype='a' ) | 
        
          | 1661 |           AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?) | 1785 |           AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?) | 
        
          | 1662 |           AND reserves.reservedate <= CURRENT_DATE() | 1786 |           AND reserves.reservedate <= CURRENT_DATE() | 
            
              |  |  | 1787 |           AND suspend = 0 | 
        
          | 1663 |     /; | 1788 |     /; | 
        
          | 1664 |     $sth = $dbh->prepare($query); | 1789 |     $sth = $dbh->prepare($query); | 
        
          | 1665 |     $sth->execute( $biblio, $bibitem, $itemnumber ); | 1790 |     $sth->execute( $biblio, $bibitem, $itemnumber ); |