X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=C4%2FReserves.pm;h=78f5ca39f285d0071b9c1555090dbc9740e76c5a;hb=3cf0caf05ca9577a26bb76d4910d8be8970aa06a;hp=c078af1088bd66e422b0c5db8a3a46c348117814;hpb=844cf7a748c2b4f567bec2e5088665a9edf94468;p=koha.git diff --git a/C4/Reserves.pm b/C4/Reserves.pm index c078af1088..78f5ca39f2 100644 --- a/C4/Reserves.pm +++ b/C4/Reserves.pm @@ -36,6 +36,7 @@ use C4::Members qw(); use C4::Letters; use C4::Log; +use Koha::Biblios; use Koha::DateUtils; use Koha::Calendar; use Koha::Database; @@ -103,14 +104,7 @@ BEGIN { @EXPORT = qw( &AddReserve - &GetReserve - &GetReservesFromItemnumber - &GetReservesFromBiblionumber - &GetReservesFromBorrowernumber &GetReservesForBranch - &GetReservesToBranch - &GetReserveCount - &GetReserveInfo &GetReserveStatus &GetOtherReserves @@ -127,7 +121,6 @@ BEGIN { &CanBookBeReserved &CanItemBeReserved &CanReserveBeCanceledFromOpac - &CancelReserve &CancelExpiredReserves &AutoUnsuspendReserves @@ -165,6 +158,7 @@ The following tables are available witin the HOLDPLACED message: biblio biblioitems items + reserves =cut @@ -219,29 +213,33 @@ sub AddReserve { my $reserve_id = $hold->id(); # add a reserve fee if needed - my $fee = GetReserveFee( $borrowernumber, $biblionumber ); - ChargeReserveFee( $borrowernumber, $fee, $title ); + if ( C4::Context->preference('HoldFeeMode') ne 'any_time_is_collected' ) { + my $reserve_fee = GetReserveFee( $borrowernumber, $biblionumber ); + ChargeReserveFee( $borrowernumber, $reserve_fee, $title ); + } _FixPriority({ biblionumber => $biblionumber}); # Send e-mail to librarian if syspref is active if(C4::Context->preference("emailLibrarianWhenHoldIsPlaced")){ - my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber); - my $library = Koha::Libraries->find($borrower->{branchcode})->unblessed; + my $patron = Koha::Patrons->find( $borrowernumber ); + my $library = $patron->library; if ( my $letter = C4::Letters::GetPreparedLetter ( module => 'reserves', letter_code => 'HOLDPLACED', branchcode => $branch, + lang => $patron->lang, tables => { - 'branches' => $library, - 'borrowers' => $borrower, + 'branches' => $library->unblessed, + 'borrowers' => $patron->unblessed, 'biblio' => $biblionumber, 'biblioitems' => $biblionumber, 'items' => $checkitem, + 'reserves' => $hold->unblessed, }, ) ) { - my $admin_email_address = $library->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress'); + my $admin_email_address = $library->branchemail || C4::Context->preference('KohaAdminEmailAddress'); C4::Letters::EnqueueLetter( { letter => $letter, @@ -257,165 +255,6 @@ sub AddReserve { return $reserve_id; } -=head2 GetReserve - - $res = GetReserve( $reserve_id ); - - Return the current reserve. - -=cut - -sub GetReserve { - my ($reserve_id) = @_; - - my $dbh = C4::Context->dbh; - - my $query = "SELECT * FROM reserves WHERE reserve_id = ?"; - my $sth = $dbh->prepare( $query ); - $sth->execute( $reserve_id ); - return $sth->fetchrow_hashref(); -} - -=head2 GetReservesFromBiblionumber - - my $reserves = GetReservesFromBiblionumber({ - biblionumber => $biblionumber, - [ itemnumber => $itemnumber, ] - [ all_dates => 1|0 ] - }); - -This function gets the list of reservations for one C<$biblionumber>, -returning an arrayref pointing to the reserves for C<$biblionumber>. - -By default, only reserves whose start date falls before the current -time are returned. To return all reserves, including future ones, -the C parameter can be included and set to a true value. - -If the C parameter is supplied, reserves must be targeted -to that item or not targeted to any item at all; otherwise, they -are excluded from the list. - -=cut - -sub GetReservesFromBiblionumber { - my ( $params ) = @_; - my $biblionumber = $params->{biblionumber} or return []; - my $itemnumber = $params->{itemnumber}; - my $all_dates = $params->{all_dates} // 0; - my $dbh = C4::Context->dbh; - - # Find the desired items in the reserves - my @params; - my $query = " - SELECT reserve_id, - branchcode, - timestamp AS rtimestamp, - priority, - biblionumber, - borrowernumber, - reservedate, - found, - itemnumber, - reservenotes, - expirationdate, - lowestPriority, - suspend, - suspend_until, - itemtype - FROM reserves - WHERE biblionumber = ? "; - push( @params, $biblionumber ); - unless ( $all_dates ) { - $query .= " AND reservedate <= CAST(NOW() AS DATE) "; - } - if ( $itemnumber ) { - $query .= " AND ( itemnumber IS NULL OR itemnumber = ? )"; - push( @params, $itemnumber ); - } - $query .= "ORDER BY priority"; - my $sth = $dbh->prepare($query); - $sth->execute( @params ); - my @results; - while ( my $data = $sth->fetchrow_hashref ) { - push @results, $data; - } - return \@results; -} - -=head2 GetReservesFromItemnumber - - ( $reservedate, $borrowernumber, $branchcode, $reserve_id, $waitingdate ) = GetReservesFromItemnumber($itemnumber); - -Get the first reserve for a specific item number (based on priority). Returns the abovementioned values for that reserve. - -The routine does not look at future reserves (read: item level holds), but DOES include future waits (a confirmed future hold). - -=cut - -sub GetReservesFromItemnumber { - my ($itemnumber) = @_; - - my $schema = Koha::Database->new()->schema(); - - my $r = $schema->resultset('Reserve')->search( - { - itemnumber => $itemnumber, - suspend => 0, - -or => [ - reservedate => \'<= CAST( NOW() AS DATE )', - waitingdate => { '!=', undef } - ] - }, - { - order_by => 'priority', - } - )->first(); - - return unless $r; - - return ( - $r->reservedate(), - $r->get_column('borrowernumber'), - $r->get_column('branchcode'), - $r->reserve_id(), - $r->waitingdate(), - ); -} - -=head2 GetReservesFromBorrowernumber - - $borrowerreserv = GetReservesFromBorrowernumber($borrowernumber,$tatus); - -TODO :: Descritpion - -=cut - -sub GetReservesFromBorrowernumber { - my ( $borrowernumber, $status ) = @_; - my $dbh = C4::Context->dbh; - my $sth; - if ($status) { - $sth = $dbh->prepare(" - SELECT * - FROM reserves - WHERE borrowernumber=? - AND found =? - ORDER BY reservedate - "); - $sth->execute($borrowernumber,$status); - } else { - $sth = $dbh->prepare(" - SELECT * - FROM reserves - WHERE borrowernumber=? - ORDER BY reservedate - "); - $sth->execute($borrowernumber); - } - my $data = $sth->fetchall_arrayref({}); - return @$data; -} - =head2 CanBookBeReserved $canReserve = &CanBookBeReserved($borrowernumber, $biblionumber) @@ -468,8 +307,9 @@ sub CanItemBeReserved { # we retrieve borrowers and items informations # # item->{itype} will come for biblioitems if necessery my $item = GetItem($itemnumber); - my $biblioData = C4::Biblio::GetBiblioData( $item->{biblionumber} ); - my $borrower = C4::Members::GetMember( 'borrowernumber' => $borrowernumber ); + my $biblio = Koha::Biblios->find( $item->{biblionumber} ); + my $patron = Koha::Patrons->find( $borrowernumber ); + my $borrower = $patron->unblessed; # If an item is damaged and we don't allow holds on damaged items, we can stop right here return 'damaged' @@ -478,7 +318,7 @@ sub CanItemBeReserved { # Check for the age restriction my ( $ageRestriction, $daysToAgeRestriction ) = - C4::Circulation::GetAgeRestriction( $biblioData->{agerestriction}, $borrower ); + C4::Circulation::GetAgeRestriction( $biblio->biblioitem->agerestriction, $borrower ); return 'ageRestricted' if $daysToAgeRestriction && $daysToAgeRestriction > 0; # Check that the patron doesn't have an item level hold on this item already @@ -581,7 +421,7 @@ sub CanItemBeReserved { if ( C4::Context->preference('IndependentBranches') and !C4::Context->preference('canreservefromotherbranches') ) { - my $itembranch = $item->{homebranch}; + my $itembranch = $item->homebranch; if ( $itembranch ne $borrower->{branchcode} ) { return 'cannotReserveFromOtherBranches'; } @@ -604,39 +444,15 @@ sub CanReserveBeCanceledFromOpac { my ($reserve_id, $borrowernumber) = @_; return unless $reserve_id and $borrowernumber; - my $reserve = GetReserve($reserve_id); + my $reserve = Koha::Holds->find($reserve_id); - return 0 unless $reserve->{borrowernumber} == $borrowernumber; - return 0 if ( $reserve->{found} eq 'W' ) or ( $reserve->{found} eq 'T' ); + return 0 unless $reserve->borrowernumber == $borrowernumber; + return 0 if ( $reserve->found eq 'W' ) or ( $reserve->found eq 'T' ); return 1; } -=head2 GetReserveCount - - $number = &GetReserveCount($borrowernumber); - -this function returns the number of reservation for a borrower given on input arg. - -=cut - -sub GetReserveCount { - my ($borrowernumber) = @_; - - my $dbh = C4::Context->dbh; - - my $query = " - SELECT COUNT(*) AS counter - FROM reserves - WHERE borrowernumber = ? - "; - my $sth = $dbh->prepare($query); - $sth->execute($borrowernumber); - my $row = $sth->fetchrow_hashref; - return $row->{counter}; -} - =head2 GetOtherReserves ($messages,$nextreservinfo)=$GetOtherReserves(itemnumber); @@ -729,7 +545,7 @@ SELECT COUNT(*) FROM reserves WHERE biblionumber=? AND borrowernumber<>? my $dbh = C4::Context->dbh; my ( $fee ) = $dbh->selectrow_array( $borquery, undef, ($borrowernumber) ); my $hold_fee_mode = C4::Context->preference('HoldFeeMode') || 'not_always'; - if( $fee and $fee > 0 and $hold_fee_mode ne 'always' ) { + if( $fee and $fee > 0 and $hold_fee_mode eq 'not_always' ) { # This is a reconstruction of the old code: # Compare number of items with items issued, and optionally check holds # If not all items are issued and there are no holds: charge no fee @@ -746,33 +562,6 @@ SELECT COUNT(*) FROM reserves WHERE biblionumber=? AND borrowernumber<>? return $fee; } -=head2 GetReservesToBranch - - @transreserv = GetReservesToBranch( $frombranch ); - -Get reserve list for a given branch - -=cut - -sub GetReservesToBranch { - my ( $frombranch ) = @_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( - "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp - FROM reserves - WHERE priority='0' - AND branchcode=?" - ); - $sth->execute( $frombranch ); - my @transreserv; - my $i = 0; - while ( my $data = $sth->fetchrow_hashref ) { - $transreserv[$i] = $data; - $i++; - } - return (@transreserv); -} - =head2 GetReservesForBranch @transreserv = GetReservesForBranch($frombranch); @@ -784,7 +573,7 @@ sub GetReservesForBranch { my $dbh = C4::Context->dbh; my $query = " - SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate + SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate, expirationdate FROM reserves WHERE priority='0' AND found='W' @@ -943,14 +732,18 @@ sub CheckReserves { my $priority = 10000000; foreach my $res (@reserves) { if ( $res->{'itemnumber'} == $itemnumber && $res->{'priority'} == 0) { - return ( "Waiting", $res, \@reserves ); # Found it + if ($res->{'found'} eq 'W') { + return ( "Waiting", $res, \@reserves ); # Found it, it is waiting + } else { + return ( "Reserved", $res, \@reserves ); # Found determinated hold, e. g. the tranferred one + } } else { - my $borrowerinfo; + my $patron; my $iteminfo; my $local_hold_match; if ($LocalHoldsPriority) { - $borrowerinfo = C4::Members::GetMember( borrowernumber => $res->{'borrowernumber'} ); + $patron = Koha::Patrons->find( $res->{borrowernumber} ); $iteminfo = C4::Items::GetItem($itemnumber); my $local_holds_priority_item_branchcode = @@ -959,7 +752,7 @@ sub CheckReserves { ( $LocalHoldsPriorityPatronControl eq 'PickupLibrary' ) ? $res->{branchcode} : ( $LocalHoldsPriorityPatronControl eq 'HomeLibrary' ) - ? $borrowerinfo->{branchcode} + ? $patron->branchcode : undef; $local_hold_match = $local_holds_priority_item_branchcode eq @@ -970,11 +763,11 @@ sub CheckReserves { if ( ( $res->{'priority'} && $res->{'priority'} < $priority ) || $local_hold_match ) { $iteminfo ||= C4::Items::GetItem($itemnumber); next if $res->{itemtype} && $res->{itemtype} ne _get_itype( $iteminfo ); - $borrowerinfo ||= C4::Members::GetMember( borrowernumber => $res->{'borrowernumber'} ); - my $branch = GetReservesControlBranch( $iteminfo, $borrowerinfo ); + $patron ||= Koha::Patrons->find( $res->{borrowernumber} ); + my $branch = GetReservesControlBranch( $iteminfo, $patron->unblessed ); my $branchitemrule = C4::Circulation::GetBranchItemRule($branch,$iteminfo->{'itype'}); next if ($branchitemrule->{'holdallowed'} == 0); - next if (($branchitemrule->{'holdallowed'} == 1) && ($branch ne $borrowerinfo->{'branchcode'})); + next if (($branchitemrule->{'holdallowed'} == 1) && ($branch ne $patron->branchcode)); next if ( ($branchitemrule->{hold_fulfillment_policy} ne 'any') && ($res->{branchcode} ne $iteminfo->{ $branchitemrule->{hold_fulfillment_policy} }) ); $priority = $res->{'priority'}; $highest = $res; @@ -1003,48 +796,28 @@ Cancels all reserves with an expiration date from before today. =cut sub CancelExpiredReserves { + my $today = dt_from_string(); + my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays'); + my $expireWaiting = C4::Context->preference('ExpireReservesMaxPickUpDelay'); - # Cancel reserves that have passed their expiration date. - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( " - SELECT * FROM reserves WHERE DATE(expirationdate) < DATE( CURDATE() ) - AND expirationdate IS NOT NULL - AND found IS NULL - " ); - $sth->execute(); - - while ( my $res = $sth->fetchrow_hashref() ) { - CancelReserve({ reserve_id => $res->{'reserve_id'} }); - } - - # Cancel reserves that have been waiting too long - if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) { - my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay"); - my $cancel_on_holidays = C4::Context->preference('ExpireReservesOnHolidays'); - - my $today = dt_from_string(); + my $dtf = Koha::Database->new->schema->storage->datetime_parser; + my $params = { expirationdate => { '<', $dtf->format_date($today) } }; + $params->{found} = undef unless $expireWaiting; - my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > ? AND found = 'W' AND priority = 0"; - $sth = $dbh->prepare( $query ); - $sth->execute( $max_pickup_delay ); + # FIXME To move to Koha::Holds->search_expired (?) + my $holds = Koha::Holds->search( $params ); - while ( my $res = $sth->fetchrow_hashref ) { - my $do_cancel = 1; - unless ( $cancel_on_holidays ) { - my $calendar = Koha::Calendar->new( branchcode => $res->{'branchcode'} ); - my $is_holiday = $calendar->is_holiday( $today ); + while ( my $hold = $holds->next ) { + my $calendar = Koha::Calendar->new( branchcode => $hold->branchcode ); - if ( $is_holiday ) { - $do_cancel = 0; - } - } + next if !$cancel_on_holidays && $calendar->is_holiday( $today ); - if ( $do_cancel ) { - CancelReserve({ reserve_id => $res->{'reserve_id'}, charge_cancel_fee => 1 }); - } + my $cancel_params = {}; + if ( $hold->found eq 'W' ) { + $cancel_params->{charge_cancel_fee} = 1; } + $hold->cancel( $cancel_params ); } - } =head2 AutoUnsuspendReserves @@ -1063,70 +836,6 @@ sub AutoUnsuspendReserves { map { $_->suspend(0)->suspend_until(undef)->store() } @holds; } -=head2 CancelReserve - - CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber, ] [ charge_cancel_fee => 1 ] }); - -Cancels a reserve. If C is passed and the C syspref is set, charge that fee to the patron's account. - -=cut - -sub CancelReserve { - my ( $params ) = @_; - - my $reserve_id = $params->{'reserve_id'}; - # Filter out only the desired keys; this will insert undefined values for elements missing in - # \%params, but GetReserveId filters them out anyway. - $reserve_id = GetReserveId( { biblionumber => $params->{'biblionumber'}, borrowernumber => $params->{'borrowernumber'}, itemnumber => $params->{'itemnumber'} } ) unless ( $reserve_id ); - - return unless ( $reserve_id ); - - my $dbh = C4::Context->dbh; - - my $reserve = GetReserve( $reserve_id ); - if ($reserve) { - - my $hold = Koha::Holds->find( $reserve_id ); - logaction( 'HOLDS', 'CANCEL', $hold->reserve_id, Dumper($hold->unblessed) ) - if C4::Context->preference('HoldsLog'); - - my $query = " - UPDATE reserves - SET cancellationdate = now(), - priority = 0 - WHERE reserve_id = ? - "; - my $sth = $dbh->prepare($query); - $sth->execute( $reserve_id ); - - $query = " - INSERT INTO old_reserves - SELECT * FROM reserves - WHERE reserve_id = ? - "; - $sth = $dbh->prepare($query); - $sth->execute( $reserve_id ); - - $query = " - DELETE FROM reserves - WHERE reserve_id = ? - "; - $sth = $dbh->prepare($query); - $sth->execute( $reserve_id ); - - # now fix the priority on the others.... - _FixPriority({ biblionumber => $reserve->{biblionumber} }); - - # and, if desired, charge a cancel fee - my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge"); - if ( $charge && $params->{'charge_cancel_fee'} ) { - manualinvoice($reserve->{'borrowernumber'}, $reserve->{'itemnumber'}, '', 'HE', $charge); - } - } - - return $reserve; -} - =head2 ModReserve ModReserve({ rank => $rank, @@ -1178,13 +887,20 @@ sub ModReserve { return if $rank eq "n"; return unless ( $reserve_id || ( $borrowernumber && ( $biblionumber || $itemnumber ) ) ); - $reserve_id = GetReserveId({ biblionumber => $biblionumber, borrowernumber => $borrowernumber, itemnumber => $itemnumber }) unless ( $reserve_id ); + + my $hold; + unless ( $reserve_id ) { + $hold = Koha::Holds->search({ biblionumber => $biblionumber, borrowernumber => $borrowernumber, itemnumber => $itemnumber }); + return unless $hold; # FIXME Should raise an exception + $reserve_id = $hold->reserve_id; + } + + $hold ||= Koha::Holds->find($reserve_id); if ( $rank eq "del" ) { - CancelReserve({ reserve_id => $reserve_id }); + $hold->cancel; } elsif ($rank =~ /^\d+/ and $rank > 0) { - my $hold = Koha::Holds->find($reserve_id); logaction( 'HOLDS', 'MODIFY', $hold->reserve_id, Dumper($hold->unblessed) ) if C4::Context->preference('HoldsLog'); @@ -1242,10 +958,16 @@ sub ModReserveFill { } ); + # FIXME Must call Koha::Hold->cancel ? => No, should call ->filled and add the correct log Koha::Old::Hold->new( $hold->unblessed() )->store(); $hold->delete(); + if ( C4::Context->preference('HoldFeeMode') eq 'any_time_is_collected' ) { + my $reserve_fee = GetReserveFee( $hold->borrowernumber, $hold->biblionumber ); + ChargeReserveFee( $hold->borrowernumber, $reserve_fee, $hold->biblio->title ); + } + # now fix the priority on the others (if the priority wasn't # already sorted!).... unless ( $priority == 0 ) { @@ -1318,33 +1040,10 @@ sub ModReserveAffect { return unless $hold; - $reserve_id = $hold->id(); - my $already_on_shelf = $hold->found && $hold->found eq 'W'; - # If we affect a reserve that has to be transferred, don't set to Waiting - my $query; - if ($transferToDo) { - $hold->set( - { - priority => 0, - itemnumber => $itemnumber, - found => 'T', - } - ); - } - else { - # affect the reserve to Waiting as well. - $hold->set( - { - priority => 0, - itemnumber => $itemnumber, - found => 'W', - waitingdate => dt_from_string(), - } - ); - } - $hold->store(); + $hold->itemnumber($itemnumber); + $hold->set_waiting($transferToDo); _koha_notify_reserve( $hold->reserve_id ) if ( !$transferToDo && !$already_on_shelf ); @@ -1372,7 +1071,9 @@ sub ModReserveCancelAll { my ( $itemnumber, $borrowernumber ) = @_; #step 1 : cancel the reservation - my $CancelReserve = CancelReserve({ itemnumber => $itemnumber, borrowernumber => $borrowernumber }); + my $holds = Koha::Holds->search({ itemnumber => $itemnumber, borrowernumber => $borrowernumber }); + return unless $holds->count; + $holds->next->cancel; #step 2 launch the subroutine of the others reserves ( $messages, $nextreservinfo ) = GetOtherReserves($itemnumber); @@ -1404,59 +1105,6 @@ sub ModReserveMinusPriority { _FixPriority({ reserve_id => $reserve_id, rank => '0' }); } -=head2 GetReserveInfo - - &GetReserveInfo($reserve_id); - -Get item and borrower details for a current hold. -Current implementation this query should have a single result. - -=cut - -sub GetReserveInfo { - my ( $reserve_id ) = @_; - my $dbh = C4::Context->dbh; - my $strsth="SELECT - reserve_id, - reservedate, - reservenotes, - reserves.borrowernumber, - reserves.biblionumber, - reserves.branchcode, - reserves.waitingdate, - notificationdate, - reminderdate, - priority, - found, - firstname, - surname, - phone, - email, - address, - address2, - cardnumber, - city, - zipcode, - biblio.title, - biblio.author, - items.holdingbranch, - items.itemcallnumber, - items.itemnumber, - items.location, - barcode, - notes - FROM reserves - LEFT JOIN items USING(itemnumber) - LEFT JOIN borrowers USING(borrowernumber) - LEFT JOIN biblio ON (reserves.biblionumber=biblio.biblionumber) - WHERE reserves.reserve_id = ?"; - my $sth = $dbh->prepare($strsth); - $sth->execute($reserve_id); - - my $data = $sth->fetchrow_hashref; - return $data; -} - =head2 IsAvailableForItemLevelRequest my $is_available = IsAvailableForItemLevelRequest($item_record,$borrower_record); @@ -1591,16 +1239,17 @@ Input: $where is 'up', 'down', 'top' or 'bottom'. Biblionumber, Date reserve was sub AlterPriority { my ( $where, $reserve_id ) = @_; - my $reserve = GetReserve( $reserve_id ); + my $hold = Koha::Holds->find( $reserve_id ); + return unless $hold; - if ( $reserve->{cancellationdate} ) { - warn "I cannot alter the priority for reserve_id $reserve_id, the reserve has been cancelled (".$reserve->{cancellationdate}.')'; + if ( $hold->cancellationdate ) { + warn "I cannot alter the priority for reserve_id $reserve_id, the reserve has been cancelled (" . $hold->cancellationdate . ')'; return; } if ( $where eq 'up' || $where eq 'down' ) { - my $priority = $reserve->{'priority'}; + my $priority = $hold->priority; $priority = $where eq 'up' ? $priority - 1 : $priority + 1; _FixPriority({ reserve_id => $reserve_id, rank => $priority }) @@ -1613,6 +1262,7 @@ sub AlterPriority { _FixPriority({ reserve_id => $reserve_id, rank => '999999' }); } + # FIXME Should return the new priority } =head2 ToggleLowestPriority @@ -1747,13 +1397,18 @@ sub _FixPriority { my $dbh = C4::Context->dbh; - unless ( $biblionumber ) { - my $res = GetReserve( $reserve_id ); - $biblionumber = $res->{biblionumber}; + my $hold; + if ( $reserve_id ) { + $hold = Koha::Holds->find( $reserve_id ); + return unless $hold; } - if ( $rank eq "del" ) { - CancelReserve({ reserve_id => $reserve_id }); + unless ( $biblionumber ) { # FIXME This is a very weird API + $biblionumber = $hold->biblionumber; + } + + if ( $rank eq "del" ) { # FIXME will crash if called without $hold + $hold->cancel; } elsif ( $rank eq "W" || $rank eq "0" ) { @@ -1983,7 +1638,7 @@ sub _koha_notify_reserve { my $hold = Koha::Holds->find($reserve_id); my $borrowernumber = $hold->borrowernumber; - my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber); + my $patron = Koha::Patrons->find( $borrowernumber ); # Try to get the borrower's email address my $to_address = C4::Members::GetNoticeEmailAddress($borrowernumber); @@ -2000,15 +1655,15 @@ sub _koha_notify_reserve { my %letter_params = ( module => 'reserves', branchcode => $hold->branchcode, + lang => $patron->lang, tables => { 'branches' => $library, - 'borrowers' => $borrower, + 'borrowers' => $patron->unblessed, 'biblio' => $hold->biblionumber, 'biblioitems' => $hold->biblionumber, 'reserves' => $hold->unblessed, 'items' => $hold->itemnumber, }, - substitute => { today => output_pref( { dt => dt_from_string, dateonly => 1 } ) }, ); my $notification_sent = 0; #Keeping track if a Hold_filled message is sent. If no message can be sent, then default to a print message. @@ -2034,7 +1689,7 @@ sub _koha_notify_reserve { while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) { next if ( ( $mtt eq 'email' and not $to_address ) # No email address - or ( $mtt eq 'sms' and not $borrower->{smsalertnumber} ) # No SMS number + or ( $mtt eq 'sms' and not $patron->smsalertnumber ) # No SMS number or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl ); @@ -2189,7 +1844,8 @@ sub MoveReserve { RevertWaitingStatus({ itemnumber => $itemnumber }); } elsif ( $cancelreserve eq 'cancel' || $cancelreserve ) { # cancel reserves on this item - CancelReserve( { reserve_id => $res->{'reserve_id'} } ); + my $hold = Koha::Holds->find( $res->{reserve_id} ); + $hold->cancel; } } } @@ -2299,30 +1955,6 @@ sub RevertWaitingStatus { _FixPriority( { biblionumber => $reserve->{biblionumber} } ); } -=head2 GetReserveId - - $reserve_id = GetReserveId({ biblionumber => $biblionumber, borrowernumber => $borrowernumber [, itemnumber => $itemnumber ] }); - - Returnes the first reserve id that matches the given criteria - -=cut - -sub GetReserveId { - my ( $params ) = @_; - - return unless ( ( $params->{'biblionumber'} || $params->{'itemnumber'} ) && $params->{'borrowernumber'} ); - - foreach my $key ( keys %$params ) { - delete $params->{$key} unless defined( $params->{$key} ); - } - - my $hold = Koha::Holds->search( $params )->next(); - - return unless $hold; - - return $hold->id(); -} - =head2 ReserveSlip ReserveSlip($branchcode, $borrowernumber, $biblionumber) @@ -2345,17 +1977,17 @@ sub ReserveSlip { my ($branch, $borrowernumber, $biblionumber) = @_; # return unless ( C4::Context->boolean_preference('printreserveslips') ); + my $patron = Koha::Patrons->find( $borrowernumber ); - my $reserve_id = GetReserveId({ - biblionumber => $biblionumber, - borrowernumber => $borrowernumber - }) or return; - my $reserve = GetReserveInfo($reserve_id) or return; + my $hold = Koha::Holds->search({biblionumber => $biblionumber, borrowernumber => $borrowernumber })->next; + return unless $hold; + my $reserve = $hold->unblessed; return C4::Letters::GetPreparedLetter ( module => 'circulation', letter_code => 'HOLD_SLIP', branchcode => $branch, + lang => $patron->lang, tables => { 'reserves' => $reserve, 'branches' => $reserve->{branchcode},