From 6f97268af35880dec0ed6713e493d79c04c5b554 Mon Sep 17 00:00:00 2001
From: Matthias Meusburger <matthias.meusburger@biblibre.com>
Date: Wed, 22 May 2024 10:06:17 +0000
Subject: [PATCH] Bug 35659: (more QA follow-ups)

Rename Oaipmh to OAI
Rename oaiservers to oai_servers
Rename OaiServer to OAIServer
Rename oai_servers.id to oai_servers.oai_server_id
Rename ServerSearch to server_search
Use a callback function for logs
Use context for string "Set"
Split translation string
---
 Koha/Import/{Oaipmh => OAI}/Authorities.pm    | 10 +++---
 Koha/Import/{Oaipmh => OAI}/Authority.pm      |  6 ++--
 Koha/Import/{Oaipmh => OAI}/Biblio.pm         |  6 ++--
 Koha/Import/{Oaipmh => OAI}/Biblios.pm        | 10 +++---
 Koha/OAI/Client/Harvester.pm                  | 33 +++++++++----------
 Koha/{OaiServer.pm => OAIServer.pm}           |  6 ++--
 Koha/{OaiServers.pm => OAIServers.pm}         | 10 +++---
 admin/{oaiservers.pl => oai_servers.pl}       | 22 ++++++-------
 .../data/mysql/atomicupdate/Bug-35659.pl      | 20 +++++------
 installer/data/mysql/kohastructure.sql        | 22 ++++++-------
 .../prog/en/includes/admin-menu.inc           |  2 +-
 .../prog/en/includes/oai-admin-search.inc     |  2 +-
 .../prog/en/modules/admin/admin-home.tt       |  2 +-
 .../admin/{oaiservers.tt => oai_servers.tt}   | 24 +++++++-------
 misc/cronjobs/harvest_oai.pl                  | 15 ++++++---
 t/db_dependent/Koha/OAIHarvester.t            | 10 +++---
 t/db_dependent/Koha/OAIServers.t              | 18 +++++-----
 17 files changed, 112 insertions(+), 106 deletions(-)
 rename Koha/Import/{Oaipmh => OAI}/Authorities.pm (81%)
 rename Koha/Import/{Oaipmh => OAI}/Authority.pm (87%)
 rename Koha/Import/{Oaipmh => OAI}/Biblio.pm (88%)
 rename Koha/Import/{Oaipmh => OAI}/Biblios.pm (82%)
 rename Koha/{OaiServer.pm => OAIServer.pm} (89%)
 rename Koha/{OaiServers.pm => OAIServers.pm} (85%)
 rename admin/{oaiservers.pl => oai_servers.pl} (85%)
 rename koha-tmpl/intranet-tmpl/prog/en/modules/admin/{oaiservers.tt => oai_servers.tt} (87%)

diff --git a/Koha/Import/Oaipmh/Authorities.pm b/Koha/Import/OAI/Authorities.pm
similarity index 81%
rename from Koha/Import/Oaipmh/Authorities.pm
rename to Koha/Import/OAI/Authorities.pm
index 90372a8609..c66daa6816 100644
--- a/Koha/Import/Oaipmh/Authorities.pm
+++ b/Koha/Import/OAI/Authorities.pm
@@ -1,4 +1,4 @@
-package Koha::Import::Oaipmh::Authorities;
+package Koha::Import::OAI::Authorities;
 
 # This file is part of Koha.
 #
@@ -16,13 +16,13 @@ package Koha::Import::Oaipmh::Authorities;
 
 use Modern::Perl;
 
-use Koha::Import::Oaipmh::Authority;
+use Koha::Import::OAI::Authority;
 
 use base qw(Koha::Objects);
 
 =head1 NAME
 
-Koha::Import::Oaipmh::Authorities
+Koha::Import::OAI::Authorities
 
 This object represents a collection of OAI-PMH records being imported as authorities
 
@@ -36,7 +36,7 @@ This object represents a collection of OAI-PMH records being imported as authori
 =cut
 
 sub _type {
-    return 'ImportOaipmhAuthority';
+    return 'ImportOAIAuthority';
 }
 
 =head3 object_class
@@ -46,6 +46,6 @@ Koha::Object class
 =cut
 
 sub object_class {
-    return 'Koha::Import::Oaipmh::Authority';
+    return 'Koha::Import::OAI::Authority';
 }
 1;
diff --git a/Koha/Import/Oaipmh/Authority.pm b/Koha/Import/OAI/Authority.pm
similarity index 87%
rename from Koha/Import/Oaipmh/Authority.pm
rename to Koha/Import/OAI/Authority.pm
index fe90c432a2..8f44b235f4 100644
--- a/Koha/Import/Oaipmh/Authority.pm
+++ b/Koha/Import/OAI/Authority.pm
@@ -1,4 +1,4 @@
-package Koha::Import::Oaipmh::Authority;
+package Koha::Import::OAI::Authority;
 
 # This file is part of Koha.
 #
@@ -20,7 +20,7 @@ use base qw(Koha::Object);
 
 =head1 NAME
 
