use strict;
use CGI;
use C4::Auth;
-use C4::Date;
+use C4::Dates qw/format_date format_date_in_iso/;
use C4::Biblio;
+use C4::Items;
use C4::Koha;
use C4::Output;
use C4::Context;
my @notes = $query->param('notes');
my @subscriptionids = $query->param('subscriptionid');
my $op = $query->param('op');
-# warn "op : $op";
if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){
- @subscriptionids =split /,/,$subscriptionids[0];
+ @subscriptionids =split (/,/,$subscriptionids[0]);
}
+my @errors;
+my @errseq;
my $redirectstring;
# If user comes from subscription details
unless (@serialids){
unless (scalar(@serialids)){
my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids);
$string=~s/,$//;
- warn $string;
+# warn $string;
print $query->redirect($string);
}
my ($template, $loggedinuser, $cookie)
});
my @serialdatalist;
+my %processedserialid;
foreach my $tmpserialid (@serialids){
- my $data=GetSerialInformation($tmpserialid);
- $data->{publisheddate}=format_date($data->{publisheddate});
- $data->{planneddate}=format_date($data->{planneddate});
- $data->{'editdisable'}=(HasSubscriptionExpired($data->{subscriptionid})&& $data->{'status1'});
- push @serialdatalist,$data;
+ #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->{publisheddate}=format_date($data->{publisheddate});
+ $data->{planneddate}=format_date($data->{planneddate});
+ $data->{'editdisable'}=((HasSubscriptionExpired($data->{subscriptionid})&& $data->{'status1'})||$data->{'cannotedit'});
+ push @serialdatalist,$data;
+ $processedserialid{$tmpserialid}=1;
}
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){
- my $cell;
- if (C4::Context->preference("serialsadditems")){
- #Create New empty item
- $cell =
- PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'} );
- }
- $cell->{'subscriptionid'}=$subscriptionid;
- $cell->{'itemid'} = "NNEW";
- $cell->{'serialid'} = "NEW";
- $cell->{'issuesatonce'} = 1;
- push @newserialloop,$cell;
- push @subscriptionloop, {'subscriptionid'=>$subscriptionid,
- 'abouttoexpire'=>abouttoexpire($subscriptionid),
- 'subscriptionexpired'=>HasSubscriptionExpired($subscriptionid),
- };
+ #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'},'', GetSubscription($subscriptionid));
+ $cell->{serialsadditems} = 1;
+ }
+ $cell->{'subscriptionid'}=$subscriptionid;
+ $cell->{'itemid'} = "NNEW";
+ $cell->{'serialid'} = "NEW";
+ $cell->{'issuesatonce'} = 1;
+ push @newserialloop,$cell;
+ push @subscriptionloop, {'subscriptionid'=>$subscriptionid,
+ 'abouttoexpire'=>abouttoexpire($subscriptionid),
+ 'subscriptionexpired'=>HasSubscriptionExpired($subscriptionid),
+ };
+ $processedsubscriptionid{$subscriptionid}=1;
}
$template->param(newserialloop=>\@newserialloop);
$template->param(subscriptions=>\@subscriptionloop);
$notes[$i]);
}
}
- if (C4::Context->preference("serialsadditems")){
- my @moditems = $query->param('moditem');
+ 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');
}
foreach my $item (keys %itemhash){
# Verify Itemization is "Valid", i.e. serial status is Arrived or Missing
- my $index;
+ my $index=-1;
for (my $i=0; $i<scalar(@serialids);$i++){
- $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i]);
+ $index = $i if ($itemhash{$item}->{'serial'} eq $serialids[$i] || ($itemhash{$item}->{'serial'} == $newserial && $serialids[$i] eq "NEW"));
}
- if ($status[$index]==2){
+ if ($index>=0 && $status[$index]==2){
my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
$itemhash{$item}->{'subfields'},
$itemhash{$item}->{'field_values'},
$itemhash{$item}->{'ind_tag'},
$itemhash{$item}->{'indicator'});
-# warn $xml;
+ # warn $xml;
my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
if ($item=~/^N/){
#New Item
- # if autoBarcode is ON, calculate barcode...
- my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode");
- if (C4::Boolean::true_p(C4::Context->preference("autoBarcode")) != 0 ) {
-
- unless ($record->field($tagfield)->subfield($tagsubfield)) {
+
+ # 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");
$sth_barcode->execute;
my ($newbarcode) = $sth_barcode->fetchrow;
- $newbarcode++;
- # OK, we have the new barcode, now create the entry in MARC record
- my $fieldItem = $record->field($tagfield);
- $record->delete_field($fieldItem);
- $fieldItem->add_subfields($tagsubfield => $newbarcode);
- $record->insert_fields_ordered($fieldItem);
+ # 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 = GetItemnumberFromBarcode($record->subfield($tagfield,$tagsubfield)) if ($record->subfield($tagfield,$tagsubfield));
+ my $exists = GetItemnumberFromBarcode($record->subfield($barcodetagfield,$barcodetagsubfield)) if ($record->subfield($barcodetagfield,$barcodetagsubfield));
# push @errors,"barcode_not_unique" if($exists);
- $template->param("barcode_not_unique" => 1,'errserialseq'=>$serialseqs[$index]);
# if barcode exists, don't create, but report The problem.
- unless ($exists){
- my ($biblionumber,$bibitemnum,$itemnumber) = AddItem($record,$itemhash{$item}->{'bibnum'});
+ if ($exists){
+ push @errors,"barcode_not_unique" if($exists);
+ push @errseq,{"serialseq"=>$serialseqs[$index]};
+ } else {
+ my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'});
AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber);
}
} else {
#modify item
- my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItem($record,$itemhash{$item}->{'bibnum'},$item,0);
+ my ($oldbiblionumber,$oldbibnum,$itemnumber) = ModItemFromMarc($record,$itemhash{$item}->{'bibnum'},$item);
}
}
}
# $redirect.="&".join("&",map{"status=".$_} @status);
# $redirect.="&".join("&",map{"notes=".$_} @notes);
- my $redirect ="serials-collection.pl?";
- my %hashsubscription;
- map{$hashsubscription{$_}=1} @subscriptionids;
- $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
- print $query->redirect("$redirect");
+ if (scalar(@errors)>0){
+ $template->param("Errors" => 1);
+ if (scalar(@errseq)>0){
+ $template->param("barcode_not_unique" => 1);
+ $template->param('errseq'=>\@errseq);
+ }
+ } else {
+ my $redirect ="serials-collection.pl?";
+ my %hashsubscription;
+ foreach (@subscriptionids) {
+ $hashsubscription{$_}=1;
+ }
+ $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription);
+ print $query->redirect("$redirect");
+ }
}
-$template->param(serialsadditems =>C4::Context->preference("serialsadditems"));
-
-
-
$template->param(
- bibliotitle => $bibdata->{'title'},
- biblionumber =>$serialdatalist[0]->{'biblionumber'},
- serialslist => \@serialdatalist,
- );
+ serialsadditems => $serialdatalist[0]->{'serialsadditems'},
+ bibliotitle => $bibdata->{'title'},
+ biblionumber => $serialdatalist[0]->{'biblionumber'},
+ serialslist => \@serialdatalist,
+);
output_html_with_http_headers $query, $cookie, $template->output;