Bug 23463: Fix CancelReceipt.t
[koha-ffzg.git] / C4 / AuthoritiesMarc.pm
index ac109de..9d059a0 100644 (file)
@@ -52,8 +52,6 @@ BEGIN {
        &GetAuthority
        &GetAuthorityXML
 
-       &CountUsage
-       &CountUsageChildren
        &SearchAuthorities
     
         &BuildSummary
@@ -115,8 +113,6 @@ sub SearchAuthorities {
     $sortby="" unless $sortby;
     my $query;
     my $qpquery = '';
-    my $QParser;
-    $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser'));
     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
@@ -135,9 +131,6 @@ sub SearchAuthorities {
         if ($n>1){
             while ($n>1){$query= "\@or ".$query;$n--;}
         }
-        if ($QParser) {
-            $qpquery .= '(authtype:' . join('|| authtype:', @auths) . ')';
-        }
     }
 
     my $dosearch;
@@ -165,9 +158,12 @@ sub SearchAuthorities {
                 elsif ( @$tags[$i] eq "thesaurus" ) {
                     $attr = " \@attr 1=Subject-heading-thesaurus ";
                 }
-                else {    # Assume any if no index was specified
+                elsif ( @$tags[$i] eq "all" ) {
                     $attr = " \@attr 1=Any ";
                 }
+                else {    # Use the index passed in params
+                    $attr = " \@attr 1=" . @$tags[$i] . " ";
+                }
             }         #if @$tags[$i]
             else {    # Assume any if no index was specified
                 $attr = " \@attr 1=Any ";
@@ -202,9 +198,6 @@ sub SearchAuthorities {
             $q2 .= $attr;
             $dosearch = 1;
             ++$attr_cnt;
-            if ($QParser) {
-                $qpquery .= " $tags->[$i]:\"$value->[$i]\"";
-            }
         }    #if value
     }
     ##Add how many queries generated
@@ -225,21 +218,8 @@ sub SearchAuthorities {
     } elsif ($sortby eq 'AuthidDsc') {
         $orderstring = '@attr 7=2 @attr 4=109 @attr 1=Local-Number 0';
     }
-    if ($QParser) {
-        $qpquery .= ' all:all' unless $value->[0];
-
-        if ( $value->[0] =~ m/^qp=(.*)$/ ) {
-            $qpquery = $1;
-        }
-
-        $qpquery .= " #$sortby" unless $sortby eq '';
-
-        $QParser->parse( $qpquery );
-        $query = $QParser->target_syntax('authorityserver');
-    } else {
-        $query=($query?$query:"\@attr 1=_ALLRECORDS \@attr 2=103 ''");
-        $query="\@or $orderstring $query" if $orderstring;
-    }
+    $query=($query?$query:"\@attr 1=_ALLRECORDS \@attr 2=103 ''");
+    $query="\@or $orderstring $query" if $orderstring;
 
     $offset = 0 if not defined $offset or $offset < 0;
     my $counter = $offset;
@@ -328,7 +308,7 @@ sub SearchAuthorities {
         ###
         if (! $skipmetadata) {
             for (my $z=0; $z<@finalresult; $z++){
-                my  $count=CountUsage($finalresult[$z]{authid});
+                my $count = Koha::Authorities->get_usage_count({ authid => $finalresult[$z]{authid} });
                 $finalresult[$z]{used}=$count;
             }# all $z's
         }
@@ -341,43 +321,6 @@ sub SearchAuthorities {
     return (\@finalresult, $nbresults);
 }
 
-=head2 CountUsage 
-
-  $count= &CountUsage($authid)
-
-counts Usage of Authid in bibliorecords. 
-
-=cut
-
-sub CountUsage {
-    my ($authid) = @_;
-        ### ZOOM search here
-        my $query;
-        $query= "an:".$authid;
-        # Should really be replaced with a real count call, this is a
-        # bad way.
-        my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
-        my ($err,$res,$result) = $searcher->simple_search_compat($query,0,1);
-        if ($err) {
-            warn "Error: $err from search $query";
-            $result = 0;
-        }
-
-        return $result;
-}
-
-=head2 CountUsageChildren 
-
-  $count= &CountUsageChildren($authid)
-
-counts Usage of narrower terms of Authid in bibliorecords.
-
-=cut
-
-sub CountUsageChildren {
-  my ($authid) = @_;
-}
-
 =head2 GuessAuthTypeCode
 
   my $authtypecode = GuessAuthTypeCode($record);
@@ -608,15 +551,18 @@ sub AddAuthority {
        if ($format eq "MARC21") {
         my $userenv = C4::Context->userenv;
         my $library;
+        my $marcorgcode = C4::Context->preference('MARCOrgCode');
         if ( $userenv && $userenv->{'branch'} ) {
             $library = Koha::Libraries->find( $userenv->{'branch'} );
+            # userenv's library could not exist because of a trick in misc/commit_file.pl (see FIXME and set_userenv statement)
+            $marcorgcode = $library ? $library->get_effective_marcorgcode : $marcorgcode;
         }
                if (!$record->leader) {
                        $record->leader($leader);
                }
                if (!$record->field('003')) {
                        $record->insert_fields_ordered(
-                MARC::Field->new('003', $library ? $library->get_effective_marcorgcode : C4::Context->preference('MARCOrgCode'))
+                MARC::Field->new('003', $marcorgcode),
                        );
                }
                my $date=POSIX::strftime("%y%m%d",localtime);
@@ -635,8 +581,8 @@ sub AddAuthority {
                if (!$record->field('040')) {
                 $record->insert_fields_ordered(
         MARC::Field->new('040','','',
-            'a' => $library ? $library->get_effective_marcorgcode : C4::Context->preference('MARCOrgCode'),
-            'c' => $library ? $library->get_effective_marcorgcode : C4::Context->preference('MARCOrgCode')
+            'a' => $marcorgcode,
+            'c' => $marcorgcode,
                                ) 
                        );
     }
@@ -791,14 +737,8 @@ sub FindDuplicateAuthority {
     my $auth_tag_to_report = Koha::Authority::Types->find($authtypecode)->auth_tag_to_report;
 #     warn "record :".$record->as_formatted."  auth_tag_to_report :$auth_tag_to_report";
     # build a request for SearchAuthorities
-    my $QParser;
-    $QParser = C4::Context->queryparser if (C4::Context->preference('UseQueryParser'));
-    my $op;
-    if ($QParser) {
-        $op = '&&';
-    } else {
-        $op = 'and';
-    }
+    my $op = 'AND';
+    $authtypecode =~ s#/#\\/#; # GENRE/FORM contains forward slash which is a reserved character
     my $query='at:'.$authtypecode.' ';
     my $filtervalues=qr([\001-\040\Q!'"`#$%&*+,-./:;<=>?@(){[}_|~\E\]]);
     if ($record->field($auth_tag_to_report)) {
@@ -807,7 +747,7 @@ sub FindDuplicateAuthority {
         }
     }
     my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::AUTHORITIES_INDEX});
-    my ($error, $results, $total_hits) = $searcher->simple_search_compat( $query, 0, 1 );
+    my ($error, $results, $total_hits) = $searcher->simple_search_compat( $query, 0, 1, [ 'authorityserver' ] );
     # there is at least 1 result => return the 1st one
     if (!defined $error && @{$results} ) {
         my $marcrecord = C4::Search::new_record_from_zebra(
@@ -1028,14 +968,14 @@ sub BuildSummary {
             if ($type eq 'subfi') {
                 push @seefrom, {
                     heading => $field->as_string($marc21subfields),
-                    hemain  => $field->subfield( substr($marc21subfields, 0, 1) ),
+                    hemain  => scalar $field->subfield( substr($marc21subfields, 0, 1) ),
                     type    => ($field->subfield('i') || ''),
                     field   => $field->tag(),
                 };
             } else {
                 push @seefrom, {
                     heading => $field->as_string($marc21subfields),
-                    hemain  => $field->subfield( substr($marc21subfields, 0, 1) ),
+                    hemain  => scalar $field->subfield( substr($marc21subfields, 0, 1) ),
                     type    => $type,
                     field   => $field->tag(),
                 };
@@ -1051,8 +991,8 @@ sub BuildSummary {
             if ($type eq 'subfi') {
                 push @seealso, {
                     heading => $field->as_string($marc21subfields),
-                    hemain  => $field->subfield( substr($marc21subfields, 0, 1) ),
-                    type    => $field->subfield('i'),
+                    hemain  => scalar $field->subfield( substr($marc21subfields, 0, 1) ),
+                    type    => scalar $field->subfield('i'),
                     field   => $field->tag(),
                     search  => $field->as_string($marc21subfields) || '',
                     authid  => $field->subfield('9') || ''
@@ -1060,7 +1000,7 @@ sub BuildSummary {
             } else {
                 push @seealso, {
                     heading => $field->as_string($marc21subfields),
-                    hemain  => $field->subfield( substr($marc21subfields, 0, 1) ),
+                    hemain  => scalar $field->subfield( substr($marc21subfields, 0, 1) ),
                     type    => $type,
                     field   => $field->tag(),
                     search  => $field->as_string($marc21subfields) || '',
@@ -1484,8 +1424,6 @@ sub merge {
         # We only need it in loose merge mode; replaces the former $exclude
         ? {}
         : { map { ( $_->[0], 1 ); } ( @record_from, @record_to ) };
-    # And we need to add $9 in order not to duplicate
-    $skip_subfields->{9} = 1 if !$overwrite;
 
     my $counteditedbiblio = 0;
     foreach my $biblionumber ( @biblionumbers ) {
@@ -1510,22 +1448,49 @@ sub merge {
                 my $newtag = $tags_new && @$tags_new
                   ? _merge_newtag( $tag, $tags_new )
                   : $tag;
+                my $controlled_ind = $authto->controlled_indicators({ record => $MARCto, biblio_tag => $newtag });
                 my $field_to = MARC::Field->new(
                     $newtag,
-                    $field->indicator(1),
-                    $field->indicator(2),
-                    "9" => $mergeto,
+                    $controlled_ind->{ind1} // $field->indicator(1),
+                    $controlled_ind->{ind2} // $field->indicator(2),
+                    9 => $mergeto, # Needed to create field, will be moved
                 );
-                foreach my $subfield ( grep { $_->[0] ne '9' } @record_to ) {
-                    $field_to->add_subfields( $subfield->[0] => $subfield->[1] );
-                }
+                my ( @prefix, @postfix );
                 if ( !$overwrite ) {
                     # add subfields back in loose mode, check skip_subfields
+                    # The first extra subfields will be in front of the
+                    # controlled block, the rest at the end.
+                    my $prefix_flag = 1;
                     foreach my $subfield ( $field->subfields ) {
-                        next if $skip_subfields->{ $subfield->[0] };
-                        $field_to->add_subfields( $subfield->[0], $subfield->[1] );
+                        next if $subfield->[0] eq '9'; # skip but leave flag
+                        if ( $skip_subfields->{ $subfield->[0] } ) {
+                            # This marks the beginning of the controlled block
+                            $prefix_flag = 0;
+                            next;
+                        }
+                        if ($prefix_flag) {
+                            push @prefix, [ $subfield->[0], $subfield->[1] ];
+                        } else {
+                            push @postfix, [ $subfield->[0], $subfield->[1] ];
+                        }
                     }
                 }
+                foreach my $subfield ( @prefix, @record_to, @postfix ) {
+                    $field_to->add_subfields($subfield->[0] => $subfield->[1]);
+                }
+                if( exists $controlled_ind->{sub2} ) { # thesaurus info
+                    if( defined $controlled_ind->{sub2} ) {
+                        # Add or replace
+                        $field_to->update( 2 => $controlled_ind->{sub2} );
+                    } else {
+                        # Key alerts us here to remove $2
+                        $field_to->delete_subfield( code => '2' );
+                    }
+                }
+                # Move $9 to the end
+                $field_to->delete_subfield( code => '9' );
+                $field_to->add_subfields( 9 => $mergeto );
+
                 if ($tags_new && @$tags_new) {
                     $marcrecord->delete_field($field);
                     append_fields_ordered( $marcrecord, $field_to );