Bug 13903: Add API routes to list, create, update, delete reserves
[koha.git] / Koha / REST / V1 / Reserve.pm
1 package Koha::REST::V1::Reserve;
2
3 # This file is part of Koha.
4 #
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.
9 #
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.
13 #
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.
17
18 use Modern::Perl;
19
20 use Mojo::Base 'Mojolicious::Controller';
21
22 use C4::Biblio;
23 use C4::Reserves;
24
25 use Koha::Patrons;
26 use Koha::DateUtils;
27
28 sub list {
29     my ($c, $args, $cb) = @_;
30
31     my $borrowernumber = $c->param('borrowernumber');
32     my $borrower = Koha::Patrons->find($borrowernumber);
33     unless ($borrower) {
34         return $c->$cb({error => "Borrower not found"}, 404);
35     }
36
37     my @reserves = C4::Reserves::GetReservesFromBorrowernumber($borrowernumber);
38
39     return $c->$cb(\@reserves, 200);
40 }
41
42 sub add {
43     my ($c, $args, $cb) = @_;
44
45     my $body = $c->req->json;
46
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);
55     }
56
57     unless ($biblionumber or $itemnumber) {
58         return $c->$cb({
59             error => "At least one of biblionumber, itemnumber should be given"
60         }, 400);
61     }
62     unless ($branchcode) {
63         return $c->$cb({
64             error => "Branchcode is required"
65         }, 400);
66     }
67
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);
74         }
75         $biblionumber ||= $item_biblionumber;
76     }
77
78     my $biblio = C4::Biblio::GetBiblio($biblionumber);
79
80     my $can_reserve =
81       $itemnumber
82       ? CanItemBeReserved( $borrowernumber, $itemnumber )
83       : CanBookBeReserved( $borrowernumber, $biblionumber );
84
85     unless ($can_reserve eq 'OK') {
86         return $c->$cb({
87             error => "Reserve cannot be placed. Reason: $can_reserve"
88         }, 403);
89     }
90
91     my $priority = C4::Reserves::CalculatePriority($biblionumber);
92     $itemnumber ||= undef;
93
94     # AddReserve expects date to be in syspref format
95     if ($expirationdate) {
96         $expirationdate = output_pref(dt_from_string($expirationdate, 'iso'));
97     }
98
99     my $reserve_id = C4::Reserves::AddReserve($branchcode, $borrowernumber,
100         $biblionumber, undef, $priority, undef, $expirationdate, undef,
101         $biblio->{title}, $itemnumber);
102
103     unless ($reserve_id) {
104         return $c->$cb({
105             error => "Error while placing reserve. See Koha logs for details."
106         }, 500);
107     }
108
109     my $reserve = C4::Reserves::GetReserve($reserve_id);
110
111     return $c->$cb($reserve, 201);
112 }
113
114 sub edit {
115     my ($c, $args, $cb) = @_;
116
117     my $reserve_id = $args->{reserve_id};
118     my $reserve = C4::Reserves::GetReserve($reserve_id);
119
120     unless ($reserve) {
121         return $c->$cb({error => "Reserve not found"}, 404);
122     }
123
124     my $body = $c->req->json;
125
126     my $branchcode = $body->{branchcode};
127     my $priority = $body->{priority};
128     my $suspend_until = $body->{suspend_until};
129
130     if ($suspend_until) {
131         $suspend_until = output_pref(dt_from_string($suspend_until, 'iso'));
132     }
133
134     my $params = {
135         reserve_id => $reserve_id,
136         branchcode => $branchcode,
137         rank => $priority,
138         suspend_until => $suspend_until,
139     };
140     C4::Reserves::ModReserve($params);
141     $reserve = C4::Reserves::GetReserve($reserve_id);
142
143     return $c->$cb($reserve, 200);
144 }
145
146 sub delete {
147     my ($c, $args, $cb) = @_;
148
149     my $reserve_id = $args->{reserve_id};
150     my $reserve = C4::Reserves::GetReserve($reserve_id);
151
152     unless ($reserve) {
153         return $c->$cb({error => "Reserve not found"}, 404);
154     }
155
156     C4::Reserves::CancelReserve({ reserve_id => $reserve_id });
157
158     return $c->$cb({}, 200);
159 }
160
161 1;