X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=serials%2Fserials-edit.pl;h=5c87851a324d36d40144796c116eba8f6d70e110;hb=f74da1e83442a730e2e56866f57b9f5aef93a3f5;hp=8cefe5dffdfd28d292a052df0c142c69d802b185;hpb=23b8da277b0a1aa67f0686aa65a9e0d527a3b26b;p=koha.git diff --git a/serials/serials-edit.pl b/serials/serials-edit.pl index 8cefe5dffd..5c87851a32 100755 --- a/serials/serials-edit.pl +++ b/serials/serials-edit.pl @@ -1,6 +1,7 @@ #!/usr/bin/perl # Copyright 2000-2002 Katipo Communications +# Parts Copyright 2010 Biblibre # # This file is part of Koha. # @@ -13,14 +14,13 @@ # 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 - +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. =head1 NAME -serials-recieve.pl +serials-edit.pl =head1 Parameters @@ -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 @@ -61,8 +61,8 @@ op can be : =cut - use strict; +use warnings; use CGI; use C4::Auth; use C4::Dates qw/format_date format_date_in_iso/; @@ -72,210 +72,347 @@ use C4::Koha; use C4::Output; 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'); +use C4::Search qw/enabled_staff_search_views/; +use List::MoreUtils qw/uniq/; + +my $query = CGI->new(); +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'); -# warn "op : $op"; -if (scalar(@subscriptionids)==1 && index($subscriptionids[0],",")>0){ - @subscriptionids =split /,/,$subscriptionids[0]; +my $op = $query->param('op'); +if ( scalar(@subscriptionids) == 1 && index( $subscriptionids[0], q|,| ) > 0 ) { + @subscriptionids = split( /,/, $subscriptionids[0] ); } -my $redirectstring; +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 (@serialids) { + my $serstatus = $query->param('serstatus'); + if ($serstatus) { + foreach my $subscriptionid (@subscriptionids) { + my @tmpser = GetSerials2( $subscriptionid, $serstatus ); + push @serialids, map { $_->{serialid} } @tmpser; + } } - } } -unless (scalar(@serialids)){ - my $string="serials-collection.pl?subscriptionid=".join(",",@subscriptionids); - $string=~s/,$//; -# warn $string; - print $query->redirect($string); +unless ( @serialids ) { + my $string = + 'serials-collection.pl?subscriptionid=' . join ',', uniq @subscriptionids; + $string =~ s/,$//; + + 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 ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => 'serials/serials-edit.tmpl', + query => $query, + type => 'intranet', + authnotrequired => 0, + flagsrequired => { serials => 'receive_serials' }, + debug => 1, + } +); my @serialdatalist; -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; +my %processedserialid; + +my $today = C4::Dates->new(); +foreach my $serialid (@serialids) { + + #filtering serialid for duplication + #NEW serial should appear only once and are created afterwards + if ( $serialid + && $serialid =~ /^[0-9]+$/ + && !$processedserialid{$serialid} ) + { + my $serinfo = GetSerialInformation($serialid); #TODO duplicates work done by GetSerials2 above + for my $d ( qw( publisheddate planneddate )){ + if ( $serinfo->{$d} =~m/^00/ ) { + $serinfo->{$d} = q{}; + } + else { + $serinfo->{$d} = format_date( $serinfo->{$d} ); + } + } + $serinfo->{arriveddate}=$today->output('syspref'); + + $serinfo->{'editdisable'} = ( + ( + HasSubscriptionExpired( $serinfo->{subscriptionid} ) + && $serinfo->{'status1'} + ) + || $serinfo->{'cannotedit'} + ); + push @serialdatalist, $serinfo; + $processedserialid{$serialid} = 1; + } } -my $bibdata=GetBiblioData($serialdatalist[0]->{'biblionumber'}); +my $biblio = 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 -foreach my $subscriptionid (@subscriptionids){ - my $cell; - if ($serialdatalist[0]->{'serialsadditems'}){ - #Create New empty item - $cell = - PrepareItemrecordDisplay( $serialdatalist[0]->{'biblionumber'} ); - $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), - }; +my %processedsubscriptionid; +foreach my $subscriptionid (@subscriptionids) { + + #Do not process subscriptionid twice if it was already processed. + if ( $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->{biblionumber} = $serialdatalist[0]->{'biblionumber'}; + $cell->{'itemid'} = 'NNEW'; + $cell->{'serialid'} = 'NEW'; + $cell->{'issuesatonce'} = 1; + $cell->{arriveddate}=$today->output('syspref'); + + push @newserialloop, $cell; + push @subscriptionloop, + { + 'subscriptionid' => $subscriptionid, + 'abouttoexpire' => abouttoexpire($subscriptionid), + 'subscriptionexpired' => HasSubscriptionExpired($subscriptionid), + }; + $processedsubscriptionid{$subscriptionid} = 1; + } } -$template->param(newserialloop=>\@newserialloop); -$template->param(subscriptions=>\@subscriptionloop); +$template->param( newserialloop => \@newserialloop ); +$template->param( subscriptions => \@subscriptionloop ); + +if ( $op and $op eq 'serialchangestatus' ) { + + # Convert serialseqs to UTF-8 to prevent encoding problems + foreach my $seq (@serialseqs) { + utf8::decode($seq) unless utf8::is_utf8($seq); + } -if ($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]){ + for ( my $i = 0 ; $i <= $#serialids ; $i++ ) { + my ($plan_date, $pub_date); + + if (defined $planneddates[$i] && $planneddates[$i] ne 'XXX') { + $plan_date = format_date_in_iso( $planneddates[$i] ); + } + if (defined $publisheddates[$i] && $publisheddates[$i] ne 'XXX') { + $pub_date = format_date_in_iso( $publisheddates[$i] ); + } + + 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'}, - $status[$i], - format_date_in_iso($planneddates[$i]), - format_date_in_iso($publisheddates[$i]), - $notes[$i]); - } - }elsif ($serialids[$i]){ - ModSerialStatus($serialids[$i], - $serialseqs[$i], - format_date_in_iso($planneddates[$i]), - format_date_in_iso($publisheddates[$i]), - $status[$i], - $notes[$i]); + ### FIXME if NewIssue is modified to use subscription biblionumber, then biblionumber would not be useful. + $newserial = NewIssue( + $serialseqs[$i], + $subscriptionids[0], + $serialdatalist[0]->{'biblionumber'}, + $status[$i], + $plan_date, + $pub_date, + $notes[$i] + ); + } + } + elsif ( $serialids[$i] ) { + ModSerialStatus( + $serialids[$i], + $serialseqs[$i], + $plan_date, + $pub_date, + $status[$i], + $notes[$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"){ - $itemhash{$itemid[$i]}->{'serial'}=$serials[$countdistinct]; - } else { - $itemhash{$itemid[$i]}->{'serial'}=$newserial; - } - $itemhash{$itemid[$i]}->{'bibnum'}=$bibnums[$countdistinct]; - $countdistinct++; - } - 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{'serial'} eq $serialids[$i] || ($itemhash{$item}->{'serial'} == $newserial && $serialids[$i] eq "NEW")); + 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" ) + { + $itemhash{ $itemid[$i] }->{'serial'} = + $serials[$countdistinct]; + } + else { + $itemhash{ $itemid[$i] }->{'serial'} = $newserial; + } + $itemhash{ $itemid[$i] }->{'bibnum'} = $bibnums[$countdistinct]; + $countdistinct++; + } + 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]; } - 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; - my $record=MARC::Record::new_from_xml($xml, 'UTF-8'); - if ($item=~/^N/){ - #New Item - - # if autoBarcode is set to 'incremental', calculate barcode... - my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode"); - if (C4::Context->preference("autoBarcode") eq 'incremental' ) { - if (!$record->field($tagfield)->subfield($tagsubfield)) { - my $sth_barcode = $dbh->prepare("select max(abs(barcode)) from items"); - $sth_barcode->execute; - 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($tagfield)->update( $tagsubfield => ++$newbarcode ); - } + 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++ ) { + if ( + $itemhash{$item}->{serial} eq $serialids[$i] + || ( $itemhash{$item}->{serial} == $newserial + && $serialids[$i] eq 'NEW' ) + ) { + $index = $i + } } - # 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]); - # if barcode exists, don't create, but report The problem. - if ($exists){ - $url_error_str = "rcv_error=barcode_not_unique&rcv_error_param=$serialseqs[$index]"; - $template->param("barcode_not_unique" => 1,'errserialseq'=>$serialseqs[$index]); - } else { - my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$itemhash{$item}->{'bibnum'}); - AddItem2Serial($itemhash{$item}->{'serial'},$itemnumber); + if ( $index >= 0 && $status[$index] == 2 ) { + my $xml = TransformHtmlToXml( + $itemhash{$item}->{'tags'}, + $itemhash{$item}->{'subfields'}, + $itemhash{$item}->{'field_values'}, + $itemhash{$item}->{'indicator'}, + $itemhash{$item}->{'ind_tag'} + ); + + # warn $xml; + my $bib_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 ( !$bib_record->field($barcodetagfield) + ->subfield($barcodetagsubfield) ) + { + my $sth_barcode = $dbh->prepare( + 'select max(abs(barcode)) from items'); + $sth_barcode->execute; + my ($newbarcode) = $sth_barcode->fetchrow; + +# OK, we have the new barcode, add the entry in MARC record # FIXME -> should be using barcode plugin here. + $bib_record->field($barcodetagfield) + ->update( $barcodetagsubfield => ++$newbarcode ); + } + } + + # check for item barcode # being unique + my $exists; + if ( + $bib_record->subfield( + $barcodetagfield, $barcodetagsubfield + ) + ) + { + $exists = GetItemnumberFromBarcode( + $bib_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'; + push @errseq, { serialseq => $serialseqs[$index] }; + } + else { + my ( $biblionumber, $bibitemnum, $itemnumber ) = + AddItemFromMarc( $bib_record, + $itemhash{$item}->{bibnum} ); + AddItem2Serial( $itemhash{$item}->{serial}, + $itemnumber ); + } + } + else { + + #modify item + my ( $oldbiblionumber, $oldbibnum, $itemnumber ) = + ModItemFromMarc( $bib_record, + $itemhash{$item}->{'bibnum'}, $item ); + } } - } 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 ="serials-home.pl?"; -# $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); - - my $redirect ="serials-collection.pl?"; - my %hashsubscription; - foreach (@subscriptionids) { - $hashsubscription{$_}=1; - } - $redirect.=join("&",map{"subscriptionid=".$_} sort keys %hashsubscription); - print $query->redirect("$redirect"); + + + if ( @errors ) { + $template->param( Errors => 1 ); + if ( @errseq ) { + $template->param( barcode_not_unique => 1, errseq => \@errseq ); + } + } + else { + my $redirect = 'serials-collection.pl?'; + $redirect .= join( '&', map { 'subscriptionid=' . $_ } @subscriptionids ); + print $query->redirect($redirect); + } +} +my $location = GetAuthorisedValues('LOC', $serialdatalist[0]->{'location'}); +my $locationlib; +foreach (@$location) { + $locationlib = $_->{'lib'} if $_->{'selected'}; } +my $default_bib_view = get_default_view(); $template->param( - serialsadditems => $serialdatalist[0]->{'serialsadditems'}, - bibliotitle => $bibdata->{'title'}, - biblionumber => $serialdatalist[0]->{'biblionumber'}, - serialslist => \@serialdatalist, + serialsadditems => $serialdatalist[0]->{'serialsadditems'}, + callnumber => $serialdatalist[0]->{'callnumber'}, + bibliotitle => $biblio->{'title'}, + biblionumber => $serialdatalist[0]->{'biblionumber'}, + serialslist => \@serialdatalist, + default_bib_view => $default_bib_view, + location => $locationlib, ); output_html_with_http_headers $query, $cookie, $template->output; + +sub get_default_view { + my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); + my %views = C4::Search::enabled_staff_search_views(); + if ( $defaultview eq 'isbd' && $views{can_view_ISBD} ) { + return 'ISBDdetail'; + } + elsif ( $defaultview eq 'marc' && $views{can_view_MARC} ) { + return 'MARCdetail'; + } + elsif ( $defaultview eq 'labeled_marc' && $views{can_view_labeledMARC} ) { + return 'labeledMARCdetail'; + } + return 'detail'; +}