X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FILSDI%2FServices.pm;h=2b291b82a45cb482fbbe54a13ee65407fb34e56a;hb=0748911eb26f2a35d8ba881dcb92e37a979fc9a9;hp=e33ef6edffcccf2fec4d5cb7b28a9077c7e78bf4;hpb=51f0a0b7229c1e76699708a548a9e3e68c9953ad;p=koha.git diff --git a/C4/ILSDI/Services.pm b/C4/ILSDI/Services.pm index e33ef6edff..2b291b82a4 100644 --- a/C4/ILSDI/Services.pm +++ b/C4/ILSDI/Services.pm @@ -4,18 +4,18 @@ package C4::ILSDI::Services; # # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . use strict; use warnings; @@ -23,17 +23,24 @@ use warnings; use C4::Members; use C4::Items; use C4::Circulation; -use C4::Branch; use C4::Accounts; use C4::Biblio; -use C4::Reserves qw(AddReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved); +use C4::Reserves qw(AddReserve CanBookBeReserved CanItemBeReserved IsAvailableForItemLevelRequest); use C4::Context; use C4::AuthoritiesMarc; use XML::Simple; use HTML::Entities; -use CGI; +use CGI qw ( -utf8 ); use DateTime; use C4::Auth; +use C4::Members::Attributes qw(GetBorrowerAttributes); +use Koha::DateUtils; + +use Koha::Biblios; +use Koha::Checkouts; +use Koha::Items; +use Koha::Libraries; +use Koha::Patrons; =head1 NAME @@ -42,27 +49,27 @@ C4::ILS-DI::Services - ILS-DI Services =head1 DESCRIPTION Each function in this module represents an ILS-DI service. -They all takes a CGI instance as argument and most of them return a +They all takes a CGI instance as argument and most of them return a hashref that will be printed by XML::Simple in opac/ilsdi.pl =head1 SYNOPSIS - use C4::ILSDI::Services; - use XML::Simple; - use CGI; + use C4::ILSDI::Services; + use XML::Simple; + use CGI qw ( -utf8 ); - my $cgi = new CGI; + my $cgi = new CGI; - $out = LookupPatron($cgi); + $out = LookupPatron($cgi); - print CGI::header('text/xml'); - print XMLout($out, - noattr => 1, - noescape => 1, - nosort => 1, + print CGI::header('text/xml'); + print XMLout($out, + noattr => 1, + noescape => 1, + nosort => 1, xmldecl => '', - RootName => 'LookupPatron', - SuppressEmpty => 1); + RootName => 'LookupPatron', + SuppressEmpty => 1); =cut @@ -70,7 +77,7 @@ hashref that will be printed by XML::Simple in opac/ilsdi.pl =head2 GetAvailability -Given a set of biblionumbers or itemnumbers, returns a list with +Given a set of biblionumbers or itemnumbers, returns a list with availability of the items associated with the identifiers. Parameters: @@ -81,7 +88,7 @@ list of either biblionumbers or itemnumbers =head3 id_type (Required) -defines the type of record identifier being used in the request, +defines the type of record identifier being used in the request, possible values: - bib @@ -89,7 +96,7 @@ possible values: =head3 return_type (Optional) -requests a particular level of detail in reporting availability, +requests a particular level of detail in reporting availability, possible values: - bib @@ -97,8 +104,8 @@ possible values: =head3 return_fmt (Optional) -requests a particular format or set of formats in reporting -availability +requests a particular format or set of formats in reporting +availability =cut @@ -132,21 +139,32 @@ sub GetAvailability { } else { my $status; my $msg; - my $biblioitem = ( GetBiblioItemByBiblioNumber( $id, undef ) )[0]; - if ($biblioitem) { - + my $items = Koha::Items->search({ biblionumber => $id }); + if ($items->count) { + # Open XML + $out .= " \n"; + $out .= " \n"; + $out .= " \n"; + # We loop over the items to clean them + while ( my $item = $items->next ) { + my $itemnumber = $item->itemnumber; + my ( $biblionumber, $status, $msg, $location ) = _availability($itemnumber); + $out .= " \n"; + $out .= " \n"; + $out .= " " . $itemnumber . "\n"; + $out .= " " . $status . "\n"; + if ($msg) { $out .= " " . $msg . "\n"; } + if ($location) { $out .= " " . $location . "\n"; } + $out .= " \n"; + $out .= " \n"; + } + # Close XML + $out .= " \n"; + $out .= " \n"; } else { $status = "unknown"; $msg = "Error: could not retrieve availability for this ID"; } - $out .= " \n"; - $out .= " \n"; - $out .= " \n"; - $out .= " " . $id . "\n"; - $out .= " " . $status . "\n"; - $out .= " " . $msg . "\n"; - $out .= " \n"; - $out .= " \n"; } } $out .= "\n"; @@ -156,13 +174,13 @@ sub GetAvailability { =head2 GetRecords -Given a list of biblionumbers, returns a list of record objects that +Given a list of biblionumbers, returns a list of record objects that contain bibliographic information, as well as associated holdings and item -information. The caller may request a specific metadata schema for the +information. The caller may request a specific metadata schema for the record objects to be returned. -This function behaves similarly to HarvestBibliographicRecords and -HarvestExpandedRecords in Data Aggregation, but allows quick, real time +This function behaves similarly to HarvestBibliographicRecords and +HarvestExpandedRecords in Data Aggregation, but allows quick, real time lookup by bibliographic identifier. You can use OAI-PMH ListRecords instead of this service. @@ -170,11 +188,11 @@ You can use OAI-PMH ListRecords instead of this service. Parameters: - id (Required) - list of system record identifiers + list of system record identifiers - id_type (Optional) - Defines the metadata schema in which the records are returned, - possible values: - - MARCXML + Defines the metadata schema in which the records are returned, + possible values: + - MARCXML =cut @@ -192,25 +210,27 @@ sub GetRecords { foreach my $biblionumber ( split( / /, $cgi->param('id') ) ) { # Get the biblioitem from the biblionumber - my $biblioitem = ( GetBiblioItemByBiblioNumber( $biblionumber, undef ) )[0]; - if ( not $biblioitem->{'biblionumber'} ) { - $biblioitem->{code} = "RecordNotFound"; + my $biblio = Koha::Biblios->find( $biblionumber ); + unless ( $biblio ) { + push @records, { code => "RecordNotFound" }; + next; } + my $biblioitem = $biblio->biblioitem->unblessed; + my $embed_items = 1; - my $record = GetMarcBiblio($biblionumber, $embed_items); + my $record = GetMarcBiblio({ + biblionumber => $biblionumber, + embed_items => $embed_items }); if ($record) { $biblioitem->{marcxml} = $record->as_xml_record(); } - # We don't want MARC to be displayed - delete $biblioitem->{'marc'}; - # Get most of the needed data my $biblioitemnumber = $biblioitem->{'biblioitemnumber'}; - my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber }); + my $holds = $biblio->current_holds->unblessed; my $issues = GetBiblioIssues($biblionumber); - my $items = GetItemsByBiblioitemnumber($biblioitemnumber); + my $items = $biblio->items->unblessed; # We loop over the items to clean them foreach my $item (@$items) { @@ -219,13 +239,15 @@ sub GetRecords { delete $item->{'more_subfields_xml'}; # Display branch names instead of branch codes - $item->{'homebranchname'} = GetBranchName( $item->{'homebranch'} ); - $item->{'holdingbranchname'} = GetBranchName( $item->{'holdingbranch'} ); + my $home_library = Koha::Libraries->find( $item->{homebranch} ); + my $holding_library = Koha::Libraries->find( $item->{holdingbranch} ); + $item->{'homebranchname'} = $home_library ? $home_library->branchname : ''; + $item->{'holdingbranchname'} = $holding_library ? $holding_library->branchname : ''; } # Hashref building... $biblioitem->{'items'}->{'item'} = $items; - $biblioitem->{'reserves'}->{'reserve'} = $reserves; + $biblioitem->{'reserves'}->{'reserve'} = $holds; $biblioitem->{'issues'}->{'issue'} = $issues; push @records, $biblioitem; @@ -236,8 +258,8 @@ sub GetRecords { =head2 GetAuthorityRecords -Given a list of authority record identifiers, returns a list of record -objects that contain the authority records. The function user may request +Given a list of authority record identifiers, returns a list of record +objects that contain the authority records. The function user may request a specific metadata schema for the record objects. Parameters: @@ -277,36 +299,47 @@ Looks up a patron in the ILS by an identifier, and returns the borrowernumber. Parameters: - id (Required) - an identifier used to look up the patron in Koha + an identifier used to look up the patron in Koha - id_type (Optional) - the type of the identifier, possible values: - - cardnumber - - firstname - - userid - - borrowernumber + the type of the identifier, possible values: + - cardnumber + - userid + - email + - borrowernumber + - firstname + - surname =cut sub LookupPatron { my ($cgi) = @_; - # Get the borrower... - my $borrower = GetMember($cgi->param('id_type') => $cgi->param('id')); - if ( not $borrower->{'borrowernumber'} ) { + my $id = $cgi->param('id'); + if(!$id) { return { message => 'PatronNotFound' }; } - # Build the hashref - my $patron->{'id'} = $borrower->{'borrowernumber'}; - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patrons; + my $passed_id_type = $cgi->param('id_type'); + if($passed_id_type) { + $patrons = Koha::Patrons->search( { $passed_id_type => $id } ); + } else { + foreach my $id_type ('cardnumber', 'userid', 'email', 'borrowernumber', + 'surname', 'firstname') { + $patrons = Koha::Patrons->search( { $id_type => $id } ); + last if($patrons->count); + } + } + unless ( $patrons->count ) { + return { message => 'PatronNotFound' }; + } - # ...and return his ID - return $patron; + return { id => $patrons->next->borrowernumber }; } =head2 AuthenticatePatron -Authenticates a user's login credentials and returns the identifier for +Authenticates a user's login credentials and returns the identifier for the patron. Parameters: @@ -320,12 +353,13 @@ Parameters: sub AuthenticatePatron { my ($cgi) = @_; - my ($status, $cardnumber, $userid) = C4::Auth::checkpw( C4::Context->dbh, $cgi->param('username'), $cgi->param('password') ); + my $username = $cgi->param('username'); + my $password = $cgi->param('password'); + my ($status, $cardnumber, $userid) = C4::Auth::checkpw( C4::Context->dbh, $username, $password ); if ( $status ) { # Get the borrower - my $borrower = GetMember( cardnumber => $cardnumber ); - my $patron->{'id'} = $borrower->{'borrowernumber'}; - return $patron; + my $patron = Koha::Patrons->find( { userid => $userid } ); + return { id => $patron->borrowernumber }; } else { return { code => 'PatronNotFound' }; @@ -334,22 +368,25 @@ sub AuthenticatePatron { =head2 GetPatronInfo -Returns specified information about the patron, based on options in the -request. This function can optionally return patron's contact information, +Returns specified information about the patron, based on options in the +request. This function can optionally return patron's contact information, fine information, hold request information, and loan information. Parameters: - patron_id (Required) - the borrowernumber + the borrowernumber - show_contact (Optional, default 1) - whether or not to return patron's contact information in the response + whether or not to return patron's contact information in the response - show_fines (Optional, default 0) - whether or not to return fine information in the response + whether or not to return fine information in the response - show_holds (Optional, default 0) - whether or not to return hold request information in the response + whether or not to return hold request information in the response - show_loans (Optional, default 0) - whether or not to return loan information request information in the response + whether or not to return loan information request information in the response + - show_attributes (Optional, default 0) + whether or not to return additional patron attributes, when enabled the attributes + are limited to those marked as opac visible only. =cut @@ -358,18 +395,19 @@ sub GetPatronInfo { # Get Member details my $borrowernumber = $cgi->param('patron_id'); - my $borrower = GetMemberDetails( $borrowernumber ); - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patron = Koha::Patrons->find( $borrowernumber ); + return { code => 'PatronNotFound' } unless $patron; # Cleaning the borrower hashref - $borrower->{'charges'} = $borrower->{'flags'}->{'CHARGES'}->{'amount'}; - $borrower->{'branchname'} = GetBranchName( $borrower->{'branchcode'} ); - delete $borrower->{'flags'}; + my $borrower = $patron->unblessed; + $borrower->{charges} = sprintf "%.02f", $patron->account->non_issues_charges; # FIXME Formatting should not be done here + my $library = Koha::Libraries->find( $borrower->{branchcode} ); + $borrower->{'branchname'} = $library ? $library->branchname : ''; delete $borrower->{'userid'}; delete $borrower->{'password'}; # Contact fields management - if ( $cgi->param('show_contact') eq "0" ) { + if ( defined $cgi->param('show_contact') && $cgi->param('show_contact') eq "0" ) { # Define contact fields my @contactfields = ( @@ -386,48 +424,65 @@ sub GetPatronInfo { } # Fines management - if ( $cgi->param('show_fines') eq "1" ) { - my @charges; - for ( my $i = 1 ; my @charge = getcharges( $borrowernumber, undef, $i ) ; $i++ ) { - push( @charges, @charge ); - } - $borrower->{'fines'}->{'fine'} = \@charges; + if ( $cgi->param('show_fines') && $cgi->param('show_fines') eq "1" ) { + $borrower->{fines}{fine} = $patron->account->lines->unblessed; } # Reserves management - if ( $cgi->param('show_holds') eq "1" ) { + if ( $cgi->param('show_holds') && $cgi->param('show_holds') eq "1" ) { # Get borrower's reserves - my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef ); - foreach my $reserve (@reserves) { + my $holds = $patron->holds; + while ( my $hold = $holds->next ) { + my ( $item, $biblio, $biblioitem ) = ( {}, {}, {} ); # Get additional informations - my $item = GetBiblioFromItemNumber( $reserve->{'itemnumber'}, undef ); - my $branchname = GetBranchName( $reserve->{'branchcode'} ); - - # Remove unwanted fields - delete $item->{'marc'}; - delete $item->{'marcxml'}; - delete $item->{'more_subfields_xml'}; + if ( $hold->itemnumber ) { # item level holds + $item = Koha::Items->find( $hold->itemnumber ); + $biblio = $item->biblio; + $biblioitem = $biblio->biblioitem; + + # Remove unwanted fields + $item = $item->unblessed; + delete $item->{more_subfields_xml}; + $biblio = $biblio->unblessed; + $biblioitem = $biblioitem->unblessed; + } # Add additional fields - $reserve->{'item'} = $item; - $reserve->{'branchname'} = $branchname; - $reserve->{'title'} = GetBiblio( $reserve->{'biblionumber'} )->{'title'}; + my $unblessed_hold = $hold->unblessed; + $unblessed_hold->{item} = { %$item, %$biblio, %$biblioitem }; + my $library = Koha::Libraries->find( $hold->branchcode ); + my $branchname = $library ? $library->branchname : ''; + $unblessed_hold->{branchname} = $branchname; + $biblio = Koha::Biblios->find( $hold->biblionumber ); # Should be $hold->get_biblio + $unblessed_hold->{title} = $biblio ? $biblio->title : ''; # Just in case, but should not be needed + + push @{ $borrower->{holds}{hold} }, $unblessed_hold; + } - $borrower->{'holds'}->{'hold'} = \@reserves; } # Issues management - if ( $cgi->param('show_loans') eq "1" ) { - my $issues = GetPendingIssues($borrowernumber); - foreach my $issue ( @$issues ){ - $issue->{'issuedate'} = $issue->{'issuedate'}->strftime('%Y-%m-%d %H:%M'); - $issue->{'date_due'} = $issue->{'date_due'}->strftime('%Y-%m-%d %H:%M'); + if ( $cgi->param('show_loans') && $cgi->param('show_loans') eq "1" ) { + my $pending_checkouts = $patron->pending_checkouts; + my @checkouts; + while ( my $c = $pending_checkouts->next ) { + # FIXME We should only retrieve what is needed in the template + my $issue = $c->unblessed_all_relateds; + push @checkouts, $issue } - $borrower->{'loans'}->{'loan'} = $issues; + $borrower->{'loans'}->{'loan'} = \@checkouts; } + if ( $cgi->param('show_attributes') eq "1" ) { + my $attrs = GetBorrowerAttributes( $borrowernumber, 1 ); + $borrower->{'attributes'} = $attrs; + } + + # Add is expired information + $borrower->{'is_expired'} = $patron->is_expired ? 1 : 0; + return $borrower; } @@ -438,7 +493,7 @@ Returns a patron's status information. Parameters: - patron_id (Required) - the borrower ID + the borrower ID =cut @@ -447,28 +502,29 @@ sub GetPatronStatus { # Get Member details my $borrowernumber = $cgi->param('patron_id'); - my $borrower = GetMemberDetails( $borrowernumber ); - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patron = Koha::Patrons->find( $borrowernumber ); + return { code => 'PatronNotFound' } unless $patron; # Return the results return { - type => $$borrower{categorycode}, + type => $patron->categorycode, status => 0, # TODO - expiry => $$borrower{dateexpiry}, + expiry => $patron->dateexpiry, }; } =head2 GetServices -Returns information about the services available on a particular item for +Returns information about the services available on a particular item for a particular patron. Parameters: - patron_id (Required) - a borrowernumber + a borrowernumber - item_id (Required) - an itemnumber + an itemnumber + =cut sub GetServices { @@ -476,32 +532,33 @@ sub GetServices { # Get the member, or return an error code if not found my $borrowernumber = $cgi->param('patron_id'); - my $borrower = GetMemberDetails( $borrowernumber ); - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patron = Koha::Patrons->find( $borrowernumber ); + return { code => 'PatronNotFound' } unless $patron; + my $borrower = $patron->unblessed; # Get the item, or return an error code if not found my $itemnumber = $cgi->param('item_id'); - my $item = GetItem( $itemnumber ); - return { code => 'RecordNotFound' } unless $$item{itemnumber}; + my $item = Koha::Items->find($itemnumber); + return { code => 'RecordNotFound' } unless $item; my @availablefor; # Reserve level management - my $biblionumber = $item->{'biblionumber'}; + my $biblionumber = $item->biblionumber; my $canbookbereserved = CanBookBeReserved( $borrower, $biblionumber ); - if ($canbookbereserved eq 'OK') { + if ($canbookbereserved->{status} eq 'OK') { push @availablefor, 'title level hold'; - my $canitembereserved = IsAvailableForItemLevelRequest($itemnumber); + my $canitembereserved = IsAvailableForItemLevelRequest($item->unblessed, $borrower); if ($canitembereserved) { push @availablefor, 'item level hold'; } } # Reserve cancellation management - my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef ); + my $holds = $patron->holds; my @reserveditems; - foreach my $reserve (@reserves) { - push @reserveditems, $reserve->{'itemnumber'}; + while ( my $hold = $holds->next ) { # FIXME This could be improved + push @reserveditems, $hold->itemnumber; } if ( grep { $itemnumber eq $_ } @reserveditems ) { push @availablefor, 'hold cancellation'; @@ -514,10 +571,10 @@ sub GetServices { } # Issuing management - my $barcode = $item->{'barcode'} || ''; + my $barcode = $item->barcode || ''; $barcode = barcodedecode($barcode) if ( $barcode && C4::Context->preference('itemBarcodeInputFilter') ); if ($barcode) { - my ( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $borrower, $barcode ); + my ( $issuingimpossible, $needsconfirmation ) = CanBookBeIssued( $patron, $barcode ); # TODO push @availablefor, 'loan'; } @@ -535,11 +592,11 @@ Extends the due date for a borrower's existing issue. Parameters: - patron_id (Required) - a borrowernumber + a borrowernumber - item_id (Required) - an itemnumber + an itemnumber - desired_due_date (Required) - the date the patron would like the item returned by + the date the patron would like the item returned by =cut @@ -548,24 +605,27 @@ sub RenewLoan { # Get borrower infos or return an error code my $borrowernumber = $cgi->param('patron_id'); - my $borrower = GetMemberDetails( $borrowernumber ); - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patron = Koha::Patrons->find( $borrowernumber ); + return { code => 'PatronNotFound' } unless $patron; # Get the item, or return an error code my $itemnumber = $cgi->param('item_id'); - my $item = GetItem( $itemnumber ); - return { code => 'RecordNotFound' } unless $$item{itemnumber}; + my $item = Koha::Items->find($itemnumber); + return { code => 'RecordNotFound' } unless $item; # Add renewal if possible my @renewal = CanBookBeRenewed( $borrowernumber, $itemnumber ); if ( $renewal[0] ) { AddRenewal( $borrowernumber, $itemnumber ); } - my $issue = GetItemIssue($itemnumber); + return unless $item; # FIXME should be handled + + my $issue = $item->checkout; + return $issue; # FIXME should be handled # Hashref building my $out; - $out->{'renewals'} = $issue->{'renewals'}; - $out->{date_due} = $issue->{date_due}->strftime('%Y-%m-%d %H:%S'); + $out->{'renewals'} = $issue->renewals; + $out->{date_due} = dt_from_string($issue->date_due)->strftime('%Y-%m-%d %H:%S'); $out->{'success'} = $renewal[0]; $out->{'error'} = $renewal[1]; @@ -579,17 +639,17 @@ Creates, for a borrower, a biblio-level hold reserve. Parameters: - patron_id (Required) - a borrowernumber + a borrowernumber - bib_id (Required) - a biblionumber + a biblionumber - request_location (Required) - IP address where the end user request is being placed + IP address where the end user request is being placed - pickup_location (Optional) - a branch code indicating the location to which to deliver the item for pickup + a branch code indicating the location to which to deliver the item for pickup - needed_before_date (Optional) - date after which hold request is no longer needed + date after which hold request is no longer needed - pickup_expiry_date (Optional) - date after which item returned to shelf if item is not picked up + date after which item returned to shelf if item is not picked up =cut @@ -598,28 +658,40 @@ sub HoldTitle { # Get the borrower or return an error code my $borrowernumber = $cgi->param('patron_id'); - my $borrower = GetMemberDetails( $borrowernumber ); - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patron = Koha::Patrons->find( $borrowernumber ); + return { code => 'PatronNotFound' } unless $patron; # Get the biblio record, or return an error code my $biblionumber = $cgi->param('bib_id'); - my $biblio = GetBiblio( $biblionumber ); - return { code => 'RecordNotFound' } unless $$biblio{biblionumber}; - - my $title = $$biblio{title}; + my $biblio = Koha::Biblios->find( $biblionumber ); + return { code => 'RecordNotFound' } unless $biblio; + + my @hostitems = get_hostitemnumbers_of($biblionumber); + my @itemnumbers; + if (@hostitems){ + push(@itemnumbers, @hostitems); + } + + my $items = Koha::Items->search({ -or => { biblionumber => $biblionumber, itemnumber => { in => \@itemnumbers } } }); + + unless ( $items->count ) { + return { code => 'NoItems' }; + } + + my $title = $biblio ? $biblio->title : ''; # Check if the biblio can be reserved - return { code => 'NotHoldable' } unless CanBookBeReserved( $borrowernumber, $biblionumber ) eq 'OK'; + my $code = CanBookBeReserved( $borrowernumber, $biblionumber )->{status}; + return { code => $code } unless ( $code eq 'OK' ); my $branch; # Pickup branch management if ( $cgi->param('pickup_location') ) { $branch = $cgi->param('pickup_location'); - my $branches = GetBranches; - return { code => 'LocationNotFound' } unless $$branches{$branch}; + return { code => 'LocationNotFound' } unless Koha::Libraries->find($branch); } else { # if the request provide no branch, use the borrower's branch - $branch = $$borrower{branchcode}; + $branch = $patron->branchcode; } # Add the reserve @@ -627,12 +699,13 @@ sub HoldTitle { # $constraint, $bibitems, $priority, $resdate, $expdate, $notes, # $title, $checkitem, $found my $priority= C4::Reserves::CalculatePriority( $biblionumber ); - AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $priority, undef, undef, undef, $title, undef, undef ); + AddReserve( $branch, $borrowernumber, $biblionumber, undef, $priority, undef, undef, undef, $title, undef, undef ); # Hashref building my $out; $out->{'title'} = $title; - $out->{'pickup_location'} = GetBranchName($branch); + my $library = Koha::Libraries->find( $branch ); + $out->{'pickup_location'} = $library ? $library->branchname : ''; # TODO $out->{'date_available'} = ''; @@ -641,23 +714,23 @@ sub HoldTitle { =head2 HoldItem -Creates, for a borrower, an item-level hold request on a specific item of +Creates, for a borrower, an item-level hold request on a specific item of a bibliographic record in Koha. Parameters: - patron_id (Required) - a borrowernumber + a borrowernumber - bib_id (Required) - a biblionumber + a biblionumber - item_id (Required) - an itemnumber + an itemnumber - pickup_location (Optional) - a branch code indicating the location to which to deliver the item for pickup + a branch code indicating the location to which to deliver the item for pickup - needed_before_date (Optional) - date after which hold request is no longer needed + date after which hold request is no longer needed - pickup_expiry_date (Optional) - date after which item returned to shelf if item is not picked up + date after which item returned to shelf if item is not picked up =cut @@ -666,37 +739,35 @@ sub HoldItem { # Get the borrower or return an error code my $borrowernumber = $cgi->param('patron_id'); - my $borrower = GetMemberDetails( $borrowernumber ); - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patron = Koha::Patrons->find( $borrowernumber ); + return { code => 'PatronNotFound' } unless $patron; # Get the biblio or return an error code my $biblionumber = $cgi->param('bib_id'); - my $biblio = GetBiblio($biblionumber); - return { code => 'RecordNotFound' } unless $$biblio{biblionumber}; + my $biblio = Koha::Biblios->find( $biblionumber ); + return { code => 'RecordNotFound' } unless $biblio; - my $title = $$biblio{title}; + my $title = $biblio ? $biblio->title : ''; # Get the item or return an error code my $itemnumber = $cgi->param('item_id'); - my $item = GetItem( $itemnumber ); - return { code => 'RecordNotFound' } unless $$item{itemnumber}; + my $item = Koha::Items->find($itemnumber); + return { code => 'RecordNotFound' } unless $item; # If the biblio does not match the item, return an error code - return { code => 'RecordNotFound' } if $$item{biblionumber} ne $$biblio{biblionumber}; + return { code => 'RecordNotFound' } if $item->biblionumber ne $biblio->biblionumber; # Check for item disponibility - my $canitembereserved = C4::Reserves::CanItemBeReserved( $borrowernumber, $itemnumber ); - my $canbookbereserved = C4::Reserves::CanBookBeReserved( $borrowernumber, $biblionumber ); - return { code => 'NotHoldable' } unless $canbookbereserved eq 'OK' and $canitembereserved eq 'OK'; + my $canitembereserved = C4::Reserves::CanItemBeReserved( $borrowernumber, $itemnumber )->{status}; + return { code => $canitembereserved } unless $canitembereserved eq 'OK'; # Pickup branch management my $branch; if ( $cgi->param('pickup_location') ) { $branch = $cgi->param('pickup_location'); - my $branches = GetBranches(); - return { code => 'LocationNotFound' } unless $$branches{$branch}; + return { code => 'LocationNotFound' } unless Koha::Libraries->find($branch); } else { # if the request provide no branch, use the borrower's branch - $branch = $$borrower{branchcode}; + $branch = $patron->branchcode; } # Add the reserve @@ -704,11 +775,12 @@ sub HoldItem { # $constraint, $bibitems, $priority, $resdate, $expdate, $notes, # $title, $checkitem, $found my $priority= C4::Reserves::CalculatePriority( $biblionumber ); - AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $priority, undef, undef, undef, $title, $itemnumber, undef ); + AddReserve( $branch, $borrowernumber, $biblionumber, undef, $priority, undef, undef, undef, $title, $itemnumber, undef ); # Hashref building my $out; - $out->{'pickup_location'} = GetBranchName($branch); + my $library = Koha::Libraries->find( $branch ); + $out->{'pickup_location'} = $library ? $library->branchname : ''; # TODO $out->{'date_available'} = ''; @@ -733,16 +805,16 @@ sub CancelHold { # Get the borrower or return an error code my $borrowernumber = $cgi->param('patron_id'); - my $borrower = GetMemberDetails( $borrowernumber ); - return { code => 'PatronNotFound' } unless $$borrower{borrowernumber}; + my $patron = Koha::Patrons->find( $borrowernumber ); + return { code => 'PatronNotFound' } unless $patron; # Get the reserve or return an error code my $reserve_id = $cgi->param('item_id'); - my $reserve = C4::Reserves::GetReserve($reserve_id); - return { code => 'RecordNotFound' } unless $reserve; - return { code => 'RecordNotFound' } unless ($reserve->{borrowernumber} == $borrowernumber); + my $hold = Koha::Holds->find( $reserve_id ); + return { code => 'RecordNotFound' } unless $hold; + return { code => 'RecordNotFound' } unless ($hold->borrowernumber == $borrowernumber); - C4::Reserves::CancelReserve({reserve_id => $reserve_id}); + $hold->cancel; return { code => 'Canceled' }; } @@ -757,24 +829,25 @@ Returns, for an itemnumber, an array containing availability information. sub _availability { my ($itemnumber) = @_; - my $item = GetItem( $itemnumber, undef, undef ); + my $item = Koha::Items->find($itemnumber); - if ( not $item->{'itemnumber'} ) { + unless ( $item ) { return ( undef, 'unknown', 'Error: could not retrieve availability for this ID', undef ); } - my $biblionumber = $item->{'biblioitemnumber'}; - my $location = GetBranchName( $item->{'holdingbranch'} ); + my $biblionumber = $item->biblioitemnumber; + my $library = Koha::Libraries->find( $item->holdingbranch ); + my $location = $library ? $library->branchname : ''; - if ( $item->{'notforloan'} ) { + if ( $item->notforloan ) { return ( $biblionumber, 'not available', 'Not for loan', $location ); - } elsif ( $item->{'onloan'} ) { + } elsif ( $item->onloan ) { return ( $biblionumber, 'not available', 'Checked out', $location ); - } elsif ( $item->{'itemlost'} ) { + } elsif ( $item->itemlost ) { return ( $biblionumber, 'not available', 'Item lost', $location ); - } elsif ( $item->{'withdrawn'} ) { + } elsif ( $item->withdrawn ) { return ( $biblionumber, 'not available', 'Item withdrawn', $location ); - } elsif ( $item->{'damaged'} ) { + } elsif ( $item->damaged ) { return ( $biblionumber, 'not available', 'Item damaged', $location ); } else { return ( $biblionumber, 'available', undef, $location );