|
Lines 52-64
sub list {
Link Here
|
| 52 |
try { |
52 |
try { |
| 53 |
my $checkouts_set; |
53 |
my $checkouts_set; |
| 54 |
|
54 |
|
| 55 |
if ( $checked_in ) { |
55 |
if ($checked_in) { |
| 56 |
$checkouts_set = Koha::Old::Checkouts->new; |
56 |
$checkouts_set = Koha::Old::Checkouts->new; |
| 57 |
} else { |
57 |
} else { |
| 58 |
$checkouts_set = Koha::Checkouts->new; |
58 |
$checkouts_set = Koha::Checkouts->new; |
| 59 |
} |
59 |
} |
| 60 |
|
60 |
|
| 61 |
my $checkouts = $c->objects->search( $checkouts_set ); |
61 |
my $checkouts = $c->objects->search($checkouts_set); |
| 62 |
|
62 |
|
| 63 |
return $c->render( |
63 |
return $c->render( |
| 64 |
status => 200, |
64 |
status => 200, |
|
Lines 79-91
sub get {
Link Here
|
| 79 |
my $c = shift->openapi->valid_input or return; |
79 |
my $c = shift->openapi->valid_input or return; |
| 80 |
|
80 |
|
| 81 |
my $checkout_id = $c->param('checkout_id'); |
81 |
my $checkout_id = $c->param('checkout_id'); |
| 82 |
my $checkout = Koha::Checkouts->find( $checkout_id ); |
82 |
my $checkout = Koha::Checkouts->find($checkout_id); |
| 83 |
$checkout = Koha::Old::Checkouts->find( $checkout_id ) |
83 |
$checkout = Koha::Old::Checkouts->find($checkout_id) |
| 84 |
unless ($checkout); |
84 |
unless ($checkout); |
| 85 |
|
85 |
|
| 86 |
unless ($checkout) { |
86 |
unless ($checkout) { |
| 87 |
return $c->render( |
87 |
return $c->render( |
| 88 |
status => 404, |
88 |
status => 404, |
| 89 |
openapi => { error => "Checkout doesn't exist" } |
89 |
openapi => { error => "Checkout doesn't exist" } |
| 90 |
); |
90 |
); |
| 91 |
} |
91 |
} |
|
Lines 95-102
sub get {
Link Here
|
| 95 |
status => 200, |
95 |
status => 200, |
| 96 |
openapi => $checkout->to_api |
96 |
openapi => $checkout->to_api |
| 97 |
); |
97 |
); |
| 98 |
} |
98 |
} catch { |
| 99 |
catch { |
|
|
| 100 |
$c->unhandled_exception($_); |
99 |
$c->unhandled_exception($_); |
| 101 |
}; |
100 |
}; |
| 102 |
} |
101 |
} |
|
Lines 115-129
sub _check_availability {
Link Here
|
| 115 |
my $ignore_reserves = 0; # Don't ignore reserves |
114 |
my $ignore_reserves = 0; # Don't ignore reserves |
| 116 |
my $params = { item => $item }; |
115 |
my $params = { item => $item }; |
| 117 |
|
116 |
|
| 118 |
my ( $impossible, $confirmation, $alerts, $messages ) = |
117 |
my ( $impossible, $confirmation, $alerts, $messages ) = C4::Circulation::CanBookBeIssued( |
| 119 |
C4::Circulation::CanBookBeIssued( $patron, undef, undef, $inprocess, |
118 |
$patron, undef, undef, $inprocess, |
| 120 |
$ignore_reserves, $params ); |
119 |
$ignore_reserves, $params |
|
|
120 |
); |
| 121 |
|
121 |
|
| 122 |
if ( $c->stash('is_public') ) { |
122 |
if ( $c->stash('is_public') ) { |
| 123 |
|
123 |
|
| 124 |
# Upgrade some confirmations to blockers |
124 |
# Upgrade some confirmations to blockers |
| 125 |
my @should_block = |
125 |
my @should_block = |
| 126 |
qw/TOO_MANY ISSUED_TO_ANOTHER RESERVED RESERVED_WAITING TRANSFERRED PROCESSING AGE_RESTRICTION/; |
126 |
qw/TOO_MANY ISSUED_TO_ANOTHER RESERVED RESERVED_WAITING TRANSFERRED PROCESSING AGE_RESTRICTION/; |
| 127 |
for my $block (@should_block) { |
127 |
for my $block (@should_block) { |
| 128 |
if ( exists( $confirmation->{$block} ) ) { |
128 |
if ( exists( $confirmation->{$block} ) ) { |
| 129 |
$impossible->{$block} = $confirmation->{$block}; |
129 |
$impossible->{$block} = $confirmation->{$block}; |
|
Lines 133-139
sub _check_availability {
Link Here
|
| 133 |
|
133 |
|
| 134 |
# Remove any non-public info that's returned by CanBookBeIssued |
134 |
# Remove any non-public info that's returned by CanBookBeIssued |
| 135 |
my @restricted_keys = |
135 |
my @restricted_keys = |
| 136 |
qw/issued_borrowernumber issued_cardnumber issued_firstname issued_surname resborrowernumber resbranchcode rescardnumber reserve_id resfirstname resreservedate ressurname item_notforloan/; |
136 |
qw/issued_borrowernumber issued_cardnumber issued_firstname issued_surname resborrowernumber resbranchcode rescardnumber reserve_id resfirstname resreservedate ressurname item_notforloan/; |
| 137 |
for my $key (@restricted_keys) { |
137 |
for my $key (@restricted_keys) { |
| 138 |
delete $confirmation->{$key}; |
138 |
delete $confirmation->{$key}; |
| 139 |
delete $impossible->{$key}; |
139 |
delete $impossible->{$key}; |
|
Lines 152-170
Controller function that handles retrieval of Checkout availability
Link Here
|
| 152 |
=cut |
152 |
=cut |
| 153 |
|
153 |
|
| 154 |
sub get_availability { |
154 |
sub get_availability { |
| 155 |
my $c = shift->openapi->valid_input or return; |
155 |
my $c = shift->openapi->valid_input or return; |
| 156 |
my $user = $c->stash('koha.user'); |
156 |
my $user = $c->stash('koha.user'); |
| 157 |
|
157 |
|
| 158 |
my $patron = Koha::Patrons->find( $c->param('patron_id') ); |
158 |
my $patron = Koha::Patrons->find( $c->param('patron_id') ); |
| 159 |
my $item = Koha::Items->find( $c->param('item_id') ); |
159 |
my $item = Koha::Items->find( $c->param('item_id') ); |
| 160 |
|
160 |
|
| 161 |
my ( $impossible, $confirmation, $warnings ) = |
161 |
my ( $impossible, $confirmation, $warnings ) = $c->_check_availability( $patron, $item ); |
| 162 |
$c->_check_availability( $patron, $item ); |
|
|
| 163 |
|
162 |
|
| 164 |
my @confirm_keys = sort keys %{$confirmation}; |
163 |
my @confirm_keys = sort keys %{$confirmation}; |
| 165 |
unshift @confirm_keys, $item->id; |
164 |
unshift @confirm_keys, $item->id; |
| 166 |
unshift @confirm_keys, $user->id |
165 |
unshift @confirm_keys, $user->id |
| 167 |
if $user; |
166 |
if $user; |
| 168 |
|
167 |
|
| 169 |
my $token = Koha::Token->new->generate_jwt( { id => join( ':', @confirm_keys ) } ); |
168 |
my $token = Koha::Token->new->generate_jwt( { id => join( ':', @confirm_keys ) } ); |
| 170 |
|
169 |
|
|
Lines 185-191
Add a new checkout
Link Here
|
| 185 |
=cut |
184 |
=cut |
| 186 |
|
185 |
|
| 187 |
sub add { |
186 |
sub add { |
| 188 |
my $c = shift->openapi->valid_input or return; |
187 |
my $c = shift->openapi->valid_input or return; |
| 189 |
my $user = $c->stash('koha.user'); |
188 |
my $user = $c->stash('koha.user'); |
| 190 |
|
189 |
|
| 191 |
my $body = $c->req->json; |
190 |
my $body = $c->req->json; |
|
Lines 228-235
sub add {
Link Here
|
| 228 |
); |
227 |
); |
| 229 |
} |
228 |
} |
| 230 |
|
229 |
|
| 231 |
my ( $impossible, $confirmation, $warnings ) = |
230 |
my ( $impossible, $confirmation, $warnings ) = $c->_check_availability( $patron, $item ); |
| 232 |
$c->_check_availability( $patron, $item ); |
|
|
| 233 |
|
231 |
|
| 234 |
# * Fail for blockers - render 403 |
232 |
# * Fail for blockers - render 403 |
| 235 |
if ( keys %{$impossible} ) { |
233 |
if ( keys %{$impossible} ) { |
|
Lines 250-257
sub add {
Link Here
|
| 250 |
if ( my $token = $c->param('confirmation') ) { |
248 |
if ( my $token = $c->param('confirmation') ) { |
| 251 |
my $confirm_keys = join( ":", sort keys %{$confirmation} ); |
249 |
my $confirm_keys = join( ":", sort keys %{$confirmation} ); |
| 252 |
$confirm_keys = $user->id . ":" . $item->id . ":" . $confirm_keys; |
250 |
$confirm_keys = $user->id . ":" . $item->id . ":" . $confirm_keys; |
| 253 |
$confirmed = Koha::Token->new->check_jwt( |
251 |
$confirmed = Koha::Token->new->check_jwt( { id => $confirm_keys, token => $token } ); |
| 254 |
{ id => $confirm_keys, token => $token } ); |
|
|
| 255 |
} |
252 |
} |
| 256 |
|
253 |
|
| 257 |
unless ($confirmed) { |
254 |
unless ($confirmed) { |
|
Lines 265-285
sub add {
Link Here
|
| 265 |
# Call 'AddIssue' |
262 |
# Call 'AddIssue' |
| 266 |
my $checkout = AddIssue( $patron->unblessed, $item->barcode ); |
263 |
my $checkout = AddIssue( $patron->unblessed, $item->barcode ); |
| 267 |
if ($checkout) { |
264 |
if ($checkout) { |
| 268 |
$c->res->headers->location( |
265 |
$c->res->headers->location( $c->req->url->to_string . '/' . $checkout->id ); |
| 269 |
$c->req->url->to_string . '/' . $checkout->id ); |
|
|
| 270 |
return $c->render( |
266 |
return $c->render( |
| 271 |
status => 201, |
267 |
status => 201, |
| 272 |
openapi => $checkout->to_api |
268 |
openapi => $checkout->to_api |
| 273 |
); |
269 |
); |
| 274 |
} |
270 |
} else { |
| 275 |
else { |
|
|
| 276 |
return $c->render( |
271 |
return $c->render( |
| 277 |
status => 500, |
272 |
status => 500, |
| 278 |
openapi => { error => 'Unknown error during checkout' } |
273 |
openapi => { error => 'Unknown error during checkout' } |
| 279 |
); |
274 |
); |
| 280 |
} |
275 |
} |
| 281 |
} |
276 |
} catch { |
| 282 |
catch { |
|
|
| 283 |
$c->unhandled_exception($_); |
277 |
$c->unhandled_exception($_); |
| 284 |
}; |
278 |
}; |
| 285 |
} |
279 |
} |
|
Lines 295-333
sub delete {
Link Here
|
| 295 |
|
289 |
|
| 296 |
my $c = shift->openapi->valid_input or return; |
290 |
my $c = shift->openapi->valid_input or return; |
| 297 |
|
291 |
|
| 298 |
my $body = $c->validation->param('body'); |
292 |
my $body = $c->validation->param('body'); |
| 299 |
my $item_id = $body->{item_id}; |
293 |
my $item_id = $body->{item_id}; |
| 300 |
|
294 |
|
| 301 |
return try { |
295 |
return try { |
| 302 |
my $item = Koha::Items->find($item_id); |
296 |
my $item = Koha::Items->find($item_id); |
| 303 |
unless ($item) { |
297 |
unless ($item) { |
| 304 |
return $c->render( |
298 |
return $c->render( |
| 305 |
status => 409, |
299 |
status => 409, |
| 306 |
openapi => { |
300 |
openapi => { error => 'Item not found' } |
| 307 |
error => 'Item not found' |
|
|
| 308 |
} |
| 309 |
); |
301 |
); |
| 310 |
} |
302 |
} |
| 311 |
my $checkout = Koha::Checkouts->find({ itemnumber => $item_id }); |
303 |
my $checkout = Koha::Checkouts->find( { itemnumber => $item_id } ); |
| 312 |
unless ( $checkout ) { |
304 |
unless ($checkout) { |
| 313 |
return $c->render( |
305 |
return $c->render( |
| 314 |
status => 400, |
306 |
status => 400, |
| 315 |
openapi => { error => "Item not checked out" } |
307 |
openapi => { error => "Item not checked out" } |
| 316 |
); |
308 |
); |
| 317 |
} |
309 |
} |
| 318 |
my $library_id = $c->validation->output->{library_id}; |
310 |
my $library_id = $c->validation->output->{library_id}; |
| 319 |
unless ( $library_id ) { |
311 |
unless ($library_id) { |
| 320 |
$library_id = $checkout->patron->branchcode; |
312 |
$library_id = $checkout->patron->branchcode; |
| 321 |
} |
313 |
} |
| 322 |
my $library = Koha::Libraries->find( $library_id ); |
314 |
my $library = Koha::Libraries->find($library_id); |
| 323 |
|
315 |
|
| 324 |
try { |
316 |
try { |
| 325 |
my $barcode = $item->barcode; |
317 |
my $barcode = $item->barcode; |
| 326 |
my ( $returned ) = C4::Circulation::AddReturn( $barcode, $library_id ); |
318 |
my ($returned) = C4::Circulation::AddReturn( $barcode, $library_id ); |
| 327 |
|
319 |
|
| 328 |
unless ( $returned ) { |
320 |
unless ($returned) { |
| 329 |
return $c->render( |
321 |
return $c->render( |
| 330 |
status => 403, |
322 |
status => 403, |
| 331 |
openapi => { error => "Checkin not allowed" } |
323 |
openapi => { error => "Checkin not allowed" } |
| 332 |
); |
324 |
); |
| 333 |
} |
325 |
} |
|
Lines 337-349
sub delete {
Link Here
|
| 337 |
status => 201, |
329 |
status => 201, |
| 338 |
openapi => $item->to_api |
330 |
openapi => $item->to_api |
| 339 |
); |
331 |
); |
| 340 |
} |
332 |
} catch { |
| 341 |
catch { |
|
|
| 342 |
$c->unhandled_exception($_); |
333 |
$c->unhandled_exception($_); |
| 343 |
}; |
334 |
}; |
| 344 |
} |
335 |
} |
| 345 |
} |
336 |
} |
| 346 |
|
|
|
| 347 |
|
337 |
|
| 348 |
=head3 get_renewals |
338 |
=head3 get_renewals |
| 349 |
|
339 |
|
|
Lines 358-364
sub get_renewals {
Link Here
|
| 358 |
my $checkout_id = $c->param('checkout_id'); |
348 |
my $checkout_id = $c->param('checkout_id'); |
| 359 |
my $checkout = Koha::Checkouts->find($checkout_id); |
349 |
my $checkout = Koha::Checkouts->find($checkout_id); |
| 360 |
$checkout = Koha::Old::Checkouts->find($checkout_id) |
350 |
$checkout = Koha::Old::Checkouts->find($checkout_id) |
| 361 |
unless ($checkout); |
351 |
unless ($checkout); |
| 362 |
|
352 |
|
| 363 |
unless ($checkout) { |
353 |
unless ($checkout) { |
| 364 |
return $c->render( |
354 |
return $c->render( |
|
Lines 368-386
sub get_renewals {
Link Here
|
| 368 |
} |
358 |
} |
| 369 |
|
359 |
|
| 370 |
my $renewals_rs = $checkout->renewals; |
360 |
my $renewals_rs = $checkout->renewals; |
| 371 |
my $renewals = $c->objects->search( $renewals_rs ); |
361 |
my $renewals = $c->objects->search($renewals_rs); |
| 372 |
|
362 |
|
| 373 |
return $c->render( |
363 |
return $c->render( |
| 374 |
status => 200, |
364 |
status => 200, |
| 375 |
openapi => $renewals |
365 |
openapi => $renewals |
| 376 |
); |
366 |
); |
| 377 |
} |
367 |
} catch { |
| 378 |
catch { |
|
|
| 379 |
$c->unhandled_exception($_); |
368 |
$c->unhandled_exception($_); |
| 380 |
}; |
369 |
}; |
| 381 |
} |
370 |
} |
| 382 |
|
371 |
|
| 383 |
|
|
|
| 384 |
=head3 renew |
372 |
=head3 renew |
| 385 |
|
373 |
|
| 386 |
Renew a checkout |
374 |
Renew a checkout |
|
Lines 391-412
sub renew {
Link Here
|
| 391 |
my $c = shift->openapi->valid_input or return; |
379 |
my $c = shift->openapi->valid_input or return; |
| 392 |
|
380 |
|
| 393 |
my $checkout_id = $c->param('checkout_id'); |
381 |
my $checkout_id = $c->param('checkout_id'); |
| 394 |
my $seen = $c->param('seen') || 1; |
382 |
my $seen = $c->param('seen') || 1; |
| 395 |
my $checkout = Koha::Checkouts->find( $checkout_id ); |
383 |
my $checkout = Koha::Checkouts->find($checkout_id); |
| 396 |
|
384 |
|
| 397 |
unless ($checkout) { |
385 |
unless ($checkout) { |
| 398 |
return $c->render( |
386 |
return $c->render( |
| 399 |
status => 404, |
387 |
status => 404, |
| 400 |
openapi => { error => "Checkout doesn't exist" } |
388 |
openapi => { error => "Checkout doesn't exist" } |
| 401 |
); |
389 |
); |
| 402 |
} |
390 |
} |
| 403 |
|
391 |
|
| 404 |
return try { |
392 |
return try { |
| 405 |
my ($can_renew, $error) = CanBookBeRenewed($checkout->patron, $checkout); |
393 |
my ( $can_renew, $error ) = CanBookBeRenewed( $checkout->patron, $checkout ); |
| 406 |
|
394 |
|
| 407 |
if (!$can_renew) { |
395 |
if ( !$can_renew ) { |
| 408 |
return $c->render( |
396 |
return $c->render( |
| 409 |
status => 403, |
397 |
status => 403, |
| 410 |
openapi => { error => "Renewal not authorized ($error)" } |
398 |
openapi => { error => "Renewal not authorized ($error)" } |
| 411 |
); |
399 |
); |
| 412 |
} |
400 |
} |
|
Lines 426-433
sub renew {
Link Here
|
| 426 |
status => 201, |
414 |
status => 201, |
| 427 |
openapi => $checkout->to_api |
415 |
openapi => $checkout->to_api |
| 428 |
); |
416 |
); |
| 429 |
} |
417 |
} catch { |
| 430 |
catch { |
|
|
| 431 |
$c->unhandled_exception($_); |
418 |
$c->unhandled_exception($_); |
| 432 |
}; |
419 |
}; |
| 433 |
} |
420 |
} |
|
Lines 442-458
sub allows_renewal {
Link Here
|
| 442 |
my $c = shift->openapi->valid_input or return; |
429 |
my $c = shift->openapi->valid_input or return; |
| 443 |
|
430 |
|
| 444 |
my $checkout_id = $c->param('checkout_id'); |
431 |
my $checkout_id = $c->param('checkout_id'); |
| 445 |
my $checkout = Koha::Checkouts->find( $checkout_id ); |
432 |
my $checkout = Koha::Checkouts->find($checkout_id); |
| 446 |
|
433 |
|
| 447 |
unless ($checkout) { |
434 |
unless ($checkout) { |
| 448 |
return $c->render( |
435 |
return $c->render( |
| 449 |
status => 404, |
436 |
status => 404, |
| 450 |
openapi => { error => "Checkout doesn't exist" } |
437 |
openapi => { error => "Checkout doesn't exist" } |
| 451 |
); |
438 |
); |
| 452 |
} |
439 |
} |
| 453 |
|
440 |
|
| 454 |
return try { |
441 |
return try { |
| 455 |
my ($can_renew, $error) = CanBookBeRenewed($checkout->patron, $checkout); |
442 |
my ( $can_renew, $error ) = CanBookBeRenewed( $checkout->patron, $checkout ); |
| 456 |
|
443 |
|
| 457 |
my $renewable = Mojo::JSON->false; |
444 |
my $renewable = Mojo::JSON->false; |
| 458 |
$renewable = Mojo::JSON->true if $can_renew; |
445 |
$renewable = Mojo::JSON->true if $can_renew; |
|
Lines 466-482
sub allows_renewal {
Link Here
|
| 466 |
} |
453 |
} |
| 467 |
); |
454 |
); |
| 468 |
return $c->render( |
455 |
return $c->render( |
| 469 |
status => 200, |
456 |
status => 200, |
| 470 |
openapi => { |
457 |
openapi => { |
| 471 |
allows_renewal => $renewable, |
458 |
allows_renewal => $renewable, |
| 472 |
max_renewals => $rule->rule_value, |
459 |
max_renewals => $rule->rule_value, |
| 473 |
current_renewals => $checkout->renewals_count, |
460 |
current_renewals => $checkout->renewals_count, |
| 474 |
unseen_renewals => $checkout->unseen_renewals, |
461 |
unseen_renewals => $checkout->unseen_renewals, |
| 475 |
error => $error |
462 |
error => $error |
| 476 |
} |
463 |
} |
| 477 |
); |
464 |
); |
| 478 |
} |
465 |
} catch { |
| 479 |
catch { |
|
|
| 480 |
$c->unhandled_exception($_); |
466 |
$c->unhandled_exception($_); |
| 481 |
}; |
467 |
}; |
| 482 |
} |
468 |
} |
| 483 |
- |
|
|