From 77e983bb13a04850938cfa1d7929a76b45dc21a8 Mon Sep 17 00:00:00 2001 From: Matt Blenkinsop Date: Fri, 31 May 2024 16:31:24 +0000 Subject: [PATCH] Bug 37115: Delete linked serial when deleting a single item Test plan: - Add a new subscription to a serial notice (with the option 'create an item record' selected) - Receive one issue and create the linked item - Return to the bibliographic record - Edit item - Action - Delete - Tick the box 'delete serial issues linked to item' and confirm - The item should still be deleted correctly - Back to subscription : the issue linked to the item doesn't exist any more Signed-off-by: Boubacar OUATTARA Signed-off-by: Nathalie --- Koha/Item.pm | 16 +++++-- Koha/Template/Plugin/Item.pm | 43 +++++++++++++++++++ cataloguing/additem.pl | 3 +- .../modals/delete_item_confirmation.inc | 30 +++++++++++++ .../prog/en/modules/cataloguing/additem.tt | 5 ++- .../prog/js/cataloging_additem.js | 25 ++++++++++- 6 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 Koha/Template/Plugin/Item.pm create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/modals/delete_item_confirmation.inc diff --git a/Koha/Item.pm b/Koha/Item.pm index e9501183363..e76d702480a 100644 --- a/Koha/Item.pm +++ b/Koha/Item.pm @@ -264,14 +264,24 @@ sub delete { my $self = shift; my $params = @_ ? shift : {}; - # FIXME check the item has no current issues - # i.e. raise the appropriate exception - # Get the item group so we can delete it later if it has no items left my $item_group = C4::Context->preference('EnableItemGroups') ? $self->item_group : undef; + my $serial_item = $self->serial_item; + my $result = $self->SUPER::delete; + # Delete the serial linked to the item if required + if ( $result && $params->{delete_serial_issues} ) { + if ($serial_item) { + my $serial = Koha::Serials->find( $serial_item->serialid ); + + # The serial_item is deleted by cascade when the item is deleted + # so we don't need to delete it here + $serial->delete; + } + } + # Delete the item group if it has no items left $item_group->delete if ( $item_group && $item_group->items->count == 0 ); diff --git a/Koha/Template/Plugin/Item.pm b/Koha/Template/Plugin/Item.pm new file mode 100644 index 00000000000..784a95c5160 --- /dev/null +++ b/Koha/Template/Plugin/Item.pm @@ -0,0 +1,43 @@ +package Koha::Template::Plugin::Item; + +# Copyright PTFS EUROPE 2024 + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use Template::Plugin; +use base qw( Template::Plugin ); + +use Koha::Items; + +=head1 METHODS + +=head2 HasSerialItem + +Checks whether a particular item has an associated serial item + +=cut + +sub HasSerialItem { + my ( $self, $itemnumber ) = @_; + + my $serial_item = Koha::Items->find($itemnumber)->serial_item; + + return $serial_item ? 1 : 0; +} + +1; diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl index 3d361ec1e63..84a0bfc0dc0 100755 --- a/cataloguing/additem.pl +++ b/cataloguing/additem.pl @@ -532,7 +532,8 @@ if ( $op eq "cud-additem" ) { my $item = Koha::Items->find($itemnumber); my $deleted; if ($item) { - $deleted = $item->safe_delete; + my $delete_serial_issues = $input->param('delete-serial-issues'); + $deleted = $item->safe_delete( { delete_serial_issues => $delete_serial_issues } ); } else { $deleted = Koha::Result::Boolean->new(0)->add_message( { message => 'item_not_found' } ); } diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/modals/delete_item_confirmation.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/modals/delete_item_confirmation.inc new file mode 100644 index 00000000000..4dbcc64e24d --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/modals/delete_item_confirmation.inc @@ -0,0 +1,30 @@ +[% USE Item %] + + + + diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt index 90fe28057ea..9cfb5583c5b 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt @@ -4,6 +4,7 @@ [% USE Branches %] [% USE KohaDates %] [% USE Price %] +[% USE Item %] [% USE TablesSettings %] [% PROCESS 'i18n.inc' %] [% INCLUDE 'doc-head-open.inc' %] @@ -183,8 +184,9 @@ + - Delete + Delete [% END %] [% END %] @@ -422,6 +424,7 @@ [% INCLUDE 'modals/cataloguing_create_av.inc' %] + [% INCLUDE 'modals/delete_item_confirmation.inc' %] diff --git a/koha-tmpl/intranet-tmpl/prog/js/cataloging_additem.js b/koha-tmpl/intranet-tmpl/prog/js/cataloging_additem.js index cfe10df1d8a..26576f6adc0 100644 --- a/koha-tmpl/intranet-tmpl/prog/js/cataloging_additem.js +++ b/koha-tmpl/intranet-tmpl/prog/js/cataloging_additem.js @@ -154,8 +154,31 @@ $(document).ready(function () { $(document).on("click", ".delete", function (e) { e.preventDefault(); if (confirmDelete(MSG_CONFIRM_DELETE_ITEM)) { - return $("#" + $(this).data("item") + "-delete-item-form").submit(); + var itemnumber = $(this).data("itemnumber"); + var hasSerialItem = $(this).data("has-serial-item"); + + $("#delete-item-itemnumber").val(itemnumber); + $("#delete_associated_serial_issues").attr("checked", false); + $("#delete-item-modal-btn-submit").data("item", itemnumber); + if (!hasSerialItem) { + $(".form-group").hide(); + } + $("#delete-item-modal").modal("show"); + } + }); + $(document).on("click", "#delete-item-modal-btn-submit", function (e) { + e.preventDefault(); + var itemnumber = $("#delete-item-itemnumber").val(); + var deleteSerialIssues = $("#delete_associated_serial_issues").prop( + "checked" + ) + ? true + : false; + $("#delete-item-modal").modal("hide"); + if (deleteSerialIssues) { + $("#" + itemnumber + "-delete-serial-issues").val("1"); } + return $("#" + $(this).data("item") + "-delete-item-form").submit(); }); /* On page load, check for location.hash in the page URL */ -- 2.48.1