X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FBiblio.pm;h=56cd94e0d00b28d787058160b11c7bf9eea0a986;hb=b20c2d6857629eed3f3eaf44cdca68dda36f4216;hp=81da91be74ed85b8f237860f14810526118c8c91;hpb=a7f7aeb138b8275448937102cb7a46cf49530aef;p=koha_gimpoz diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 81da91be74..56cd94e0d0 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -35,6 +35,7 @@ use C4::Log; # logaction use C4::ClassSource; use C4::Charset; use C4::Linker; +use C4::OAI::Sets; use vars qw($VERSION @ISA @EXPORT); @@ -131,6 +132,7 @@ BEGIN { &TransformHtmlToMarc &TransformHtmlToXml &GetNoZebraIndexes + prepare_host_field ); } @@ -268,6 +270,11 @@ sub AddBiblio { # now add the record ModBiblioMarc( $record, $biblionumber, $frameworkcode ) unless $defer_marc_save; + # update OAI-PMH sets + if(C4::Context->preference("OAI-PMH:AutoUpdateSets")) { + C4::OAI::Sets::UpdateOAISetsBiblio($biblionumber, $record); + } + logaction( "CATALOGUING", "ADD", $biblionumber, "biblio" ) if C4::Context->preference("CataloguingLog"); return ( $biblionumber, $biblioitemnumber ); } @@ -339,6 +346,12 @@ sub ModBiblio { # modify the other koha tables _koha_modify_biblio( $dbh, $oldbiblio, $frameworkcode ); _koha_modify_biblioitem_nonmarc( $dbh, $oldbiblio ); + + # update OAI-PMH sets + if(C4::Context->preference("OAI-PMH:AutoUpdateSets")) { + C4::OAI::Sets::UpdateOAISetsBiblio($biblionumber, $record); + } + return 1; } @@ -417,6 +430,13 @@ sub DelBiblio { C4::Serials::DelSubscription( $subscription->{subscriptionid} ); } + # We delete any existing holds + require C4::Reserves; + my ($count, $reserves) = C4::Reserves::GetReservesFromBiblionumber($biblionumber); + foreach my $res ( @$reserves ) { + C4::Reserves::CancelReserve( $res->{'biblionumber'}, $res->{'itemnumber'}, $res->{'borrowernumber'} ); + } + # Delete in Zebra. Be careful NOT to move this line after _koha_delete_biblio # for at least 2 reasons : # - we need to read the biblio if NoZebra is set (to remove it from the indexes @@ -1061,7 +1081,7 @@ sub GetMarcStructure { } $sth = $dbh->prepare( - "SELECT tagfield,tagsubfield,liblibrarian,libopac,tab,mandatory,repeatable,authorised_value,authtypecode,value_builder,kohafield,seealso,hidden,isurl,link,defaultvalue + "SELECT tagfield,tagsubfield,liblibrarian,libopac,tab,mandatory,repeatable,authorised_value,authtypecode,value_builder,kohafield,seealso,hidden,isurl,link,defaultvalue,maxlength FROM marc_subfield_structure WHERE frameworkcode=? ORDER BY tagfield,tagsubfield @@ -1080,10 +1100,12 @@ sub GetMarcStructure { my $isurl; my $link; my $defaultvalue; + my $maxlength; while ( ( $tag, $subfield, $liblibrarian, $libopac, $tab, $mandatory, $repeatable, $authorised_value, - $authtypecode, $value_builder, $kohafield, $seealso, $hidden, $isurl, $link, $defaultvalue + $authtypecode, $value_builder, $kohafield, $seealso, $hidden, $isurl, $link, $defaultvalue, + $maxlength ) = $sth->fetchrow ) { @@ -1100,6 +1122,7 @@ sub GetMarcStructure { $res->{$tag}->{$subfield}->{isurl} = $isurl; $res->{$tag}->{$subfield}->{'link'} = $link; $res->{$tag}->{$subfield}->{defaultvalue} = $defaultvalue; + $res->{$tag}->{$subfield}->{maxlength} = $maxlength; } $marc_structure_cache->{$forlibrarian}->{$frameworkcode} = $res; @@ -1666,7 +1689,7 @@ sub GetMarcSubjects { # ignore $9 my @this_link_loop = @link_loop; - push @subfields_loop, { code => $code, value => $value, link_loop => \@this_link_loop, separator => $separator } unless ( $subject_subfield->[0] eq 9 ); + push @subfields_loop, { code => $code, value => $value, link_loop => \@this_link_loop, separator => $separator } unless ( $subject_subfield->[0] eq 9 || $subject_subfield->[0] eq '0' ); $counter++; } @@ -1750,7 +1773,7 @@ sub GetMarcAuthors { link_loop => \@this_link_loop, separator => $separator } - unless ( $authors_subfield->[0] eq '9' ); + unless ( $authors_subfield->[0] eq '9' || $authors_subfield->[0] eq '0'); $count_auth++; } push @marcauthors, { MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop }; @@ -3445,9 +3468,12 @@ Function exported, but should NOT be used, unless you really know what you're do =cut sub ModBiblioMarc { - - # pass the MARC::Record to this function, and it will create the records in the marc field + # pass the MARC::Record to this function, and it will create the records in + # the marc field my ( $record, $biblionumber, $frameworkcode ) = @_; + + # Clone record as it gets modified + $record = $record->clone(); my $dbh = C4::Context->dbh; my @fields = $record->fields(); if ( !$frameworkcode ) { @@ -3628,9 +3654,134 @@ sub GetHolds { return ($holds); } +=head2 prepare_host_field + +$marcfield = prepare_host_field( $hostbiblioitem, $marcflavour ); +Generate the host item entry for an analytic child entry + +=cut + +sub prepare_host_field { + my ( $hostbiblio, $marcflavour ) = @_; + $marcflavour ||= C4::Context->preference('marcflavour'); + my $host = GetMarcBiblio($hostbiblio); + # unfortunately as_string does not 'do the right thing' + # if field returns undef + my %sfd; + my $field; + my $host_field; + if ( $marcflavour eq 'MARC21' || $marcflavour eq 'NORMARC' ) { + if ( $field = $host->field('100') || $host->field('110') || $host->field('11') ) { + my $s = $field->as_string('ab'); + if ($s) { + $sfd{a} = $s; + } + } + if ( $field = $host->field('245') ) { + my $s = $field->as_string('a'); + if ($s) { + $sfd{t} = $s; + } + } + if ( $field = $host->field('260') ) { + my $s = $field->as_string('abc'); + if ($s) { + $sfd{d} = $s; + } + } + if ( $field = $host->field('240') ) { + my $s = $field->as_string(); + if ($s) { + $sfd{b} = $s; + } + } + if ( $field = $host->field('022') ) { + my $s = $field->as_string('a'); + if ($s) { + $sfd{x} = $s; + } + } + if ( $field = $host->field('020') ) { + my $s = $field->as_string('a'); + if ($s) { + $sfd{z} = $s; + } + } + if ( $field = $host->field('001') ) { + $sfd{w} = $field->data(),; + } + $host_field = MARC::Field->new( 773, '0', ' ', %sfd ); + return $host_field; + } + elsif ( $marcflavour eq 'UNIMARC' ) { + #author + if ( $field = $host->field('700') || $host->field('710') || $host->field('720') ) { + my $s = $field->as_string('ab'); + if ($s) { + $sfd{a} = $s; + } + } + #title + if ( $field = $host->field('200') ) { + my $s = $field->as_string('a'); + if ($s) { + $sfd{t} = $s; + } + } + #place of publicaton + if ( $field = $host->field('210') ) { + my $s = $field->as_string('a'); + if ($s) { + $sfd{c} = $s; + } + } + #date of publication + if ( $field = $host->field('210') ) { + my $s = $field->as_string('d'); + if ($s) { + $sfd{d} = $s; + } + } + #edition statement + if ( $field = $host->field('205') ) { + my $s = $field->as_string(); + if ($s) { + $sfd{a} = $s; + } + } + #URL + if ( $field = $host->field('856') ) { + my $s = $field->as_string('u'); + if ($s) { + $sfd{u} = $s; + } + } + #ISSN + if ( $field = $host->field('011') ) { + my $s = $field->as_string('a'); + if ($s) { + $sfd{x} = $s; + } + } + #ISBN + if ( $field = $host->field('010') ) { + my $s = $field->as_string('a'); + if ($s) { + $sfd{y} = $s; + } + } + if ( $field = $host->field('001') ) { + $sfd{0} = $field->data(),; + } + $host_field = MARC::Field->new( 461, '0', ' ', %sfd ); + return $host_field; + } + return; +} 1; + __END__ =head1 AUTHOR