use warnings;
use C4::Members;
-use C4::Items;
-use C4::Circulation;
+use C4::Items qw( get_hostitemnumbers_of );
+use C4::Circulation qw( CanBookBeRenewed barcodedecode CanBookBeIssued AddRenewal );
use C4::Accounts;
-use C4::Biblio;
-use C4::Reserves qw(AddReserve GetReservesFromBiblionumber GetReservesFromBorrowernumber CanBookBeReserved CanItemBeReserved IsAvailableForItemLevelRequest);
+use C4::Biblio qw( GetMarcBiblio );
+use C4::Reserves qw( CanBookBeReserved IsAvailableForItemLevelRequest CalculatePriority AddReserve CanItemBeReserved );
use C4::Context;
-use C4::AuthoritiesMarc;
-use XML::Simple;
-use HTML::Entities;
+use C4::Auth;
use CGI qw ( -utf8 );
use DateTime;
use C4::Auth;
-use C4::Members::Attributes qw(GetBorrowerAttributes);
+use Koha::DateUtils qw( dt_from_string );
+use Koha::Biblios;
+use Koha::Checkouts;
+use Koha::Items;
use Koha::Libraries;
+use Koha::Patrons;
=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
+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 qw ( -utf8 );
+ 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 => '<?xml version="1.0" encoding="UTF-8" ?>',
- RootName => 'LookupPatron',
- SuppressEmpty => 1);
+ RootName => 'LookupPatron',
+ SuppressEmpty => 1);
=cut
=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:
=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
=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
=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
} else {
my $status;
my $msg;
- my $items = GetItemnumbersForBiblio($id);
- if ($items) {
+ my $items = Koha::Items->search({ biblionumber => $id });
+ if ($items->count) {
# Open XML
$out .= " <dlf:record>\n";
$out .= " <dlf:bibliographic id=\"" .$id. "\" />\n";
$out .= " <dlf:items>\n";
# We loop over the items to clean them
- foreach my $itemnumber (@$items) {
+ while ( my $item = $items->next ) {
+ my $itemnumber = $item->itemnumber;
my ( $biblionumber, $status, $msg, $location ) = _availability($itemnumber);
$out .= " <dlf:item id=\"" . $itemnumber . "\">\n";
$out .= " <dlf:simpleavailability>\n";
=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.
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
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();
}
# Get most of the needed data
my $biblioitemnumber = $biblioitem->{'biblioitemnumber'};
- my $reserves = GetReservesFromBiblionumber({ biblionumber => $biblionumber });
- my $issues = GetBiblioIssues($biblionumber);
- my $items = GetItemsByBiblioitemnumber($biblioitemnumber);
+ my $checkouts = Koha::Checkouts->search(
+ { biblionumber => $biblionumber },
+ {
+ join => 'item',
+ '+select' => ['item.barcode'],
+ '+as' => ['barcode'],
+ }
+ )->unblessed;
+ foreach my $checkout (@$checkouts) {
+ delete $checkout->{'borrowernumber'};
+ }
+ my @items = $biblio->items->as_list;
+
+ $biblioitem->{items}->{item} = [];
# We loop over the items to clean them
- foreach my $item (@$items) {
+ foreach my $item (@items) {
+ my %item = %{ $item->unblessed };
# This hides additionnal XML subfields, we don't need these info
- delete $item->{'more_subfields_xml'};
+ delete $item{'more_subfields_xml'};
# Display branch names instead of branch codes
- 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 : '';
+ my $home_library = $item->home_branch;
+ my $holding_library = $item->holding_branch;
+ $item{'homebranchname'} = $home_library ? $home_library->branchname : '';
+ $item{'holdingbranchname'} = $holding_library ? $holding_library->branchname : '';
+
+ if ($item->location) {
+ my $authorised_value = Koha::AuthorisedValues->find_by_koha_field({ kohafield => 'items.location', authorised_value => $item->location });
+ if ($authorised_value) {
+ $item{location_description} = $authorised_value->opac_description;
+ }
+ }
+
+ if ($item->itype) {
+ my $itemtype = Koha::ItemTypes->find($item->itype);
+ if ($itemtype) {
+ $item{itype_description} = $itemtype->description;
+ }
+ }
+
+ my $transfer = $item->get_transfer;
+ if ($transfer) {
+ $item{transfer} = {
+ datesent => $transfer->datesent,
+ frombranch => $transfer->frombranch,
+ tobranch => $transfer->tobranch,
+ };
+ }
+
+ push @{ $biblioitem->{items}->{item} }, \%item;
+ }
+
+ # Holds
+ my $holds = $biblio->current_holds->unblessed;
+ foreach my $hold (@$holds) {
+ delete $hold->{'borrowernumber'};
}
# Hashref building...
- $biblioitem->{'items'}->{'item'} = $items;
- $biblioitem->{'reserves'}->{'reserve'} = $reserves;
- $biblioitem->{'issues'}->{'issue'} = $issues;
+ $biblioitem->{'reserves'}->{'reserve'} = $holds;
+ $biblioitem->{'issues'}->{'issue'} = $checkouts;
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
+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:
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:
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' };
=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
# Get Member details
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMember( borrowernumber => $borrowernumber );
- return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
+ my $patron = Koha::Patrons->find( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $patron;
# Cleaning the borrower hashref
- my $flags = C4::Members::patronflags( $borrower );
- $borrower->{'charges'} = $flags>{'CHARGES'}->{'amount'};
+ 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'};
# Fines management
if ( $cgi->param('show_fines') && $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;
+ $borrower->{fines}{fine} = $patron->account->lines->unblessed;
}
# Reserves management
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 $library = Koha::Libraries->find( $reserve->{branchcode} );
+ 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
+ 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
- # Remove unwanted fields
- delete $item->{'more_subfields_xml'};
+ push @{ $borrower->{holds}{hold} }, $unblessed_hold;
- # Add additional fields
- $reserve->{'item'} = $item;
- $reserve->{'branchname'} = $branchname;
- $reserve->{'title'} = GetBiblio( $reserve->{'biblionumber'} )->{'title'};
}
- $borrower->{'holds'}->{'hold'} = \@reserves;
}
# Issues management
if ( $cgi->param('show_loans') && $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');
+ my $per_page = $cgi->param('loans_per_page');
+ my $page = $cgi->param('loans_page');
+
+ my $pending_checkouts = $patron->pending_checkouts;
+
+ if ($page || $per_page) {
+ $page ||= 1;
+ $per_page ||= 10;
+ $borrower->{total_loans} = $pending_checkouts->count();
+ $pending_checkouts = $pending_checkouts->search(undef, {
+ rows => $per_page,
+ page => $page,
+ });
}
- $borrower->{'loans'}->{'loan'} = $issues;
+
+ 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;
+ delete $issue->{'more_subfields_xml'};
+ push @checkouts, $issue
+ }
+ $borrower->{'loans'}->{'loan'} = \@checkouts;
}
- if ( $cgi->param('show_attributes') eq "1" ) {
- my $attrs = GetBorrowerAttributes( $borrowernumber, 0, 1 );
- $borrower->{'attributes'} = $attrs;
+ my $show_attributes = $cgi->param('show_attributes');
+ if ( $show_attributes && $show_attributes eq "1" ) {
+ # FIXME Regression expected here, we do not retrieve the same field as previously
+ # Waiting for answer on bug 14257 comment 15
+ $borrower->{'attributes'} = [
+ map {
+ $_->type->opac_display
+ ? {
+ %{ $_->unblessed },
+ %{ $_->type->unblessed },
+ value => $_->attribute, # Backward compatibility
+ value_description => $_->description, # Awkward retro-compability...
+ }
+ : ()
+ } $patron->extended_attributes->search
+ ];
}
+ # Add is expired information
+ $borrower->{'is_expired'} = $patron->is_expired ? 1 : 0;
+
return $borrower;
}
Parameters:
- patron_id (Required)
- the borrower ID
+ the borrower ID
=cut
# Get Member details
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMember( borrowernumber => $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
# Get the member, or return an error code if not found
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMember( borrowernumber => $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($item, $borrower);
+ my $canitembereserved = IsAvailableForItemLevelRequest($item, $patron);
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';
}
# 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';
}
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
# Get borrower infos or return an error code
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMember( borrowernumber => $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 ); }
+ if ( $renewal[0] ) { AddRenewal( $borrowernumber, $itemnumber, undef, undef, undef, undef, 0 ); }
- my $issue = GetItemIssue($itemnumber);
+ my $issue = $item->checkout;
+ return unless $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:%M');
$out->{'success'} = $renewal[0];
$out->{'error'} = $renewal[1];
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
- - 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
+ a branch code indicating the location to which to deliver the item for pickup
+ - start_date (Optional)
+ date after which hold request is no longer needed if the document has not been made available
+ - 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 = GetMember( borrowernumber => $borrowernumber );
- return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
+ my $patron = Koha::Patrons->find( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $patron;
+
+
+ # If borrower is restricted return an error code
+ return { code => 'PatronRestricted' } if $patron->is_debarred;
+
+ # Check for patron expired, category and syspref settings
+ return { code => 'PatronExpired' } if ($patron->category->effective_BlockExpiredPatronOpacActions && $patron->is_expired);
# 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;
$branch = $cgi->param('pickup_location');
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;
+ }
+
+ my $destination = Koha::Libraries->find($branch);
+ return { code => 'libraryNotPickupLocation' } unless $destination->pickup_location;
+ return { code => 'cannotBeTransferred' } unless $biblio->can_be_transferred({ to => $destination });
+
+ my $resdate;
+ if ( $cgi->param('start_date') ) {
+ $resdate = $cgi->param('start_date');
+ }
+
+ my $expdate;
+ if ( $cgi->param('expiry_date') ) {
+ $expdate = $cgi->param('expiry_date');
}
# Add the reserve
# $constraint, $bibitems, $priority, $resdate, $expdate, $notes,
# $title, $checkitem, $found
my $priority= C4::Reserves::CalculatePriority( $biblionumber );
- AddReserve( $branch, $borrowernumber, $biblionumber, undef, $priority, undef, undef, undef, $title, undef, undef );
+ AddReserve(
+ {
+ branchcode => $branch,
+ borrowernumber => $borrowernumber,
+ biblionumber => $biblionumber,
+ priority => $priority,
+ reservation_date => $resdate,
+ expiration_date => $expdate,
+ title => $title,
+ }
+ );
# Hashref building
my $out;
=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
- - 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
+ a branch code indicating the location to which to deliver the item for pickup
+ - start_date (Optional)
+ date after which hold request is no longer needed if the item has not been made available
+ - 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 = GetMember( borrowernumber => $borrowernumber );
- return { code => 'PatronNotFound' } unless $$borrower{borrowernumber};
+ my $patron = Koha::Patrons->find( $borrowernumber );
+ return { code => 'PatronNotFound' } unless $patron;
+
+ # If borrower is restricted return an error code
+ return { code => 'PatronRestricted' } if $patron->is_debarred;
+
+ # Check for patron expired, category and syspref settings
+ return { code => 'PatronExpired' } if ($patron->category->effective_BlockExpiredPatronOpacActions && $patron->is_expired);
# 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};
-
- # 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';
+ return { code => 'RecordNotFound' } if $item->biblionumber ne $biblio->biblionumber;
# Pickup branch management
my $branch;
$branch = $cgi->param('pickup_location');
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;
+ }
+
+ # Check for item disponibility
+ my $canitembereserved = C4::Reserves::CanItemBeReserved( $borrowernumber, $itemnumber, $branch )->{status};
+ return { code => $canitembereserved } unless $canitembereserved eq 'OK';
+
+ my $resdate;
+ if ( $cgi->param('start_date') ) {
+ $resdate = $cgi->param('start_date');
+ }
+
+ my $expdate;
+ if ( $cgi->param('expiry_date') ) {
+ $expdate = $cgi->param('expiry_date');
}
# Add the reserve
- # $branch, $borrowernumber, $biblionumber,
- # $constraint, $bibitems, $priority, $resdate, $expdate, $notes,
- # $title, $checkitem, $found
- my $priority= C4::Reserves::CalculatePriority( $biblionumber );
- AddReserve( $branch, $borrowernumber, $biblionumber, undef, $priority, undef, undef, undef, $title, $itemnumber, undef );
+ my $priority = C4::Reserves::CalculatePriority($biblionumber);
+ AddReserve(
+ {
+ branchcode => $branch,
+ borrowernumber => $borrowernumber,
+ biblionumber => $biblionumber,
+ priority => $priority,
+ reservation_date => $resdate,
+ expiration_date => $expdate,
+ title => $title,
+ itemnumber => $itemnumber,
+ }
+ );
# Hashref building
my $out;
# Get the borrower or return an error code
my $borrowernumber = $cgi->param('patron_id');
- my $borrower = GetMember( borrowernumber => $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' };
}
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 $library = Koha::Libraries->find( $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 );