-Koha::Import::Oaipmh::Authority
+Koha::Import::OAI::Authority
 
 This object represents an OAI-PMH record being imported as an authority
 
@@ -35,7 +35,7 @@ This object represents an OAI-PMH record being imported as an authority
 =cut
 
 sub _type {
-    return 'ImportOaipmhAuthority';
+    return 'ImportOAIAuthority';
 }
 
 1;
diff --git a/Koha/Import/Oaipmh/Biblio.pm b/Koha/Import/OAI/Biblio.pm
similarity index 88%
rename from Koha/Import/Oaipmh/Biblio.pm
rename to Koha/Import/OAI/Biblio.pm
index d59e5a6449..42ad046e72 100644
--- a/Koha/Import/Oaipmh/Biblio.pm
+++ b/Koha/Import/OAI/Biblio.pm
@@ -1,4 +1,4 @@
-package Koha::Import::Oaipmh::Biblio;
+package Koha::Import::OAI::Biblio;
 
 # This file is part of Koha.
 #
@@ -20,7 +20,7 @@ use base qw(Koha::Object);
 
 =head1 NAME
 
-Koha::Import::Oaipmh::Biblio
+Koha::Import::OAI::Biblio
 
 This object represents an OAI-PMH record being imported as a bibliographic record
 
@@ -34,7 +34,7 @@ This object represents an OAI-PMH record being imported as a bibliographic recor
 =cut
 
 sub _type {
-    return 'ImportOaipmhBiblio';
+    return 'ImportOaiBiblio';
 }
 
 1;
diff --git a/Koha/Import/Oaipmh/Biblios.pm b/Koha/Import/OAI/Biblios.pm
similarity index 82%
rename from Koha/Import/Oaipmh/Biblios.pm
rename to Koha/Import/OAI/Biblios.pm
index 9ae111e96b..59ceba9cd3 100644
--- a/Koha/Import/Oaipmh/Biblios.pm
+++ b/Koha/Import/OAI/Biblios.pm
@@ -1,4 +1,4 @@
-package Koha::Import::Oaipmh::Biblios;
+package Koha::Import::OAI::Biblios;
 
 # This file is part of Koha.
 #
@@ -16,13 +16,13 @@ package Koha::Import::Oaipmh::Biblios;
 
 use Modern::Perl;
 
-use Koha::Import::Oaipmh::Biblio;
+use Koha::Import::OAI::Biblio;
 
 use base qw(Koha::Objects);
 
 =head1 NAME
 
-Koha::Import::Oaipmh::Biblios
+Koha::Import::OAI::Biblios
 
 This object represents a collection of OAI-PMH records being imported as bibliographic records
 
@@ -36,7 +36,7 @@ This object represents a collection of OAI-PMH records being imported as bibliog
 =cut
 
 sub _type {
-    return 'ImportOaipmhBiblio';
+    return 'ImportOaiBiblio';
 }
 
 =head3 object_class
@@ -46,6 +46,6 @@ Koha::Object class
 =cut
 
 sub object_class {
-    return 'Koha::Import::Oaipmh::Biblio';
+    return 'Koha::Import::OAI::Biblio';
 }
 1;
diff --git a/Koha/OAI/Client/Harvester.pm b/Koha/OAI/Client/Harvester.pm
index bcb0106952..462f56e06f 100644
--- a/Koha/OAI/Client/Harvester.pm
+++ b/Koha/OAI/Client/Harvester.pm
@@ -36,11 +36,11 @@ use C4::Log             qw( cronlogaction );
 use HTTP::OAI;
 use HTTP::OAI::Metadata::OAI_DC;
 use Koha::DateUtils qw( dt_from_string );
-use Koha::OaiServers;
-use Koha::Import::Oaipmh::Biblio;
-use Koha::Import::Oaipmh::Biblios;
-use Koha::Import::Oaipmh::Authority;
-use Koha::Import::Oaipmh::Authorities;
+use Koha::OAIServers;
+use Koha::Import::OAI::Biblio;
+use Koha::Import::OAI::Biblios;
+use Koha::Import::OAI::Authority;
+use Koha::Import::OAI::Authorities;
 use Koha::XSLT::Base;
 use MARC::File::XML;
 use MARC::Record;
