Bug 34024: Block changing pickup location for found holds

This patch adds a check on holds for 'found' statuses. Holds with the
following statuses have special workflows in Koha, and overwritting
their pickup locations yields uncertain scenarios:

* Waiting: the item has probably been put on a special shelve
* In transit: the item is travelling to a new destination, and changing
  the pickup location should include some validations, and probably
  generate some notifications. At least.
* In processing: the item has already been taken out of the shelve for
  some internal processing. Changing the pickup location could interfere
  with this workflow. Overriding this limitation could be introduced
  with care on a separate report.

To test:
1. Apply the unit tests patch
2. Run:
   $ ktd --shell
  k$ prove t/db_dependent/api/v1/holds.t
=> FAIL: Tests don't pass. Holds go through (200) instead of being
rejected (409).
3. Apply this patch
4. Repeat 2
=> SUCCESS: Tests pass!
5. Sign off :-D

Signed-off-by: Sam Lau <samalau@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
(cherry picked from commit a1b5bd9534)
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
(cherry picked from commit 6b2b54151f)
Signed-off-by: Pedro Amorim <pedro.amorim@ptfs-europe.com>
This commit is contained in:
Tomas Cohen Arazi 2023-07-31 14:26:01 -03:00 committed by Pedro Amorim
parent 9ed11360d6
commit c46aa8af33
1 changed files with 11 additions and 0 deletions

View File

@ -540,6 +540,17 @@ sub update_pickup_location {
my $overrides = $c->stash('koha.overrides');
my $can_override = $overrides->{any} && C4::Context->preference('AllowHoldPolicyOverride');
my $error_code =
$hold->is_waiting ? 'hold_waiting'
: $hold->is_in_transit ? 'hold_in_transit'
: $hold->is_in_processing ? 'hold_in_processing'
: undef;
return $c->render(
status => 409,
openapi => { error => 'Cannot change pickup location', error_code => $error_code }
) if $error_code;
$hold->set_pickup_location(
{
library_id => $pickup_library_id,