Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…
Cannot retrieve contributors at this time
executable file 308 lines (273 sloc) 11.3 KB
#!/usr/bin/env perl
# Copyright 2000-2002 Katipo Communications
# 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
=head1 NAME
=head1 Parameters
=over 4
=item op
op can be :
* modsubscriptionhistory :to modify the subscription history
* serialchangestatus :to modify the status of this subscription
=item subscriptionid
=item user
=item histstartdate
=item enddate
=item recievedlist
=item missinglist
=item opacnote
=item librariannote
=item serialid
=item serialseq
=item planneddate
=item notes
=item status
use strict;
use warnings;
use CGI;
use C4::Auth;
use C4::Dates qw/format_date format_date_in_iso/;
use C4::Biblio;
use C4::Items;
use C4::Koha;
use C4::Output;
use Koha;
use C4::Context;
use C4::Serials;
#use Smart::Comments;
my $query = new CGI;
my $dbh = C4::Context->dbh;
my @serialids = $query->param('serialid');
my @serialseqs = $query->param('serialseq');
my @planneddates = $query->param('planneddate');
my @publisheddates = $query->param('publisheddate');
my @status = $query->param('status');
my @notes = $query->param('notes');
my @subscriptionids = $query->param('subscriptionid');
my $op = $query->param('op');
if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){
@subscriptionids =split (/,/,$subscriptionids[0]);
my @errors;
my @errseq;
# If user comes from subscription details
unless (@serialids){
foreach my $subscriptionid (@subscriptionids){
my $serstatus=$query->param('serstatus');
if ($serstatus){
my ($count,@tmpser)=GetSerials2($subscriptionid,$serstatus);
foreach (@tmpser) {
push @serialids, $_->{'serialid'};
unless (scalar(@serialids)){
my $string="".join(",",@subscriptionids);
# warn $string;
print $query->redirect($string);
my ($template, $loggedinuser, $cookie) = get_template_and_user({template_name => "serials/serials-edit.tmpl",
query => $query,
type => "intranet",
authnotrequired => 0,
flagsrequired => {serials => 1},
debug => 1,
my @serialdatalist;
my %processedserialid;
my $today = C4::Dates->new();
foreach my $tmpserialid (@serialids){
#filtering serialid for duplication
#NEW serial should appear only once and are created afterwards
next unless (defined($tmpserialid) && $tmpserialid =~/^[0-9]+$/ && !$processedserialid{$tmpserialid});
my $data=GetSerialInformation($tmpserialid);
$data->{'editdisable'}=((HasSubscriptionExpired($data->{subscriptionid})&& $data->{'status1'})||$data->{'cannotedit'});
push @serialdatalist,$data;
my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'});
my @newserialloop;
my @subscriptionloop;
# check, for each subscription edited, that we have an empty item line if applicable for the subscription
my %processedsubscriptionid;
foreach my $subscriptionid (@subscriptionids){
#Donot process subscriptionid twice if it was already processed.
next unless (defined($subscriptionid) && !$processedsubscriptionid{$subscriptionid});
my $cell;
if ($serialdatalist[0]->{'serialsadditems'}){
#Create New empty item
$cell =
PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'},'', GetSubscriptionDefaults($subscriptionid));
$cell->{serialsadditems} = 1;
$cell->{'itemid'} = "NNEW";
$cell->{'serialid'} = "NEW";
$cell->{'issuesatonce'} = 1;
push @newserialloop,$cell;
push @subscriptionloop, {'subscriptionid'=>$subscriptionid,
if ($op and $op eq 'serialchangestatus') {
# my $sth = $dbh->prepare("select status from serial where serialid=?");
my $newserial;
for (my $i=0;$i<=$#serialids;$i++) {
# $sth->execute($serialids[$i]);
# my ($oldstatus) = $sth->fetchrow;
if ($serialids[$i] && $serialids[$i] eq "NEW") {
if ($serialseqs[$i]){
#IF newserial was provided a name Then we have to create a newSerial
### FIXME if NewIssue is modified to use subscription biblionumber, then biblionumber would not be useful.
$newserial = NewIssue( $serialseqs[$i],$subscriptionids[$i],$serialdatalist[0]->{'biblionumber'},
}elsif ($serialids[$i]){
my @moditems = $query->param('moditem');
if (scalar(@moditems)){
my @tags = $query->param('tag');
my @subfields = $query->param('subfield');
my @field_values = $query->param('field_value');
my @serials = $query->param('serial');
my @bibnums = $query->param('bibnum');
my @itemid = $query->param('itemid');
my @ind_tag = $query->param('ind_tag');
my @indicator = $query->param('indicator');
#Rebuilding ALL the data for items into a hash
# parting them on $itemid.
my %itemhash;
my $countdistinct;
my $range=scalar(@itemid);
for (my $i=0; $i<$range; $i++){
unless ($itemhash{$itemid[$i]}){
if ($serials[$countdistinct] && $serials[$countdistinct] ne "NEW"){
} else {
push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
foreach my $item (keys %itemhash){
# Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
my $index=-1;
for (my $i=0; $i<scalar(@serialids);$i++){
$index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i] || ($itemhash{$item}->{'serial'} == $newserial && $serialids[$i] eq "NEW"));
if ($index>=0 && $status[$index]==2){
my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
# warn $xml;
my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
if ($item=~/^N/){
#New Item
# if autoBarcode is set to 'incremental', calculate barcode...
my ($barcodetagfield,$barcodetagsubfield) = &GetMarcFromKohaField("items.barcode", GetFrameworkCode($serialdatalist[0]->{'biblionumber'}));
if (C4::Context->preference("autoBarcode") eq 'incremental' ) {
if (!$record->field($barcodetagfield)->subfield($barcodetagsubfield)) {
my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items");
my ($newbarcode) = $sth_barcode->fetchrow;
# OK, we have the new barcode, add the entry in MARC record # FIXME -> should be using barcode plugin here.
$record->field($barcodetagfield)->update( $barcodetagsubfield => ++$newbarcode );
# check for item barcode # being unique
my $exists;
if ($record->subfield($barcodetagfield,$barcodetagsubfield)) {
$exists = GetItemnumberFromBarcode($record->subfield($barcodetagfield,$barcodetagsubfield));
# push @errors,"barcode_not_unique" if($exists);
# if barcode exists, don't create, but report The problem.
if ($exists){
push @errors,"barcode_not_unique" if($exists);
push @errseq,{"serialseq"=>$serialseqs[$index]};
} else {
my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'});
} else {
#modify item
my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc($record,$itemhash{$item}->{'bibnum'},$item);
# ### FIXME this part of code is not very pretty. Nor is it very efficient... There MUST be a more perlish way to write it. But it works.
# my $redirect ="";
# $redirect.=join("&",map{"serialseq=".$_} @serialseqs);
# $redirect.="&".join("&",map{"planneddate=".$_} @planneddates);
# $redirect.="&".join("&",map{"publisheddate=".$_} @publisheddates);
# $redirect.="&".join("&",map{"status=".$_} @status);
# $redirect.="&".join("&",map{"notes=".$_} @notes);
if (scalar(@errors)>0){
$template->param("Errors" => 1);
if (scalar(@errseq)>0){
$template->param("barcode_not_unique" => 1);
} else {
my $redirect ="";
my %hashsubscription;
foreach (@subscriptionids) {
$redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
print $query->redirect("$redirect");
serialsadditems => $serialdatalist[0]->{'serialsadditems'},
bibliotitle => $bibdata->{'title'},
biblionumber => $serialdatalist[0]->{'biblionumber'},
serialslist => \@serialdatalist,
output_html_with_http_headers $query, $cookie, $template->output;
Jump to Line
Something went wrong with that request. Please try again.