Bug 6831 follow-up: add support for UNIMARC and NORMARC
authorKatrin Fischer <Katrin.Fischer.83@web.de>
Sun, 11 Mar 2012 19:00:39 +0000 (20:00 +0100)
committerPaul Poulain <paul.poulain@biblibre.com>
Wed, 21 Mar 2012 10:30:37 +0000 (11:30 +0100)
1) Removes unused subroutine get_host_control_num
2) Fixes small mistake, correct subfield for ISBN 020 is z
3) Checks system preference for correct marcflavour instead of
   assuming MARC21
4) Fixes MARC21 to not use author(), because it would also add
   fields like $w and $0 to 773$a
5) Fixes MARC21 to not use title(), but 245$a, because it would
   also add too many subfields.
6) Adds definitions for UNIMARC and includes NORMARC

Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
Works properly with all supported MARC flavours.

Signed-off-by: Paul Poulain <paul.poulain@biblibre.com>

C4/Biblio.pm
cataloguing/addbiblio.pl

index 5fe0be9..432eb6b 100644 (file)
@@ -3650,19 +3650,25 @@ Generate the host item entry for an analytic child entry
 
 sub prepare_host_field {
     my ( $hostbiblio, $marcflavour ) = @_;
-    $marcflavour ||= 'MARC21';
+    $marcflavour ||= C4::Context->preference('marcflavour');
     my $host = GetMarcBiblio($hostbiblio);
-    if ( $marcflavour eq 'MARC21' ) {
-
-        # unfortunately as_string does not 'do the right thing'
-        # if field returns undef
-        my %sfd;
-        my $field;
-        if ( $field = $host->author() ) {
-            $sfd{a} = $field;
+    # 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->title() ) {
-            $sfd{t} = $field;
+        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');
@@ -3685,13 +3691,76 @@ sub prepare_host_field {
         if ( $field = $host->field('020') ) {
             my $s = $field->as_string('a');
             if ($s) {
-                $sfd{x} = $s;
+                $sfd{z} = $s;
             }
         }
         if ( $field = $host->field('001') ) {
             $sfd{w} = $field->data(),;
         }
-        my $host_field = MARC::Field->new( 773, '0', ' ', %sfd );
+        $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;
index 22d1b8d..8e4defd 100755 (executable)
@@ -995,12 +995,3 @@ $template->param(
 );
 
 output_html_with_http_headers $input, $cookie, $template->output;
-
-sub get_host_control_num {
-    my $host_biblio_nr = shift;
-    my $host = GetMarcBiblio($host_biblio_nr);
-    my $control_num = GetMarcControlnumber($host, C4::Context->preference('marcflavour'));
-    $host = GetBiblioData($host_biblio_nr);
-    $host->{control_number} = $control_num;
-    return $host;
-}