# 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., 59 Temple Place,
-# Suite 330, Boston, MA 02111-1307 USA
+# 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.
use strict;
use warnings;
use C4::Branch;
use C4::Accounts;
use C4::Biblio;
-use C4::Reserves;
+use C4::Reserves qw(AddReserve CancelReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved);
use C4::Context;
use C4::AuthoritiesMarc;
-use C4::ILSDI::Utility;
use XML::Simple;
use HTML::Entities;
use CGI;
+use DateTime;
+use C4::Auth;
=head1 NAME
=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
- hashref that will be printed by XML::Simple in opac/ilsdi.pl
+Each function in this module represents an ILS-DI service.
+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
noattr => 1,
noescape => 1,
nosort => 1,
- xmldecl => '<?xml version="1.0" encoding="ISO-8859-1" ?>',
+ xmldecl => '<?xml version="1.0" encoding="UTF-8" ?>',
RootName => 'LookupPatron',
SuppressEmpty => 1);
=cut
+=head1 FUNCTIONS
+
=head2 GetAvailability
-
- Given a set of biblionumbers or itemnumbers, returns a list with
- availability of the items associated with the identifiers.
-
- Parameters :
-
- - id (Required)
- list of either biblionumbers or itemnumbers
- - id_type (Required)
- defines the type of record identifier being used in the request,
- possible values:
- - bib
- - item
- - return_type (Optional)
- requests a particular level of detail in reporting availability,
- possible values:
- - bib
- - item
- - return_fmt (Optional)
- requests a particular format or set of formats in reporting
- availability
+
+Given a set of biblionumbers or itemnumbers, returns a list with
+availability of the items associated with the identifiers.
+
+Parameters:
+
+=head3 id (Required)
+
+list of either biblionumbers or itemnumbers
+
+=head3 id_type (Required)
+
+defines the type of record identifier being used in the request,
+possible values:
+
+ - bib
+ - item
+
+=head3 return_type (Optional)
+
+requests a particular level of detail in reporting availability,
+possible values:
+
+ - bib
+ - item
+
+=head3 return_fmt (Optional)
+
+requests a particular format or set of formats in reporting
+availability
=cut
sub GetAvailability {
my ($cgi) = @_;
- my $out = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
+ my $out = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
$out .= "<dlf:collection\n";
$out .= " xmlns:dlf=\"http://diglib.org/ilsdi/1.1\"\n";
$out .= " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n";
foreach my $id ( split( / /, $cgi->param('id') ) ) {
if ( $cgi->param('id_type') eq "item" ) {
- my ( $biblionumber, $status, $msg, $location ) = Availability($id);
+ my ( $biblionumber, $status, $msg, $location ) = _availability($id);
$out .= " <dlf:record>\n";
$out .= " <dlf:bibliographic id=\"" . ( $biblionumber || $id ) . "\" />\n";
}
=head2 GetRecords
-
- 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
- record objects to be returned.
- 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.
-
- Parameters:
-
- - id (Required)
- list of system record identifiers
- - id_type (Optional)
- Defines the metadata schema in which the records are returned,
- possible values:
- - MARCXML
+
+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
+record objects to be returned.
+
+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.
+
+Parameters:
+
+ - id (Required)
+ list of system record identifiers
+ - id_type (Optional)
+ Defines the metadata schema in which the records are returned,
+ possible values:
+ - MARCXML
=cut
# Check if the schema is supported. For now, GetRecords only supports MARCXML
if ( $cgi->param('schema') and $cgi->param('schema') ne "MARCXML" ) {
- return { message => 'UnsupportedSchema' };
+ return { code => 'UnsupportedSchema' };
}
my @records;
# Get the biblioitem from the biblionumber
my $biblioitem = ( GetBiblioItemByBiblioNumber( $biblionumber, undef ) )[0];
if ( not $biblioitem->{'biblionumber'} ) {
- $biblioitem = "RecordNotFound";
+ $biblioitem->{code} = "RecordNotFound";
+ }
+
+ my $embed_items = 1;
+ my $record = GetMarcBiblio($biblionumber, $embed_items);
+ if ($record) {
+ $biblioitem->{marcxml} = $record->as_xml_record();
}
# We don't want MARC to be displayed
delete $biblioitem->{'marc'};
- # nor the XML declaration of MARCXML
- $biblioitem->{'marcxml'} =~ s/<\?xml version="1.0" encoding="UTF-8"\?>//go;
-
# Get most of the needed data
my $biblioitemnumber = $biblioitem->{'biblioitemnumber'};
- my @reserves = GetReservesFromBiblionumber( $biblionumber, undef, undef );
+ my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
my $issues = GetBiblioIssues($biblionumber);
my $items = GetItemsByBiblioitemnumber($biblioitemnumber);
# Hashref building...
$biblioitem->{'items'}->{'item'} = $items;
- $biblioitem->{'reserves'}->{'reserve'} = $reserves[1];
+ $biblioitem->{'reserves'}->{'reserve'} = $reserves;
$biblioitem->{'issues'}->{'issue'} = $issues;
- map { $biblioitem->{$_} = encode_entities( $biblioitem->{$_}, '&' ) } grep( !/marcxml/, keys %$biblioitem );
-
push @records, $biblioitem;
}
}
=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
- a specific metadata schema for the record objects.
- Parameters:
+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.
- - id (Required)
- list of authority record identifiers
- - schema (Optional)
- specifies the metadata schema of records to be returned, possible values:
- - MARCXML
+Parameters:
+
+ - id (Required)
+ list of authority record identifiers
+ - schema (Optional)
+ specifies the metadata schema of records to be returned, possible values:
+ - MARCXML
=cut
# If the user asks for an unsupported schema, return an error code
if ( $cgi->param('schema') and $cgi->param('schema') ne "MARCXML" ) {
- return { message => 'UnsupportedSchema' };
+ return { code => 'UnsupportedSchema' };
}
- my $records;
+ my @records;
# Let's loop over the authority IDs
foreach my $authid ( split( / /, $cgi->param('id') ) ) {
# Get the record as XML string, or error code
- my $record = GetAuthorityXML($authid) || "<record>RecordNotFound</record>";
- $record =~ s/<\?xml version="1.0" encoding="UTF-8"\?>//go;
- $records .= $record;
+ push @records, GetAuthorityXML($authid) || { code => 'RecordNotFound' };
}
- return $records;
+ return { record => \@records };
}
=head2 LookupPatron
-
- 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
- - id_type (Optional)
- the type of the identifier, possible values:
- - cardnumber
- - firstname
- - userid
- - borrowernumber
+
+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
+ - id_type (Optional)
+ the type of the identifier, possible values:
+ - cardnumber
+ - firstname
+ - userid
+ - borrowernumber
=cut
my ($cgi) = @_;
# Get the borrower...
- my $borrower = GetMember( $cgi->param('id'), $cgi->param('id_type') );
+ my $borrower = GetMember($cgi->param('id_type') => $cgi->param('id'));
if ( not $borrower->{'borrowernumber'} ) {
return { message => 'PatronNotFound' };
}
# Build the hashref
my $patron->{'id'} = $borrower->{'borrowernumber'};
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
# ...and return his ID
return $patron;
=head2 AuthenticatePatron
- Authenticates a user's login credentials and returns the identifier for
- the patron.
-
- Parameters:
+Authenticates a user's login credentials and returns the identifier for
+the patron.
+
+Parameters:
+
+ - username (Required)
+ user's login identifier (userid or cardnumber)
+ - password (Required)
+ user's password
- - username (Required)
- user's login identifier
- - password (Required)
- user's password
-
=cut
sub AuthenticatePatron {
my ($cgi) = @_;
-
- # Check if borrower exists, using a C4::ILSDI::Utility function...
- if ( not( BorrowerExists( $cgi->param('username'), $cgi->param('password') ) ) ) {
- return { message => 'PatronNotFound' };
+ my ($status, $cardnumber, $userid) = C4::Auth::checkpw( C4::Context->dbh, $cgi->param('username'), $cgi->param('password') );
+ if ( $status ) {
+ # Get the borrower
+ my $borrower = GetMember( cardnumber => $cardnumber );
+ my $patron->{'id'} = $borrower->{'borrowernumber'};
+ return $patron;
}
+ else {
+ return { code => 'PatronNotFound' };
+ }
+}
- # Get the borrower
- my $borrower = GetMember( $cgi->param('username'), "userid" );
+=head2 GetPatronInfo
- # Build the hashref
- my $patron->{'id'} = $borrower->{'borrowernumber'};
+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.
- # ... and return his ID
- return $patron;
-}
+Parameters:
-=head2 GetPatronInfo
+ - patron_id (Required)
+ the borrowernumber
+ - show_contact (Optional, default 1)
+ 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
+ - show_holds (Optional, default 0)
+ 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
- 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
- - show_contact (Optional, default 1)
- 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
- - show_holds (Optional, default 0)
- 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
-
=cut
sub GetPatronInfo {
# Get Member details
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMemberDetails( $borrowernumber, undef );
- if ( not $borrower->{'borrowernumber'} ) {
- return { message => 'PatronNotFound' };
- }
+ my $borrower = GetMemberDetails( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
# Cleaning the borrower hashref
$borrower->{'charges'} = $borrower->{'flags'}->{'CHARGES'}->{'amount'};
# Add additional fields
$reserve->{'item'} = $item;
$reserve->{'branchname'} = $branchname;
- $reserve->{'title'} = ( GetBiblio( $reserve->{'biblionumber'} ) )[1]->{'title'};
+ $reserve->{'title'} = GetBiblio( $reserve->{'biblionumber'} )->{'title'};
}
$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');
+ }
$borrower->{'loans'}->{'loan'} = $issues;
}
=head2 GetPatronStatus
- Returns a patron's status information.
-
- Parameters:
+Returns a patron's status information.
+
+Parameters:
- - patron_id (Required)
- the borrower ID
+ - patron_id (Required)
+ the borrower ID
=cut
# Get Member details
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMemberDetails( $borrowernumber, undef );
- if ( not $borrower->{'borrowernumber'} ) {
- return { message => 'PatronNotFound' };
- }
-
- # Hashref building
- my $patron;
- $patron->{'type'} = $borrower->{'categorycode'};
- $patron->{'status'} = 0; #TODO
- $patron->{'expiry'} = $borrower->{'dateexpiry'};
-
- return $patron;
+ my $borrower = GetMemberDetails( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
+
+ # Return the results
+ return {
+ type => $$borrower{categorycode},
+ status => 0, # TODO
+ expiry => $$borrower{dateexpiry},
+ };
}
=head2 GetServices
- Returns information about the services available on a particular item for
- a particular patron.
-
- Parameters:
+Returns information about the services available on a particular item for
+a particular patron.
+
+Parameters:
- - patron_id (Required)
- a borrowernumber
- - item_id (Required)
- an itemnumber
+ - patron_id (Required)
+ a borrowernumber
+ - item_id (Required)
+ an itemnumber
=cut
sub GetServices {
# Get the member, or return an error code if not found
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMemberDetails( $borrowernumber, undef );
- if ( not $borrower->{'borrowernumber'} ) {
- return { message => 'PatronNotFound' };
- }
+ my $borrower = GetMemberDetails( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
# Get the item, or return an error code if not found
my $itemnumber = $cgi->param('item_id');
- my $item = GetItem( $itemnumber, undef, undef );
- if ( not $item->{'itemnumber'} ) {
- return { message => 'RecordNotFound' };
- }
+ my $item = GetItem( $itemnumber );
+ return { code => 'RecordNotFound' } unless $$item{itemnumber};
my @availablefor;
=head2 RenewLoan
- Extends the due date for a borrower's existing issue.
-
- Parameters:
+Extends the due date for a borrower's existing issue.
+
+Parameters:
- - patron_id (Required)
- a borrowernumber
- - item_id (Required)
- an itemnumber
- - desired_due_date (Required)
- the date the patron would like the item returned by
+ - patron_id (Required)
+ a borrowernumber
+ - item_id (Required)
+ an itemnumber
+ - desired_due_date (Required)
+ the date the patron would like the item returned by
=cut
# Get borrower infos or return an error code
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMemberDetails( $borrowernumber, undef );
- if ( not $borrower->{'borrowernumber'} ) {
- return { message => 'PatronNotFound' };
- }
+ my $borrower = GetMemberDetails( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
# Get the item, or return an error code
my $itemnumber = $cgi->param('item_id');
- my $item = GetItem( $itemnumber, undef, undef );
- if ( not $item->{'itemnumber'} ) {
- return { message => 'RecordNotFound' };
- }
+ my $item = GetItem( $itemnumber );
+ return { code => 'RecordNotFound' } unless $$item{itemnumber};
# Add renewal if possible
my @renewal = CanBookBeRenewed( $borrowernumber, $itemnumber );
# Hashref building
my $out;
$out->{'renewals'} = $issue->{'renewals'};
- $out->{'date_due'} = $issue->{'date_due'};
+ $out->{date_due} = $issue->{date_due}->strftime('%Y-%m-%d %H:%S');
$out->{'success'} = $renewal[0];
$out->{'error'} = $renewal[1];
=head2 HoldTitle
- Creates, for a borrower, a biblio-level hold reserve.
-
- Parameters:
-
- - patron_id (Required)
- a borrowernumber
- - bib_id (Required)
- a biblionumber
- - request_location (Required)
- 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
- - needed_before_date (Optional)
- 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
+Creates, for a borrower, a biblio-level hold reserve.
+
+Parameters:
+
+ - patron_id (Required)
+ a borrowernumber
+ - bib_id (Required)
+ a biblionumber
+ - request_location (Required)
+ 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
+ - needed_before_date (Optional)
+ 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
=cut
# Get the borrower or return an error code
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMemberDetails( $borrowernumber, undef );
- if ( not $borrower->{'borrowernumber'} ) {
- return { message => 'PatronNotFound' };
- }
+ my $borrower = GetMemberDetails( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
# Get the biblio record, or return an error code
my $biblionumber = $cgi->param('bib_id');
- my ( $count, $biblio ) = GetBiblio($biblionumber);
- if ( not $biblio->{'biblionumber'} ) {
- return { message => 'RecordNotFound' };
- }
- my $title = $biblio->{'title'};
+ my $biblio = GetBiblio( $biblionumber );
+ return { code => 'RecordNotFound' } unless $$biblio{biblionumber};
+
+ my $title = $$biblio{title};
# Check if the biblio can be reserved
- my $canbereserved = CanBookBeReserved( $borrower, $biblionumber );
- if ( not $canbereserved ) {
- return { message => 'NotHoldable' };
- }
+ return { code => 'NotHoldable' } unless CanBookBeReserved( $borrowernumber, $biblionumber );
my $branch;
# Pickup branch management
if ( $cgi->param('pickup_location') ) {
$branch = $cgi->param('pickup_location');
- my $branches = GetBranches();
- if ( not $branches->{$branch} ) {
- return { message => 'LocationNotFound' };
- }
- } else { # if user provide no branch, use his own
- $branch = $borrower->{'branchcode'};
+ my $branches = GetBranches;
+ return { code => 'LocationNotFound' } unless $$branches{$branch};
+ } else { # if the request provide no branch, use the borrower's branch
+ $branch = $$borrower{branchcode};
}
# Add the reserve
- # $branch, $borrowernumber, $biblionumber, $constraint, $bibitems, $priority, $notes, $title, $checkitem, $found
- AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, 0, undef, $title, undef, undef );
+ # $branch, $borrowernumber, $biblionumber,
+ # $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 );
# Hashref building
my $out;
=head2 HoldItem
- Creates, for a borrower, an item-level hold request on a specific item of
- a bibliographic record in Koha.
+Creates, for a borrower, an item-level hold request on a specific item of
+a bibliographic record in Koha.
- Parameters:
+Parameters:
- - patron_id (Required)
- a borrowernumber
- - bib_id (Required)
- a biblionumber
- - item_id (Required)
- an itemnumber
- - pickup_location (Optional)
- 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
- - pickup_expiry_date (Optional)
- date after which item returned to shelf if item is not picked up
+ - patron_id (Required)
+ a borrowernumber
+ - bib_id (Required)
+ a biblionumber
+ - item_id (Required)
+ an itemnumber
+ - pickup_location (Optional)
+ 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
+ - pickup_expiry_date (Optional)
+ date after which item returned to shelf if item is not picked up
=cut
# Get the borrower or return an error code
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMemberDetails( $borrowernumber, undef );
- if ( not $borrower->{'borrowernumber'} ) {
- return { message => 'PatronNotFound' };
- }
+ my $borrower = GetMemberDetails( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
# Get the biblio or return an error code
my $biblionumber = $cgi->param('bib_id');
- my ( $count, $biblio ) = GetBiblio($biblionumber);
- if ( not $biblio->{'biblionumber'} ) {
- return { message => 'RecordNotFound' };
- }
- my $title = $biblio->{'title'};
+ my $biblio = GetBiblio($biblionumber);
+ return { code => 'RecordNotFound' } unless $$biblio{biblionumber};
+
+ my $title = $$biblio{title};
# Get the item or return an error code
my $itemnumber = $cgi->param('item_id');
- my $item = GetItem( $itemnumber, undef, undef );
- if ( not $item->{'itemnumber'} ) {
- return { message => 'RecordNotFound' };
- }
+ my $item = GetItem( $itemnumber );
+ return { code => 'RecordNotFound' } unless $$item{itemnumber};
- # if the biblio does not match the item, return an error code
- if ( $item->{'biblionumber'} ne $biblio->{'biblionumber'} ) {
- return { message => 'RecordNotFound' };
- }
+ # If the biblio does not match the item, return an error code
+ return { code => 'RecordNotFound' } if $$item{biblionumber} ne $$biblio{biblionumber};
# Check for item disponibility
- my $canitembereserved = IsAvailableForItemLevelRequest($itemnumber);
- my $canbookbereserved = CanBookBeReserved( $borrower, $biblionumber );
- if ( ( not $canbookbereserved ) or not($canitembereserved) ) {
- return { message => 'NotHoldable' };
- }
-
- my $branch;
+ my $canitembereserved = C4::Reserves::CanItemBeReserved( $borrowernumber, $itemnumber );
+ my $canbookbereserved = C4::Reserves::CanBookBeReserved( $borrowernumber, $biblionumber );
+ return { code => 'NotHoldable' } unless $canbookbereserved and $canitembereserved;
# Pickup branch management
+ my $branch;
if ( $cgi->param('pickup_location') ) {
$branch = $cgi->param('pickup_location');
my $branches = GetBranches();
- if ( not $branches->{$branch} ) {
- return { message => 'LocationNotFound' };
- }
- } else { # if user provide no branch, use his own
- $branch = $borrower->{'branchcode'};
- }
-
- my $rank;
- my $found;
-
- # Get rank and found
- $rank = '0' unless C4::Context->preference('ReservesNeedReturns');
- if ( $item->{'holdingbranch'} eq $branch ) {
- $found = 'W' unless C4::Context->preference('ReservesNeedReturns');
+ return { code => 'LocationNotFound' } unless $$branches{$branch};
+ } else { # if the request provide no branch, use the borrower's branch
+ $branch = $$borrower{branchcode};
}
# Add the reserve
- # $branch, $borrowernumber, $biblionumber, $constraint, $bibitems, $priority, $notes, $title, $checkitem, $found
- AddReserve( $branch, $borrowernumber, $biblionumber, 'a', undef, $rank, undef, $title, $itemnumber, $found );
+ # $branch, $borrowernumber, $biblionumber,
+ # $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 );
# Hashref building
my $out;
=head2 CancelHold
- Cancels an active reserve request for the borrower.
-
- Parameters:
+Cancels an active reserve request for the borrower.
- - patron_id (Required)
- a borrowernumber
- - item_id (Required)
- an itemnumber
+Parameters:
+
+ - patron_id (Required)
+ a borrowernumber
+ - item_id (Required)
+ an itemnumber
=cut
# Get the borrower or return an error code
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMemberDetails( $borrowernumber, undef );
- if ( not $borrower->{'borrowernumber'} ) {
- return { message => 'PatronNotFound' };
- }
+ my $borrower = GetMemberDetails( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
# Get the item or return an error code
my $itemnumber = $cgi->param('item_id');
- my $item = GetItem( $itemnumber, undef, undef );
- if ( not $item->{'itemnumber'} ) {
- return { message => 'RecordNotFound' };
- }
+ my $item = GetItem( $itemnumber );
+ return { code => 'RecordNotFound' } unless $$item{itemnumber};
# Get borrower's reserves
my @reserves = GetReservesFromBorrowernumber( $borrowernumber, undef );
}
# if the item was not reserved by the borrower, returns an error code
- if ( not grep { $itemnumber eq $_ } @reserveditems ) {
- return { message => 'NotCanceled' };
- }
+ return { code => 'NotCanceled' } unless any { $itemnumber eq $_ } @reserveditems;
# Cancel the reserve
- CancelReserve( $itemnumber, undef, $borrowernumber );
+ CancelReserve({ itemnumber => $itemnumber, borrowernumber => $borrowernumber });
+
+ return { code => 'Canceled' };
+}
+
+=head2 _availability
+
+Returns, for an itemnumber, an array containing availability information.
+
+ my ($biblionumber, $status, $msg, $location) = _availability($id);
+
+=cut
- return { message => 'Canceled' };
+sub _availability {
+ my ($itemnumber) = @_;
+ my $item = GetItem( $itemnumber, undef, undef );
+ if ( not $item->{'itemnumber'} ) {
+ return ( undef, 'unknown', 'Error: could not retrieve availability for this ID', undef );
+ }
+
+ my $biblionumber = $item->{'biblioitemnumber'};
+ my $location = GetBranchName( $item->{'holdingbranch'} );
+
+ if ( $item->{'notforloan'} ) {
+ return ( $biblionumber, 'not available', 'Not for loan', $location );
+ } elsif ( $item->{'onloan'} ) {
+ return ( $biblionumber, 'not available', 'Checked out', $location );
+ } elsif ( $item->{'itemlost'} ) {
+ return ( $biblionumber, 'not available', 'Item lost', $location );
+ } elsif ( $item->{'wthdrawn'} ) {
+ return ( $biblionumber, 'not available', 'Item withdrawn', $location );
+ } elsif ( $item->{'damaged'} ) {
+ return ( $biblionumber, 'not available', 'Item damaged', $location );
+ } else {
+ return ( $biblionumber, 'available', undef, $location );
+ }
}
1;