@@ -61,19 +61,18 @@ my $strp = DateTime::Format::Strptime->new(
 our $xslt_engine = Koha::XSLT::Base->new;
 
 =head2 new
-
-$harvester = Koha::OAI::Client::Harvester->new( { server => $server, verbose => $verbose, days => $days, force => $force } );
+$harvester = Koha::OAI::Client::Harvester->new( { server => $server, days => $days, force => $force, logger => \&logger } );
 
 New instance of Koha::OAI::Client::Harvester
 
-C<$server> An OAI repository (Koha::OaiServer)
-
-C<$verbose> print log messages to stdout when enabled
+C<$server> An OAI repository (Koha::OAIServer)
 
 C<$days> number of days to harvest from (optional)
 
 C<$force> force harvesting (ignore records datestamps)
 
+C<$logger> a callback function to handle logs (optional)
+
 =cut
 
 sub new {
@@ -250,7 +249,7 @@ sub processRecord {
     }
     my $imported_record;
     if ( $server->recordtype eq "biblio" ) {
-        $imported_record = Koha::Import::Oaipmh::Biblios->find(
+        $imported_record = Koha::Import::OAI::Biblios->find(
             {
                 repository => $server->endpoint,
                 identifier => $oai_record->identifier,
@@ -258,7 +257,7 @@ sub processRecord {
             }
         );
     } else {
-        $imported_record = Koha::Import::Oaipmh::Authorities->find(
+        $imported_record = Koha::Import::OAI::Authorities->find(
             {
                 repository => $server->endpoint,
                 identifier => $oai_record->identifier,
@@ -318,7 +317,7 @@ sub processRecord {
         if ( $server->recordtype eq "biblio" ) {
             my ( $biblionumber, $biblioitemnumber ) = AddBiblio($marcrecord);
             $self->printlog( $oai_record->identifier . " added, biblionumber: $biblionumber" );
-            Koha::Import::Oaipmh::Biblio->new(
+            Koha::Import::OAI::Biblio->new(
                 {
                     repository   => $server->endpoint,
                     identifier   => $oai_record->identifier,
@@ -330,7 +329,7 @@ sub processRecord {
         } else {
             my $authid = AddAuthority( $marcrecord, "", GuessAuthTypeCode($marcrecord) );
             $self->printlog( $oai_record->identifier . " added, authid: $authid" );
-            Koha::Import::Oaipmh::Authority->new(
+            Koha::Import::OAI::Authority->new(
                 {
                     repository => $server->endpoint,
                     identifier => $oai_record->identifier,
@@ -350,15 +349,15 @@ sub processRecord {
 
 =head2 $self->printlog
 
-This method adds a cronlog and prints to stdout if verbose is enabled
+This method gives the caller an opportunity to handle log messages
 
 =cut
 
 sub printlog {
     my ( $self, $message ) = @_;
+    return unless $self->{logger};
     $message = $self->{server}->servername . ": " . $message;
-    print $message . "\n" if ( $self->{verbose} );
-    cronlogaction( { info => $message } );
+    $self->{logger}->($message);
 }
 
 1;
diff --git a/Koha/OaiServer.pm b/Koha/OAIServer.pm
similarity index 89%
rename from Koha/OaiServer.pm
rename to Koha/OAIServer.pm
index fa97c1f0b7..2261aa3707 100644
--- a/Koha/OaiServer.pm
+++ b/Koha/OAIServer.pm
@@ -1,4 +1,4 @@
-package Koha::OaiServer;
+package Koha::OAIServer;
 
 # This file is part of Koha.
 #
@@ -24,7 +24,7 @@ use base qw(Koha::Object);
 
 =head1 NAME
 
-Koha::OaiServer - Koha OaiServer Object class
+Koha::OAIServer - Koha OAIServer Object class
 
 =head1 API
 
@@ -39,7 +39,7 @@ Return type of Object relating to Schema ResultSet
 =cut
 
 sub _type {
-    return 'Oaiserver';
+    return 'OaiServer';
 }
 
 1;
diff --git a/Koha/OaiServers.pm b/Koha/OAIServers.pm
similarity index 85%
rename from Koha/OaiServers.pm
rename to Koha/OAIServers.pm
index b752419c5d..9e822e49cd 100644
--- a/Koha/OaiServers.pm
+++ b/Koha/OAIServers.pm
@@ -1,4 +1,4 @@
-package Koha::OaiServers;
+package Koha::OAIServers;
 
 # This file is part of Koha.
 #
@@ -20,13 +20,13 @@ use Modern::Perl;
 
 use Koha::Database;
 
-use Koha::OaiServer;
+use Koha::OAIServer;
 
 use base qw(Koha::Objects);
 
 =head1 NAME
 
-Koha::OaiServers - Koha OaiServer Object set class
+Koha::OAIServers - Koha OAIServer Object set class
 
 =head1 API
 
@@ -41,7 +41,7 @@ Return type of object, relating to Schema ResultSet
 =cut
 
 sub _type {
-    return 'Oaiserver';
+    return 'OaiServer';
 }
 
 =head3 object_class
@@ -51,7 +51,7 @@ Return object class
 =cut
 
 sub object_class {
-    return 'Koha::OaiServer';
+    return 'Koha::OAIServer';
 }
 
 1;
diff --git a/admin/oaiservers.pl b/admin/oai_servers.pl
similarity index 85%
rename from admin/oaiservers.pl
rename to admin/oai_servers.pl
index b9dc686b7c..af35b14110 100755
--- a/admin/oaiservers.pl
+++ b/admin/oai_servers.pl
@@ -26,7 +26,7 @@ use C4::Context;
 use C4::Auth   qw( get_template_and_user );
 use C4::Output qw( output_html_with_http_headers );
 use Koha::Database;
-use Koha::OaiServers;
+use Koha::OAIServers;
 
 # Initialize CGI, template, database
 
@@ -38,13 +38,13 @@ my $searchfield = '';
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     {
-        template_name => "admin/oaiservers.tt",
+        template_name => "admin/oai_servers.tt",
         query         => $input,
         type          => "intranet",
         flagsrequired => { parameters => 'manage_search_targets' },
     }
 );
-my $script_name = "/cgi-bin/koha/admin/oaiservers.pl";
+my $script_name = "/cgi-bin/koha/admin/oai_servers.pl";
 my $path        = C4::Context->config('intrahtdocs') . "/prog/";
 
 $template->param( script_name => $script_name, xslt_path => $path );
@@ -55,7 +55,7 @@ my $schema = Koha::Database->new()->schema();
 # First process a confirmed delete, or save a validated record
 
 if ( $op eq 'cud-delete_confirmed' && $id ) {
-    my $server = Koha::OaiServers->find($id);
+    my $server = Koha::OAIServers->find($id);
     if ($server) {
         $server->delete;
         $template->param( msg_deleted => 1, msg_add => $server->servername );
@@ -69,7 +69,7 @@ if ( $op eq 'cud-delete_confirmed' && $id ) {
         add_xslt/;
     my $formdata = _form_data_hashref( $input, \@fields );
     if ($id) {
-        my $server = Koha::OaiServers->find($id);
+        my $server = Koha::OAIServers->find($id);
         if ($server) {
             $server->set($formdata)->store;
             $template->param( msg_updated => 1, msg_add => $formdata->{servername} );
@@ -78,7 +78,7 @@ if ( $op eq 'cud-delete_confirmed' && $id ) {
         }
         $id = 0;
     } else {
-        Koha::OaiServer->new($formdata)->store;
+        Koha::OAIServer->new($formdata)->store;
         $template->param( msg_added => 1, msg_add => $formdata->{servername} );
     }
 } elsif ( $op eq 'search' ) {
@@ -91,14 +91,14 @@ if ( $op eq 'cud-delete_confirmed' && $id ) {
 
 my $data = [];
 if ( $op eq 'add' || $op eq 'edit' ) {
-    $data = ServerSearch( $schema, $id, $searchfield ) if $searchfield || $id;
-    delete $data->[0]->{id}                            if @$data && $op eq 'add';    #cloning record
+    $data = server_search( $schema, $id, $searchfield ) if $searchfield || $id;
+    delete $data->[0]->{id}                             if @$data && $op eq 'add';    #cloning record
     $template->param(
         add_form => 1, server => @$data ? $data->[0] : undef,
         op => $op, type => $op eq 'add' ? lc $type : ''
     );
 } else {
-    $data = ServerSearch( $schema, $id, $searchfield );
+    $data = server_search( $schema, $id, $searchfield );
     $template->param(
         loop => \@$data, searchfield => $searchfield, id => $id,
         op   => 'list'
@@ -108,10 +108,10 @@ output_html_with_http_headers $input, $cookie, $template->output;
 
 # End of main code
 
-sub ServerSearch {    #find server(s) by id or name
+sub server_search {    #find server(s) by id or name
     my ( $schema, $id, $searchstring ) = @_;
 
-    return Koha::OaiServers->search(
+    return Koha::OAIServers->search(
         $id ? { id => $id } : { servername => { like => $searchstring . '%' } },
     )->unblessed;
 }
diff --git a/installer/data/mysql/atomicupdate/Bug-35659.pl b/installer/data/mysql/atomicupdate/Bug-35659.pl
index 96721d3291..c637027d45 100755
--- a/installer/data/mysql/atomicupdate/Bug-35659.pl
+++ b/installer/data/mysql/atomicupdate/Bug-35659.pl
@@ -8,8 +8,8 @@ return {
         my ( $dbh, $out ) = @$args{qw(dbh out)};
         $dbh->do(
             q{
-            CREATE TABLE IF NOT EXISTS `oaiservers` (
-              `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
+            CREATE TABLE IF NOT EXISTS `oai_servers` (
+              `oai_server_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
               `endpoint` varchar(255) NOT NULL COMMENT 'OAI endpoint (host + port + path)',
               `oai_set` varchar(255) DEFAULT NULL COMMENT 'OAI set to harvest',
               `servername` longtext NOT NULL COMMENT 'name given to the target by the library',
@@ -20,12 +20,12 @@ return {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
         }
         );
-        say $out "Added new table 'oaiservers'";
+        say $out "Added new table 'oai_servers'";
 
         $dbh->do(
             q{
-            CREATE TABLE IF NOT EXISTS `import_oaipmh_biblios` (
-              `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
+            CREATE TABLE IF NOT EXISTS `import_oai_biblios` (
+              `import_oai_biblio_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
               `biblionumber` int(11) NOT NULL COMMENT 'unique identifier assigned to each koha record',
               `identifier` varchar(255) NOT NULL COMMENT 'OAI record identifier',
               `repository` varchar(255) NOT NULL COMMENT 'OAI repository',
@@ -34,15 +34,15 @@ return {
               `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
               PRIMARY KEY (id),
               KEY biblionumber (biblionumber),
-              CONSTRAINT FK_import_oaipmh_biblios_1 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE NO ACTION
+              CONSTRAINT FK_import_oai_biblios_1 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE NO ACTION
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
         }
         );
 
         $dbh->do(
             q{
-            CREATE TABLE IF NOT EXISTS `import_oaipmh_authorities` (
-              `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
+            CREATE TABLE IF NOT EXISTS `import_oai_authorities` (
+              `import_oai_authority_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
               `authid` bigint(20) unsigned NOT NULL COMMENT 'unique identifier assigned to each koha record',
               `identifier` varchar(255) NOT NULL COMMENT 'OAI record identifier',
               `repository` varchar(255) NOT NULL COMMENT 'OAI repository',
@@ -51,11 +51,11 @@ return {
               `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
               PRIMARY KEY (id),
               KEY authid (authid),
-              CONSTRAINT FK_import_oaipmh_authorities_1 FOREIGN KEY (authid) REFERENCES auth_header (authid) ON DELETE CASCADE ON UPDATE NO ACTION
+              CONSTRAINT FK_import_oai_authorities_1 FOREIGN KEY (authid) REFERENCES auth_header (authid) ON DELETE CASCADE ON UPDATE NO ACTION
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
         }
         );
-        say $out "Added new tables 'import_oaipmh_biblios' and import_oaipmh_authorities";
+        say $out "Added new tables 'import_oai_biblios' and import_oai_authorities";
 
         $dbh->do(
             q{
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index 3bfe31da94..0a43745c97 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -4852,13 +4852,13 @@ CREATE TABLE `oai_sets_mappings` (
 /*!40101 SET character_set_client = @saved_cs_client */;
 
 --
--- Table structure for table `oaiservers`
+-- Table structure for table `oai_servers`
 --
 
-DROP TABLE IF EXISTS `oaiservers`;
+DROP TABLE IF EXISTS `oai_servers`;
 /*!40101 SET @saved_cs_client     = @@character_set_client */;
 /*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `oaiservers` (
+CREATE TABLE `oai_servers` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
   `endpoint` varchar(255) NOT NULL COMMENT 'OAI endpoint (host + port + path)',
   `oai_set` varchar(255) DEFAULT NULL COMMENT 'OAI set to harvest',
@@ -4870,13 +4870,13 @@ CREATE TABLE `oaiservers` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 --
--- Table structure for table `import_oaipmh_biblios`
+-- Table structure for table `import_oai_biblios`
 --
 
-DROP TABLE IF EXISTS `import_oaipmh_biblios`;
+DROP TABLE IF EXISTS `import_oai_biblios`;
 /*!40101 SET @saved_cs_client     = @@character_set_client */;
 /*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `import_oaipmh_biblios` (
+CREATE TABLE `import_oai_biblios` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
   `biblionumber` int(11) NOT NULL COMMENT 'unique identifier assigned to each koha record',
   `identifier` varchar(255) NOT NULL COMMENT 'OAI record identifier',
@@ -4886,17 +4886,17 @@ CREATE TABLE `import_oaipmh_biblios` (
   `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (id),
   KEY biblionumber (biblionumber),
-  CONSTRAINT FK_import_oaipmh_biblios_1 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE NO ACTION
+  CONSTRAINT FK_import_oai_biblios_1 FOREIGN KEY (biblionumber) REFERENCES biblio (biblionumber) ON DELETE CASCADE ON UPDATE NO ACTION
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 --
--- Table structure for table `import_oaipmh_authorities`
+-- Table structure for table `import_oai_authorities`
 --
 
-DROP TABLE IF EXISTS `import_oaipmh_authorities`;
+DROP TABLE IF EXISTS `import_oai_authorities`;
 /*!40101 SET @saved_cs_client     = @@character_set_client */;
 /*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `import_oaipmh_authorities` (
+CREATE TABLE `import_oai_authorities` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier assigned by Koha',
   `authid` bigint(20) unsigned NOT NULL COMMENT 'unique identifier assigned to each koha record',
   `identifier` varchar(255) NOT NULL COMMENT 'OAI record identifier',
@@ -4906,7 +4906,7 @@ CREATE TABLE `import_oaipmh_authorities` (
   `last_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (id),
   KEY authid (authid),
-  CONSTRAINT FK_import_oaipmh_authorities_1 FOREIGN KEY (authid) REFERENCES auth_header (authid) ON DELETE CASCADE ON UPDATE NO ACTION
+  CONSTRAINT FK_import_oai_authorities_1 FOREIGN KEY (authid) REFERENCES auth_header (authid) ON DELETE CASCADE ON UPDATE NO ACTION
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 --
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc
index 5f5e089d1c..e3b6e520d0 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/admin-menu.inc
@@ -152,7 +152,7 @@
             [% END %]
             [% IF ( CAN_user_parameters_manage_search_targets ) %]
                 <li><a href="/cgi-bin/koha/admin/z3950servers.pl">Z39.50/SRU servers</a></li>
-                <li><a href="/cgi-bin/koha/admin/oaiservers.pl">OAI repositories</a></li>
+                <li><a href="/cgi-bin/koha/admin/oai_servers.pl">OAI repositories</a></li>
             [% END %]
             [% IF ( CAN_user_parameters_manage_smtp_servers ) %]
                 <li><a href="/cgi-bin/koha/admin/smtp_servers.pl">SMTP servers</a></li>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/oai-admin-search.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/oai-admin-search.inc
index 5f7a97c71f..1da8c440cc 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/oai-admin-search.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/oai-admin-search.inc
@@ -3,7 +3,7 @@
 <div id="header_search" role="tablist">
     <div class="tab-content">
         <div id="oai_search" role="tabpanel" class="tab-pane active">
-            <form action="/cgi-bin/koha/admin/oaiservers.pl" method="get">
+            <form action="/cgi-bin/koha/admin/oai_servers.pl" method="get">
                 <div class="form-title">
                     <label class="control-label" for="searchfield">Search OAI repositories</label>
                 </div>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt
index 4dab8392ba..8fbf2b7e7e 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/admin-home.tt
@@ -261,7 +261,7 @@
                     [% IF ( CAN_user_parameters_manage_search_targets ) %]
                         <dt><a href="/cgi-bin/koha/admin/z3950servers.pl">Z39.50/SRU servers</a></dt>
                         <dd>Define which external servers to query for MARC data</dd>
-                        <dt><a href="/cgi-bin/koha/admin/oaiservers.pl">OAI repositories</a></dt>
+                        <dt><a href="/cgi-bin/koha/admin/oai_servers.pl">OAI repositories</a></dt>
                         <dd>Define which OAI repositories to harvest data from</dd>
                     [% END %]
                     [% IF ( CAN_user_parameters_manage_smtp_servers ) %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/oaiservers.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/oai_servers.tt
similarity index 87%
rename from koha-tmpl/intranet-tmpl/prog/en/modules/admin/oaiservers.tt
rename to koha-tmpl/intranet-tmpl/prog/en/modules/admin/oai_servers.tt
index eee0c85d80..07751b636e 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/oaiservers.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/oai_servers.tt
@@ -15,7 +15,7 @@
 [% INCLUDE 'doc-head-close.inc' %]
 </head>
 
-<body id="admin_oaiservers" class="admin">
+<body id="admin_oai_servers" class="admin">
 [% WRAPPER 'header.inc' %]
     [% INCLUDE 'oai-admin-search.inc' %]
 [% END %]
@@ -28,7 +28,7 @@
 
         [% IF op == 'edit' || op == 'add' %]
             [% WRAPPER breadcrumb_item %]
-                <a href="/cgi-bin/koha/admin/oaiservers.pl">OAI repositories</a>
+                <a href="/cgi-bin/koha/admin/oai_servers.pl">OAI repositories</a>
            [% END %]
         [% END %]
 
@@ -89,7 +89,7 @@
 
         <li><label for="endpoint" class="required">Endpoint: </label> <input type="text" name="endpoint" id="endpoint" size="30" value="[% server.endpoint | html %]" required="required" /> <span class="required">Required</span>
         </li>
-        <li><label for="oai_set">Set: </label> <input type="text" name="oai_set" id="oai_set" value="[% server.oai_set | html %]" />
+        <li><label for="oai_set">[% I18N.tp('OAI', 'Set:') | html %] </label> <input type="text" name="oai_set" id="oai_set" value="[% server.oai_set | html %]" />
         </li>
         <li>
             <label for="dataformat">Data format: </label>
@@ -115,31 +115,31 @@
         </ol>
         </fieldset>
 
-        <fieldset class="action"><input type="submit" class="btn btn-primary" value="Save" /> <a class="cancel" href="/cgi-bin/koha/admin/oaiservers.pl">Cancel</a></fieldset>
+        <fieldset class="action"><input type="submit" class="btn btn-primary" value="Save" /> <a class="cancel" href="/cgi-bin/koha/admin/oai_servers.pl">Cancel</a></fieldset>
     </form>
 [% END %]
 
 [% IF op == 'list' %]
     <div id="toolbar" class="btn-toolbar">
-        <a id="newserver" class="btn btn-default" href="/cgi-bin/koha/admin/oaiservers.pl?op=add"><i class="fa fa-plus"></i> New OAI repository</a>
+        <a id="newserver" class="btn btn-default" href="/cgi-bin/koha/admin/oai_servers.pl?op=add"><i class="fa fa-plus"></i> New OAI repository</a>
     </div>
     <h1>OAI repositories administration</h1>
     [% IF id %]
-        You searched for record [% id | html %]
+        <span>You searched for record [% id | html %]</span>
     [% ELSIF searchfield %]
-        You searched for [% searchfield | html %]
+        </span>You searched for [% searchfield | html %]<span>
     [% END %]
 
     <div class="page-section">
     <table id="serverst">
 
-        <thead><tr><th>Id</th><th>Repository name</th><th>Endpoint</th><th>Set</th><th>Data format</th><th>Record type</th><th class="noExport">Actions</th>
+        <thead><tr><th>Id</th><th>Repository name</th><th>Endpoint</th><th>[% tp('OAI', 'Set') | html %]</th><th>Data format</th><th>Record type</th><th class="noExport">Actions</th>
         </tr></thead>
         <tbody>
         [% FOREACH loo IN loop %]
             <tr>
             <td>[% loo.id | html %]</td>
-            <td><a href="/cgi-bin/koha/admin/oaiservers.pl?op=edit&amp;id=[% loo.id | uri %]">[% loo.servername | html %]</a></td><td>[% loo.endpoint | html %]</td><td>[% loo.oai_set | html %]</td>
+            <td><a href="/cgi-bin/koha/admin/oai_servers.pl?op=edit&amp;id=[% loo.id | uri %]">[% loo.servername | html %]</a></td><td>[% loo.endpoint | html %]</td><td>[% loo.oai_set | html %]</td>
             <td>[% loo.dataformat | html %]</td>
             <td>[% IF ( loo.recordtype == 'biblio' )  %]
                 <span>Bibliographic</span>
@@ -153,11 +153,11 @@
                         Actions <b class="caret"></b>
                     </a>
                     <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="reportactions[% savedreport.id | html %]">
-                        <li><a href="/cgi-bin/koha/admin/oaiservers.pl?op=edit&amp;id=[% loo.id | uri %]"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a></li>
-                        <li><a href="/cgi-bin/koha/admin/oaiservers.pl?op=add&amp;id=[% loo.id | uri %]"><i class="fa fa-copy"></i> Copy</a></li>
+                        <li><a href="/cgi-bin/koha/admin/oai_servers.pl?op=edit&amp;id=[% loo.id | uri %]"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a></li>
+                        <li><a href="/cgi-bin/koha/admin/oai_servers.pl?op=add&amp;id=[% loo.id | uri %]"><i class="fa fa-copy"></i> Copy</a></li>
                         <li>
                             <a href="#" class="delete" data-formid="server_row_[% loo.id | uri %]" data-servername="[% loo.servername | html %]"><i class="fa fa-trash-can"></i> Delete</a>
-                            <form id="server_row_[% loo.id | uri %]" action="/cgi-bin/koha/admin/oaiservers.pl" method="post">
+                            <form id="server_row_[% loo.id | uri %]" action="/cgi-bin/koha/admin/oai_servers.pl" method="post">
                                 [% INCLUDE 'csrf-token.inc' %]
                                 <input type="hidden" name="op" value="cud-delete_confirmed">
                                 <input type="hidden" name="id" value="[% loo.id | uri %]">
diff --git a/misc/cronjobs/harvest_oai.pl b/misc/cronjobs/harvest_oai.pl
index 5471cbe164..3148e89347 100755
--- a/misc/cronjobs/harvest_oai.pl
+++ b/misc/cronjobs/harvest_oai.pl
@@ -24,7 +24,7 @@ use utf8;
 use Getopt::Long qw( GetOptions );
 use Koha::Script -cron;
 use Koha::OAI::Client::Harvester;
-use Koha::OaiServers;
+use Koha::OAIServers;
 use C4::Log   qw( cronlogaction );
 use Try::Tiny qw( catch try );
 
@@ -60,7 +60,7 @@ if ($help) {
 }
 
 if ($list) {
-    my $servers = Koha::OaiServers->search( {}, { order_by => { -asc => 'id' } } )->unblessed;
+    my $servers = Koha::OAIServers->search( {}, { order_by => { -asc => 'id' } } )->unblessed;
     print "The following repositories are available: \n\n";
     foreach my $server (@$servers) {
         print $server->{'id'} . ": "
@@ -81,7 +81,7 @@ if ( !$id ) {
     print $usage . "\n";
 }
 
-my $server = Koha::OaiServers->find($id);
+my $server = Koha::OAIServers->find($id);
 
 unless ($server) {
     print "OAI Server $id unknown\n";
@@ -103,8 +103,15 @@ cronlogaction( { action => 'Start', info => "Starting OAI Harvest" } );
 cronlogaction( { info   => "Command line: $command_line_options" } );
 
 my $harvester =
-    Koha::OAI::Client::Harvester->new( { server => $server, verbose => $verbose, days => $days, force => $force } );
+    Koha::OAI::Client::Harvester->new( { server => $server, days => $days, force => $force, logger => \&logFunction } );
 $harvester->init();
 
 cronlogaction( { action => 'End', info => "Ending OAI Harvest" } );
+
+sub logFunction {
+    my $message = shift;
+    print $message . "\n" if ($verbose);
+    cronlogaction( { info => $message } );
+}
+
 exit(0);
diff --git a/t/db_dependent/Koha/OAIHarvester.t b/t/db_dependent/Koha/OAIHarvester.t
index db973bd268..57c1d30be5 100755
--- a/t/db_dependent/Koha/OAIHarvester.t
+++ b/t/db_dependent/Koha/OAIHarvester.t
@@ -27,8 +27,8 @@ use HTTP::OAI::Metadata::OAI_DC;
 use HTTP::OAI::Record;
 use HTTP::OAI::Encapsulation;
 use Koha::Database;
-use Koha::OaiServer;
-use Koha::OaiServers;
+use Koha::OAIServer;
+use Koha::OAIServers;
 use Koha::OAI::Client::Harvester;
 
 my $schema  = Koha::Database->new->schema;
@@ -36,7 +36,7 @@ my $builder = t::lib::TestBuilder->new;
 
 $schema->storage->txn_begin;
 
-my $new_oai_1 = Koha::OaiServer->new(
+my $new_oai_1 = Koha::OAIServer->new(
     {
         endpoint   => 'my_host1.org',
         oai_set    => 'set1',
@@ -85,11 +85,11 @@ $r->header->datestamp('2018-05-10T09:18:13Z');
 $status = $harvester->processRecord($r);
 is( $status, 'updated', 'When force is not used, record is updated if newer' );
 
-my $imported_record = Koha::Import::Oaipmh::Biblios->find( { identifier => 'oai:myarchive.org:oid-234' } );
+my $imported_record = Koha::Import::OAI::Biblios->find( { identifier => 'oai:myarchive.org:oid-234' } );
 my $added_datestamp = $imported_record->datestamp;
 $r->header->datestamp(undef);
 $status          = $harvester->processRecord($r);
-$imported_record = Koha::Import::Oaipmh::Biblios->find( { identifier => 'oai:myarchive.org:oid-234' } );
+$imported_record = Koha::Import::OAI::Biblios->find( { identifier => 'oai:myarchive.org:oid-234' } );
 my $updated_datestamp = $imported_record->datestamp;
 isnt(
     $added_datestamp, $updated_datestamp,
diff --git a/t/db_dependent/Koha/OAIServers.t b/t/db_dependent/Koha/OAIServers.t
index 9f135b77db..22d9cab649 100755
--- a/t/db_dependent/Koha/OAIServers.t
+++ b/t/db_dependent/Koha/OAIServers.t
@@ -23,8 +23,8 @@ use Test::Exception;
 
 use t::lib::TestBuilder;
 use Koha::Database;
-use Koha::OaiServer;
-use Koha::OaiServers;
+use Koha::OAIServer;
+use Koha::OAIServers;
 
 my $schema  = Koha::Database->new->schema;
 my $builder = t::lib::TestBuilder->new;
@@ -32,8 +32,8 @@ my $builder = t::lib::TestBuilder->new;
 subtest 'new, find and delete tests' => sub {
     plan tests => 4;
     $schema->storage->txn_begin;
-    my $nb_of_oais = Koha::OaiServers->search->count;
-    my $new_oai_1  = Koha::OaiServer->new(
+    my $nb_of_oais = Koha::OAIServers->search->count;
+    my $new_oai_1  = Koha::OAIServer->new(
         {
             endpoint   => 'my_host1.org',
             oai_set    => 'set1',
@@ -42,7 +42,7 @@ subtest 'new, find and delete tests' => sub {
             recordtype => 'biblio',
         }
     )->store;
-    my $new_oai_2 = Koha::OaiServer->new(
+    my $new_oai_2 = Koha::OAIServer->new(
         {
             endpoint   => 'my_host2.org',
             oai_set    => 'set2',
@@ -53,16 +53,16 @@ subtest 'new, find and delete tests' => sub {
     )->store;
 
     like( $new_oai_1->id, qr|^\d+$|, 'Adding a new oai server should have set the id' );
-    is( Koha::OaiServers->search->count, $nb_of_oais + 2, 'The 2 oai servers should have been added' );
+    is( Koha::OAIServers->search->count, $nb_of_oais + 2, 'The 2 oai servers should have been added' );
 
-    my $retrieved_oai_1 = Koha::OaiServers->find( $new_oai_1->id );
+    my $retrieved_oai_1 = Koha::OAIServers->find( $new_oai_1->id );
     is(
         $retrieved_oai_1->servername, $new_oai_1->servername,
         'Find a oai server by id should return the correct oai server'
     );
 
     $retrieved_oai_1->delete;
-    is( Koha::OaiServers->search->count, $nb_of_oais + 1, 'Delete should have deleted the oai server' );
+    is( Koha::OAIServers->search->count, $nb_of_oais + 1, 'Delete should have deleted the oai server' );
 
     $schema->storage->txn_rollback;
 };
@@ -72,7 +72,7 @@ subtest 'Check NOT NULL without default values' => sub {
     $schema->storage->txn_begin;
     local $SIG{__WARN__} = sub { };    # TODO Needed it for suppressing DBIx warns
 
-    my $server = Koha::OaiServer->new(
+    my $server = Koha::OAIServer->new(
         {
             oai_set    => 'set3',
             dataformat => 'marcxml',
-- 
2.39.2