diff --git a/Koha/Hold.pm b/Koha/Hold.pm
index 3c4fcb8362..efb5b916c5 100644
--- a/Koha/Hold.pm
+++ b/Koha/Hold.pm
@@ -250,6 +250,27 @@ sub move_hold {
return { success => 1, hold => $self };
}
+=head3 cleanup_hold_group
+
+$self->cleanup_hold_group;
+
+Check if a hold group is left with a single or zero holds. Delete hold_group if so.
+Accepts an optional $hold_group_id that, if defined, uses that instead of self->hold_group_id
+
+=cut
+
+sub cleanup_hold_group {
+ my ( $self, $hold_group_id ) = @_;
+
+ my $hold_group_id_to_check = $hold_group_id // $self->hold_group_id;
+ my $hold_group = Koha::HoldGroups->find($hold_group_id_to_check);
+ return unless $hold_group;
+
+ if ( $hold_group->holds->count <= 1 ) {
+ $hold_group->delete();
+ }
+}
+
=head3 set_transfer
=cut
@@ -744,9 +765,10 @@ sub cancellation_requested {
my $cancel_hold = $hold->cancel(
{
- [ charge_cancel_fee => 1||0, ]
- [ cancellation_reason => $cancellation_reason, ]
- [ skip_holds_queue => 1||0 ]
+ [ charge_cancel_fee => 1||0, ]
+ [ cancellation_reason => $cancellation_reason, ]
+ [ skip_holds_queue => 1||0 ]
+ [ skip_hold_group_cleanup => 1||0 ]
}
);
@@ -870,6 +892,8 @@ sub cancel {
}
);
+ $self->cleanup_hold_group() unless $params->{skip_hold_group_cleanup};
+
if ($autofill_next) {
my ( undef, $next_hold ) = C4::Reserves::CheckReserves( $self->item );
if ($next_hold) {
@@ -957,9 +981,10 @@ sub fill {
if ( $self->hold_group_id ) {
my @holds = $self->hold_group->holds->as_list;
foreach my $h (@holds) {
- $h->cancel unless $h->reserve_id == $self->id;
+ $h->cancel( { skip_hold_group_cleanup => 1 } ) unless $h->reserve_id == $self->id;
}
}
+ $self->cleanup_hold_group();
Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue(
{ biblio_ids => [ $old_me->biblionumber ] } )
diff --git a/Koha/Patron.pm b/Koha/Patron.pm
index 745355819d..20e9c71415 100644
--- a/Koha/Patron.pm
+++ b/Koha/Patron.pm
@@ -1912,6 +1912,8 @@ Creates and returns a hold group given a list of hold ids
If force_grouped is supplied, the hold group will be created even if the holds are already grouped
+Checks if the hold is moving from another group, and if so, removes the old group if empty
+
=cut
sub create_hold_group {
@@ -1968,9 +1970,13 @@ sub create_hold_group {
{ visual_hold_group_id => $next_available_visual_hold_group_id }
);
foreach my $hold_id (@$hold_ids) {
- my $hold = Koha::Holds->find($hold_id);
+ my $hold = Koha::Holds->find($hold_id);
+ my $previous_hold_group_id = $hold->hold_group_id;
$hold->hold_group_id( $hold_group_rs->hold_group_id )->store;
+ if ( $previous_hold_group_id && $previous_hold_group_id != $hold_group_rs->hold_group_id ) {
+ $hold->cleanup_hold_group($previous_hold_group_id);
+ }
}
return Koha::HoldGroup->_new_from_dbic($hold_group_rs);
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/modals/holds_table_modals.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/modals/holds_table_modals.inc
index 7beb583dff..e8a458bfb1 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/modals/holds_table_modals.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/modals/holds_table_modals.inc
@@ -74,3 +74,24 @@
[% END %]
+
+[% BLOCK 'group-hold-modal' %]
+
+
+
+
+
+
Are you sure you want to group the selected holds?
+
+
+
+
+
+
+[% END %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/patron-detail-tabs.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/patron-detail-tabs.inc
index 649150a02f..0805755b9c 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/patron-detail-tabs.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/patron-detail-tabs.inc
@@ -150,6 +150,9 @@
|
Hold date |
+ [% IF Koha.Preference('DisplayAddHoldGroups') %]
+ Hold group |
+ [% END %]
Title |
Call number |
Item type |
@@ -171,6 +174,12 @@
[% PROCESS 'cancel-hold-modal' form_action = '/cgi-bin/koha/reserve/modrequest.pl' from_param = patronpage %]
[% PROCESS 'suspend-hold-modal' %]
+ [% PROCESS 'group-hold-modal' %]
+ [% IF Koha.Preference('DisplayAddHoldGroups') %]
+
+ [% END # IF DisplayAddHoldGroups %]
[% IF Koha.Preference('SuspendHoldsIntranet') %]