Main Koha release repository
https://koha-community.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.5 KiB
165 lines
4.5 KiB
package Koha::REST::V1::Hold;
|
|
|
|
# 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 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.
|
|
#
|
|
# 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 Modern::Perl;
|
|
|
|
use Mojo::Base 'Mojolicious::Controller';
|
|
|
|
use C4::Biblio;
|
|
use C4::Reserves;
|
|
|
|
use Koha::Items;
|
|
use Koha::Patrons;
|
|
use Koha::Holds;
|
|
use Koha::DateUtils;
|
|
|
|
sub list {
|
|
my ($c, $args, $cb) = @_;
|
|
|
|
my $params = $c->req->query_params->to_hash;
|
|
my @valid_params = Koha::Holds->_resultset->result_source->columns;
|
|
foreach my $key (keys %$params) {
|
|
delete $params->{$key} unless grep { $key eq $_ } @valid_params;
|
|
}
|
|
my $holds = Koha::Holds->search($params);
|
|
|
|
return $c->$cb($holds, 200);
|
|
}
|
|
|
|
sub add {
|
|
my ($c, $args, $cb) = @_;
|
|
|
|
my $body = $c->req->json;
|
|
|
|
my $borrowernumber = $body->{borrowernumber};
|
|
my $biblionumber = $body->{biblionumber};
|
|
my $itemnumber = $body->{itemnumber};
|
|
my $branchcode = $body->{branchcode};
|
|
my $expirationdate = $body->{expirationdate};
|
|
my $borrower = Koha::Patrons->find($borrowernumber);
|
|
unless ($borrower) {
|
|
return $c->$cb({error => "Borrower not found"}, 404);
|
|
}
|
|
|
|
unless ($biblionumber or $itemnumber) {
|
|
return $c->$cb({
|
|
error => "At least one of biblionumber, itemnumber should be given"
|
|
}, 400);
|
|
}
|
|
unless ($branchcode) {
|
|
return $c->$cb({
|
|
error => "Branchcode is required"
|
|
}, 400);
|
|
}
|
|
|
|
my $biblio;
|
|
if ($itemnumber) {
|
|
my $item = Koha::Items->find( $itemnumber );
|
|
$biblio = $item->biblio;
|
|
if ($biblionumber and $biblionumber != $biblio->biblionumber) {
|
|
return $c->$cb({
|
|
error => "Item $itemnumber doesn't belong to biblio $biblionumber"
|
|
}, 400);
|
|
}
|
|
$biblionumber ||= $biblio->biblionumber;
|
|
} else {
|
|
$biblio = Koha::Biblios->find( $biblionumber );
|
|
}
|
|
|
|
my $can_reserve =
|
|
$itemnumber
|
|
? CanItemBeReserved( $borrowernumber, $itemnumber )
|
|
: CanBookBeReserved( $borrowernumber, $biblionumber );
|
|
|
|
unless ($can_reserve eq 'OK') {
|
|
return $c->$cb({
|
|
error => "Reserve cannot be placed. Reason: $can_reserve"
|
|
}, 403);
|
|
}
|
|
|
|
my $priority = C4::Reserves::CalculatePriority($biblionumber);
|
|
$itemnumber ||= undef;
|
|
|
|
# AddReserve expects date to be in syspref format
|
|
if ($expirationdate) {
|
|
$expirationdate = output_pref(dt_from_string($expirationdate, 'iso'));
|
|
}
|
|
|
|
my $reserve_id = C4::Reserves::AddReserve($branchcode, $borrowernumber,
|
|
$biblionumber, undef, $priority, undef, $expirationdate, undef,
|
|
$biblio->title, $itemnumber);
|
|
|
|
unless ($reserve_id) {
|
|
return $c->$cb({
|
|
error => "Error while placing reserve. See Koha logs for details."
|
|
}, 500);
|
|
}
|
|
|
|
my $reserve = Koha::Holds->find($reserve_id);
|
|
|
|
return $c->$cb($reserve, 201);
|
|
}
|
|
|
|
sub edit {
|
|
my ($c, $args, $cb) = @_;
|
|
|
|
my $reserve_id = $args->{reserve_id};
|
|
my $reserve = C4::Reserves::GetReserve($reserve_id);
|
|
|
|
unless ($reserve) {
|
|
return $c->$cb({error => "Reserve not found"}, 404);
|
|
}
|
|
|
|
my $body = $c->req->json;
|
|
|
|
my $branchcode = $body->{branchcode};
|
|
my $priority = $body->{priority};
|
|
my $suspend_until = $body->{suspend_until};
|
|
|
|
if ($suspend_until) {
|
|
$suspend_until = output_pref(dt_from_string($suspend_until, 'iso'));
|
|
}
|
|
|
|
my $params = {
|
|
reserve_id => $reserve_id,
|
|
branchcode => $branchcode,
|
|
rank => $priority,
|
|
suspend_until => $suspend_until,
|
|
};
|
|
|
|
C4::Reserves::ModReserve($params);
|
|
$reserve = Koha::Holds->find($reserve_id);
|
|
|
|
return $c->$cb($reserve, 200);
|
|
}
|
|
|
|
sub delete {
|
|
my ($c, $args, $cb) = @_;
|
|
|
|
my $reserve_id = $args->{reserve_id};
|
|
my $reserve = C4::Reserves::GetReserve($reserve_id);
|
|
|
|
unless ($reserve) {
|
|
return $c->$cb({error => "Reserve not found"}, 404);
|
|
}
|
|
|
|
C4::Reserves::CancelReserve({ reserve_id => $reserve_id });
|
|
|
|
return $c->$cb({}, 200);
|
|
}
|
|
|
|
1;
|
|
|