Bug 16271: Allow more filters on /api/v1/holds
[koha.git] / Koha / REST / V1 / Hold.pm
blob7f0b1ff269f7e41e900cfd4efb53f9275afa7b4d
1 package Koha::REST::V1::Hold;
3 # This file is part of Koha.
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 3 of the License, or (at your option) any later
8 # version.
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License along
15 # with Koha; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 use Modern::Perl;
20 use Mojo::Base 'Mojolicious::Controller';
22 use C4::Biblio;
23 use C4::Reserves;
25 use Koha::Patrons;
26 use Koha::Holds;
27 use Koha::DateUtils;
29 sub list {
30 my ($c, $args, $cb) = @_;
32 my $params = $c->req->query_params->to_hash;
33 my @valid_params = Koha::Holds->_resultset->result_source->columns;
34 foreach my $key (keys %$params) {
35 delete $params->{$key} unless grep { $key eq $_ } @valid_params;
37 my $holds = Koha::Holds->search($params)->unblessed;
39 return $c->$cb($holds, 200);
42 sub add {
43 my ($c, $args, $cb) = @_;
45 my $body = $c->req->json;
47 my $borrowernumber = $body->{borrowernumber};
48 my $biblionumber = $body->{biblionumber};
49 my $itemnumber = $body->{itemnumber};
50 my $branchcode = $body->{branchcode};
51 my $expirationdate = $body->{expirationdate};
52 my $borrower = Koha::Patrons->find($borrowernumber);
53 unless ($borrower) {
54 return $c->$cb({error => "Borrower not found"}, 404);
57 unless ($biblionumber or $itemnumber) {
58 return $c->$cb({
59 error => "At least one of biblionumber, itemnumber should be given"
60 }, 400);
62 unless ($branchcode) {
63 return $c->$cb({
64 error => "Branchcode is required"
65 }, 400);
68 if ($itemnumber) {
69 my $item_biblionumber = C4::Biblio::GetBiblionumberFromItemnumber($itemnumber);
70 if ($biblionumber and $biblionumber != $item_biblionumber) {
71 return $c->$cb({
72 error => "Item $itemnumber doesn't belong to biblio $biblionumber"
73 }, 400);
75 $biblionumber ||= $item_biblionumber;
78 my $biblio = C4::Biblio::GetBiblio($biblionumber);
80 my $can_reserve =
81 $itemnumber
82 ? CanItemBeReserved( $borrowernumber, $itemnumber )
83 : CanBookBeReserved( $borrowernumber, $biblionumber );
85 unless ($can_reserve eq 'OK') {
86 return $c->$cb({
87 error => "Reserve cannot be placed. Reason: $can_reserve"
88 }, 403);
91 my $priority = C4::Reserves::CalculatePriority($biblionumber);
92 $itemnumber ||= undef;
94 # AddReserve expects date to be in syspref format
95 if ($expirationdate) {
96 $expirationdate = output_pref(dt_from_string($expirationdate, 'iso'));
99 my $reserve_id = C4::Reserves::AddReserve($branchcode, $borrowernumber,
100 $biblionumber, undef, $priority, undef, $expirationdate, undef,
101 $biblio->{title}, $itemnumber);
103 unless ($reserve_id) {
104 return $c->$cb({
105 error => "Error while placing reserve. See Koha logs for details."
106 }, 500);
109 my $reserve = C4::Reserves::GetReserve($reserve_id);
111 return $c->$cb($reserve, 201);
114 sub edit {
115 my ($c, $args, $cb) = @_;
117 my $reserve_id = $args->{reserve_id};
118 my $reserve = C4::Reserves::GetReserve($reserve_id);
120 unless ($reserve) {
121 return $c->$cb({error => "Reserve not found"}, 404);
124 my $body = $c->req->json;
126 my $branchcode = $body->{branchcode};
127 my $priority = $body->{priority};
128 my $suspend_until = $body->{suspend_until};
130 if ($suspend_until) {
131 $suspend_until = output_pref(dt_from_string($suspend_until, 'iso'));
134 my $params = {
135 reserve_id => $reserve_id,
136 branchcode => $branchcode,
137 rank => $priority,
138 suspend_until => $suspend_until,
140 C4::Reserves::ModReserve($params);
141 $reserve = C4::Reserves::GetReserve($reserve_id);
143 return $c->$cb($reserve, 200);
146 sub delete {
147 my ($c, $args, $cb) = @_;
149 my $reserve_id = $args->{reserve_id};
150 my $reserve = C4::Reserves::GetReserve($reserve_id);
152 unless ($reserve) {
153 return $c->$cb({error => "Reserve not found"}, 404);
156 C4::Reserves::CancelReserve({ reserve_id => $reserve_id });
158 return $c->$cb({}, 200);