View | Details | Raw Unified | Return to bug 8015
Collapse All | Expand All

(-)a/C4/MarcModificationTemplates.pm (-75 / +104 lines)
Lines 492-573 sub ModifyRecordsWithTemplate { Link Here
492
=cut
492
=cut
493
493
494
sub ModifyRecordWithTemplate {
494
sub ModifyRecordWithTemplate {
495
  my ( $template_id, $record ) = @_;
495
    my ( $template_id, $record ) = @_;
496
  C4::Koha::Log( "C4::MarcModificationTemplates::ModifyRecordWithTemplate( $template_id, $record )" ) if DEBUG;
496
    C4::Koha::Log( "C4::MarcModificationTemplates::ModifyRecordWithTemplate( $template_id, $record )" ) if DEBUG;
497
  warn( "C4::MarcModificationTemplates::ModifyRecordWithTemplate( $template_id, $record )" ) if DEBUG;
497
    warn( "C4::MarcModificationTemplates::ModifyRecordWithTemplate( $template_id, $record )" ) if DEBUG;
498
  C4::Koha::Log( "Unmodified Record:\n" . $record->as_formatted() ) if DEBUG >= 10;
498
    C4::Koha::Log( "Unmodified Record:\n" . $record->as_formatted() ) if DEBUG >= 10;
499
  warn( "Unmodified Record:\n" . $record->as_formatted() ) if DEBUG >= 10;
499
    warn( "Unmodified Record:\n" . $record->as_formatted() ) if DEBUG >= 10;
500
500
501
  my $current_date = DateTime->now()->ymd();
501
    my $current_date = DateTime->now()->ymd();
502
  my $branchcode = C4::Context->userenv->{branch};
502
    my $branchcode = C4::Context->userenv->{branch};
503
503
504
  my @actions = GetModificationTemplateActions( $template_id );
504
    my @actions = GetModificationTemplateActions( $template_id );
505
505
506
  foreach my $a ( @actions ) {
506
    foreach my $a ( @actions ) {
507
    my $action = $a->{'action'};
507
        my $action = $a->{'action'};
508
    my $field_number = $a->{'field_number'};
508
        my $field_number = $a->{'field_number'};
509
    my $from_field = $a->{'from_field'};
509
        my $from_field = $a->{'from_field'};
510
    my $from_subfield = $a->{'from_subfield'};
510
        my $from_subfield = $a->{'from_subfield'};
511
    my $field_value = $a->{'field_value'};
511
        my $field_value = $a->{'field_value'};
512
    my $to_field = $a->{'to_field'};
512
        my $to_field = $a->{'to_field'};
513
    my $to_subfield = $a->{'to_subfield'};
513
        my $to_subfield = $a->{'to_subfield'};
514
    my $to_regex = $a->{'to_regex'};
514
        my $to_regex = $a->{'to_regex'};
515
    my $conditional = $a->{'conditional'};
515
        my $conditional = $a->{'conditional'};
516
    my $conditional_field = $a->{'conditional_field'};
516
        my $conditional_field = $a->{'conditional_field'};
517
    my $conditional_subfield = $a->{'conditional_subfield'};
517
        my $conditional_subfield = $a->{'conditional_subfield'};
518
    my $conditional_comparison = $a->{'conditional_comparison'};
518
        my $conditional_comparison = $a->{'conditional_comparison'};
519
    my $conditional_value = $a->{'conditional_value'};
519
        my $conditional_value = $a->{'conditional_value'};
520
    my $conditional_regex = $a->{'conditional_regex'};
520
        my $conditional_regex = $a->{'conditional_regex'};
521
521
522
    my $eval = "$action( \$record, '$from_field', '$from_subfield', ";
522
        if ( $field_value ) {
523
523
            $field_value =~ s/__CURRENTDATE__/$current_date/g;
524
    if ( $field_value ) {
524
            $field_value =~ s/__BRANCHCODE__/$branchcode/g;
525
      C4::Koha::Log( "Field value before replacements: $field_value" ) if ( DEBUG >= 3 );
525
        }
526
      warn( "Field value before replacements: $field_value" ) if ( DEBUG >= 3 );
526
527
527
        my @params = ( $record, $from_field, $from_subfield );
528
      $field_value =~ s/__CURRENTDATE__/$current_date/g;
528
        if ( $action eq 'update_field' ) {
529
      $field_value =~ s/__BRANCHCODE__/$branchcode/g;
529
            push @params,
530
530
                ( $field_value
531
      $eval .= " undef, " if ( $action eq 'update_field' );
531
                    ? ( undef, $field_value )
532
      $eval .= " '$field_value' ";
532
                    : ()
533
533
                );
534
      C4::Koha::Log( "Field value after replacements: $field_value" ) if ( DEBUG >= 3 );
534
        } else {
535
      warn( "Field value after replacements: $field_value" ) if ( DEBUG >= 3 );
535
            push @params,
536
    } elsif ( $to_field ) {
536
                ( $field_value
537
      $eval .= " '$to_field', '$to_subfield', '$to_regex' ";
537
                    ? $field_value
538
    }
538
                    : ()
539
539
                );
540
    $eval .= ", '$field_number' " if ( $field_number );
540
        }
541
    $eval .= ') ';
541
        push @params, (
542
542
                ( ( not $field_value and $to_field )
543
    if ( $conditional ) {
543
                    ? ( $to_field, $to_subfield, $to_regex )
544
      $eval .= " $conditional ( ";
544
                    : () ),
545
545
                ( $field_number
546
      if ( $conditional_comparison eq 'exists' ) {
546
                    ? $field_number
547
        $eval .= "field_exists( \$record, '$conditional_field', '$conditional_subfield' )";
547
                    : () )
548
548
        );
549
      } elsif ( $conditional_comparison eq 'not_exists' ) {
549
550
        $eval .= "!field_exists( \$record, '$conditional_field', '$conditional_subfield' )";
550
        my $do = 1;
551
551
        if ( $conditional ) {
552
      } elsif ( $conditional_comparison eq 'equals' ) {
552
            for ( $conditional_comparison ) {
553
        $eval .= "field_equals( \$record, '$conditional_value', '$conditional_field', '$conditional_subfield', '$conditional_regex' ) ";
553
                when ( /^exists$/ ) {
554
554
                    my $exists = field_exists( $record, $conditional_field, $conditional_subfield );
555
      } elsif ( $conditional_comparison eq 'not_equals' ) {
555
                    $do = $conditional eq 'if'
556
        $eval .= "!field_equals( \$record, '$conditional_value', '$conditional_field', '$conditional_subfield', '$conditional_regex' ) ";
556
                        ? $exists
557
      }
557
                        : not $exists;
558
558
                }
559
      $eval .= " )";
559
                when ( /^not_exists$/ ) {
560
                    my $exists = field_exists( $record, $conditional_field, $conditional_subfield );
561
                    $do = $conditional eq 'if'
562
                        ? not $exists
563
                        : $exists;
564
                }
565
                when ( /^equals$/ ) {
566
                    my $equals = field_equals( $record, $conditional_value, $conditional_field, $conditional_subfield, $conditional_regex );
567
                    $do = $conditional eq 'if'
568
                        ? $equals
569
                        : not $equals;
570
                }
571
                when ( /^not_equals$/ ) {
572
                    my $equals = field_equals( $record, $conditional_value, $conditional_field, $conditional_subfield, $conditional_regex );
573
                    $do = $conditional eq 'if'
574
                        ? not $equals
575
                        : $equals;
576
                }
577
            }
578
        }
579
580
        if ( $do ) {
581
            for ( $action ) {
582
                when ( /^copy_field$/ ) {
583
                    copy_field( @params );
584
                }
585
                when ( /^update_field$/ ) {
586
                    update_field( @params );
587
                }
588
                when ( /^move_field$/ ) {
589
                    move_field( @params );
590
                }
591
                when ( /^delete_field$/ ) {
592
                    delete_field( @params );
593
                }
594
            }
595
        }
596
597
        C4::Koha::Log( $record->as_formatted() ) if DEBUG >= 10;
598
        warn( $record->as_formatted() ) if DEBUG >= 10;
560
    }
599
    }
561
562
    $eval .= ";";
563
564
    C4::Koha::Log("eval $eval") if DEBUG >= 2;
565
    warn("eval $eval") if DEBUG >= 2;
566
    eval {$eval};
567
    C4::Koha::Log( $record->as_formatted() ) if DEBUG >= 10;
568
    warn( $record->as_formatted() ) if DEBUG >= 10;
569
570
  }
571
}
600
}
572
1;
601
1;
573
__END__
602
__END__
(-)a/Koha/SimpleMARC.pm (-1 / +1 lines)
Lines 125-131 sub update_field { Link Here
125
          $field->update( "$subfieldName" => $values[$i++] );
125
          $field->update( "$subfieldName" => $values[$i++] );
126
        }
126
        }
