X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=serials%2Fserials-edit.pl;h=93caa555886b3c00da007afb465b7a1954866d36;hb=ef142b1dbec4246e41b1f9d0ee71b5a9c94dfc49;hp=2e25ba33a8591c6040fdff16c28d3f05e7dc0749;hpb=4399daf0bdc0deabb13ec7b16198260bd5bc6b0c;p=koha.git diff --git a/serials/serials-edit.pl b/serials/serials-edit.pl index 2e25ba33a8..93caa55588 100755 --- a/serials/serials-edit.pl +++ b/serials/serials-edit.pl @@ -28,7 +28,7 @@ serials-recieve.pl =item op op can be : - * modsubscriptionhistory :to modify the subscription history + * modsubscriptionhistory :to modify the subscription history * serialchangestatus :to modify the status of this subscription =item subscriptionid @@ -63,10 +63,12 @@ op can be : use strict; +use warnings; 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; @@ -84,11 +86,11 @@ my @status = $query->param('status'); 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 $redirectstring; +my @errors; +my @errseq; # If user comes from subscription details unless (@serialids){ foreach my $subscriptionid (@subscriptionids){ @@ -105,7 +107,7 @@ 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) @@ -113,43 +115,54 @@ my ($template, $loggedinuser, $cookie) query => $query, type => "intranet", authnotrequired => 0, - flagsrequired => {serials => 1}, + flagsrequired => {serials => 'receive_serials'}, debug => 1, }); 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'})||$data->{'cannotedit'}); - 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); -if ($op eq 'serialchangestatus') { +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++) { @@ -174,8 +187,8 @@ if ($op eq 'serialchangestatus') { $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'); @@ -207,54 +220,54 @@ if ($op eq 'serialchangestatus') { } 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{'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::Context->preference("autoBarcode") ne 'OFF' ) { - - eval { $record->field($tagfield)->subfield($tagsubfield) }; - if ($@) { + + # 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 - $record->add_fields( $tagfield, "1", "0", - $tagsubfield => $newbarcode ); + # 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)); - # push @errors,"barcode_not_unique" if($exists); - $template->param("barcode_not_unique" => 1,'errserialseq'=>$serialseqs[$index]); + 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. - unless ($exists){ - my ($biblionumber,$bibitemnum,$itemnumber) = AddItem($record,$itemhash{$item}->{'bibnum'}); - AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber); + 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); } } } } -# ### 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. +# ### 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 ="serials-home.pl?"; # $redirect.=join("&",map{"serialseq=".$_} @serialseqs); # $redirect.="&".join("&",map{"planneddate=".$_} @planneddates); @@ -262,20 +275,27 @@ if ($op eq 'serialchangestatus') { # $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;