Koha/serials/serials-collection.pl
Jonathan Druart 381898d8ca Bug 29790: Restore warning if deletion of serial item fails
If the deletion of a serial item failed, the UI did not provide a warning/error message.

Test plan:
0. Create a new subscription with "Create an item record when receiving
this serial"
1. Receive a new item, set a barcode
2. Check it out
3. Select the item you have received in the serial item list (page
"Serial collection information") and click "Delete selected issues"
4. Tick "Delete the associated items" and confirm the deletion
=> Without this patch the deletion fail but the UI does not warn it
=> With this patch applied you see a warning "one or more associated
items could not be deleted at this time."

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
2022-01-11 12:38:35 -10:00

215 lines
9.3 KiB
Perl
Executable file

#!/usr/bin/perl
# Copyright 2000-2002 Katipo Communications
# Parts Copyright 2010 Biblibre
#
# 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 <http://www.gnu.org/licenses>.
use Modern::Perl;
use CGI qw ( -utf8 );
use C4::Auth qw( get_template_and_user );
use C4::Serials qw( ModSerialStatus GetSubscription GetNextExpected GetNextSeq GetNextDate NewIssue HasSubscriptionExpired abouttoexpire check_routing GetFullSubscription PrepareSerialsData CountSubscriptionFromBiblionumber GetSubscriptionsFromBiblionumber GetFullSubscriptionsFromBiblionumber );
use C4::Output qw( output_and_exit output_html_with_http_headers );
use C4::Context;
use Koha::Serial::Items;
use Koha::DateUtils qw( dt_from_string );
use List::MoreUtils qw( uniq );
my $query = CGI->new;
my $op = $query->param('op') || q{};
my $nbissues=$query->param('nbissues');
my $date_received_today = $query->param('date_received_today') || 0;
my $dbh = C4::Context->dbh;
my ($template, $loggedinuser, $cookie)
= get_template_and_user({template_name => "serials/serials-collection.tt",
query => $query,
type => "intranet",
flagsrequired => {serials => '*'},
});
my $biblionumber = $query->param('biblionumber');
my @subscriptionid = $query->multi_param('subscriptionid');
@subscriptionid= uniq @subscriptionid;
@subscriptionid= sort @subscriptionid;
my $subscriptiondescs;
my $subscriptions;
if($op eq 'gennext' && @subscriptionid){
my $subscriptionid = $subscriptionid[0];
my $sth = $dbh->prepare("
SELECT publisheddate, publisheddatetext, serialid, serialseq,
planneddate, notes, routingnotes
FROM serial
WHERE status = 1 AND subscriptionid = ?
");
my $status = defined( $nbissues ) ? 2 : 3;
$nbissues ||= 1;
for ( my $i = 0; $i < $nbissues; $i++ ){
$sth->execute($subscriptionid);
# modify actual expected issue, to generate the next
if ( my $issue = $sth->fetchrow_hashref ) {
my $planneddate = $date_received_today ? dt_from_string : $issue->{planneddate};
ModSerialStatus( $issue->{serialid}, $issue->{serialseq},
$planneddate, $issue->{publisheddate},
$issue->{publisheddatetext}, $status, "" );
} else {
require C4::Serials::Numberpattern;
my $subscription = GetSubscription($subscriptionid);
my $pattern = C4::Serials::Numberpattern::GetSubscriptionNumberpattern($subscription->{numberpattern});
my $frequency = C4::Serials::Frequency::GetSubscriptionFrequency($subscription->{periodicity});
my $expected = GetNextExpected($subscriptionid);
my (
$newserialseq, $newlastvalue1, $newlastvalue2, $newlastvalue3,
$newinnerloop1, $newinnerloop2, $newinnerloop3
) = GetNextSeq($subscription, $pattern, $frequency, $expected->{publisheddate});
## We generate the next publication date
my $nextpublisheddate = GetNextDate($subscription, $expected->{publisheddate}, $frequency, 1);
my $planneddate = $date_received_today ? dt_from_string : $nextpublisheddate;
## Creating the new issue
NewIssue( $newserialseq, $subscriptionid, $subscription->{'biblionumber'},
1, $planneddate, $nextpublisheddate, undef,
$issue->{notes}, $issue->{routingnotes} );
## Updating the subscription seq status
my $squery = "UPDATE subscription SET lastvalue1=?, lastvalue2=?, lastvalue3=?, innerloop1=?, innerloop2=?, innerloop3=?
WHERE subscriptionid = ?";
my $seqsth = $dbh->prepare($squery);
$seqsth->execute(
$newlastvalue1, $newlastvalue2, $newlastvalue3, $newinnerloop1,
$newinnerloop2, $newinnerloop3, $subscriptionid
);
}
last if $nbissues == 1;
last if HasSubscriptionExpired($subscriptionid) > 0;
}
print $query->redirect('/cgi-bin/koha/serials/serials-collection.pl?subscriptionid='.$subscriptionid);
exit;
}
my $countitems = 0;
my @serialsid = $query->multi_param('serialid');
my $subscriptionid = $subscriptionid[0];
if($op eq 'delete_confirm'){
foreach my $serialid (@serialsid){
$countitems += Koha::Serial::Items->search({serialid => $serialid})->count();
}
}elsif($op eq 'delete_confirmed'){
if($query->param('delitems') eq "Yes"){
my @itemnumbers;
foreach my $serialid (@serialsid){
my @ids = Koha::Serial::Items->search({serialid => $serialid})->get_column('itemnumber');
push(@itemnumbers, @ids);
}
my $items = Koha::Items->search({ itemnumber => \@itemnumbers });
while ( my $item = $items->next ) {
my $deleted = $item->safe_delete;
$template->param(error_delitem => 1)
unless $deleted;
}
}
for my $serialid (@serialsid){
my $serial = Koha::Serials->find($serialid);
ModSerialStatus($serialid, $serial->serialseq, $serial->planneddate, $serial->publisheddate, $serial->publisheddatetext, 6, "");
}
}
my $subscriptioncount;
my ($location, $callnumber);
if (@subscriptionid){
my @subscriptioninformation=();
my $closed = 0;
foreach my $subscriptionid (@subscriptionid){
my $subs= GetSubscription($subscriptionid);
next unless $subs;
$closed = 1 if $subs->{closed};
##these are display information
$subs->{'abouttoexpire'}=abouttoexpire($subs->{'subscriptionid'});
$subs->{'subscriptionexpired'}=HasSubscriptionExpired($subs->{'subscriptionid'});
$subs->{'subscriptionid'} = $subscriptionid; # FIXME - why was this lost ?
$location = $subs->{'location'};
$callnumber = $subs->{callnumber};
my $frequency = C4::Serials::Frequency::GetSubscriptionFrequency($subs->{periodicity});
my $numberpattern = C4::Serials::Numberpattern::GetSubscriptionNumberpattern($subs->{numberpattern});
$subs->{frequency} = $frequency;
$subs->{numberpattern} = $numberpattern;
$subs->{'hasRouting'} = check_routing($subscriptionid);
push @$subscriptiondescs,$subs;
my $tmpsubscription= GetFullSubscription($subscriptionid);
@subscriptioninformation=(@$tmpsubscription,@subscriptioninformation);
}
output_and_exit( $query, $cookie, $template, 'unknown_subscription') unless @subscriptioninformation;
$template->param(closed => $closed);
$subscriptions=PrepareSerialsData(\@subscriptioninformation);
$subscriptioncount = CountSubscriptionFromBiblionumber($subscriptiondescs->[0]{'biblionumber'});
} else {
$subscriptiondescs = GetSubscriptionsFromBiblionumber($biblionumber);
foreach my $s (@$subscriptiondescs) {
my $frequency = C4::Serials::Frequency::GetSubscriptionFrequency($s->{periodicity});
my $numberpattern = C4::Serials::Numberpattern::GetSubscriptionNumberpattern($s->{numberpattern});
$s->{frequency} = $frequency;
$s->{numberpattern} = $numberpattern;
}
my $subscriptioninformation = GetFullSubscriptionsFromBiblionumber($biblionumber);
$subscriptions=PrepareSerialsData($subscriptioninformation);
}
my $title = $subscriptiondescs->[0]{bibliotitle};
my $yearmax=($subscriptions->[0]{year} eq "manage" && scalar(@$subscriptions)>1)? $subscriptions->[1]{year} :$subscriptions->[0]{year};
my $yearmin=$subscriptions->[scalar(@$subscriptions)-1]{year};
my $subscriptionidlist="";
foreach my $subscription (@$subscriptiondescs){
$subscriptionidlist.=$subscription->{'subscriptionid'}."," ;
$biblionumber = $subscription->{'bibnum'} unless ($biblionumber);
$subscription->{'hasRouting'} = check_routing($subscription->{'subscriptionid'});
}
chop $subscriptionidlist;
$template->param(
subscriptionidlist => $subscriptionidlist,
biblionumber => $biblionumber,
subscriptions => $subscriptiondescs,
years => $subscriptions,
yearmin => $yearmin,
yearmax =>$yearmax,
bibliotitle => $title,
suggestion => C4::Context->preference("suggestion"),
virtualshelves => C4::Context->preference("virtualshelves"),
routing => C4::Context->preference("RoutingSerials"),
subscr=>scalar $query->param('subscriptionid'),
subscriptioncount => $subscriptioncount,
location => $location,
callnumber => $callnumber,
uc(C4::Context->preference("marcflavour")) => 1,
serialsadditems => $subscriptiondescs->[0]{'serialsadditems'},
delete => ($op eq 'delete_confirm'),
subscriptionid => $subscriptionid,
countitems => $countitems,
serialnumber => scalar @serialsid,
serialsid => \@serialsid,
);
output_html_with_http_headers $query, $cookie, $template->output;