127
      }
127
      }
128
      if ( $i <= scalar @values - 1 ) {
128
      if ( $i <= scalar ( @values ) - 1 ) {
129
        foreach my $field ( @fields ) {
129
        foreach my $field ( @fields ) {
130
          foreach my $j ( $i .. scalar( @values ) - 1) {
130
          foreach my $j ( $i .. scalar( @values ) - 1) {
131
            $field->add_subfields( "$subfieldName" => $values[$j] );
131
            $field->add_subfields( "$subfieldName" => $values[$j] );
(-)a/t/SimpleMARC.t (-6 / +1 lines)
Lines 1-14 Link Here
1
use Modern::Perl;
1
use Modern::Perl;
2
2
3
use Test::More;#tests => 1;
3
use Test::More tests => 33;
4
5
use Data::Dumper;
6
4
7
use_ok("MARC::Field");
5
use_ok("MARC::Field");
8
use_ok("MARC::Record");
6
use_ok("MARC::Record");
9
use_ok("Koha::SimpleMARC");
7
use_ok("Koha::SimpleMARC");
10
8
11
12
sub new_record {
9
sub new_record {
13
    my $record = MARC::Record->new;
10
    my $record = MARC::Record->new;
14
    $record->leader('03174nam a2200445 a 4500');
11
    $record->leader('03174nam a2200445 a 4500');
Lines 184-188 move_field( $record, '952', 'p', '954', 'p' ); # Move all field Link Here
184
is_deeply( \@fields_952p, [], 'All 952$p have moved' );
181
is_deeply( \@fields_952p, [], 'All 952$p have moved' );
185
is_deeply( \@fields_954p, ['3010023917', '3010023917'], 'Now 2 954$p exist' );
182
is_deeply( \@fields_954p, ['3010023917', '3010023917'], 'Now 2 954$p exist' );
186
183
187
188
done_testing;
(-)a/t/db_dependent/MarcModificationTemplates.t (-2 / +139 lines)
Lines 1-9 Link Here
1
use Modern::Perl;
1
use Modern::Perl;
2
2
3
use Test::More tests => 66;
3
use Test::More tests => 74;
4
4
5
use_ok("MARC::Field");
6
use_ok("MARC::Record");
5
use_ok("C4::MarcModificationTemplates");
7
use_ok("C4::MarcModificationTemplates");
6
8
9
my $dbh = C4::Context->dbh;
10
$dbh->{AutoCommit} = 0;
11
$dbh->{RaiseError} = 1;
12
13
$dbh->do(q|DELETE FROM marc_modification_template_actions|);
14
$dbh->do(q|DELETE FROM marc_modification_templates|);
15
7
# Creation
16
# Creation
8
my $template_id = AddModificationTemplate("template_name");
17
my $template_id = AddModificationTemplate("template_name");
9
like( $template_id, qr|^\d+$|, "new template returns an id" );
18
like( $template_id, qr|^\d+$|, "new template returns an id" );
Lines 123-125 is( GetModificationTemplateAction( $actions[1]->{mmta_id} ), undef, "second acti Link Here
123
is( GetModificationTemplateAction( $actions[2]->{mmta_id} ), undef, "third action does not exist anymore" );
132
is( GetModificationTemplateAction( $actions[2]->{mmta_id} ), undef, "third action does not exist anymore" );
124
133
125
is( GetModificationTemplateActions( $template_id ), 0, "There is no action for deleted template" );
134
is( GetModificationTemplateActions( $template_id ), 0, "There is no action for deleted template" );
126
- 
135
136
# ModifyRecordWithTemplate
137
my @USERENV = (
138
    1,
139
    'test',
140
    'MASTERTEST',
141
    'Test',
142
    'Test',
143
    't',
144
    'Test',
145
    0,
146
);
147
C4::Context->_new_userenv ('DUMMY_SESSION_ID');
148
C4::Context->set_userenv ( @USERENV );
149
150
$template_id = AddModificationTemplate("template_name");
151
like( $template_id, qr|^\d+$|, "new template returns an id" );
152
153
is( AddModificationTemplateAction(
154
    $template_id, 'copy_field', 0,
155
    '245', 'a', '',
156
    '246', 'a', '',
157
    '', '', '', '', '', '', '',
158
    'copy field 245$a to 246$a'
159
), 1, 'Add first action: copy 245$a to 246$a');
160
161
is( AddModificationTemplateAction(
162
    $template_id, 'delete_field', 0,
163
    '650', 'a', '',
164
    '', '', '',
165
    'if', '650', '9', 'equals', '462', '',
166
    'Delete field 650$a if 650$9=462'
167
), 1, 'Add second action: delete field 650$a if 650$9=462');
168
169
is( AddModificationTemplateAction(
170
    $template_id, 'update_field', 0,
171
    '952', 'p', '3010023917_updated',
172
    '', '', '',
173
    'unless', '650', '9', 'equals', '42', '',
174
    'Update field 952$p with "3010023917_updated" if 650$9 != 42'
175
), 1, 'Add third action: update field 952$p with "3010023917_updated" if 650$9 != 42');
176
177
is( AddModificationTemplateAction(
178
    $template_id, 'move_field', 0,
179
    '952', 'd', '',
180
    '952', 'e', '',
181
    'if', '952', 'c', 'equals', '/^GEN/', '1',
182
    'Move field 952$d to 952$e if 952$c =~ /^GE/'
183
), 1, 'Add fourth action: move field 952$d to 952$e if 952$c =~ /^GE/');
184
185
my $record = new_record();
186
187
ModifyRecordWithTemplate( $template_id, $record );
188
189
my $expected_record = expected_record();
190
is_deeply( $record, $expected_record );
191
192
done_testing;
193
194
sub new_record {
195
    my $record = MARC::Record->new;
196
    $record->leader('03174nam a2200445 a 4500');
197
    my @fields = (
198
        MARC::Field->new(
199
            100, '1', ' ',
200
            a => 'Knuth, Donald Ervin',
201
            d => '1938',
202
        ),
203
        MARC::Field->new(
204
            245, '1', '4',
205
            a => 'The art of computer programming',
206
            c => 'Donald E. Knuth.',
207
        ),
208
        MARC::Field->new(
209
            650, ' ', '0',
210
            a => 'Computer programming.',
211
            9 => '462',
212
        ),
213
        MARC::Field->new(
214
            952, ' ', ' ',
215
            p => '3010023917',
216
            y => 'BK',
217
            c => 'GEN',
218
            d => '2001-06-25',
219
        ),
220
    );
221
    $record->append_fields(@fields);
222
    return $record;
223
}
224
225
sub expected_record {
226
    my $record = MARC::Record->new;
227
    $record->leader('03174nam a2200445 a 4500');
228
    my @fields = (
229
        MARC::Field->new(
230
            100, '1', ' ',
231
            a => 'Knuth, Donald Ervin',
232
            d => '1938',
233
        ),
234
        MARC::Field->new(
235
            245, '1', '4',
236
            a => 'The art of computer programming',
237
            c => 'Donald E. Knuth.',
238
        ),
239
        MARC::Field->new(
240
            650, ' ', '0',
241
            9 => '462',
242
        ),
243
        MARC::Field->new(
244
            952, ' ', ' ',
245
            p => '3010023917_updated',
246
            y => 'BK',
247
            c => 'GEN',
248
            e => '2001-06-25',
249
        ),
250
        MARC::Field->new(
251
            246, '', ' ',
252
            a => 'The art of computer programming',
253
        ),
254
    );
255
    $record->append_fields(@fields);
256
    return $record;
257
}
258
259
260
# C4::Context->userenv
261
sub Mock_userenv {
262
    return { branchcode => 'CPL' };
263
}

Return to bug 8015