From 4ddff47e80c6fb0f9bed17220e5bd8df88e293a5 Mon Sep 17 00:00:00 2001
From: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Date: Tue, 7 Jun 2022 15:24:23 +0100
Subject: [PATCH] Bug 30921: Replace C4::XSLT::transformMARCXML4XSLT with
 RecordProcessor

This patch removes the last remaining uses of transformMARCXML4XSLT and
replaced them with the equivilent RecordProcessor usage.

Signed-off-by: David Nind <david@davidnind.com>
---
 C4/XSLT.pm                    | 91 ++++++-----------------------------
 Koha/OAI/Server/Repository.pm | 18 +++++--
 t/db_dependent/XSLT.t         | 15 +-----
 3 files changed, 32 insertions(+), 92 deletions(-)

diff --git a/C4/XSLT.pm b/C4/XSLT.pm
index 0fb7be0d6c..8c2b4c1bcd 100644
--- a/C4/XSLT.pm
+++ b/C4/XSLT.pm
@@ -28,22 +28,18 @@ use C4::Koha qw( xml_escape );
 use C4::Biblio qw( GetAuthorisedValueDesc GetFrameworkCode GetMarcStructure );
 use Koha::AuthorisedValues;
 use Koha::ItemTypes;
+use Koha::RecordProcessor;
 use Koha::XSLT::Base;
 use Koha::Libraries;
 use Koha::Recalls;
 
 my $engine; #XSLT Handler object
