@@ -, +, @@ does not equal conditional field of 1st 650$2 does match fast --- C4/MarcModificationTemplates.pm | 31 ++++++-- t/db_dependent/MarcModificationTemplates.t | 122 ++++++++++++++++++++++++++++- 2 files changed, 147 insertions(+), 6 deletions(-) --- a/C4/MarcModificationTemplates.pm +++ a/C4/MarcModificationTemplates.pm @@ -585,9 +585,15 @@ sub ModifyRecordWithTemplate { } ]; $field_numbers = [Koha::MoreUtils::singleton ( @$field_numbers, @$all_fields ) ]; - $do = $conditional eq 'if' - ? @$field_numbers - : not @$field_numbers; + if ( $from_field == $conditional_field ){ + $do = $conditional eq 'if' + ? @$field_numbers + : not @$field_numbers; + } else { + $do = $conditional eq 'if' + ? not @$field_numbers + : @$field_numbers; + } } } @@ -599,8 +605,23 @@ sub ModifyRecordWithTemplate { # A condition has been given if ( @$field_numbers > 0 ) { if ( $field_number == 1 ) { - # We want only the first matching - $field_numbers = [ $field_numbers->[0] ]; + # We want only the first + if ( $from_field == $conditional_field ){ + # want first field matching condition + $field_numbers = [ $field_numbers->[0] ]; + } else { + # condition doesn't match, so just want first occurrence of from field + $field_numbers = [ 1 ]; + } + } else { + unless ( $from_field == $conditional_field ){ + # condition doesn't match from fields so need all occurrences of from fields for action + $field_numbers = field_exists({ + record => $record, + field => $from_field, + subfield => $from_subfield, + }); + } } } # There was no condition --- a/t/db_dependent/MarcModificationTemplates.t +++ a/t/db_dependent/MarcModificationTemplates.t @@ -1,6 +1,6 @@ use Modern::Perl; -use Test::More tests => 125; +use Test::More tests => 126; use Koha::Database; use Koha::SimpleMARC; @@ -415,6 +415,51 @@ subtest "not_equals" => sub { is_deeply( $record, $expected_record, 'None 650 have been moved, no $650$b exists' ); }; +subtest "when conditional field doesn't match the from field" => sub { + plan tests => 3; + $dbh->do(q|DELETE FROM marc_modification_templates|); + my $template_id = AddModificationTemplate("template_name"); + AddModificationTemplateAction( + $template_id, 'delete_field', 0, + '650', '9', '', '', '', + '', '', '', + 'if', '245', 'a', 'equals', 'Bad title', '', + 'Delete fields 650$9 if 245$a == "Bad title"' + ); + my $record = new_record(); + ModifyRecordWithTemplate( $template_id, $record ); + my $expected_record = expected_record_3(); + is_deeply( $record, $expected_record, '650$9 fields have been deleted when 245$a == "Bad title"' ); + + $dbh->do(q|DELETE FROM marc_modification_templates|); + $template_id = AddModificationTemplate("template_name"); + AddModificationTemplateAction( + $template_id, 'delete_field', 0, + '650', '9', '', '', '', + '', '', '', + 'if', '245', 'a', 'exists', '', '', + 'Delete fields 650$9 if 245$a exists' + ); + $record = new_record(); + ModifyRecordWithTemplate( $template_id, $record ); + $expected_record = expected_record_3(); + is_deeply( $record, $expected_record, '650$9 fields have been deleted because 245$a exists' ); + + $dbh->do(q|DELETE FROM marc_modification_templates|); + $template_id = AddModificationTemplate("template_name"); + AddModificationTemplateAction( + $template_id, 'delete_field', 1, + '650', '', '', '', '', + '', '', '', + 'if', '245', 'a', 'exists', '', '', + 'Delete 1st field 650 if 245$a exists' + ); + $record = new_record(); + ModifyRecordWithTemplate( $template_id, $record ); + $expected_record = expected_record_4(); + is_deeply( $record, $expected_record, '1st 650 field has been deleted because 245$a exists' ); +}; + sub new_record { my $record = MARC::Record->new; $record->leader('03174nam a2200445 a 4500'); @@ -547,6 +592,81 @@ sub expected_record_2 { return $record; } +sub expected_record_3 { + my $record = MARC::Record->new; + $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', + a => 'The art of computer programming', + c => 'Donald E. Knuth.', + ), + MARC::Field->new( + 245, '1', '4', + a => 'Bad title', + c => 'Donald E. Knuth.', + ), + MARC::Field->new( + 650, ' ', '0', + a => 'Computer programming.', + ), + MARC::Field->new( + 650, ' ', '0', + a => 'Computer programming.', + ), + MARC::Field->new( + 952, ' ', ' ', + p => '3010023917', + y => 'BK', + c => 'GEN', + d => '2001-06-25', + ), + ); + $record->append_fields(@fields); + return $record; +} + +sub expected_record_4 { + my $record = MARC::Record->new; + $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', + a => 'The art of computer programming', + c => 'Donald E. Knuth.', + ), + MARC::Field->new( + 245, '1', '4', + a => 'Bad title', + c => 'Donald E. Knuth.', + ), + MARC::Field->new( + 650, ' ', '0', + a => 'Computer programming.', + 9 => '499', + ), + MARC::Field->new( + 952, ' ', ' ', + p => '3010023917', + y => 'BK', + c => 'GEN', + d => '2001-06-25', + ), + ); + $record->append_fields(@fields); + return $record; +} + # Tests related to use of subfield 0 ($0) sub new_record_0 { --