Bugzilla – Attachment 185612 Details for
Bug 31698
Add ability to move a hold to a new bibliographic record/item
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 31698: Disallow moving waiting or intransit holds
Bug-31698-Disallow-moving-waiting-or-intransit-hol.patch (text/plain), 10.04 KB, created by
Lucas Gass (lukeg)
on 2025-08-20 21:08:56 UTC
(
hide
)
Description:
Bug 31698: Disallow moving waiting or intransit holds
Filename:
MIME Type:
Creator:
Lucas Gass (lukeg)
Created:
2025-08-20 21:08:56 UTC
Size:
10.04 KB
patch
obsolete
>From f34501305d1d9020165fdbf0ed22179e5619dac7 Mon Sep 17 00:00:00 2001 >From: Lucas Gass <lucas@bywatersolutions.com> >Date: Mon, 5 May 2025 22:16:02 +0000 >Subject: [PATCH] Bug 31698: Disallow moving waiting or intransit holds > >Signed-off-by: kristi <kkrueger@cuyahogalibrary.org> >--- > Koha/Hold.pm | 71 +++++++++++++++++++ > .../prog/en/includes/holds_table.inc | 12 +++- > .../prog/en/modules/reserve/request.tt | 13 ++-- > t/db_dependent/Koha/Hold.t | 30 +++++++- > 4 files changed, 119 insertions(+), 7 deletions(-) > >diff --git a/Koha/Hold.pm b/Koha/Hold.pm >index c44d46a56a9..7b8681e2fee 100644 >--- a/Koha/Hold.pm >+++ b/Koha/Hold.pm >@@ -178,6 +178,77 @@ sub delete { > return $deleted; > } > >+=head3 move_hold >+ >+$hold->move_hold(); >+ >+=cut >+ >+sub move_hold { >+ my ( $self, $args ) = @_; >+ >+ my $original = $self; >+ my $original_biblionumber = $self->biblionumber; >+ >+ my $found = $original->found // ''; >+ >+ if ( $found eq 'W' ) { >+ return { success => 0, error => 'Cannot move a waiting hold' }; >+ } >+ >+ if ( $found eq 'T' ) { >+ return { success => 0, error => 'Cannot move a hold in transit' }; >+ } >+ >+ my $patron = Koha::Patrons->find( { borrowernumber => $self->borrowernumber } ); >+ return { success => 0, error => 'Missing patron or target' } unless $patron; >+ >+ my ( $new_biblionumber, $new_itemnumber, $item, $canReserve ); >+ >+ if ( $args->{new_itemnumber} ) { >+ $item = Koha::Items->find( { itemnumber => $args->{new_itemnumber} } ) >+ or return { success => 0, error => 'Target item not found' }; >+ >+ $new_itemnumber = $item->itemnumber; >+ $new_biblionumber = $item->biblionumber; >+ >+ $canReserve = C4::Reserves::CanItemBeReserved( $patron, $item, $self->branchcode, { ignore_hold_counts => 1 } ); >+ } elsif ( $args->{new_biblionumber} ) { >+ $new_biblionumber = $args->{new_biblionumber}; >+ >+ $canReserve = C4::Reserves::CanBookBeReserved( >+ $patron->borrowernumber, $new_biblionumber, $self->branchcode, >+ { ignore_hold_counts => 1 } >+ ); >+ } else { >+ return { success => 0, error => 'Missing itemnumber or biblionumber' }; >+ } >+ >+ return { success => 0, error => $canReserve->{status} } >+ unless $canReserve->{status} eq 'OK'; >+ >+ my $max = Koha::Holds->search( >+ { biblionumber => $new_biblionumber }, >+ { order_by => { -desc => 'priority' }, rows => 1 } >+ )->next; >+ my $base_priority = $max ? $max->priority : 0; >+ my $priority = $base_priority + 1; >+ my $new_priority = C4::Reserves::_ShiftPriority( $new_biblionumber, $priority ); >+ >+ $self->update( >+ { >+ itemnumber => $new_itemnumber, # undef for biblio-level is fine >+ biblionumber => $new_biblionumber, >+ priority => $new_priority, >+ } >+ ); >+ >+ C4::Log::logaction( 'HOLDS', 'MODIFY', $self->reserve_id, $self, undef, $original ) >+ if C4::Context->preference('HoldsLog'); >+ >+ return { success => 1, hold => $self }; >+} >+ > =head3 set_transfer > > =cut >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc >index 70ff63bf366..1515ea767c4 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/holds_table.inc >@@ -46,7 +46,17 @@ > [%- END -%] > [% SET tr_class = hold.suspend ? 'suspend' : '' %] > <tr class="[% tr_class | html %]"> >- <td><input type="checkbox" class="select_hold" data-id="[% hold.reserve_id | html %]" /></td> >+ <td >+ ><input >+ type="checkbox" >+ class="select_hold" >+ data-id="[% hold.reserve_id | html %]" >+ data-item_level_hold="[% hold.item_level_hold | html %]" >+ data-itemnumber="[% hold.itemnumber | html %]" >+ data-biblionumber="[% hold.biblionumber | html %]" >+ data-waiting="[% hold.atdestination | html %]" >+ data-intransit="[% hold.intransit | html %]" >+ /></td> > <td> > <input type="hidden" name="reserve_id" value="[% hold.reserve_id | html %]" /> > <input type="hidden" name="borrowernumber" value="[% hold.borrowernumber | html %]" /> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt >index 45682e1c7b1..d2279de70d4 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt >@@ -2055,9 +2055,11 @@ > let reserve_biblionumber = $(this).data('biblionumber'); > let reserve_itemnumber = $(this).data('itemnumber'); > let item_level_hold = $(this).data('item_level_hold'); >- let error_message = $(this).data('item_level_hold') ? "" : _("Cannot move a waiting or record level hold"); >+ let item_waiting = $(this).data('waiting'); >+ let item_intransit = $(this).data('intransit'); >+ let error_message = $(this).data('item_level_hold') ? "" : _("Cannot move a waiting, in transit, or record level hold"); > let found_status = $(this).data('found'); >- if ( item_level_hold ) { >+ if ( item_level_hold && ( !item_waiting || !item_intransit ) ) { > $('#move_hold_item_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" checked /></td><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a> Itemnumber: <a target="_blank" href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=${reserve_biblionumber}#item${reserve_itemnumber}">${reserve_itemnumber}</a></td><td>${error_message}</td></tr>`) > } else { > $('#move_hold_item_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" disabled /></td><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a> Itemnumber: <a target="_blank" href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=${reserve_biblionumber}#item${reserve_itemnumber}">${reserve_itemnumber}</a></td><td>${error_message}</td></tr>`) >@@ -2078,9 +2080,12 @@ > let reserve_biblionumber = $(this).data('biblionumber'); > let reserve_itemnumber = $(this).data('itemnumber'); > let item_level_hold = $(this).data('item_level_hold'); >- let error_message = $(this).data('item_level_hold') ? _("Cannot move a waiting or item level hold") : ""; >+ let item_status = $(this).data('status'); >+ let item_waiting = $(this).data('waiting'); >+ let item_intransit = $(this).data('intransit'); >+ let error_message = $(this).data('item_level_hold') ? _("Cannot move a waiting, in transit, or item level hold") : ""; > let found_status = $(this).data('found'); >- if ( !item_level_hold ) { >+ if ( !item_level_hold && ( !item_waiting || !item_intransit ) ) { > $('#move_hold_biblio_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" checked /><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a></td><td>${error_message}</td></tr>`) > } else { > $('#move_hold_biblio_selection table').append(`<tr><td><input type="checkbox" name="move_hold_id" value="${reserve_id}" disabled /><td>${reserve_id}</td><td>Biblionumber: <a target="_blank" href="/cgi-bin/koha/reserve/request.pl?biblionumber=${reserve_biblionumber}">${reserve_biblionumber}</a></td><td>${error_message}</td></tr>`) >diff --git a/t/db_dependent/Koha/Hold.t b/t/db_dependent/Koha/Hold.t >index 96aa4ee940a..e3d5ad31d58 100755 >--- a/t/db_dependent/Koha/Hold.t >+++ b/t/db_dependent/Koha/Hold.t >@@ -1495,7 +1495,7 @@ subtest 'revert_waiting() tests' => sub { > }; > }; > subtest 'move_hold() tests' => sub { >- plan tests => 11; >+ plan tests => 13; > $schema->storage->txn_begin; > > my $patron = Koha::Patron->new( >@@ -1638,7 +1638,33 @@ subtest 'move_hold() tests' => sub { > is( $logs_2->count, 1, 'Hold modification was logged' ); > > #disable HoldsLog >- t::lib::Mocks::mock_preference( 'HoldsLog', 1 ); >+ t::lib::Mocks::mock_preference( 'HoldsLog', 0 ); >+ >+ my $hold_6 = Koha::Hold->new( >+ { >+ borrowernumber => $patron_4->borrowernumber, >+ biblionumber => $biblio4->biblionumber, >+ itemnumber => $item_4->itemnumber, >+ branchcode => 'CPL', >+ found => 'W', >+ } >+ )->store; >+ >+ my $result_4 = $hold_6->move_hold( { new_biblionumber => $biblio1->biblionumber } ); >+ is( $result_4->{error}, 'Cannot move a waiting hold', 'Correct error for waiting hold' ); >+ >+ my $hold_7 = Koha::Hold->new( >+ { >+ borrowernumber => $patron_4->borrowernumber, >+ biblionumber => $biblio4->biblionumber, >+ itemnumber => $item_4->itemnumber, >+ branchcode => 'CPL', >+ found => 'T', >+ } >+ )->store; >+ >+ my $result_5 = $hold_7->move_hold( { new_biblionumber => $biblio1->biblionumber } ); >+ is( $result_5->{error}, 'Cannot move a hold in transit', 'Correct error for hold instransit' ); > > $schema->storage->txn_rollback; > }; >-- >2.39.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 31698
:
179226
|
179235
|
179236
|
179279
|
179287
|
179290
|
179291
|
179292
|
179295
|
179704
|
179711
|
179713
|
181222
|
181223
|
181224
|
181225
|
181226
|
181228
|
181229
|
181230
|
181231
|
181232
|
181233
|
181234
|
181929
|
181930
|
181944
|
181945
|
181946
|
181947
|
181948
|
181951
|
181952
|
181953
|
181954
|
181955
|
181956
|
181957
|
181958
|
181959
|
181960
|
181961
|
181962
|
182639
|
182640
|
182641
|
184750
|
185050
|
185064
|
185065
|
185066
|
185067
|
185068
|
185069
|
185070
|
185121
|
185379
|
185380
|
185607
|
185608
|
185609
|
185610
|
185611
|
185612
|
185613
|
185614
|
185615
|
185616
|
185753
|
185754
|
185755
|
185756
|
185757
|
185758
|
185759
|
185760
|
185761
|
185762
|
185763
|
185764
|
185765
|
185766
|
185767
|
185768
|
185769
|
185770
|
185771
|
185772
|
185773
|
185774
|
185775
|
185776
|
185834