-my %authval_per_framework;
-    # Cache for tagfield-tagsubfield to decode per framework.
-    # Should be preferably be placed in Koha-core...
 
 our (@ISA, @EXPORT_OK);
 BEGIN {
     require Exporter;
     @ISA = qw(Exporter);
     @EXPORT_OK = qw(
-        transformMARCXML4XSLT
-        getAuthorisedValues4MARCSubfields
         buildKohaItemsNamespace
         XSLTParse4Display
     );
@@ -56,75 +52,6 @@ C4::XSLT - Functions for displaying XSLT-generated content
 
 =head1 FUNCTIONS
 
-=head2 transformMARCXML4XSLT
-
-Replaces codes with authorized values in a MARC::Record object
-
-=cut
-
-sub transformMARCXML4XSLT {
-    my ($biblionumber, $record, $opac) = @_;
-    my $frameworkcode = GetFrameworkCode($biblionumber) || '';
-    my $tagslib = &GetMarcStructure(1, $frameworkcode, { unsafe => 1 });
-    my @fields;
-    # FIXME: wish there was a better way to handle exceptions
-    eval {
-        @fields = $record->fields();
-    };
-    if ($@) { warn "PROBLEM WITH RECORD"; next; }
-    my $marcflavour = C4::Context->preference('marcflavour');
-    my $av = getAuthorisedValues4MARCSubfields($frameworkcode);
-    foreach my $tag ( keys %$av ) {
-        foreach my $field ( $record->field( $tag ) ) {
-            if ( $av->{ $tag } ) {
-                my @new_subfields = ();
-                for my $subfield ( $field->subfields() ) {
-                    my ( $letter, $value ) = @$subfield;
-                    # Replace the field value with the authorised value *except* for MARC21 field 942$n (suppression in opac)
-                    if ( !( $tag eq '942' && $subfield->[0] eq 'n' ) || $marcflavour eq 'UNIMARC' ) {
-                        $value = GetAuthorisedValueDesc( $tag, $letter, $value, '', $tagslib, undef, $opac )
-                            if $av->{ $tag }->{ $letter };
-                    }
-                    push( @new_subfields, $letter, $value );
-                } 
-                $field ->replace_with( MARC::Field->new(
-                    $tag,
-                    $field->indicator(1),
-                    $field->indicator(2),
-                    @new_subfields
-                ) );
-            }
-        }
-    }
-    return $record;
-}
-
-=head2 getAuthorisedValues4MARCSubfields
-
-Returns a ref of hash of ref of hash for tag -> letter controlled by authorised values
-Is only used in this module currently.
-
-=cut
-
-sub getAuthorisedValues4MARCSubfields {
-    my ($frameworkcode) = @_;
-    unless ( $authval_per_framework{ $frameworkcode } ) {
-        my $dbh = C4::Context->dbh;
-        my $sth = $dbh->prepare("SELECT DISTINCT tagfield, tagsubfield
-                                 FROM marc_subfield_structure
-                                 WHERE authorised_value IS NOT NULL
-                                   AND authorised_value!=''
-                                   AND frameworkcode=?");
-        $sth->execute( $frameworkcode );
-        my $av = { };
-        while ( my ( $tag, $letter ) = $sth->fetchrow() ) {
-            $av->{ $tag }->{ $letter } = 1;
-        }
-        $authval_per_framework{ $frameworkcode } = $av;
-    }
-    return $authval_per_framework{ $frameworkcode };
-}
-
 =head2 XSLTParse4Display
 
 Returns xml for biblionumber and requested XSLT transformation.
@@ -245,8 +172,9 @@ sub XSLTParse4Display {
     my ( $params ) = @_;
 
     my $biblionumber = $params->{biblionumber};
-    my $orig_record  = $params->{record};
+    my $record       = $params->{record};
     my $xslsyspref   = $params->{xsl_syspref};
+    my $interface    = ( $xslsyspref =~ /OPAC/ ) ? 'opac' : 'intranet' ;
     my $fixamps      = $params->{fix_amps};
     my $hidden_items = $params->{hidden_items} || [];
     my $variables    = $params->{xslt_variables};
@@ -257,8 +185,19 @@ sub XSLTParse4Display {
 
     my $xslfilename = get_xsl_filename( $xslsyspref);
 
+    my $frameworkcode = GetFrameworkCode($biblionumber) || '';
+    my $record_processor = Koha::RecordProcessor->new(
+        {
+            filters => [ 'ExpandCodedFields' ],
+            options => {
+                interface     => $interface,
+                frameworkcode => $frameworkcode
+            }
+        }
+    );
+    $record_processor->process($record);
+
     # grab the XML, run it through our stylesheet, push it out to the browser
-    my $record = transformMARCXML4XSLT($biblionumber, $orig_record);
     my $itemsxml;
     if ( $xslsyspref eq "OPACXSLTDetailsDisplay" || $xslsyspref eq "XSLTDetailsDisplay" || $xslsyspref eq "XSLTResultsDisplay" ) {
         $itemsxml = ""; #We don't use XSLT for items display on these pages
diff --git a/Koha/OAI/Server/Repository.pm b/Koha/OAI/Server/Repository.pm
index f8e19b12c1..886131318b 100644
--- a/Koha/OAI/Server/Repository.pm
+++ b/Koha/OAI/Server/Repository.pm
@@ -25,6 +25,7 @@ use HTTP::OAI::Repository qw( validate_request );
 
 use base ("HTTP::OAI::Repository");
 
+use Koha::RecordProcessor;
 use Koha::OAI::Server::Identify;
 use Koha::OAI::Server::ListSets;
 use Koha::OAI::Server::ListMetadataFormats;
@@ -35,7 +36,7 @@ use XML::SAX::Writer;
 use YAML::XS;
 use CGI qw/:standard -oldstyle_urls/;
 use C4::Context;
-use C4::XSLT qw( transformMARCXML4XSLT );
+use C4::Biblio qw( GetFrameworkCode );
 use Koha::XSLT::Base;
 use Koha::Biblios;
 
@@ -178,8 +179,19 @@ sub get_biblio_marcxml {
 
     my $biblio = Koha::Biblios->find($biblionumber);
     my $record = $biblio->metadata->record({ embed_items => $with_items, opac => 1 });
-    $record = transformMARCXML4XSLT( $biblionumber, $record )
-        if $expanded_avs;
+    if ( $expanded_avs ) {
+        my $frameworkcode = GetFrameworkCode($biblionumber) || '';
+        my $record_processor = Koha::RecordProcessor->new(
+            {
+                filters => [ 'ExpandCodedFields' ],
+                options => {
+                    interface     => 'opac',
+                    frameworkcode => $frameworkcode
+                }
+            }
+        );
+        $record_processor->process($record) if $expanded_avs;
+    }
 
     return $record ? $record->as_xml_record() : undef;
 }
diff --git a/t/db_dependent/XSLT.t b/t/db_dependent/XSLT.t
index 8f08abdb80..314996d488 100755
--- a/t/db_dependent/XSLT.t
+++ b/t/db_dependent/XSLT.t
@@ -18,7 +18,7 @@
 use Modern::Perl;
 
 use MARC::Record;
-use Test::More tests => 4;
+use Test::More tests => 3;
 use Test::Warn;
 use t::lib::TestBuilder;
 use t::lib::Mocks;
@@ -28,7 +28,7 @@ use Koha::Libraries;
 use Koha::ItemTypes;
 
 BEGIN {
-    use_ok('C4::XSLT', qw( transformMARCXML4XSLT getAuthorisedValues4MARCSubfields buildKohaItemsNamespace ));
+    use_ok('C4::XSLT', qw( buildKohaItemsNamespace ));
 }
 
 my $schema  = Koha::Database->new->schema;
@@ -36,17 +36,6 @@ my $builder = t::lib::TestBuilder->new;
 
 $schema->storage->txn_begin;
 
-subtest 'transformMARCXML4XSLT tests' => sub {
-    plan tests => 1;
-    my $mock_xslt =  Test::MockModule->new("C4::XSLT");
-    $mock_xslt->mock( getAuthorisedValues4MARCSubfields => sub { return { 942 => { 'n' => 1 } } } );
-    $mock_xslt->mock( GetAuthorisedValueDesc => sub { warn "called"; });
-    my $record = MARC::Record->new();
-    my $suppress_field = MARC::Field->new( 942, ' ', ' ', n => '1' );
-    $record->append_fields($suppress_field);
-    warning_is { C4::XSLT::transformMARCXML4XSLT( 3,$record ) } undef, "942n auth value not translated";
-};
-
 subtest 'buildKohaItemsNamespace status tests' => sub {
     plan tests => 17;
 
-- 
2.30.2