X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FAuthoritiesMarc.pm;h=aef8b6c60e7481cd069495e183978d73d3c31096;hb=198bae17b1ebd42f4c1ce3b21e13b7ad7b844b64;hp=5a4021b37053f492dc5ad82b236e8b31d8a8270b;hpb=a481fad4b7e84e1571fb2750ee99d1edf234b796;p=koha.git
diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm
index 5a4021b370..aef8b6c60e 100644
--- a/C4/AuthoritiesMarc.pm
+++ b/C4/AuthoritiesMarc.pm
@@ -17,44 +17,66 @@ package C4::AuthoritiesMarc;
# Suite 330, Boston, MA 02111-1307 USA
use strict;
-require Exporter;
use C4::Context;
use C4::Koha;
use MARC::Record;
use C4::Biblio;
use C4::Search;
-#use ZOOM;
+use C4::AuthoritiesMarc::MARC21;
+use C4::AuthoritiesMarc::UNIMARC;
+use C4::Charset;
+use C4::Debug;
+
use vars qw($VERSION @ISA @EXPORT);
-# set the version for version checking
-$VERSION = 0.01;
-
-@ISA = qw(Exporter);
-@EXPORT = qw(
- &AUTHgettagslib
- &AUTHfindsubfield
- &AUTHfind_authtypecode
-
- &AUTHaddauthority
- &AUTHmodauthority
- &AUTHdelauthority
- &AUTHaddsubfield
- &AUTHgetauthority
- &AUTHfind_marc_from_kohafield
- &AUTHgetauth_type
- &AUTHcount_usage
- &getsummary
- &authoritysearch
- &XMLgetauthority
+BEGIN {
+ # set the version for version checking
+ $VERSION = 3.01;
+
+ require Exporter;
+ @ISA = qw(Exporter);
+ @EXPORT = qw(
+ &GetTagsLabels
+ &GetAuthType
+ &GetAuthTypeCode
+ &GetAuthMARCFromKohaField
+ &AUTHhtml2marc
+
+ &AddAuthority
+ &ModAuthority
+ &DelAuthority
+ &GetAuthority
+ &GetAuthorityXML
+
+ &CountUsage
+ &CountUsageChildren
+ &SearchAuthorities
+
+ &BuildSummary
+ &BuildUnimarcHierarchies
+ &BuildUnimarcHierarchy
- &AUTHhtml2marc
- &BuildUnimarcHierarchies
- &BuildUnimarcHierarchy
- &merge
- &FindDuplicate
- );
-
-sub AUTHfind_marc_from_kohafield {
+ &merge
+ &FindDuplicateAuthority
+ );
+}
+
+=head2 GetAuthMARCFromKohaField
+
+=over 4
+
+( $tag, $subfield ) = &GetAuthMARCFromKohaField ($kohafield,$authtypecode);
+returns tag and subfield linked to kohafield
+
+Comment :
+Suppose Kohafield is only linked to ONE subfield
+
+=back
+
+=cut
+
+sub GetAuthMARCFromKohaField {
+#AUTHfind_marc_from_kohafield
my ( $kohafield,$authtypecode ) = @_;
my $dbh=C4::Context->dbh;
return 0, 0 unless $kohafield;
@@ -66,241 +88,355 @@ sub AUTHfind_marc_from_kohafield {
return ($tagfield,$tagsubfield);
}
-sub authoritysearch {
- my ($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby) = @_;
- my $dbh=C4::Context->dbh;
- my $query;
- my $attr;
- # the marclist may contain "mainentry". In this case, search the tag_to_report, that depends on
- # the authtypecode. Then, search on $a of this tag_to_report
- # also store main entry MARC tag, to extract it at end of search
- my $mainentrytag;
- ##first set the authtype search and may be multiple authorities
- my $n=0;
- my @authtypecode;
- my @auths=split / /,$authtypecode ;
- foreach my $auth (@auths){
- $query .=" \@attr 1=Authority/format-id \@attr 5=100 ".$auth; ##No truncation on authtype
- push @authtypecode ,$auth;
- $n++;
- }
- if ($n>1){
- $query= "\@or ".$query;
- }
-
- my $dosearch;
- my $and;
- my $q2;
- for(my $i = 0 ; $i <= $#{$value} ; $i++)
- {
- if (@$value[$i]){
- ##If mainentry search $a tag
- if (@$tags[$i] eq "mainmainentry") {
- $attr =" \@attr 1=Heading ";
- }elsif (@$tags[$i] eq "mainentry") {
- $attr =" \@attr 1=Heading-Entity ";
- }else{
- $attr =" \@attr 1=Any ";
- }
- if (@$operator[$i] eq 'is') {
- $attr.=" \@attr 4=1 \@attr 5=100 ";##Phrase, No truncation,all of subfield field must match
- }elsif (@$operator[$i] eq "="){
- $attr.=" \@attr 4=107 "; #Number Exact match
- }elsif (@$operator[$i] eq "start"){
- $attr.=" \@attr 4=1 \@attr 5=1 ";#Phrase, Right truncated
- } else {
- $attr .=" \@attr 5=1 ";## Word list, right truncated, anywhere
- }
- $and .=" \@and " ;
- $attr =$attr."\"".@$value[$i]."\"";
- $q2 .=$attr;
- $dosearch=1;
- }#if value
- }
- ##Add how many queries generated
- $query= $and.$query.$q2;
- $query=' @or @attr 7=1 @attr 1=Heading 0 '.$query if ($sortby eq "HeadingAsc");
- $query=' @or @attr 7=2 @attr 1=Heading 0 '.$query if ($sortby eq "HeadingDsc");
- warn $query;
-
- $offset=0 unless $offset;
- my $counter = $offset;
- $length=10 unless $length;
- my @oAuth;
- my $i;
- $oAuth[0]=C4::Context->Zconn("authorityserver" , 1);
- my $Anewq= new ZOOM::Query::PQF($query,$oAuth[0]);
- # $Anewq->sortby("1=Heading i< 1=Heading-Entity i< ");
- # $Anewq->sortby("1=Heading i< 1=Heading-Entity i< ");
- my $oAResult;
- $oAResult= $oAuth[0]->search($Anewq) ;
- while (($i = ZOOM::event(\@oAuth)) != 0) {
- my $ev = $oAuth[$i-1]->last_event();
- # warn("Authority ", $i-1, ": event $ev (", ZOOM::event_str($ev), ")\n");
- last if $ev == ZOOM::Event::ZEND;
- }
- my($error, $errmsg, $addinfo, $diagset) = $oAuth[0]->error_x();
- if ($error) {
- warn "oAuth error: $errmsg ($error) $addinfo $diagset\n";
- goto NOLUCK;
- }
- my $nbresults;
- $nbresults=$oAResult->size();
- my $nremains=$nbresults;
- my @result = ();
- my @finalresult = ();
+=head2 SearchAuthorities
- if ($nbresults>0){
+=over 4
- ##Find authid and linkid fields
- ##we may be searching multiple authoritytypes.
- ## FIXME this assumes that all authid and linkid fields are the same for all authority types
- # my ($authidfield,$authidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authid",$authtypecode[0]);
- # my ($linkidfield,$linkidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.linkid",$authtypecode[0]);
- while (($counter < $nbresults) && ($counter < ($offset + $length))) {
-
- ##Here we have to extract MARC record and $authid from ZEBRA AUTHORITIES
- my $rec=$oAResult->record($counter);
- my $marcdata=$rec->raw();
- my $authrecord;
- my $linkid;
- my @linkids;
- my $separator=C4::Context->preference('authoritysep');
- my $linksummary=" ".$separator;
-
- $authrecord = MARC::File::USMARC::decode($marcdata);
-
- my $authid=$authrecord->field('001')->data();
- # if ($authrecord->field($linkidfield)){
- # my @fields=$authrecord->field($linkidfield);
- #
- # # foreach my $field (@fields){
- # # # $linkid=$field->subfield($linkidsubfield) ;
- # # # if ($linkid){ ##There is a linked record add fields to produce summary
- # # # my $linktype=AUTHfind_authtypecode($dbh,$linkid);
- # # # my $linkrecord=AUTHgetauthority($dbh,$linkid);
- # # # $linksummary.="
".getsummary($dbh,$linkrecord,$linkid,$linktype).".".$separator;
- # # # }
- # # }
- # }#
-
- my $summary=getsummary($authrecord,$authid,$authtypecode);
- # $summary="".$summary."." if ($intranet);
- # $summary="".$summary."." if ($intranet);
- # if ($linkid && $linksummary ne " ".$separator){
- # $summary="".$summary."".$linksummary;
- # }
- my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?";
- my $sth = $dbh->prepare($query_auth_tag);
- $sth->execute($authtypecode);
- my $auth_tag_to_report = $sth->fetchrow;
- my %newline;
- $newline{summary} = $summary;
- $newline{authid} = $authid;
- # $newline{linkid} = $linkid;
- # $newline{reported_tag} = $reported_tag;
- # $newline{used} =0;
- # $newline{biblio_fields} = $tags_using_authtype;
- $newline{even} = $counter % 2;
- $counter++;
- push @finalresult, \%newline;
- }## while counter
- ###
- for (my $z=0; $z<@finalresult; $z++){
- my $count=AUTHcount_usage($finalresult[$z]{authid});
- $finalresult[$z]{used}=$count;
- }# all $z's
-
- }## if nbresult
-NOLUCK:
-# $oAResult->destroy();
-# $oAuth[0]->destroy();
-
- return (\@finalresult, $nbresults);
-}
+(\@finalresult, $nbresults)= &SearchAuthorities($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby)
+returns ref to array result and count of results returned
-# Creates the SQL Request
+=back
-sub create_request {
- my ($tags, $and_or, $operator, $value) = @_;
- my $dbh=C4::Context->dbh;
+=cut
- my $sql_tables; # will contain marc_subfield_table as m1,...
- my $sql_where1; # will contain the "true" where
- my $sql_where2 = "("; # will contain m1.authid=m2.authid
- my $nb_active=0; # will contain the number of "active" entries. and entry is active is a value is provided.
- my $nb_table=1; # will contain the number of table. ++ on each entry EXCEPT when an OR is provided.
-
- for(my $i=0; $i<=@$value;$i++) {
- if (@$value[$i]) {
- $nb_active++;
- if ($nb_active==1) {
- $sql_tables = "auth_subfield_table as m$nb_table,";
- $sql_where1 .= "( m$nb_table.subfieldvalue like '@$value[$i]' ";
- if (@$tags[$i]) {
- $sql_where1 .=" and concat(m$nb_table.tag,m$nb_table.subfieldcode) IN (@$tags[$i])";
- }
- $sql_where1.=")";
+sub SearchAuthorities {
+ my ($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby) = @_;
+# warn "CALL : $tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby";
+ my $dbh=C4::Context->dbh;
+ if (C4::Context->preference('NoZebra')) {
+
+ #
+ # build the query
+ #
+ my $query;
+ my @auths=split / /,$authtypecode ;
+ foreach my $auth (@auths){
+ $query .="AND auth_type= $auth ";
+ }
+ $query =~ s/^AND //;
+ my $dosearch;
+ for(my $i = 0 ; $i <= $#{$value} ; $i++)
+ {
+ if (@$value[$i]){
+ if (@$tags[$i] =~/mainentry|mainmainentry/) {
+ $query .= qq( AND @$tags[$i] );
+ } else {
+ $query .=" AND ";
+ }
+ if (@$operator[$i] eq 'is') {
+ $query.=(@$tags[$i]?"=":""). '"'.@$value[$i].'"';
+ }elsif (@$operator[$i] eq "="){
+ $query.=(@$tags[$i]?"=":""). '"'.@$value[$i].'"';
+ }elsif (@$operator[$i] eq "start"){
+ $query.=(@$tags[$i]?"=":"").'"'.@$value[$i].'%"';
+ } else {
+ $query.=(@$tags[$i]?"=":"").'"'.@$value[$i].'%"';
+ }
+ $dosearch=1;
+ }#if value
+ }
+ #
+ # do the query (if we had some search term
+ #
+ if ($dosearch) {
+# warn "QUERY : $query";
+ my $result = C4::Search::NZanalyse($query,'authorityserver');
+# warn "result : $result";
+ my %result;
+ foreach (split /;/,$result) {
+ my ($authid,$title) = split /,/,$_;
+ # hint : the result is sorted by title.biblionumber because we can have X biblios with the same title
+ # and we don't want to get only 1 result for each of them !!!
+ # hint & speed improvement : we can order without reading the record
+ # so order, and read records only for the requested page !
+ $result{$title.$authid}=$authid;
+ }
+ # sort the hash and return the same structure as GetRecords (Zebra querying)
+ my @listresult = ();
+ my $numbers=0;
+ if ($sortby eq 'HeadingDsc') { # sort by mainmainentry desc
+ foreach my $key (sort {$b cmp $a} (keys %result)) {
+ push @listresult, $result{$key};
+# warn "push..."$#finalresult;
+ $numbers++;
+ }
+ } else { # sort by mainmainentry ASC
+ foreach my $key (sort (keys %result)) {
+ push @listresult, $result{$key};
+# warn "push..."$#finalresult;
+ $numbers++;
+ }
+ }
+ # limit the $results_per_page to result size if it's more
+ $length = $numbers-$offset if $numbers < ($offset+$length);
+ # for the requested page, replace authid by the complete record
+ # speed improvement : avoid reading too much things
+ my @finalresult;
+ for (my $counter=$offset;$counter<=$offset+$length-1;$counter++) {
+# $finalresult[$counter] = GetAuthority($finalresult[$counter])->as_usmarc;
+ my $separator=C4::Context->preference('authoritysep');
+ my $authrecord =GetAuthority($listresult[$counter]);
+ my $authid=$listresult[$counter];
+ my $summary=BuildSummary($authrecord,$authid,$authtypecode);
+ my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?";
+ my $sth = $dbh->prepare($query_auth_tag);
+ $sth->execute($authtypecode);
+ my $auth_tag_to_report = $sth->fetchrow;
+ my %newline;
+ $newline{used}=CountUsage($authid);
+ $newline{summary} = $summary;
+ $newline{authid} = $authid;
+ $newline{even} = $counter % 2;
+ push @finalresult, \%newline;
+ }
+ return (\@finalresult, $numbers);
} else {
- $nb_table++;
- $sql_tables .= "auth_subfield_table as m$nb_table,";
- $sql_where1 .= "@$and_or[$i] (m$nb_table.subfieldvalue like '@$value[$i]' ";
- if (@$tags[$i]) {
- $sql_where1 .=" and concat(m$nb_table.tag,m$nb_table.subfieldcode) IN (@$tags[$i])";
- }
- $sql_where1.=")";
- $sql_where2.="m1.authid=m$nb_table.authid and ";
+ return;
}
- }
+ } else {
+ my $query;
+ my $attr;
+ # the marclist may contain "mainentry". In this case, search the tag_to_report, that depends on
+ # the authtypecode. Then, search on $a of this tag_to_report
+ # also store main entry MARC tag, to extract it at end of search
+ my $mainentrytag;
+ ##first set the authtype search and may be multiple authorities
+ my $n=0;
+ my @authtypecode;
+ my @auths=split / /,$authtypecode ;
+ my @queries;
+ foreach my $auth (@auths){
+ push @queries, " \@attr 1=authtype \@attr 5=100 ".$auth; ##No truncation on authtype
+ push @authtypecode ,$auth;
+ $n++;
+ }
+ if ($n>1){
+ while ($n>1){$query= "\@or ".$query;$n--;}
+ }
+
+ my $dosearch;
+ my $and=" \@and " ;
+ for(my $i = 0 ; $i <= $#{$value} ; $i++)
+ {
+ if (@$value[$i]){
+ ##If mainentry search $a tag
+ if (@$tags[$i] eq "mainmainentry") {
+
+ $attr =" \@attr 1=Heading-Main ";
+# $attr =" \@attr 1=Heading ";
+
+ }elsif (@$tags[$i] eq "mainentry") {
+ $attr =" \@attr 1=Heading ";
+ }else{
+ $attr =" \@attr 1=Any ";
+ }
+ if (@$operator[$i] eq 'is') {
+ $attr.=" \@attr 4=1 \@attr 5=100 ";##Phrase, No truncation,all of subfield field must match
+ }elsif (@$operator[$i] eq "="){
+ $attr.=" \@attr 4=107 "; #Number Exact match
+ }elsif (@$operator[$i] eq "start"){
+ $attr.=" \@attr 3=2 \@attr 4=1 \@attr 5=1 ";#Firstinfield Phrase, Right truncated
+ } else {
+ $attr .=" \@attr 5=1 \@attr 4=6 ";## Word list, right truncated, anywhere
+ }
+ $attr =$attr."\"".@$value[$i]."\"";
+ push @queries, "$attr";
+ $dosearch=1;
+ }#if value
+ }
+ ##Add how many queries generated
+ my $query;
+ foreach my $query_part (@queries){
+ $query=($query?$and.$query_part.$query:$query_part);
+ }
+ ## Adding order
+ #$query=' @or @attr 7=2 @attr 1=Heading 0 @or @attr 7=1 @attr 1=Heading 1'.$query if ($sortby eq "HeadingDsc");
+ my $orderstring= ($sortby eq "HeadingAsc"?
+ '@attr 7=1 @attr 1=Heading 0'
+ :
+ $sortby eq "HeadingDsc"?
+ '@attr 7=2 @attr 1=Heading 0'
+ :''
+ );
+ $query=($dosearch?"\@or $orderstring $query":"\@or ".($query?"$and $query":"")." \@attr 1=_ALLRECORDS \@attr 2=103 '' $orderstring ");
+ $debug && warn $query;
+
+ $offset=0 unless $offset;
+ my $counter = $offset;
+ $length=10 unless $length;
+ my @oAuth;
+ my $i;
+ $oAuth[0]=C4::Context->Zconn("authorityserver" , 1);
+ my $Anewq= new ZOOM::Query::PQF($query,$oAuth[0]);
+ my $oAResult;
+ $oAResult= $oAuth[0]->search($Anewq) ;
+ while (($i = ZOOM::event(\@oAuth)) != 0) {
+ my $ev = $oAuth[$i-1]->last_event();
+ last if $ev == ZOOM::Event::ZEND;
+ }
+ my($error, $errmsg, $addinfo, $diagset) = $oAuth[0]->error_x();
+ if ($error) {
+ warn "oAuth error: $errmsg ($error) $addinfo $diagset\n";
+ goto NOLUCK;
+ }
+
+ my $nbresults;
+ $nbresults=$oAResult->size();
+ my $nremains=$nbresults;
+ my @result = ();
+ my @finalresult = ();
+
+ if ($nbresults>0){
+
+ ##Find authid and linkid fields
+ ##we may be searching multiple authoritytypes.
+ ## FIXME this assumes that all authid and linkid fields are the same for all authority types
+ # my ($authidfield,$authidsubfield)=GetAuthMARCFromKohaField($dbh,"auth_header.authid",$authtypecode[0]);
+ # my ($linkidfield,$linkidsubfield)=GetAuthMARCFromKohaField($dbh,"auth_header.linkid",$authtypecode[0]);
+ while (($counter < $nbresults) && ($counter < ($offset + $length))) {
+
+ ##Here we have to extract MARC record and $authid from ZEBRA AUTHORITIES
+ my $rec=$oAResult->record($counter);
+ my $marcdata=$rec->raw();
+ my $authrecord;
+ my $separator=C4::Context->preference('authoritysep');
+ $authrecord = MARC::File::USMARC::decode($marcdata);
+ my $authid=$authrecord->field('001')->data();
+ my $summary=BuildSummary($authrecord,$authid,$authtypecode);
+ my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?";
+ my $sth = $dbh->prepare($query_auth_tag);
+ $sth->execute($authtypecode);
+ my $auth_tag_to_report = $sth->fetchrow;
+ my $reported_tag;
+ my $mainentry = $authrecord->field($auth_tag_to_report);
+ if ($mainentry) {
+ foreach ($mainentry->subfields()) {
+ $reported_tag .='$'.$_->[0].$_->[1];
+ }
+ }
+ my %newline;
+ $newline{summary} = $summary;
+ $newline{authid} = $authid;
+ $newline{even} = $counter % 2;
+ $newline{reported_tag} = $reported_tag;
+ $counter++;
+ push @finalresult, \%newline;
+ }## while counter
+ ###
+ for (my $z=0; $z<@finalresult; $z++){
+ my $count=CountUsage($finalresult[$z]{authid});
+ $finalresult[$z]{used}=$count;
+ }# all $z's
+
+ }## if nbresult
+ NOLUCK:
+ # $oAResult->destroy();
+ # $oAuth[0]->destroy();
+
+ return (\@finalresult, $nbresults);
}
+}
- if($sql_where2 ne "(") # some datas added to sql_where2, processing
- {
- $sql_where2 = substr($sql_where2, 0, (length($sql_where2)-5)); # deletes the trailing ' and '
- $sql_where2 .= ")";
- }
- else # no sql_where2 statement, deleting '('
- {
- $sql_where2 = "";
+=head2 CountUsage
+
+=over 4
+
+$count= &CountUsage($authid)
+counts Usage of Authid in bibliorecords.
+
+=back
+
+=cut
+
+sub CountUsage {
+ my ($authid) = @_;
+ if (C4::Context->preference('NoZebra')) {
+ # Read the index Koha-Auth-Number for this authid and count the lines
+ my $result = C4::Search::NZanalyse("an=$authid");
+ my @tab = split /;/,$result;
+ return scalar @tab;
+ } else {
+ ### ZOOM search here
+ my $oConnection=C4::Context->Zconn("biblioserver",1);
+ my $query;
+ $query= "an=".$authid;
+ my $oResult = $oConnection->search(new ZOOM::Query::CCL2RPN( $query, $oConnection ));
+ my $result;
+ while ((my $i = ZOOM::event([ $oConnection ])) != 0) {
+ my $ev = $oConnection->last_event();
+ if ($ev == ZOOM::Event::ZEND) {
+ $result = $oResult->size();
+ }
+ }
+ return ($result);
}
- chop $sql_tables; # deletes the trailing ','
-
- return ($sql_tables, $sql_where1, $sql_where2);
}
+=head2 CountUsageChildren
+
+=over 4
+
+$count= &CountUsageChildren($authid)
+counts Usage of narrower terms of Authid in bibliorecords.
+
+=back
-sub AUTHcount_usage {
+=cut
+
+sub CountUsageChildren {
my ($authid) = @_;
- ### try ZOOM search here
- my $oConnection=C4::Context->Zconn("biblioserver",1);
- my $query;
- $query= "an=".$authid;
-
- my $oResult = $oConnection->search(new ZOOM::Query::CCL2RPN( $query, $oConnection ));
- my $result;
- while ((my $i = ZOOM::event([ $oConnection ])) != 0) {
- my $ev = $oConnection->last_event();
- if ($ev == ZOOM::Event::ZEND) {
- $result = $oResult->size();
- }
- }
- return ($result);
}
+=head2 GetAuthTypeCode
+=over 4
-sub AUTHfind_authtypecode {
+$authtypecode= &GetAuthTypeCode($authid)
+returns authtypecode of an authid
+
+=back
+
+=cut
+
+sub GetAuthTypeCode {
+#AUTHfind_authtypecode
my ($authid) = @_;
my $dbh=C4::Context->dbh;
my $sth = $dbh->prepare("select authtypecode from auth_header where authid=?");
$sth->execute($authid);
- my ($authtypecode) = $sth->fetchrow;
+ my $authtypecode = $sth->fetchrow;
return $authtypecode;
}
+=head2 GetTagsLabels
+
+=over 4
+
+$tagslabel= &GetTagsLabels($forlibrarian,$authtypecode)
+returns a ref to hashref of authorities tag and subfield structure.
+
+tagslabel usage :
+$tagslabel->{$tag}->{$subfield}->{'attribute'}
+where attribute takes values in :
+ lib
+ tab
+ mandatory
+ repeatable
+ authorised_value
+ authtypecode
+ value_builder
+ kohafield
+ seealso
+ hidden
+ isurl
+ link
-sub AUTHgettagslib {
+=back
+
+=cut
+
+sub GetTagsLabels {
my ($forlibrarian,$authtypecode)= @_;
my $dbh=C4::Context->dbh;
$authtypecode="" unless $authtypecode;
@@ -309,12 +445,12 @@ sub AUTHgettagslib {
# check that authority exists
- $sth=$dbh->prepare("select count(*) from auth_tag_structure where authtypecode=?");
+ $sth=$dbh->prepare("SELECT count(*) FROM auth_tag_structure WHERE authtypecode=?");
$sth->execute($authtypecode);
my ($total) = $sth->fetchrow;
$authtypecode="" unless ($total >0);
$sth= $dbh->prepare(
-"SELECT tagfield,liblibrarian,libopac,mandatory,repeatable
+"SELECT auth_tag_structure.tagfield,auth_tag_structure.liblibrarian,auth_tag_structure.libopac,auth_tag_structure.mandatory,auth_tag_structure.repeatable
FROM auth_tag_structure
WHERE authtypecode=?
ORDER BY tagfield"
@@ -330,7 +466,7 @@ sub AUTHgettagslib {
$res->{$tag}->{repeatable} = $repeatable;
}
$sth= $dbh->prepare(
-"SELECT tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,authtypecode,value_builder,kohafield,seealso,hidden,isurl
+"SELECT tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,frameworkcode as authtypecode,value_builder,kohafield,seealso,hidden,isurl
FROM auth_subfield_structure
WHERE authtypecode=?
ORDER BY tagfield,tagsubfield"
@@ -370,213 +506,258 @@ ORDER BY tagfield,tagsubfield"
return $res;
}
-sub AUTHaddauthority {
+=head2 AddAuthority
+
+=over 4
+
+$authid= &AddAuthority($record, $authid,$authtypecode)
+returns authid of the newly created authority
+
+Either Create Or Modify existing authority.
+
+=back
+
+=cut
+
+sub AddAuthority {
# pass the MARC::Record to this function, and it will create the records in the authority table
my ($record,$authid,$authtypecode) = @_;
my $dbh=C4::Context->dbh;
-#my $leadercode=AUTHfind_leader($dbh,$authtypecode);
- my $leader=' a ';##Fixme correct leader as this one just adds utf8 to MARC21
-#substr($leader,8,1)=$leadercode;
-# $record->leader($leader);
-# my ($authfield,$authidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authid",$authtypecode);
-# my ($authfield2,$authtypesubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authtypecode",$authtypecode);
-# my ($linkidfield,$linkidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.linkid",$authtypecode);
+ my $leader=' nz a22 o 4500';#Leader for incomplete MARC21 record
# if authid empty => true add, find a new authid number
+ my $format= 'UNIMARCAUTH' if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC');
+ $format= 'MARC21' if (uc(C4::Context->preference('marcflavour')) ne 'UNIMARC');
+
+ if ($format eq "MARC21") {
+ if (!$record->leader) {
+ $record->leader($leader);
+ }
+ if (!$record->field('003')) {
+ $record->insert_fields_ordered(
+ MARC::Field->new('003',C4::Context->preference('MARCOrgCode'))
+ );
+ }
+ my $time=POSIX::strftime("%Y%m%d%H%M%S",localtime);
+ if (!$record->field('005')) {
+ $record->insert_fields_ordered(
+ MARC::Field->new('005',$time.".0")
+ );
+ }
+ my $date=POSIX::strftime("%y%m%d",localtime);
+ if (!$record->field('008')) {
+ $record->insert_fields_ordered(
+ MARC::Field->new('008',$date."|||a|||||| | ||| d")
+ );
+ }
+ if (!$record->field('040')) {
+ $record->insert_fields_ordered(
+ MARC::Field->new('040','','',
+ 'a' => C4::Context->preference('MARCOrgCode'),
+ 'c' => C4::Context->preference('MARCOrgCode')
+ )
+ );
+ }
+ }
+
+ if (($format eq "UNIMARCAUTH") && (!$record->subfield('100','a'))){
+ $record->leader(" nx j22 ");
+ my $date=POSIX::strftime("%Y%m%d",localtime);
+ if ($record->field('100')){
+ $record->field('100')->update('a'=>$date."afrey50 ba0");
+ } else {
+ $record->append_fields(
+ MARC::Field->new('100',' ',' '
+ ,'a'=>$date."afrey50 ba0")
+ );
+ }
+ }
+ my ($auth_type_tag, $auth_type_subfield) = get_auth_type_location($authtypecode);
+ if (!$authid and $format eq "MARC21") {
+ # only need to do this fix when modifying an existing authority
+ C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield);
+ }
+ if (my $field=$record->field($auth_type_tag)){
+ $field->update($auth_type_subfield=>$authtypecode);
+ }
+ else {
+ $record->add_fields($auth_type_tag,'','', $auth_type_subfield=>$authtypecode);
+ }
+
+ my $auth_exists=0;
+ my $oldRecord;
if (!$authid) {
my $sth=$dbh->prepare("select max(authid) from auth_header");
$sth->execute;
($authid)=$sth->fetchrow;
$authid=$authid+1;
##Insert the recordID in MARC record
- ##Both authid and authtypecode is expected to be in the same field. Modify if other requirements arise
- $record->add_fields('001',$authid) unless $record->field('001');
- $record->add_fields('152','','','b'=>$authtypecode) unless $record->field('152');
- # $record->add_fields('100','','','b'=>$authtypecode);
- warn $record->as_formatted;
- $dbh->do("lock tables auth_header WRITE");
- $sth=$dbh->prepare("insert into auth_header (authid,datecreated,authtypecode,marc) values (?,now(),?,?)");
- $sth->execute($authid,$authtypecode,$record->as_usmarc);
- $sth->finish;
-
- }else{
- ##Modified record reinsertid
-# my $idfield=$record->field('001');
-# $record->delete_field($idfield);
+ unless ($record->field('001') && $record->field('001')->data() eq $authid){
+ $record->delete_field($record->field('001'));
+ $record->insert_fields_ordered(MARC::Field->new('001',$authid));
+ }
+ } else {
+ $auth_exists=$dbh->do(qq(select authid from auth_header where authid=?),undef,$authid);
+# warn "auth_exists = $auth_exists";
+ }
+ if ($auth_exists>0){
+ $oldRecord=GetAuthority($authid);
$record->add_fields('001',$authid) unless ($record->field('001'));
- $record->add_fields('152','','','b'=>$authtypecode) unless ($record->field('152'));
-# $record->add_fields($authfield,$authid);
-# $record->add_fields($authfield2,'','',$authtypesubfield=>$authtypecode);
- warn $record->as_formatted;
- $dbh->do("lock tables auth_header WRITE");
- my $sth=$dbh->prepare("update auth_header set marc=? where authid=?");
- $sth->execute($record->as_usmarc,$authid);
+# warn "\n\n\n enregistrement".$record->as_formatted;
+ my $sth=$dbh->prepare("update auth_header set authtypecode=?,marc=?,marcxml=? where authid=?");
+ $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$authid) or die $sth->errstr;
$sth->finish;
- }
- $dbh->do("unlock tables");
- ModZebra($authid,'specialUpdate',"authorityserver");
-
-# if ($record->field($linkidfield)){
-# my @fields=$record->field($linkidfield);
-#
-# foreach my $field (@fields){
-# my $linkid=$field->subfield($linkidsubfield) ;
-# if ($linkid){
-# ##Modify the record of linked
-# AUTHaddlink($dbh,$linkid,$authid);
-# }
-# }
-# }
- return ($authid);
+ }
+ else {
+ my $sth=$dbh->prepare("insert into auth_header (authid,datecreated,authtypecode,marc,marcxml) values (?,now(),?,?,?)");
+ $sth->execute($authid,$authtypecode,$record->as_usmarc,$record->as_xml_record($format));
+ $sth->finish;
+ }
+ ModZebra($authid,'specialUpdate',"authorityserver",$oldRecord,$record);
+ return ($authid);
}
-sub AUTHaddlink{
- my ($linkid,$authid)=@_;
- my $dbh=C4::Context->dbh;
- my $record=AUTHgetauthority($linkid);
- my $authtypecode=AUTHfind_authtypecode($linkid);
-#warn "adding l:$linkid,a:$authid,auth:$authtypecode";
- $record=AUTH2marcOnefieldlink($record,"auth_header.linkid",$authid,$authtypecode);
- $dbh->do("lock tables auth_header WRITE");
- my $sth=$dbh->prepare("update auth_header set marc=? where authid=?");
- $sth->execute($record->as_usmarc,$linkid);
- $sth->finish;
- $dbh->do("unlock tables");
- ModZebra($linkid,'specialUpdate',"authorityserver");
-}
-sub AUTH2marcOnefieldlink {
- my ( $record, $kohafieldname, $newvalue,$authtypecode ) = @_;
- my $dbh=C4::Context->dbh;
- my $sth = $dbh->prepare(
-"select tagfield,tagsubfield from auth_subfield_structure where authtypecode=? and kohafield=?"
- );
- $sth->execute($authtypecode,$kohafieldname);
- my ($tagfield,$tagsubfield)=$sth->fetchrow;
- $record->add_fields( $tagfield, " ", " ", $tagsubfield => $newvalue );
- return $record;
-}
+=head2 DelAuthority
-sub XMLgetauthority {
+=over 4
- # Returns MARC::XML of the authority passed in parameter.
- my ( $authid ) = @_;
- my $dbh=C4::Context->dbh;
- my $sth =
- $dbh->prepare("select marc from auth_header where authid=? " );
- $sth->execute($authid);
- my ($marc)=$sth->fetchrow;
- $marc=MARC::File::USMARC::decode($marc);
- my $marcxml=$marc->as_xml_record();
- return $marcxml;
+$authid= &DelAuthority($authid)
+Deletes $authid
-}
+=back
+=cut
-sub AUTHfind_leader{
-##Hard coded for NEU auth types
-my($authtypecode)=@_;
-my $leadercode;
-if ($authtypecode eq "AUTH"){
-$leadercode="a";
-}elsif ($authtypecode eq "ESUB"){
-$leadercode="b";
-}elsif ($authtypecode eq "TSUB"){
-$leadercode="c";
-}else{
-$leadercode=" ";
-}
-return $leadercode;
+sub DelAuthority {
+ my ($authid) = @_;
+ my $dbh=C4::Context->dbh;
+
+ ModZebra($authid,"recordDelete","authorityserver",GetAuthority($authid),undef);
+ $dbh->do("delete from auth_header where authid=$authid") ;
+
}
-sub AUTHgetauthority {
-# Returns MARC::Record of the biblio passed in parameter.
- my ($authid)=@_;
+sub ModAuthority {
+ my ($authid,$record,$authtypecode,$merge)=@_;
my $dbh=C4::Context->dbh;
- my $sth=$dbh->prepare("select marc from auth_header where authid=?");
- $sth->execute($authid);
- my ($marc) = $sth->fetchrow;
- my $record=MARC::File::USMARC::decode($marc);
+ #Now rewrite the $record to table with an add
+ my $oldrecord=GetAuthority($authid);
+ $authid=AddAuthority($record,$authid,$authtypecode);
- return ($record);
+### If a library thinks that updating all biblios is a long process and wishes to leave that to a cron job to use merge_authotities.p
+### they should have a system preference "dontmerge=1" otherwise by default biblios will be updated
+### the $merge flag is now depreceated and will be removed at code cleaning
+ if (C4::Context->preference('MergeAuthoritiesOnUpdate') ){
+ &merge($authid,$oldrecord,$authid,$record);
+ } else {
+ # save the file in tmp/modified_authorities
+ my $cgidir = C4::Context->intranetdir ."/cgi-bin";
+ unless (opendir(DIR,"$cgidir")) {
+ $cgidir = C4::Context->intranetdir."/";
+ closedir(DIR);
+ }
+
+ my $filename = $cgidir."/tmp/modified_authorities/$authid.authid";
+ open AUTH, "> $filename";
+ print AUTH $authid;
+ close AUTH;
+ }
+ return $authid;
}
-sub AUTHgetauth_type {
- my ($authtypecode) = @_;
- my $dbh=C4::Context->dbh;
- my $sth=$dbh->prepare("select * from auth_types where authtypecode=?");
- $sth->execute($authtypecode);
- return $sth->fetchrow_hashref;
+=head2 GetAuthorityXML
+
+=over 4
+
+$marcxml= &GetAuthorityXML( $authid)
+returns xml form of record $authid
+
+=back
+
+=cut
+
+sub GetAuthorityXML {
+ # Returns MARC::XML of the authority passed in parameter.
+ my ( $authid ) = @_;
+ if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC') {
+ my $dbh=C4::Context->dbh;
+ my $sth = $dbh->prepare("select marcxml from auth_header where authid=? " );
+ $sth->execute($authid);
+ my ($marcxml)=$sth->fetchrow;
+ return $marcxml;
+ }
+ else {
+ # for MARC21, call GetAuthority instead of
+ # getting the XML directly since we may
+ # need to fix up the location of the authority
+ # code -- note that this is reasonably safe
+ # because GetAuthorityXML is used only by the
+ # indexing processes like zebraqueue_start.pl
+ my $record = GetAuthority($authid);
+ return $record->as_xml_record('MARC21');
+ }
}
-sub AUTHmodauthority {
- my ($authid,$record,$authtypecode,$merge)=@_;
+=head2 GetAuthority
+
+=over 4
+
+$record= &GetAuthority( $authid)
+Returns MARC::Record of the authority passed in parameter.
+
+=back
+
+=cut
+
+sub GetAuthority {
+ my ($authid)=@_;
my $dbh=C4::Context->dbh;
- my ($oldrecord)=&AUTHgetauthority($authid);
- if ($oldrecord eq $record) {
- return;
+ my $sth=$dbh->prepare("select authtypecode, marcxml from auth_header where authid=?");
+ $sth->execute($authid);
+ my ($authtypecode, $marcxml) = $sth->fetchrow;
+ my $record=eval {MARC::Record->new_from_xml(StripNonXmlChars($marcxml),'UTF-8',
+ (C4::Context->preference("marcflavour") eq "UNIMARC"?"UNIMARCAUTH":C4::Context->preference("marcflavour")))};
+ return undef if ($@);
+ $record->encoding('UTF-8');
+ if (C4::Context->preference("marcflavour") eq "MARC21") {
+ my ($auth_type_tag, $auth_type_subfield) = get_auth_type_location($authtypecode);
+ C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield);
}
-my $sth=$dbh->prepare("update auth_header set marc=? where authid=?");
-#warn find if linked records exist and delete them
-my($linkidfield,$linkidsubfield)=AUTHfind_marc_from_kohafield("auth_header.linkid",$authtypecode);
-
-if ($oldrecord->field($linkidfield)){
-my @fields=$oldrecord->field($linkidfield);
- foreach my $field (@fields){
-my $linkid=$field->subfield($linkidsubfield) ;
- if ($linkid){
- ##Modify the record of linked
- my $linkrecord=AUTHgetauthority($linkid);
- my $linktypecode=AUTHfind_authtypecode($linkid);
- my ( $linkidfield2,$linkidsubfield2)=AUTHfind_marc_from_kohafield("auth_header.linkid",$linktypecode);
- my @linkfields=$linkrecord->field($linkidfield2);
- foreach my $linkfield (@linkfields){
- if ($linkfield->subfield($linkidsubfield2) eq $authid){
- $linkrecord->delete_field($linkfield);
- $sth->execute($linkrecord->as_usmarc,$linkid);
- ModZebra($linkid,'specialUpdate',"authorityserver");
- }
- }#foreach linkfield
- }
- }#foreach linkid
+ return ($record);
}
-#Now rewrite the $record to table with an add
-$authid=AUTHaddauthority($record,$authid,$authtypecode);
+=head2 GetAuthType
-### If a library thinks that updating all biblios is a long process and wishes to leave that to a cron job to use merge_authotities.p
-### they should have a system preference "dontmerge=1" otherwise by default biblios will be updated
-### the $merge flag is now depreceated and will be removed at code cleaning
+=over 4
-if (C4::Context->preference('dontmerge') ){
-# save the file in localfile/modified_authorities
- my $cgidir = C4::Context->intranetdir ."/cgi-bin";
- unless (opendir(DIR,"$cgidir")) {
- $cgidir = C4::Context->intranetdir."/";
- }
+$result = &GetAuthType($authtypecode)
- my $filename = $cgidir."/localfile/modified_authorities/$authid.authid";
- open AUTH, "> $filename";
- print AUTH $authid;
- close AUTH;
-} else {
- &merge($authid,$record,$authid,$record);
-}
-return $authid;
-}
+=back
-sub AUTHdelauthority {
- my ($authid,$keep_biblio) = @_;
- my $dbh=C4::Context->dbh;
-# if the keep_biblio is set to 1, then authority entries in biblio are preserved.
+If the authority type specified by C<$authtypecode> exists,
+returns a hashref of the type's fields. If the type
+does not exist, returns undef.
-ModZebra($authid,"recordDelete","authorityserver");
- $dbh->do("delete from auth_header where authid=$authid") ;
+=cut
-# FIXME : delete or not in biblio tables (depending on $keep_biblio flag)
+sub GetAuthType {
+ my ($authtypecode) = @_;
+ my $dbh=C4::Context->dbh;
+ my $sth;
+ if (defined $authtypecode){ # NOTE - in MARC21 framework, '' is a valid authority
+ # type (FIXME but why?)
+ $sth=$dbh->prepare("select * from auth_types where authtypecode=?");
+ $sth->execute($authtypecode);
+ if (my $res = $sth->fetchrow_hashref) {
+ return $res;
+ }
+ }
+ return;
}
+
sub AUTHhtml2marc {
my ($rtags,$rsubfields,$rvalues,%indicators) = @_;
my $dbh=C4::Context->dbh;
@@ -624,9 +805,20 @@ sub AUTHhtml2marc {
return $record;
}
+=head2 FindDuplicateAuthority
+
+=over 4
+
+$record= &FindDuplicateAuthority( $record, $authtypecode)
+return $authid,Summary if duplicate is found.
+
+Comments : an improvement would be to return All the records that match.
+
+=back
+=cut
-sub FindDuplicate {
+sub FindDuplicateAuthority {
my ($record,$authtypecode)=@_;
# warn "IN for ".$record->as_formatted;
@@ -636,138 +828,218 @@ sub FindDuplicate {
$sth->execute($authtypecode);
my ($auth_tag_to_report) = $sth->fetchrow;
$sth->finish;
-# warn "record :".$record->as_formatted." authtattoreport :$auth_tag_to_report";
- # build a request for authoritysearch
+# warn "record :".$record->as_formatted." auth_tag_to_report :$auth_tag_to_report";
+ # build a request for SearchAuthorities
my $query='at='.$authtypecode.' ';
- map {$query.= " and he=\"".$_->[1]."\"" if ($_->[0]=~/[A-z]/)} $record->field($auth_tag_to_report)->subfields() if $record->field($auth_tag_to_report);
- my ($error,$results)=SimpleSearch($query,"authorityserver");
+ my $filtervalues=qr([\001-\040\!\'\"\`\#\$\%\&\*\+,\-\./:;<=>\?\@\(\)\{\[\]\}_\|\~]);
+ if ($record->field($auth_tag_to_report)) {
+ foreach ($record->field($auth_tag_to_report)->subfields()) {
+ $_->[1]=~s/$filtervalues/ /g; $query.= " and he,wrdl=\"".$_->[1]."\"" if ($_->[0]=~/[A-z]/);
+ }
+ }
+ my ($error, $results, $total_hits)=SimpleSearch( $query, 0, 1, [ "authorityserver" ] );
# there is at least 1 result => return the 1st one
if (@$results>0) {
my $marcrecord = MARC::File::USMARC::decode($results->[0]);
- return $marcrecord->field('001')->data,getsummary($marcrecord,$marcrecord->field('001')->data,$authtypecode);
+ return $marcrecord->field('001')->data,BuildSummary($marcrecord,$marcrecord->field('001')->data,$authtypecode);
}
# no result, returns nothing
return;
}
-sub getsummary{
-## give this a Marc record to return summary
-my ($record,$authid,$authtypecode)=@_;
-
-my $dbh=C4::Context->dbh;
-# my $authtypecode = AUTHfind_authtypecode($dbh,$authid);
- my $authref = getauthtype($authtypecode);
- my $summary = $authref->{summary};
- my @fields = $record->fields();
-# chop $tags_using_authtype; # FIXME: why commented out?
- my $reported_tag;
-
- # if the library has a summary defined, use it. Otherwise, build a standard one
- if ($summary) {
- my @fields = $record->fields();
-# $reported_tag = '$9'.$result[$counter];
- foreach my $field (@fields) {
- my $tag = $field->tag();
- my $tagvalue = $field->as_string();
- $summary =~ s/\[(.?.?.?.?)$tag\*(.*?)]/$1$tagvalue$2\[$1$tag$2]/g;
- if ($tag<10) {
- if ($tag eq '001') {
- $reported_tag.='$3'.$field->data();
- }
+=head2 BuildSummary
- } else {
- my @subf = $field->subfields;
- for my $i (0..$#subf) {
- my $subfieldcode = $subf[$i][0];
- my $subfieldvalue = $subf[$i][1];
- my $tagsubf = $tag.$subfieldcode;
- $summary =~ s/\[(.?.?.?.?)$tagsubf(.*?)]/$1$subfieldvalue$2\[$1$tagsubf$2]/g;
-# if ($tag eq $auth_tag_to_report) {
-# $reported_tag.='$'.$subfieldcode.$subfieldvalue;
-# }
- }
- }
- }
- $summary =~ s/\[(.*?)]//g;
- $summary =~ s/\n/
/g;
- } else {
- my $heading; # = $authref->{summary};
- my $altheading;
- my $seeheading;
- my $see;
- my @fields = $record->fields();
- if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
- # construct UNIMARC summary, that is quite different from MARC21 one
- # accepted form
- foreach my $field ($record->field('2..')) {
- $heading.= $field->as_string();
- }
- # rejected form(s)
- foreach my $field ($record->field('4..')) {
- $summary.= " ".$field->as_string()."
";
- $summary.= " see: ".$heading."
";
- }
- # see :
- foreach my $field ($record->field('5..')) {
- $summary.= " ".$field->as_string()."
";
- $summary.= " see: ".$heading."
";
- }
- # // form
- foreach my $field ($record->field('7..')) {
- $seeheading.= " see also: ".$field->as_string()."
";
- $altheading.= " ".$field->as_string()."
";
- $altheading.= " see also: ".$heading."
";
- }
- $summary = "".$heading."
".$seeheading.$altheading.$summary;
- } else {
- # construct MARC21 summary
- foreach my $field ($record->field('1..')) {
- if ($record->field('100')) {
- $heading.= $field->as_string('abcdefghjklmnopqrstvxyz68');
- } elsif ($record->field('110')) {
- $heading.= $field->as_string('abcdefghklmnoprstvxyz68');
- } elsif ($record->field('111')) {
- $heading.= $field->as_string('acdefghklnpqstvxyz68');
- } elsif ($record->field('130')) {
- $heading.= $field->as_string('adfghklmnoprstvxyz68');
- } elsif ($record->field('148')) {
- $heading.= $field->as_string('abvxyz68');
- } elsif ($record->field('150')) {
- # $heading.= $field->as_string('abvxyz68');
- $heading.= $field->as_formatted();
- my $tag=$field->tag();
- $heading=~s /^$tag//g;
- $heading =~s /\_/\$/g;
- } elsif ($record->field('151')) {
- $heading.= $field->as_string('avxyz68');
- } elsif ($record->field('155')) {
- $heading.= $field->as_string('abvxyz68');
- } elsif ($record->field('180')) {
- $heading.= $field->as_string('vxyz68');
- } elsif ($record->field('181')) {
- $heading.= $field->as_string('vxyz68');
- } elsif ($record->field('182')) {
- $heading.= $field->as_string('vxyz68');
- } elsif ($record->field('185')) {
- $heading.= $field->as_string('vxyz68');
- } else {
- $heading.= $field->as_string();
- }
- } #See From
- foreach my $field ($record->field('4..')) {
- $seeheading.= " ".$field->as_string()."
";
- $seeheading.= " see: ".$seeheading."
";
- } #See Also
- foreach my $field ($record->field('5..')) {
- $altheading.= " see also: ".$field->as_string()."
";
- $altheading.= " ".$field->as_string()."
";
- $altheading.= " see also: ".$altheading."
";
- }
- $summary.=$heading.$seeheading.$altheading;
- }
+=over 4
+
+$text= &BuildSummary( $record, $authid, $authtypecode)
+return HTML encoded Summary
+
+Comment : authtypecode can be infered from both record and authid.
+Moreover, authid can also be inferred from $record.
+Would it be interesting to delete those things.
+
+=back
+
+=cut
+
+sub BuildSummary{
+## give this a Marc record to return summary
+ my ($record,$authid,$authtypecode)=@_;
+ my $dbh=C4::Context->dbh;
+ my $summary;
+ # handle $authtypecode is NULL or eq ""
+ if ($authtypecode) {
+ my $authref = GetAuthType($authtypecode);
+ $summary = $authref->{summary};
+ }
+ # FIXME: should use I18N.pm
+ my %language;
+ $language{'fre'}="Français";
+ $language{'eng'}="Anglais";
+ $language{'ger'}="Allemand";
+ $language{'ita'}="Italien";
+ $language{'spa'}="Espagnol";
+ my %thesaurus;
+ $thesaurus{'1'}="Peuples";
+ $thesaurus{'2'}="Anthroponymes";
+ $thesaurus{'3'}="Oeuvres";
+ $thesaurus{'4'}="Chronologie";
+ $thesaurus{'5'}="Lieux";
+ $thesaurus{'6'}="Sujets";
+ #thesaurus a remplir
+ my @fields = $record->fields();
+ my $reported_tag;
+ # if the library has a summary defined, use it. Otherwise, build a standard one
+ # FIXME - it appears that the summary field in the authority frameworks
+ # can work as a display template. However, this doesn't
+ # suit the MARC21 version, so for now the "templating"
+ # feature will be enabled only for UNIMARC for backwards
+ # compatibility.
+ if ($summary and C4::Context->preference('marcflavour') eq 'UNIMARC') {
+ my @fields = $record->fields();
+ # $reported_tag = '$9'.$result[$counter];
+ foreach my $field (@fields) {
+ my $tag = $field->tag();
+ my $tagvalue = $field->as_string();
+ $summary =~ s/\[(.?.?.?.?)$tag\*(.*?)]/$1$tagvalue$2\[$1$tag$2]/g;
+ if ($tag<10) {
+ if ($tag eq '001') {
+ $reported_tag.='$3'.$field->data();
+ }
+ } else {
+ my @subf = $field->subfields;
+ for my $i (0..$#subf) {
+ my $subfieldcode = $subf[$i][0];
+ my $subfieldvalue = $subf[$i][1];
+ my $tagsubf = $tag.$subfieldcode;
+ $summary =~ s/\[(.?.?.?.?)$tagsubf(.*?)]/$1$subfieldvalue$2\[$1$tagsubf$2]/g;
}
-return $summary;
+ }
+ }
+ $summary =~ s/\[(.*?)]//g;
+ $summary =~ s/\n/
/g;
+ } else {
+ my $heading;
+ my $authid;
+ my $altheading;
+ my $seealso;
+ my $broaderterms;
+ my $narrowerterms;
+ my $see;
+ my $seeheading;
+ my $notes;
+ my @fields = $record->fields();
+ if (C4::Context->preference('marcflavour') eq 'UNIMARC') {
+ # construct UNIMARC summary, that is quite different from MARC21 one
+ # accepted form
+ foreach my $field ($record->field('2..')) {
+ $heading.= $field->subfield('a');
+ $authid=$field->subfield('3');
+ }
+ # rejected form(s)
+ foreach my $field ($record->field('3..')) {
+ $notes.= ''.$field->subfield('a')."\n";
+ }
+ foreach my $field ($record->field('4..')) {
+ if ($field->subfield('2')) {
+ my $thesaurus = "thes. : ".$thesaurus{"$field->subfield('2')"}." : ";
+ $see.= ''.$thesaurus.$field->subfield('a')." -- \n";
+ }
+ }
+ # see :
+ foreach my $field ($record->field('5..')) {
+
+ if (($field->subfield('5')) && ($field->subfield('a')) && ($field->subfield('5') eq 'g')) {
+ $broaderterms.= ' '.$field->subfield('a')." -- \n";
+ } elsif (($field->subfield('5')) && ($field->subfield('a')) && ($field->subfield('5') eq 'h')){
+ $narrowerterms.= ''.$field->subfield('a')." -- \n";
+ } elsif ($field->subfield('a')) {
+ $seealso.= ''.$field->subfield('a')." -- \n";
+ }
+ }
+ # // form
+ foreach my $field ($record->field('7..')) {
+ my $lang = substr($field->subfield('8'),3,3);
+ $seeheading.= ' En '.$language{$lang}.' : '.$field->subfield('a')."
\n";
+ }
+ $broaderterms =~s/-- \n$//;
+ $narrowerterms =~s/-- \n$//;
+ $seealso =~s/-- \n$//;
+ $see =~s/-- \n$//;
+ $summary = "".$heading."
".($notes?"$notes
":"");
+ $summary.= '