various installer changes
[koha_fer] / cataloguing / addbiblio.pl
index 7abb2b9..814551c 100755 (executable)
@@ -1,6 +1,5 @@
 #!/usr/bin/perl 
 
-# $Id$
 
 # Copyright 2000-2002 Katipo Communications
 #
@@ -30,6 +29,10 @@ use C4::Context;
 use MARC::Record;
 use C4::Log;
 use C4::Koha;    # XXX subfield_is_koha_internal_p
+use C4::Branch;    # XXX subfield_is_koha_internal_p
+use C4::ClassSource;
+use C4::ImportBatch;
+
 use Date::Calc qw(Today);
 use MARC::File::USMARC;
 use MARC::File::XML;
@@ -42,9 +45,9 @@ our($tagslib,$authorised_values_sth,$is_a_modif,$usedTagsLib,$mandatory_z3950);
 
 =item MARCfindbreeding
 
-    $record = MARCfindbreeding($dbh, $breedingid);
+    $record = MARCfindbreeding($breedingid);
 
-Look up the breeding farm with database handle $dbh, for the
+Look up the import record repository for the record with
 record with id $breedingid.  If found, returns the decoded
 MARC::Record; otherwise, -1 is returned (FIXME).
 Returns as second parameter the character encoding.
@@ -52,25 +55,23 @@ Returns as second parameter the character encoding.
 =cut
 
 sub MARCfindbreeding {
-    my ( $dbh, $id ) = @_;
-    my $sth =
-      $dbh->prepare("select file,marc,encoding from marc_breeding where id=?");
-    $sth->execute($id);
-    my ( $file, $marc, $encoding ) = $sth->fetchrow;
+    my ( $id ) = @_;
+    my ($marc, $encoding) = GetImportRecordMarc($id);
+    # remove the - in isbn, koha store isbn without any -
     if ($marc) {
         my $record = MARC::Record->new_from_usmarc($marc);
-        if ( $record->field('010') ) {
-            foreach my $field ( $record->field('010') ) {
-                foreach my $subfield ( $field->subfield('a') ) {
-                    my $newisbn = $field->subfield('a');
+        my ($isbnfield,$isbnsubfield) = GetMarcFromKohaField('biblioitems.isbn','');
+        if ( $record->field($isbnfield) ) {
+            foreach my $field ( $record->field($isbnfield) ) {
+                foreach my $subfield ( $field->subfield($isbnsubfield) ) {
+                    my $newisbn = $field->subfield($isbnsubfield);
                     $newisbn =~ s/-//g;
-                    $field->update( 'a' => $newisbn );
+                    $field->update( $isbnsubfield => $newisbn );
                 }
-                # record->insert_fields_ordered($record->field('010'));
             }
         }
-
-        if ($record->subfield(100,'a')) {
+        # fix the unimarc 100 coded field (with unicode information)
+        if (C4::Context->preference('marcflavour') eq 'UNIMARC' && $record->subfield(100,'a')) {
             my $f100a=$record->subfield(100,'a');
             my $f100 = $record->field(100);
             my $f100temp = $f100->as_string;
@@ -87,6 +88,7 @@ sub MARCfindbreeding {
             return -1;
         }
         else {
+            # normalize author : probably UNIMARC specific...
             if (    C4::Context->preference("z3950NormalizeAuthor")
                 and C4::Context->preference("z3950AuthorAuthFields") )
             {
@@ -162,16 +164,16 @@ sub build_authorized_values_list ($$$$$$$) {
 
     #---- branch
     if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) {
-        my $sth =
-          $dbh->prepare(
-            "select branchcode,branchname from branches order by branchname");
-        $sth->execute;
-        push @authorised_values, ""
-          unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
-
-        while ( my ( $branchcode, $branchname ) = $sth->fetchrow_array ) {
-            push @authorised_values, $branchcode;
-            $authorised_lib{$branchcode} = $branchname;
+        #Use GetBranches($onlymine)
+        my $onlymine=C4::Context->preference('IndependantBranches') && 
+                C4::Context->userenv && 
+                C4::Context->userenv->{flags}!=1 && 
+                C4::Context->userenv->{branch};
+        my $branches = GetBranches($onlymine);
+        my @branchloop;
+        foreach my $thisbranch ( sort keys %$branches ) {
+            push @authorised_values, $thisbranch;
+            $authorised_lib{$thisbranch} = $branches->{$thisbranch}->{'branchname'};
         }
 
         #----- itemtypes
@@ -192,6 +194,25 @@ sub build_authorized_values_list ($$$$$$$) {
         }
         $value = $itemtype unless ($value);
 
+          #---- class_sources
+    }
+    elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) {
+        push @authorised_values, ""
+          unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
+
+        my $class_sources = GetClassSources();
+
+        my $default_source = C4::Context->preference("DefaultClassificationSource");
+
+        foreach my $class_source (sort keys %$class_sources) {
+            next unless $class_sources->{$class_source}->{'used'} or
+                        ($value and $class_source eq $value) or
+                        ($class_source eq $default_source);
+            push @authorised_values, $class_source;
+            $authorised_lib{$class_source} = $class_sources->{$class_source}->{'description'};
+            $value = $class_source unless ($value);
+            $value = $default_source unless ($value);
+        }
         #---- "true" authorised value
     }
     else {
@@ -243,12 +264,14 @@ sub GetMandatoryFieldZ3950($){
     my @title  = GetMarcFromKohaField('biblio.title',$frameworkcode);
     my @author = GetMarcFromKohaField('biblio.author',$frameworkcode);
     my @issn   = GetMarcFromKohaField('biblioitems.issn',$frameworkcode);
+    my @lccn   = GetMarcFromKohaField('biblioitems.lccn',$frameworkcode);
     
     return {
         $isbn[0].$isbn[1]     => 'isbn',
         $title[0].$title[1]   => 'title',
         $author[0].$author[1] => 'author',
         $issn[0].$issn[1]     => 'issn',
+        $lccn[0].$lccn[1]     => 'lccn',
     };
 }
 
@@ -290,7 +313,9 @@ sub create_input {
         index          => $index_tag,
         id             => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield,
         value          => $value,
+        random         => CreateKey(),
     );
+    # deal with a <010 tag
     if($subfield eq '@'){
         $subfield_data{id} = "tag_".$tag."_subfield_00_".$index_tag."_".$index_subfield;
     } else {
@@ -300,12 +325,14 @@ sub create_input {
     if(exists $mandatory_z3950->{$tag.$subfield}){
         $subfield_data{z3950_mandatory} = $mandatory_z3950->{$tag.$subfield};
     }
-    
+    # decide if the subfield must be expanded (visible) by default or not
+    # if it is mandatory, then expand. If it is hidden explicitly by the hidden flag, hidden anyway
     $subfield_data{visibility} = "display:none;"
         if (    ($tagslib->{$tag}->{$subfield}->{hidden} % 2 == 1) and $value ne ''
             or ($value eq '' and !$tagslib->{$tag}->{$subfield}->{mandatory})
         );
-    
+    # always expand all subfields of a mandatory field
+    $subfield_data{visibility} = "" if $tagslib->{$tag}->{mandatory};
     # it's an authorised field
     if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) {
         $subfield_data{marc_value} =
@@ -316,15 +343,17 @@ sub create_input {
     }
     elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) {
         $subfield_data{marc_value} =
-               "<input type=\"text\"
-                        id=\"".$subfield_data{id}."\"
-                        name=\"".$subfield_data{id}."\"
-                       value=\"$value\"
-                       class=\"input_marceditor\"
-                        tabindex=\"1\"                     
-                       disabled=\"disabled\" readonly=\"readonly\" \/>
-                       <span class=\"buttonDot\"
-                               onclick=\"Dopop('/cgi-bin/koha/authorities/auth_finder.pl?authtypecode=".$tagslib->{$tag}->{$subfield}->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}')\">...</span>
+            "<input type=\"text\"
+                    id=\"".$subfield_data{id}."\"
+                    name=\"".$subfield_data{id}."\"
+                    value=\"$value\"
+                    class=\"input_marceditor\"
+                    tabindex=\"1\"
+                    size=\"67\"
+                    maxlength=\"255\" 
+                    \/>
+                    <a href=\"#\" class=\"buttonDot\"
+                        onclick=\"Dopop('/cgi-bin/koha/authorities/auth_finder.pl?authtypecode=".$tagslib->{$tag}->{$subfield}->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
                ";
     # it's a plugin field
     }
@@ -335,24 +364,41 @@ sub create_input {
         my $cgidir = C4::Context->intranetdir . "/cgi-bin/cataloguing/value_builder";
         unless ( opendir( DIR, "$cgidir" ) ) {
             $cgidir = C4::Context->intranetdir . "/cataloguing/value_builder";
+            closedir( DIR );
         }
         my $plugin = $cgidir . "/" . $tagslib->{$tag}->{$subfield}->{'value_builder'};
-        do $plugin || die "Plugin Failed: ".$plugin;
-        my $extended_param = plugin_parameters( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop );
-        my ( $function_name, $javascript ) = plugin_javascript( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop );
-#         my ( $function_name, $javascript,$extended_param );
+        if (do $plugin) {
+            my $extended_param = plugin_parameters( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop );
+            my ( $function_name, $javascript ) = plugin_javascript( $dbh, $rec, $tagslib, $subfield_data{id}, $tabloop );
         
-        $subfield_data{marc_value} =
-               "<input tabindex=\"1\"
-                        type=\"text\"
+            $subfield_data{marc_value} =
+                    "<input tabindex=\"1\"
+                            type=\"text\"
+                            id=\"".$subfield_data{id}."\"
+                            name=\"".$subfield_data{id}."\"
+                            value=\"$value\"
+                            class=\"input_marceditor\"
+                            onfocus=\"Focus$function_name($index_tag)\"
+                            size=\"67\"
+                            maxlength=\"255\" 
+                            onblur=\"Blur$function_name($index_tag); \" \/>
+                            <a href=\"#\" class=\"buttonDot\" onclick=\"Clic$function_name('$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
+                    $javascript";
+        } else {
+            warn "Plugin Failed: $plugin";
+            # supply default input form
+            $subfield_data{marc_value} =
+                "<input type=\"text\"
                         id=\"".$subfield_data{id}."\"
-                       name=\"".$subfield_data{id}."\"
-                       value=\"$value\"
+                        name=\"".$subfield_data{id}."\"
+                        value=\"$value\"
+                        tabindex=\"1\"
+                        size=\"67\"
+                        maxlength=\"255\" 
                         class=\"input_marceditor\"
-                       onfocus=\"Focus$function_name($index_tag)\"
-                       onblur=\"Blur$function_name($index_tag); \" \/>
-               <span class=\"buttonDot\" onclick=\"Clic$function_name('$subfield_data{id}')\">...</a>
-               $javascript";
+                \/>
+                ";
+        }
         # it's an hidden field
     }
     elsif ( $tag eq '' ) {
@@ -361,6 +407,8 @@ sub create_input {
                     type=\"hidden\"
                     id=\"".$subfield_data{id}."\"
                     name=\"".$subfield_data{id}."\"
+                    size=\"67\"
+                    maxlength=\"255\" 
                     value=\"$value\" \/>
             ";
     }
@@ -371,6 +419,8 @@ sub create_input {
                     name=\"".$subfield_data{id}."\"
                     class=\"input_marceditor\"
                     tabindex=\"1\"
+                    size=\"67\"
+                    maxlength=\"255\" 
                     value=\"$value\"
             \/>";
 
@@ -394,6 +444,8 @@ sub create_input {
                            name=\"".$subfield_data{id}."\"
                            class=\"input_marceditor\"
                            tabindex=\"1\"
+                            size=\"67\"
+                            maxlength=\"255\" 
                            >$value</textarea>
                 ";
         }
@@ -404,6 +456,8 @@ sub create_input {
                         name=\"".$subfield_data{id}."\"
                         value=\"$value\"
                         tabindex=\"1\"
+                        size=\"67\"
+                        maxlength=\"255\" 
                         class=\"input_marceditor\"
                 \/>
                 ";
@@ -466,6 +520,7 @@ sub build_tabs ($$$$$) {
                else {
                   push @fields, $record->leader(); # if tag == 000
                }
+               # loop through each field
                 foreach my $field (@fields) {
                     
                     my @subfields_data;
@@ -528,12 +583,18 @@ sub build_tabs ($$$$$) {
                         );
                     }
                     if ( $#subfields_data >= 0 ) {
+                        # build the tag entry.
+                        # note that the random() field is mandatory. Otherwise, on repeated fields, you'll 
+                        # have twice the same "name" value, and cgi->param() will return only one, making
+                        # all subfields to be merged in a single field.
                         my %tag_data = (
                             tag           => $tag,
                             index         => $index_tag,
                             tag_lib       => $tagslib->{$tag}->{lib},
+                            repeatable       => $tagslib->{$tag}->{repeatable},
                             subfield_loop => \@subfields_data,
-                            fixedfield    => ($tag < 10)?(1):(0),
+                            fixedfield    => $tag < 10?1:0,
+                            random        => CreateKey,
                         );
                         if ($tag >= 010){ # no indicator for theses tag
                            $tag_data{indicator} = $field->indicator(1).$field->indicator(2);
@@ -571,7 +632,7 @@ sub build_tabs ($$$$$) {
                         indicator        => $indicator,
                         subfield_loop    => \@subfields_data,
                         tagfirstsubfield => $subfields_data[0],
-                        fixedfield       => ($tag < 10)?(1):(0)
+                        fixedfield       => $tag < 10?1:0,
                     );
                     
                     push @loop_data, \%tag_data ;
@@ -588,6 +649,16 @@ sub build_tabs ($$$$$) {
     $template->param( BIG_LOOP => \@BIG_LOOP );
 }
 
+#
+# sub that tries to find authorities linked to the biblio
+# the sub :
+#   - search in the authority DB for the same authid (in $9 of the biblio)
+#   - search in the authority DB for the same 001 (in $3 of the biblio in UNIMARC)
+#   - search in the authority DB for the same values (exactly) (in all subfields of the biblio)
+# if the authority is found, the biblio is modified accordingly to be connected to the authority.
+# if the authority is not found, it's added, and the biblio is then modified to be connected to the authority.
+#
+
 sub BiblioAddAuthorities{
   my ( $record, $frameworkcode ) = @_;
   my $dbh=C4::Context->dbh;
@@ -603,32 +674,37 @@ AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
   $query->execute($frameworkcode);
   my ($countcreated,$countlinked);
   while (my $data=$query->fetchrow_hashref){
-    warn Data::Dumper::Dumper($data); 
-    if ($record->field($data->{tagfield})){
-      next if ($record->subfield($data->{tagfield},'3')||$record->subfield($data->{tagfield},'9'));
+    foreach my $field ($record->field($data->{tagfield})){
+      next if ($field->subfield('3')||$field->subfield('9'));
       # No authorities id in the tag.
       # Search if there is any authorities to link to.
       my $query='at='.$data->{authtypecode}.' ';
-      map {$query.= " and he=".$_->[1] if ($_->[0]=~/[A-z]/)}  $record->field($data->{tagfield})->subfields();
-      warn $query;   
+      map {$query.= ' and he,ext="'.$_->[1].'"' if ($_->[0]=~/[A-z]/)}  $field->subfields();
       my ($error,$results)=SimpleSearch($query,"authorityserver");
-    # there is at least 1 result => return the 1st one
-      if (@$results>1) {
+    # there is only 1 result 
+      if ($results && scalar(@$results)==1) {
         my $marcrecord = MARC::File::USMARC::decode($results->[0]);
-        $record->field($data->{tagfield})->add_subfields('9'=>$marcrecord->field('001')->data);
+        $field->add_subfields('9'=>$marcrecord->field('001')->data);
+        $countlinked++;
+      } elsif (scalar(@$results)>1) {
+   #More than One result 
+   #This can comes out of a lack of a subfield.
+#         my $marcrecord = MARC::File::USMARC::decode($results->[0]);
+#         $record->field($data->{tagfield})->add_subfields('9'=>$marcrecord->field('001')->data);
   $countlinked++;
       } else {
   #There are no results, build authority record, add it to Authorities, get authid and add it to 9
-  ###NOTICE : This is only valid if a subfield is linked to one and only one authtypecode
-     
-        my $authtypedata=GetAuthType($data->{authtypecode});
-        my $marcrecordauth=MARC::Record->new();
-        my $field=MARC::Field->new($authtypedata->{auth_tag_to_report},'','',"a"=>"".$record->subfield($data->{tagfield},'a'));
-        map { $field->add_subfields($_->[0]=>$_->[1]) if ($_->[0]=~/[A-z]/ && $_->[0] ne "a" )}  $record->field($data->{tagfield})->subfields();
-        $marcrecordauth->insert_fields_ordered($field);
-        my $authid=AddAuthority($marcrecordauth,'',$data->{authtypecode});
-        $countcreated++;
-        $record->field($data->{tagfield})->add_subfields('9'=>$authid);
+  ###NOTICE : This is only valid if a subfield is linked to one and only one authtypecode     
+  ###NOTICE : This can be a problem. We should also look into other types and rejected forms.
+         my $authtypedata=GetAuthType($data->{authtypecode});
+         my $marcrecordauth=MARC::Record->new();
+         my $authfield=MARC::Field->new($authtypedata->{auth_tag_to_report},'','',"a"=>"".$field->subfield('a'));
+         map { $authfield->add_subfields($_->[0]=>$_->[1]) if ($_->[0]=~/[A-z]/ && $_->[0] ne "a" )}  $field->subfields();
+         $marcrecordauth->insert_fields_ordered($authfield);
+#          warn "AUTH RECORD ADDED : ".$marcrecordauth->as_formatted;
+         my $authid=AddAuthority($marcrecordauth,'',$data->{authtypecode});
+         $countcreated++;
+         $field->add_subfields('9'=>$authid);
       }
     }  
   }
@@ -659,8 +735,6 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
         type            => "intranet",
         authnotrequired => 0,
         flagsrequired   => { editcatalogue => 1 },
-               css_page => 'addbiblio.css',
-               js_page => 'addbiblio.js',
     }
 );
 
@@ -699,8 +773,8 @@ $mandatory_z3950 = GetMandatoryFieldZ3950($frameworkcode);
 my $record   = -1;
 my $encoding = "";
 my (
-       $biblionumtagfield,
-       $biblionumtagsubfield,
+       $biblionumbertagfield,
+       $biblionumbertagsubfield,
        $biblioitemnumtagfield,
        $biblioitemnumtagsubfield,
        $bibitem,
@@ -711,7 +785,7 @@ if (($biblionumber) && !($breedingid)){
        $record = GetMarcBiblio($biblionumber);
 }
 if ($breedingid) {
-    ( $record, $encoding ) = MARCfindbreeding( $dbh, $breedingid ) ;
+    ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ;
 }
 
 $is_a_modif = 0;
@@ -720,7 +794,7 @@ if ($biblionumber) {
     $is_a_modif = 1;
 
     # if it's a modif, retrieve bibli and biblioitem numbers for the future modification of old-DB.
-    ( $biblionumtagfield, $biblionumtagsubfield ) =
+    ( $biblionumbertagfield, $biblionumbertagsubfield ) =
        &GetMarcFromKohaField( "biblio.biblionumber", $frameworkcode );
     ( $biblioitemnumtagfield, $biblioitemnumtagsubfield ) =
        &GetMarcFromKohaField( "biblioitems.biblioitemnumber", $frameworkcode );
@@ -780,10 +854,6 @@ if ( $op eq "addbiblio" ) {
         build_tabs ($template, $record, $dbh,$encoding,$input);
         $template->param(
             biblionumber             => $biblionumber,
-            biblionumtagfield        => $biblionumtagfield,
-            biblionumtagsubfield     => $biblionumtagsubfield,
-            biblioitemnumtagfield    => $biblioitemnumtagfield,
-            biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
             biblioitemnumber         => $biblioitemnumber,
             duplicatebiblionumber    => $duplicatebiblionumber,
             duplicatebibid           => $duplicatebiblionumber,
@@ -822,8 +892,8 @@ elsif ( $op eq "delete" ) {
     build_tabs( $template, $record, $dbh, $encoding,$input );
     $template->param(
         biblionumber             => $biblionumber,
-        biblionumtagfield        => $biblionumtagfield,
-        biblionumtagsubfield     => $biblionumtagsubfield,
+        biblionumbertagfield        => $biblionumbertagfield,
+        biblionumbertagsubfield     => $biblionumbertagsubfield,
         biblioitemnumtagfield    => $biblioitemnumtagfield,
         biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
         biblioitemnumber         => $biblioitemnumber,