Bug 6939 DefaultClassificationSource should be default in 942
[koha.git] / cataloguing / addbiblio.pl
index 7e146c0..3db1a65 100755 (executable)
@@ -159,7 +159,7 @@ sub MARCfindbreeding {
 
 =cut
 
-sub build_authorized_values_list ($$$$$$$) {
+sub build_authorized_values_list {
     my ( $tag, $subfield, $value, $dbh, $authorised_values_sth,$index_tag,$index_subfield ) = @_;
 
     my @authorised_values;
@@ -215,10 +215,8 @@ sub build_authorized_values_list ($$$$$$$) {
                         ($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
+        $value = $default_source unless $value;
     }
     else {
         $authorised_values_sth->execute(
@@ -252,7 +250,7 @@ sub build_authorized_values_list ($$$$$$$) {
 
 =cut
 
-sub CreateKey(){
+sub CreateKey {
     return int(rand(1000000));
 }
 
@@ -263,7 +261,7 @@ sub CreateKey(){
 
 =cut
 
-sub GetMandatoryFieldZ3950($){
+sub GetMandatoryFieldZ3950 {
     my $frameworkcode = shift;
     my @isbn   = GetMarcFromKohaField('biblioitems.isbn',$frameworkcode);
     my @title  = GetMarcFromKohaField('biblio.title',$frameworkcode);
@@ -293,14 +291,6 @@ sub create_input {
 
     $value =~ s/"/"/g;
 
-    # determine maximum length; 9999 bytes per ISO 2709 except for leader and MARC21 008
-    my $max_length = 9999;
-    if ($tag eq '000') {
-        $max_length = 24;
-    } elsif ($tag eq '008' and C4::Context->preference('marcflavour') eq 'MARC21')  {
-        $max_length = 40;
-    }
-
     # if there is no value provided but a default value in parameters, get it
     if ( $value eq '' ) {
         $value = $tagslib->{$tag}->{$subfield}->{defaultvalue};
@@ -335,6 +325,7 @@ sub create_input {
         index          => $index_tag,
         id             => "tag_".$tag."_subfield_".$id_subfield."_".$index_tag."_".$index_subfield,
         value          => $value,
+        maxlength      => $tagslib->{$tag}->{$subfield}->{maxlength},
         random         => CreateKey(),
     );
 
@@ -349,6 +340,10 @@ sub create_input {
            $value eq '' &&
            !$tdef->{$subfield}->{mandatory} &&
            !$tdef->{mandatory};
+    # expand all subfields of 773 if there is a host item provided in the input
+    $subfield_data{visibility} ="" if ($tag eq 773 and $cgi->param('hostitemnumber'));
+
+
     # it's an authorised field
     if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) {
         $subfield_data{marc_value} =
@@ -370,7 +365,7 @@ sub create_input {
                     class=\"input_marceditor readonly\"
                     tabindex=\"1\"
                     size=\"5\"
-                    maxlength=\"$max_length\"
+                    maxlength=\"".$subfield_data{maxlength}."\"
                     readonly=\"readonly\"
                     \/>";
 
@@ -386,10 +381,10 @@ sub create_input {
                     class=\"input_marceditor readonly\"
                     tabindex=\"1\"
                     size=\"67\"
-                    maxlength=\"$max_length\"
+                    maxlength=\"".$subfield_data{maxlength}."\"
                     \/>
-                    <a href=\"#\" class=\"buttonDot\"
-                        onclick=\"openAuth(this.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\">...</a>
+                    <span class=\"subfield_controls\"><a href=\"#\" class=\"buttonDot\"
+                       onclick=\"openAuth(this.parentNode.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\"><img src=\"/intranet-tmpl/prog/img/edit-tag.png\" alt=\"Tag Editor\" /></a></span>
             ";
       } else {
         $subfield_data{marc_value} =
@@ -400,17 +395,17 @@ sub create_input {
                     class=\"input_marceditor readonly\"
                     tabindex=\"1\"
                     size=\"67\"
-                    maxlength=\"$max_length\"
+                    maxlength=\"".$subfield_data{maxlength}."\"
                     readonly=\"readonly\"
-                    \/><a href=\"#\" class=\"buttonDot\"
-                        onclick=\"openAuth(this.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\">...</a>
+                    \/><span class=\"subfield_controls\"><a href=\"#\" class=\"buttonDot\"
+                        onclick=\"openAuth(this.parentNode.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\"><img src=\"/intranet-tmpl/prog/img/edit-tag.png\" alt=\"Tag Editor\" /></a></span>
             ";
       }
     # it's a plugin field
     }
     elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) {
 
-        # opening plugin. Just check wether we are on a developper computer on a production one
+        # opening plugin. Just check whether we are on a developer computer on a production one
         # (the cgidir differs)
         my $cgidir = C4::Context->intranetdir . "/cgi-bin/cataloguing/value_builder";
         unless ( opendir( DIR, "$cgidir" ) ) {
@@ -431,9 +426,9 @@ sub create_input {
                             class=\"input_marceditor\"
                             onfocus=\"Focus$function_name($index_tag)\"
                             size=\"67\"
-                            maxlength=\"$max_length\"
+                            maxlength=\"".$subfield_data{maxlength}."\"
                             onblur=\"Blur$function_name($index_tag); \" \/>
-                            <a href=\"#\" class=\"buttonDot\" onclick=\"Clic$function_name('$subfield_data{id}'); return false;\" tabindex=\"1\" title=\"Tag Editor\">...</a>
+                            <span class=\"subfield_controls\"><a href=\"#\" class=\"buttonDot\" onclick=\"Clic$function_name('$subfield_data{id}'); return false;\" tabindex=\"1\" title=\"Tag Editor\"><img src=\"/intranet-tmpl/prog/img/edit-tag.png\" alt=\"Tag Editor\" /></a></span>
                     $javascript";
         } else {
             warn "Plugin Failed: $plugin";
@@ -445,7 +440,7 @@ sub create_input {
                         value=\"$value\"
                         tabindex=\"1\"
                         size=\"67\"
-                        maxlength=\"$max_length\"
+                        maxlength=\"".$subfield_data{maxlength}."\"
                         class=\"input_marceditor\"
                 \/>
                 ";
@@ -459,25 +454,12 @@ sub create_input {
                     id=\"".$subfield_data{id}."\"
                     name=\"".$subfield_data{id}."\"
                     size=\"67\"
-                    maxlength=\"$max_length\"
+                    maxlength=\"".$subfield_data{maxlength}."\"
                     value=\"$value\" \/>
             ";
     }
-    elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) {
-        $subfield_data{marc_value} =
-            "<input type=\"text\"
-                    id=\"".$subfield_data{id}."\"
-                    name=\"".$subfield_data{id}."\"
-                    class=\"input_marceditor\"
-                    tabindex=\"1\"
-                    size=\"67\"
-                    maxlength=\"$max_length\"
-                    value=\"$value\"
-            \/>";
-
-        # it's a standard field
-    }
     else {
+        # it's a standard field
         if (
             length($value) > 100
             or
@@ -506,7 +488,7 @@ sub create_input {
                         value=\"$value\"
                         tabindex=\"1\"
                         size=\"67\"
-                        maxlength=\"$max_length\"
+                        maxlength=\"".$subfield_data{maxlength}."\"
                         class=\"input_marceditor\"
                 \/>
                 ";
@@ -532,7 +514,7 @@ sub format_indicator {
     return $ind_value;
 }
 
-sub build_tabs ($$$$$) {
+sub build_tabs {
     my ( $template, $record, $dbh, $encoding,$input ) = @_;
 
     # fill arrays
@@ -696,7 +678,7 @@ sub build_tabs ($$$$$) {
                            # always include in the form regardless of the hidden setting - bug 2206
                     next
                       if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop );
-                    push(
+                       push(
                         @subfields_data,
                         &create_input(
                             $tag, $subfield, '', $index_tag, $tabloop, $record,
@@ -732,101 +714,13 @@ 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;
-  my $query=$dbh->prepare(qq|
-SELECT authtypecode,tagfield
-FROM marc_subfield_structure 
-WHERE frameworkcode=? 
-AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
-# SELECT authtypecode,tagfield
-# FROM marc_subfield_structure 
-# WHERE frameworkcode=? 
-# AND (authtypecode IS NOT NULL OR authtypecode<>\"\")|);
-  $query->execute($frameworkcode);
-  my ($countcreated,$countlinked);
-  while (my $data=$query->fetchrow_hashref){
-    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,ext="'.$_->[1].'"' if ($_->[0]=~/[A-z]/)}  $field->subfields();
-      my ($error, $results, $total_hits)=SimpleSearch( $query, undef, undef, [ "authorityserver" ] );
-    # there is only 1 result 
-         if ( $error ) {
-        warn "BIBLIOADDSAUTHORITIES: $error";
-           return (0,0) ;
-         }
-      if ( @{$results} == 1) {
-        my $marcrecord = MARC::File::USMARC::decode($results->[0]);
-        $field->add_subfields('9'=>$marcrecord->field('001')->data);
-        $countlinked++;
-      } elsif (@{$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     
-  ###NOTICE : This can be a problem. We should also look into other types and rejected forms.
-         my $authtypedata=GetAuthType($data->{authtypecode});
-         next unless $authtypedata;
-         my $marcrecordauth=MARC::Record->new();
-               if (C4::Context->preference('marcflavour') eq 'MARC21') {
-                       $marcrecordauth->leader('     nz  a22     o  4500');
-                       SetMarcUnicodeFlag($marcrecordauth, 'MARC21');
-                       }
-         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);
-
-         # bug 2317: ensure new authority knows it's using UTF-8; currently
-         # only need to do this for MARC21, as MARC::Record->as_xml_record() handles
-         # automatically for UNIMARC (by not transcoding)
-         # FIXME: AddAuthority() instead should simply explicitly require that the MARC::Record
-         # use UTF-8, but as of 2008-08-05, did not want to introduce that kind
-         # of change to a core API just before the 3.0 release.
-
-                               if (C4::Context->preference('marcflavour') eq 'MARC21') {
-                                       $marcrecordauth->insert_fields_ordered(MARC::Field->new('667','','','a'=>"Machine generated authority record."));
-                                       my $cite = $record->author() . ", " .  $record->title_proper() . ", " . $record->publication_date() . " "; 
-                                       $cite =~ s/^[\s\,]*//;
-                                       $cite =~ s/[\s\,]*$//;
-                                       $cite = "Work cat.: (" . C4::Context->preference('MARCOrgCode') . ")". $record->subfield('999','c') . ": " . $cite;
-                                       $marcrecordauth->insert_fields_ordered(MARC::Field->new('670','','','a'=>$cite));
-                               }
-
-#          warn "AUTH RECORD ADDED : ".$marcrecordauth->as_formatted;
-
-         my $authid=AddAuthority($marcrecordauth,'',$data->{authtypecode});
-         $countcreated++;
-         $field->add_subfields('9'=>$authid);
-      }
-    }  
-  }
-  return ($countlinked,$countcreated);
-}
-
 # ========================
 #          MAIN
 #=========================
 my $input = new CGI;
 my $error = $input->param('error');
 my $biblionumber  = $input->param('biblionumber'); # if biblionumber exists, it's a modif, not a new biblio.
+my $parentbiblio  = $input->param('parentbiblionumber');
 my $breedingid    = $input->param('breedingid');
 my $z3950         = $input->param('z3950');
 my $op            = $input->param('op');
@@ -834,8 +728,14 @@ my $mode          = $input->param('mode');
 my $frameworkcode = $input->param('frameworkcode');
 my $redirect      = $input->param('redirect');
 my $dbh           = C4::Context->dbh;
+my $hostbiblionumber = $input->param('hostbiblionumber');
+my $hostitemnumber = $input->param('hostitemnumber');
 
-my $userflags = ($frameworkcode eq 'FA') ? "fast_cataloging" : "edit_catalogue";
+    
+my $userflags = 'edit_catalogue';
+if ($frameworkcode eq 'FA'){
+    $userflags = 'fast_cataloging';
+}
 
 $frameworkcode = &GetFrameworkCode($biblionumber)
   if ( $biblionumber and not($frameworkcode) and $op ne 'addbiblio' );
@@ -843,7 +743,7 @@ $frameworkcode = &GetFrameworkCode($biblionumber)
 $frameworkcode = '' if ( $frameworkcode eq 'Default' );
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     {
-        template_name   => "cataloguing/addbiblio.tmpl",
+        template_name   => "cataloguing/addbiblio.tt",
         query           => $input,
         type            => "intranet",
         authnotrequired => 0,
@@ -851,6 +751,15 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     }
 );
 
+if ($frameworkcode eq 'FA'){
+    # We need to grab and set some variables in the template for use on the additems screen
+    $template->{VARS}->{'circborrowernumber'} = $input->param('borrowernumber');
+    $template->{VARS}->{'barcode'} = $input->param('barcode');
+    $template->{VARS}->{'branch'} = $input->param('branch');
+    $template->{VARS}->{'stickyduedate'} = $input->param('stickyduedate');
+    $template->{VARS}->{'duedatespec'} = $input->param('duedatespec');
+}
+
 # Getting the list of all frameworks
 # get framework list
 my $frameworks = getframeworks;
@@ -861,7 +770,7 @@ foreach my $thisframeworkcode ( keys %$frameworks ) {
                frameworktext => $frameworks->{$thisframeworkcode}->{'frameworktext'},
        );
        if ($frameworkcode eq $thisframeworkcode){
-               $row{'selected'}="selected=\"selected\"";
+               $row{'selected'} = 1;
                }
        push @frameworkcodeloop, \%row;
 } 
@@ -892,6 +801,26 @@ if ($breedingid) {
     ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ;
 }
 
+#populate hostfield if hostbiblionumber is available
+if ($hostbiblionumber) {
+    my $marcflavour = C4::Context->preference("marcflavour");
+    $record = MARC::Record->new();
+    $record->leader('');
+    my $field =
+      PrepHostMarcField( $hostbiblionumber, $hostitemnumber, $marcflavour );
+    $record->append_fields($field);
+}
+
+# This is  a child record
+if ($parentbiblio) {
+    my $marcflavour = C4::Context->preference('marcflavour');
+    $record = MARC::Record->new();
+    my $hostfield = prepare_host_field($parentbiblio,$marcflavour);
+    if ($hostfield) {
+        $record->append_fields($hostfield);
+    }
+}
+
 $is_a_modif = 0;
     
 if ($biblionumber) {
@@ -913,18 +842,24 @@ if ($biblionumber) {
 #-------------------------------------------------------------------------------------
 if ( $op eq "addbiblio" ) {
 #-------------------------------------------------------------------------------------
+    $template->param(
+        biblionumberdata => $biblionumber,
+    );
     # getting html input
     my @params = $input->param();
-    $record = TransformHtmlToMarc( \@params , $input );
+    $record = TransformHtmlToMarc( $input );
     # check for a duplicate
-    my ($duplicatebiblionumber,$duplicatetitle) = FindDuplicate($record) if (!$is_a_modif);
+    my ( $duplicatebiblionumber, $duplicatetitle );
+    if ( !$is_a_modif ) {
+        ( $duplicatebiblionumber, $duplicatetitle ) = FindDuplicate($record);
+    }
     my $confirm_not_duplicate = $input->param('confirm_not_duplicate');
     # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate)
     if ( !$duplicatebiblionumber or $confirm_not_duplicate ) {
         my $oldbibnum;
         my $oldbibitemnum;
         if (C4::Context->preference("BiblioAddsAuthorities")){
-          my ($countlinked,$countcreated)=BiblioAddAuthorities($record,$frameworkcode);
+          my ($countlinked,$countcreated)=BiblioAutoLink($record,$frameworkcode);
         } 
         if ( $is_a_modif ) {
             ModBiblioframework( $biblionumber, $frameworkcode ); 
@@ -934,12 +869,25 @@ if ( $op eq "addbiblio" ) {
             ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
         }
         if ($redirect eq "items" || ($mode ne "popup" && !$is_a_modif && $redirect ne "view")){
-            print $input->redirect(
+           if ($frameworkcode eq 'FA'){
+               my $borrowernumber = $input->param('circborrowernumber');
+               my $barcode = $input->param('barcode');
+               my $branch = $input->param('branch');
+               my $stickyduedate = $input->param('stickyduedate');
+               my $duedatespec = $input->param('duedatespec');
+               print $input->redirect(
+                "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&borrowernumber=$borrowernumber&branch=$branch&barcode=$barcode&stickyduedate=$stickyduedate&duedatespec=$duedatespec"
+               );
+               exit;
+           }
+           else {
+               print $input->redirect(
                 "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode"
-            );
-            exit;
+               );
+               exit;
+           }
         }
-               elsif($is_a_modif || $redirect eq "view"){
+       elsif($is_a_modif || $redirect eq "view"){
             my $defaultview = C4::Context->preference('IntranetBiblioDefaultView');
             my $views = { C4::Search::enabled_staff_search_views };
             if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) {
@@ -953,7 +901,8 @@ if ( $op eq "addbiblio" ) {
             }
             exit;
 
-               }else {
+       }
+       else {
           $template->param(
             biblionumber => $biblionumber,
             done         =>1,
@@ -996,18 +945,24 @@ elsif ( $op eq "delete" ) {
    #----------------------------------------------------------------------------
    # If we're in a duplication case, we have to set to "" the biblionumber
    # as we'll save the biblio as a new one.
+    $template->param(
+        biblionumberdata => $biblionumber,
+        op               => $op,
+    );
     if ( $op eq "duplicate" ) {
         $biblionumber = "";
     }
 
+    if ( $record ne -1 ) {
 #FIXME: it's kind of silly to go from MARC::Record to MARC::File::XML and then back again just to fix the encoding
-    eval {
-        my $uxml = $record->as_xml;
-        MARC::Record::default_record_format("UNIMARC")
-          if ( C4::Context->preference("marcflavour") eq "UNIMARC" );
-        my $urecord = MARC::Record::new_from_xml( $uxml, 'UTF-8' );
-        $record = $urecord;
-    };
+        eval {
+            my $uxml = $record->as_xml;
+            MARC::Record::default_record_format("UNIMARC")
+            if ( C4::Context->preference("marcflavour") eq "UNIMARC" );
+            my $urecord = MARC::Record::new_from_xml( $uxml, 'UTF-8' );
+            $record = $urecord;
+        };
+    }
     build_tabs( $template, $record, $dbh, $encoding,$input );
     $template->param(
         biblionumber             => $biblionumber,
@@ -1016,20 +971,17 @@ elsif ( $op eq "delete" ) {
         biblioitemnumtagfield    => $biblioitemnumtagfield,
         biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
         biblioitemnumber         => $biblioitemnumber,
+       hostbiblionumber        => $hostbiblionumber,
+       hostitemnumber          => $hostitemnumber
     );
 }
 
 $template->param( title => $record->title() ) if ( $record ne "-1" );
-if (C4::Context->preference("marcflavour") eq "MARC21"){
-    $template->param(MARC21 => 1);
-}
-
-
 $template->param(
     popup => $mode,
     frameworkcode => $frameworkcode,
     itemtype => $frameworkcode,
-    borrowernumber => $loggedinuser
+    borrowernumber => $loggedinuser
 );
 
 output_html_with_http_headers $input, $cookie, $template->output;