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

(-)a/C4/Circulation.pm (-37 / +5 lines)
Lines 319-325 sub transferbook { Link Here
319
319
320
    # find reserves.....
320
    # find reserves.....
321
    # That'll save a database query.
321
    # That'll save a database query.
322
    my ( $resfound, $resrec ) =
322
    my ( $resfound, $resrec, undef ) =
323
      CheckReserves( $itemnumber );
323
      CheckReserves( $itemnumber );
324
    if ( $resfound and not $ignoreRs ) {
324
    if ( $resfound and not $ignoreRs ) {
325
        $resrec->{'ResFound'} = $resfound;
325
        $resrec->{'ResFound'} = $resfound;
Lines 869-875 sub CanBookBeIssued { Link Here
869
    }
869
    }
870
870
871
    # See if the item is on reserve.
871
    # See if the item is on reserve.
872
    my ( $restype, $res ) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
872
    my ( $restype, $res, undef ) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
873
    if ($restype) {
873
    if ($restype) {
874
		my $resbor = $res->{'borrowernumber'};
874
		my $resbor = $res->{'borrowernumber'};
875
		my ( $resborrower ) = C4::Members::GetMemberDetails( $resbor, 0 );
875
		my ( $resborrower ) = C4::Members::GetMemberDetails( $resbor, 0 );
Lines 983-1021 sub AddIssue { Link Here
983
				);
983
				);
984
			}
984
			}
985
985
986
			# See if the item is on reserve.
986
            MoveReserve( $item->{'itemnumber'}, $borrower->{'borrowernumber'}, $cancelreserve );
987
			my ( $restype, $res ) =
988
			  C4::Reserves::CheckReserves( $item->{'itemnumber'} );
989
			if ($restype) {
990
				my $resbor = $res->{'borrowernumber'};
991
				if ( $resbor eq $borrower->{'borrowernumber'} ) {
992
					# The item is reserved by the current patron
993
					ModReserveFill($res);
994
				}
995
				elsif ( $restype eq "Waiting" ) {
996
					# warn "Waiting";
997
					# The item is on reserve and waiting, but has been
998
					# reserved by some other patron.
999
				}
1000
				elsif ( $restype eq "Reserved" ) {
1001
					# warn "Reserved";
1002
					# The item is reserved by someone else.
1003
					if ($cancelreserve) { # cancel reserves on this item
1004
						CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
1005
					}
1006
				}
1007
				if ($cancelreserve) {
1008
					CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
1009
				}
1010
				else {
1011
					# set waiting reserve to first in reserve queue as book isn't waiting now
1012
					ModReserve(1,
1013
						$res->{'biblionumber'},
1014
						$res->{'borrowernumber'},
1015
						$res->{'branchcode'}
1016
					);
1017
				}
1018
			}
1019
987
1020
			# Starting process for transfer job (checking transfert and validate it if we have one)
988
			# Starting process for transfer job (checking transfert and validate it if we have one)
1021
            my ($datesent) = GetTransfers($item->{'itemnumber'});
989
            my ($datesent) = GetTransfers($item->{'itemnumber'});
Lines 1636-1642 sub AddReturn { Link Here
1636
1604
1637
    # find reserves.....
1605
    # find reserves.....
1638
    # if we don't have a reserve with the status W, we launch the Checkreserves routine
1606
    # if we don't have a reserve with the status W, we launch the Checkreserves routine
1639
    my ($resfound, $resrec) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
1607
    my ($resfound, $resrec, undef) = C4::Reserves::CheckReserves( $item->{'itemnumber'} );
1640
    if ($resfound) {
1608
    if ($resfound) {
1641
          $resrec->{'ResFound'} = $resfound;
1609
          $resrec->{'ResFound'} = $resfound;
1642
        $messages->{'ResFound'} = $resrec;
1610
        $messages->{'ResFound'} = $resrec;
Lines 2199-2205 sub CanBookBeRenewed { Link Here
2199
			$error="too_many";
2167
			$error="too_many";
2200
		}
2168
		}
2201
		
2169
		
2202
        my ( $resfound, $resrec ) = C4::Reserves::CheckReserves($itemnumber);
2170
        my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves($itemnumber);
2203
        if ($resfound) {
2171
        if ($resfound) {
2204
            $renewokay = 0;
2172
            $renewokay = 0;
2205
			$error="on_reserve"
2173
			$error="on_reserve"
(-)a/C4/Items.pm (-1 / +1 lines)
Lines 1221-1227 sub GetItemsInfo { Link Here
1221
			$serial = 1;
1221
			$serial = 1;
1222
        }
1222
        }
1223
		if ( $datedue eq '' ) {
1223
		if ( $datedue eq '' ) {
1224
            my ( $restype, $reserves ) =
1224
            my ( $restype, $reserves, undef ) =
1225
              C4::Reserves::CheckReserves( $data->{'itemnumber'} );
1225
              C4::Reserves::CheckReserves( $data->{'itemnumber'} );
1226
# Previous conditional check with if ($restype) is not needed because a true
1226
# Previous conditional check with if ($restype) is not needed because a true
1227
# result for one item will result in subsequent items defaulting to this true
1227
# result for one item will result in subsequent items defaulting to this true
(-)a/C4/Reserves.pm (-10 / +57 lines)
Lines 110-115 BEGIN { Link Here
110
        &ModReserveStatus
110
        &ModReserveStatus
111
        &ModReserveCancelAll
111
        &ModReserveCancelAll
112
        &ModReserveMinusPriority
112
        &ModReserveMinusPriority
113
        &MoveReserve
113
        
114
        
114
        &CheckReserves
115
        &CheckReserves
115
        &CanBookBeReserved
116
        &CanBookBeReserved
Lines 526-532 sub GetOtherReserves { Link Here
526
    my ($itemnumber) = @_;
527
    my ($itemnumber) = @_;
527
    my $messages;
528
    my $messages;
528
    my $nextreservinfo;
529
    my $nextreservinfo;
529
    my ( $restype, $checkreserves ) = CheckReserves($itemnumber);
530
    my ( undef, $checkreserves, undef ) = CheckReserves($itemnumber);
530
    if ($checkreserves) {
531
    if ($checkreserves) {
531
        my $iteminfo = GetItem($itemnumber);
532
        my $iteminfo = GetItem($itemnumber);
532
        if ( $iteminfo->{'holdingbranch'} ne $checkreserves->{'branchcode'} ) {
533
        if ( $iteminfo->{'holdingbranch'} ne $checkreserves->{'branchcode'} ) {
Lines 741-748 sub GetReserveStatus { Link Here
741
742
742
=head2 CheckReserves
743
=head2 CheckReserves
743
744
744
  ($status, $reserve) = &CheckReserves($itemnumber);
745
  ($status, $reserve, $all_reserves) = &CheckReserves($itemnumber);
745
  ($status, $reserve) = &CheckReserves(undef, $barcode);
746
  ($status, $reserve, $all_reserves) = &CheckReserves(undef, $barcode);
746
747
747
Find a book in the reserves.
748
Find a book in the reserves.
748
749
Lines 807-817 sub CheckReserves { Link Here
807
    # note: we get the itemnumber because we might have started w/ just the barcode.  Now we know for sure we have it.
808
    # note: we get the itemnumber because we might have started w/ just the barcode.  Now we know for sure we have it.
808
    my ( $biblio, $bibitem, $notforloan_per_itemtype, $notforloan_per_item, $itemnumber ) = $sth->fetchrow_array;
809
    my ( $biblio, $bibitem, $notforloan_per_itemtype, $notforloan_per_item, $itemnumber ) = $sth->fetchrow_array;
809
810
810
    return ( 0, 0 ) unless $itemnumber; # bail if we got nothing.
811
    return ( '' ) unless $itemnumber; # bail if we got nothing.
811
812
812
    # if item is not for loan it cannot be reserved either.....
813
    # if item is not for loan it cannot be reserved either.....
813
    #    execpt where items.notforloan < 0 :  This indicates the item is holdable. 
814
    #    execpt where items.notforloan < 0 :  This indicates the item is holdable. 
814
    return ( 0, 0 ) if  ( $notforloan_per_item > 0 ) or $notforloan_per_itemtype;
815
    return ( '' ) if  ( $notforloan_per_item > 0 ) or $notforloan_per_itemtype;
815
816
816
    # Find this item in the reserves
817
    # Find this item in the reserves
817
    my @reserves = _Findgroupreserve( $bibitem, $biblio, $itemnumber );
818
    my @reserves = _Findgroupreserve( $bibitem, $biblio, $itemnumber );
Lines 825-831 sub CheckReserves { Link Here
825
        my $priority = 10000000;
826
        my $priority = 10000000;
826
        foreach my $res (@reserves) {
827
        foreach my $res (@reserves) {
827
            if ( $res->{'itemnumber'} == $itemnumber && $res->{'priority'} == 0) {
828
            if ( $res->{'itemnumber'} == $itemnumber && $res->{'priority'} == 0) {
828
                return ( "Waiting", $res ); # Found it
829
                return ( "Waiting", $res, \@reserves ); # Found it
829
            } else {
830
            } else {
830
                # See if this item is more important than what we've got so far
831
                # See if this item is more important than what we've got so far
831
                if ( $res->{'priority'} && $res->{'priority'} < $priority ) {
832
                if ( $res->{'priority'} && $res->{'priority'} < $priority ) {
Lines 846-856 sub CheckReserves { Link Here
846
    # We return the most important (i.e. next) reservation.
847
    # We return the most important (i.e. next) reservation.
847
    if ($highest) {
848
    if ($highest) {
848
        $highest->{'itemnumber'} = $item;
849
        $highest->{'itemnumber'} = $item;
849
        return ( "Reserved", $highest );
850
        return ( "Reserved", $highest, \@reserves );
850
    }
851
    else {
852
        return ( 0, 0 );
853
    }
851
    }
852
853
    return ( '' );
854
}
854
}
855
855
856
=head2 CancelExpiredReserves
856
=head2 CancelExpiredReserves
Lines 1819-1824 sub _ShiftPriorityByDateAndPriority { Link Here
1819
    return $new_priority;  # so the caller knows what priority they wind up receiving
1819
    return $new_priority;  # so the caller knows what priority they wind up receiving
1820
}
1820
}
1821
1821
1822
=head2 MoveReserve
1823
1824
  MoveReserve( $itemnumber, $borrowernumber, $cancelreserve )
1825
1826
Use when checking out an item to handle reserves
1827
If $cancelreserve boolean is set to true, it will remove existing reserve
1828
1829
=cut
1830
1831
sub MoveReserve {
1832
    my ( $itemnumber, $borrowernumber, $cancelreserve ) = @_;
1833
1834
    my ( $restype, $res, $all_reserves ) = CheckReserves( $itemnumber );
1835
    return unless $res;
1836
1837
    my $biblionumber     =  $res->{biblionumber};
1838
    my $biblioitemnumber = $res->{biblioitemnumber};
1839
1840
    if ($res->{borrowernumber} == $borrowernumber) {
1841
        ModReserveFill($res);
1842
    }
1843
    else {
1844
        # warn "Reserved";
1845
        # The item is reserved by someone else.
1846
        # Find this item in the reserves
1847
1848
        my $borr_res;
1849
        foreach (@$all_reserves) {
1850
            $_->{'borrowernumber'} == $borrowernumber or next;
1851
            $_->{'biblionumber'}   == $biblionumber   or next;
1852
1853
            $borr_res = $_;
1854
            last;
1855
        }
1856
        
1857
        if ( $borr_res ) {
1858
            # The item is reserved by the current patron
1859
            ModReserveFill($borr_res);
1860
        }
1861
1862
        if ($cancelreserve) { # cancel reserves on this item
1863
            CancelReserve(0, $res->{'itemnumber'}, $res->{'borrowernumber'});
1864
            CancelReserve($res->{'biblionumber'}, 0, $res->{'borrowernumber'});
1865
        }
1866
    }
1867
}
1868
1822
=head2 MergeHolds
1869
=head2 MergeHolds
1823
1870
1824
  MergeHolds($dbh,$to_biblio, $from_biblio);
1871
  MergeHolds($dbh,$to_biblio, $from_biblio);
(-)a/C4/Search.pm (-2 / +2 lines)
Lines 1673-1679 sub searchResults { Link Here
1673
                my ($transfertfrom, $transfertto);
1673
                my ($transfertfrom, $transfertto);
1674
1674
1675
                # is item on the reserve shelf?
1675
                # is item on the reserve shelf?
1676
		my $reservestatus = 0;
1676
		my $reservestatus = '';
1677
		my $reserveitem;
1677
		my $reserveitem;
1678
1678
1679
                unless ($item->{wthdrawn}
1679
                unless ($item->{wthdrawn}
Lines 1695-1701 sub searchResults { Link Here
1695
                    #        should map transit status to record indexed in Zebra.
1695
                    #        should map transit status to record indexed in Zebra.
1696
                    #
1696
                    #
1697
                    ($transfertwhen, $transfertfrom, $transfertto) = C4::Circulation::GetTransfers($item->{itemnumber});
1697
                    ($transfertwhen, $transfertfrom, $transfertto) = C4::Circulation::GetTransfers($item->{itemnumber});
1698
		    ($reservestatus, $reserveitem) = C4::Reserves::CheckReserves($item->{itemnumber});
1698
		    ($reservestatus, $reserveitem, undef) = C4::Reserves::CheckReserves($item->{itemnumber});
1699
                }
1699
                }
1700
1700
1701
                # item is withdrawn, lost, damaged, not for loan, reserved or in transit
1701
                # item is withdrawn, lost, damaged, not for loan, reserved or in transit
(-)a/C4/XSLT.pm (-1 / +1 lines)
Lines 190-196 sub buildKohaItemsNamespace { Link Here
190
190
191
        my ( $transfertwhen, $transfertfrom, $transfertto ) = C4::Circulation::GetTransfers($item->{itemnumber});
191
        my ( $transfertwhen, $transfertfrom, $transfertto ) = C4::Circulation::GetTransfers($item->{itemnumber});
192
192
193
	my ( $reservestatus, $reserveitem ) = C4::Reserves::CheckReserves($item->{itemnumber});
193
	my ( $reservestatus, $reserveitem, undef ) = C4::Reserves::CheckReserves($item->{itemnumber});
194
194
195
        if ( $itemtypes->{ $item->{itype} }->{notforloan} || $item->{notforloan} || $item->{onloan} || $item->{wthdrawn} || $item->{itemlost} || $item->{damaged} || 
195
        if ( $itemtypes->{ $item->{itype} }->{notforloan} || $item->{notforloan} || $item->{onloan} || $item->{wthdrawn} || $item->{itemlost} || $item->{damaged} || 
196
             (defined $transfertwhen && $transfertwhen ne '') || $item->{itemnotforloan} || (defined $reservestatus && $reservestatus eq "Waiting") ){ 
196
             (defined $transfertwhen && $transfertwhen ne '') || $item->{itemnotforloan} || (defined $reservestatus && $reservestatus eq "Waiting") ){ 
(-)a/circ/circulation.pl (-1 / +1 lines)
Lines 430-436 sub build_issue_data { Link Here
430
            $it->{'borrowernumber'},$it->{'itemnumber'}
430
            $it->{'borrowernumber'},$it->{'itemnumber'}
431
        );
431
        );
432
        $it->{"renew_error_${can_renew_error}"} = 1 if defined $can_renew_error;
432
        $it->{"renew_error_${can_renew_error}"} = 1 if defined $can_renew_error;
433
        my ( $restype, $reserves ) = CheckReserves( $it->{'itemnumber'} );
433
        my ( $restype, $reserves, undef ) = CheckReserves( $it->{'itemnumber'} );
434
        $it->{'can_renew'} = $can_renew;
434
        $it->{'can_renew'} = $can_renew;
435
        $it->{'can_confirm'} = !$can_renew && !$restype;
435
        $it->{'can_confirm'} = !$can_renew && !$restype;
436
        $it->{'renew_error'} = $restype;
436
        $it->{'renew_error'} = $restype;
(-)a/opac/opac-user.pl (-1 / +1 lines)
Lines 118-124 my $canrenew = 0; Link Here
118
if ($issues){
118
if ($issues){
119
	foreach my $issue ( sort { $b->{'date_due'} cmp $a->{'date_due'} } @$issues ) {
119
	foreach my $issue ( sort { $b->{'date_due'} cmp $a->{'date_due'} } @$issues ) {
120
		# check for reserves
120
		# check for reserves
121
		my ( $restype, $res ) = CheckReserves( $issue->{'itemnumber'} );
121
		my ( $restype, $res, undef ) = CheckReserves( $issue->{'itemnumber'} );
122
		if ( $restype ) {
122
		if ( $restype ) {
123
			$issue->{'reserved'} = 1;
123
			$issue->{'reserved'} = 1;
124
		}
124
		}
(-)a/t/db_dependent/Reserves.t (-3 / +3 lines)
Lines 51-62 AddReserve($branch, $borrowernumber, $biblionumber, Link Here
51
        $constraint, $bibitems,  $priority,       $notes,
51
        $constraint, $bibitems,  $priority,       $notes,
52
        $title,      $checkitem, $found);
52
        $title,      $checkitem, $found);
53
        
53
        
54
my ($status, $reserve) = CheckReserves($itemnumber, $barcode);
54
my ($status, $reserve, $all_reserves) = CheckReserves($itemnumber, $barcode);
55
ok($status eq "Reserved", "CheckReserves Test 1");
55
ok($status eq "Reserved", "CheckReserves Test 1");
56
56
57
($status, $reserve) = CheckReserves($itemnumber);
57
($status, $reserve, $all_reserves) = CheckReserves($itemnumber);
58
ok($status eq "Reserved", "CheckReserves Test 2");
58
ok($status eq "Reserved", "CheckReserves Test 2");
59
59
60
($status, $reserve) = CheckReserves(undef, $barcode);
60
($status, $reserve, $all_reserves) = CheckReserves(undef, $barcode);
61
ok($status eq "Reserved", "CheckReserves Test 3");
61
ok($status eq "Reserved", "CheckReserves Test 3");
62
62
(-)a/t/db_dependent/lib/KohaTest/Reserves.pm (-1 / +1 lines)
Lines 29-34 sub methods : Test( 1 ) { Link Here
29
                       ModReserveAffect 
29
                       ModReserveAffect 
30
                       ModReserveCancelAll 
30
                       ModReserveCancelAll 
31
                       ModReserveMinusPriority 
31
                       ModReserveMinusPriority 
32
                       MoveReserve
32
                       GetReserveInfo 
33
                       GetReserveInfo 
33
                       _FixPriority 
34
                       _FixPriority 
34
                       _Findgroupreserve 
35
                       _Findgroupreserve 
35
- 

Return to bug 2830