From fd4bff4c4fc7a0ad2a50caa404b889e14a4108a6 Mon Sep 17 00:00:00 2001
From: Nick Clemens <nick@bywatersolutions.com>
Date: Mon, 2 Nov 2020 12:05:47 +0000
Subject: [PATCH] Bug 26894: Handle subfield 0 and delete empty fields
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This patch corrects handling of subfield 0 when copying/moving. Before these
patches copying from subfield 0 would copy the entire field.

We also correct an error that if moving a single subfield, we can leave behind empty
fields with no subfields. They should be deleted.

To test:
1 - Define a new MARC Modification template with actions:
        Delete field 100$0
        Add new field 100$0 with value Test
        Update existing or add new field 100$0 with value TestUpdated
        Move field 100$0 to 600$0
        Copy field 600$0 to 100$0
        Copy and replace field 245$0 to 700$0
2 - Define a new record like:
    LDR 00334nam a22001217a 4500
    003 ff
    005 20201102111604.0
    008 201102b        xxu||||| |||| 00| 0 eng d
    040 _ _ ‡cvsd
    100 1 _ ‡012345‡aKnuth, Donal Ervin‡d1938
    245 _ _ ‡012345‡aThe aty of computer programming‡cDonald E. Knuth
    650 _ 0 ‡042‡aComputer programming‡9462
3 - Modify this record using the template above
4 - Note that entier 245 is copied to 700, same for 600 field
5 - Apply patch
6 - Now only subfields 0 are copied
---
 Koha/SimpleMARC.pm                         |  9 +++++----
 t/db_dependent/MarcModificationTemplates.t | 17 ++++++++---------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/Koha/SimpleMARC.pm b/Koha/SimpleMARC.pm
index 2867dc1cd6..8b2fc651c4 100644
--- a/Koha/SimpleMARC.pm
+++ b/Koha/SimpleMARC.pm
@@ -141,8 +141,8 @@ sub copy_and_replace_field {
     if ( ! ( $record && $fromFieldName && $toFieldName ) ) { return; }
 
 
-    if ( not $fromSubfieldName or $fromSubfieldName eq ''
-      or not $toSubfieldName or $toSubfieldName eq ''
+    if ( !defined $fromSubfieldName or $fromSubfieldName eq ''
+      or !defined $toSubfieldName or $toSubfieldName eq ''
     ) {
         _copy_move_field(
             {   record        => $record,
@@ -480,9 +480,9 @@ sub move_field {
     my $regex = $params->{regex};
     my $field_numbers = $params->{field_numbers} // [];
 
-    if (   not $fromSubfieldName
+    if (   !defined $fromSubfieldName
         or $fromSubfieldName eq ''
-        or not $toSubfieldName
+        or !defined $toSubfieldName
         or $toSubfieldName eq '' ) {
         _copy_move_field(
             {   record        => $record,
@@ -564,6 +564,7 @@ sub _delete_subfield {
 
     foreach my $field ( @fields ) {
         $field->delete_subfield( code => $subfieldName );
+        $record->delete_field( $field ) unless $field->subfields();
     }
 }
 
diff --git a/t/db_dependent/MarcModificationTemplates.t b/t/db_dependent/MarcModificationTemplates.t
index 7fcd222ea5..fa148f9771 100755
--- a/t/db_dependent/MarcModificationTemplates.t
+++ b/t/db_dependent/MarcModificationTemplates.t
@@ -701,6 +701,11 @@ sub expected_record_0 {
     $record->leader('03174nam a2200445 a 4500');
     my @fields = (
         MARC::Field->new(
+            100, '1', ' ',
+            a => 'Knuth, Donald Ervin',
+            d => '1938',
+        ),
+        MARC::Field->new(
             245, '1', '4',
             0 => '12345',
             a => 'The art of computer programming',
@@ -713,9 +718,7 @@ sub expected_record_0 {
             9 => '462',
         ),
         MARC::Field->new(
-            600, '1', ' ',
-            a => 'Knuth, Donald Ervin',
-            d => '1938',
+            600, ' ', ' ',
             0 => 'TestUpdated',
         ),
         MARC::Field->new(
@@ -723,9 +726,7 @@ sub expected_record_0 {
             0 => 'TestUpdated',
         ),
         MARC::Field->new(
-            100, '1', ' ',
-            a => 'Knuth, Donald Ervin',
-            d => '1938',
+            100, ' ', ' ',
             0 => 'TestUpdated',
         ),
         MARC::Field->new(
@@ -733,10 +734,8 @@ sub expected_record_0 {
             0 => 'TestUpdated',
         ),
         MARC::Field->new(
-            700, '1', '4',
+            700, ' ', ' ',
             0 => '12345',
-            a => 'The art of computer programming',
-            c => 'Donald E. Knuth.',
         ),
     );
     $record->append_fields(@fields);
-- 
2.11.0