Bug 14687: Patron's transaction history changes items' order after paying fines.
[koha-ffzg.git] / C4 / MarcModificationTemplates.pm
index a428313..203f445 100644 (file)
@@ -504,7 +504,7 @@ sub ModifyRecordWithTemplate {
 
     foreach my $a ( @actions ) {
         my $action = $a->{'action'};
-        my $field_number = $a->{'field_number'};
+        my $field_number = $a->{'field_number'} // 1;
         my $from_field = $a->{'from_field'};
         my $from_subfield = $a->{'from_subfield'};
         my $field_value = $a->{'field_value'};
@@ -526,54 +526,77 @@ sub ModifyRecordWithTemplate {
         }
 
         my $do = 1;
+        my $field_numbers = [];
         if ( $conditional ) {
             if ( $conditional_comparison eq 'exists' ) {
-                my $exists = field_exists({
-                        record =>$record,
+                $field_numbers = field_exists({
+                        record => $record,
                         field => $conditional_field,
                         subfield => $conditional_subfield,
                     });
                 $do = $conditional eq 'if'
-                    ? $exists
-                    : not $exists;
+                    ? @$field_numbers
+                    : not @$field_numbers;
             }
             elsif ( $conditional_comparison eq 'not_exists' ) {
-                my $exists = field_exists({
+                $field_numbers = field_exists({
                         record => $record,
                         field => $conditional_field,
                         subfield => $conditional_subfield
                     });
                 $do = $conditional eq 'if'
-                    ? not $exists
-                    : $exists;
+                    ? not @$field_numbers
+                    : @$field_numbers;
             }
             elsif ( $conditional_comparison eq 'equals' ) {
-                my $equals = field_equals({
+                $field_numbers = field_equals({
                     record => $record,
                     value => $conditional_value,
                     field => $conditional_field,
                     subfield => $conditional_subfield,
-                    regex => $conditional_regex
+                    is_regex => $conditional_regex,
                 });
                 $do = $conditional eq 'if'
-                    ? $equals
-                    : not $equals;
+                    ? @$field_numbers
+                    : not @$field_numbers;
             }
             elsif ( $conditional_comparison eq 'not_equals' ) {
-                my $equals = field_equals({
+                $field_numbers = field_equals({
                     record => $record,
                     value => $conditional_value,
                     field => $conditional_field,
                     subfield => $conditional_subfield,
-                    regex => $conditional_regex
+                    is_regex => $conditional_regex,
                 });
                 $do = $conditional eq 'if'
-                    ? not $equals
-                    : $equals;
+                    ? not @$field_numbers
+                    : @$field_numbers;
             }
         }
 
         if ( $do ) {
+
+            # field_number == 0 if all field need to be updated
+            # or 1 if only the first field need to be updated
+
+            # A condition has been given
+            if ( @$field_numbers > 0 ) {
+                if ( $field_number == 1 ) {
+                    # We want only the first matching
+                    $field_numbers = [ $field_numbers->[0] ];
+                }
+            }
+            # There was no condition
+            else {
+                if ( $field_number == 1 ) {
+                    # We want to process the first field
+                    $field_numbers = [ 1 ];
+                } elsif ( $to_field and $from_field ne $to_field ) {
+                    # If the from and to fields are not the same, we only process the first field.
+                    $field_numbers = [ 1 ];
+                }
+            }
+
             if ( $action eq 'copy_field' ) {
                 copy_field({
                     record => $record,
@@ -586,16 +609,31 @@ sub ModifyRecordWithTemplate {
                         replace => $to_regex_replace,
                         modifiers => $to_regex_modifiers
                     },
-                    n => $field_number,
+                    field_numbers => $field_numbers,
+                });
+            }
+            elsif ( $action eq 'copy_and_replace_field' ) {
+                copy_and_replace_field({
+                    record => $record,
+                    from_field => $from_field,
+                    from_subfield => $from_subfield,
+                    to_field => $to_field,
+                    to_subfield => $to_subfield,
+                    regex => {
+                        search => $to_regex_search,
+                        replace => $to_regex_replace,
+                        modifiers => $to_regex_modifiers
+                    },
+                    field_numbers => $field_numbers,
                 });
             }
-
             elsif ( $action eq 'update_field' ) {
                 update_field({
                     record => $record,
                     field => $from_field,
                     subfield => $from_subfield,
                     values => [ $field_value ],
+                    field_numbers => $field_numbers,
                 });
             }
             elsif ( $action eq 'move_field' ) {
@@ -610,7 +648,7 @@ sub ModifyRecordWithTemplate {
                         replace => $to_regex_replace,
                         modifiers => $to_regex_modifiers
                     },
-                    n => $field_number,
+                    field_numbers => $field_numbers,
                 });
             }
             elsif ( $action eq 'delete_field' ) {
@@ -618,13 +656,15 @@ sub ModifyRecordWithTemplate {
                     record => $record,
                     field => $from_field,
                     subfield => $from_subfield,
-                    n => $field_number,
+                    field_numbers => $field_numbers,
                 });
             }
         }
 
         warn( $record->as_formatted() ) if DEBUG >= 10;
     }
+
+    return;
 }
 1;
 __END__