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

(-)a/Koha/Database/DataInconsistency.pm (-20 / +19 lines)
Lines 159-166 sub errors_in_marc { Link Here
159
        }
159
        }
160
    }
160
    }
161
161
162
    my ( $biblio_tag,      $biblio_subfield )     = C4::Biblio::GetMarcFromKohaField("biblio.biblionumber");
162
    my ( $biblio_tag,     $biblio_subfield )     = C4::Biblio::GetMarcFromKohaField("biblio.biblionumber");
163
    my ( $biblioitem_tag,  $biblioitem_subfield ) = C4::Biblio::GetMarcFromKohaField("biblioitems.biblioitemnumber");
163
    my ( $biblioitem_tag, $biblioitem_subfield ) = C4::Biblio::GetMarcFromKohaField("biblioitems.biblioitemnumber");
164
    $biblios = Koha::Biblios->search( { biblionumber => $ids } );
164
    $biblios = Koha::Biblios->search( { biblionumber => $ids } );
165
    while ( my $biblio = $biblios->next ) {
165
    while ( my $biblio = $biblios->next ) {
166
        my $record = eval { $biblio->metadata->record; };
166
        my $record = eval { $biblio->metadata->record; };
Lines 182-208 sub errors_in_marc { Link Here
182
            $biblioitemnumber = $record->subfield( $biblioitem_tag, $biblioitem_subfield );
182
            $biblioitemnumber = $record->subfield( $biblioitem_tag, $biblioitem_subfield );
183
        }
183
        }
184
        if ( $biblionumber != $biblio->biblionumber ) {
184
        if ( $biblionumber != $biblio->biblionumber ) {
185
                push @{ $errors->{ids_not_in_marc} },
185
            push @{ $errors->{ids_not_in_marc} },
186
                    __x(
186
                __x(
187
                    q{Biblionumber {biblionumber} has '{biblionumber_in_marc}' in {biblio_tag}${biblio_subfield}},
187
                q{Biblionumber {biblionumber} has '{biblionumber_in_marc}' in {biblio_tag}${biblio_subfield}},
188
                    biblionumber         => $biblio->biblionumber,
188
                biblionumber         => $biblio->biblionumber,
189
                    biblionumber_in_marc => $biblionumber,
189
                biblionumber_in_marc => $biblionumber,
190
                    biblio_tag           => $biblio_tag,
190
                biblio_tag           => $biblio_tag,
191
                    biblio_subfield      => $biblio_subfield,
191
                biblio_subfield      => $biblio_subfield,
192
                    );
192
                );
193
193
194
        }
194
        }
195
        if ( $biblioitemnumber != $biblio->biblioitem->biblioitemnumber ) {
195
        if ( $biblioitemnumber != $biblio->biblioitem->biblioitemnumber ) {
196
                push @{ $errors->{ids_not_in_marc} },
196
            push @{ $errors->{ids_not_in_marc} },
197
                    __x(
197
                __x(
198
                    q{Biblionumber {biblionumber} has biblioitemnumber '{biblioitemnumber}' but should be '{biblioitemnumber_in_marc}' in {biblioitem_tag}${biblioitem_subfield}},
198
                q{Biblionumber {biblionumber} has biblioitemnumber '{biblioitemnumber_in_marc}' but should be '{biblioitemnumber}' in {biblioitem_tag}${biblioitem_subfield}},
199
                    biblionumber             => $biblio->biblionumber,
199
                biblionumber             => $biblio->biblionumber,
200
                    biblioitemnumber         => $biblio->biblioitem->biblioitemnumber,
200
                biblioitemnumber_in_marc => $biblionumber,
201
                    biblioitemnumber_in_marc => $biblionumber,
201
                biblioitemnumber         => $biblio->biblioitem->biblioitemnumber,
202
                    biblioitem_tag           => $biblioitem_tag,
202
                biblioitem_tag           => $biblioitem_tag,
203
                    biblioitem_subfield      => $biblioitem_subfield,
203
                biblioitem_subfield      => $biblioitem_subfield,
204
                    );
204
                );
205
            }
206
        }
205
        }
207
    }
206
    }
208
    if (@item_fields_in_marc) {
207
    if (@item_fields_in_marc) {
(-)a/t/db_dependent/Koha/Database/DataInconsistency.t (-2 / +106 lines)
Lines 1-7 Link Here
1
use Modern::Perl;
1
use Modern::Perl;
2
2
3
#use Test::NoWarnings;
3
#use Test::NoWarnings;
4
use Test::More tests => 3;
4
use Test::More tests => 4;
5
use Test::Warn;
5
6
6
use Koha::Items;
7
use Koha::Items;
7
use Koha::Database::DataInconsistency;
8
use Koha::Database::DataInconsistency;
Lines 264-266 subtest 'invalid_item_type' => sub { Link Here
264
265
265
    $schema->storage->txn_rollback();
266
    $schema->storage->txn_rollback();
266
};
267
};
267
- 
268
269
subtest 'errors_in_marc' => sub {
270
271
    plan tests => 4;
272
273
    $schema->storage->txn_begin();
274
275
    my $biblio_ok = $builder->build_sample_biblio;
276
    my $item_ok   = $builder->build_sample_item( { biblionumber => $biblio_ok->biblionumber } );
277
    my $biblio_ko = $builder->build_sample_biblio;
278
    my $item_ko   = $builder->build_sample_item( { biblionumber => $biblio_ko->biblionumber } );
279
280
    my $biblios = Koha::Biblios->search( { biblionumber => [ $biblio_ok->biblionumber, $biblio_ko->biblionumber ] } );
281
282
    my $itemtype         = $builder->build_object( { class => 'Koha::ItemTypes' } );
283
    my $deleted_itemtype = $itemtype->itemtype;
284
    $itemtype->delete;
285
286
    subtest 'ok' => sub {
287
        plan tests => 3;
288
        my $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios);
289
        ok( !exists $errors->{decoding_errors} );
290
        ok( !exists $errors->{ids_not_in_marc} );
291
        ok( !exists $errors->{item_fields_in_marc} );
292
    };
293
294
    subtest 'ids_not_in_marc' => sub {
295
        plan tests => 2;
296
        $schema->storage->txn_begin();
297
        my ( $biblio_tag,     $biblio_subfield )     = C4::Biblio::GetMarcFromKohaField("biblio.biblionumber");
298
        my ( $biblioitem_tag, $biblioitem_subfield ) = C4::Biblio::GetMarcFromKohaField("biblioitems.biblioitemnumber");
299
        my $record = $biblio_ko->metadata->record;
300
        if ( my $field = $record->field($biblio_tag) ) {
301
            $field->update( $biblio_subfield => '-42' );
302
        }
303
        $biblio_ko->metadata->metadata( $record->as_xml )->store;
304
305
        my $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios);
306
        is_deeply(
307
            $errors->{ids_not_in_marc},
308
            [
309
                sprintf q{Biblionumber %s has '%s' in %s$%s}, $biblio_ko->biblionumber, '-42', $biblio_tag,
310
                $biblio_subfield
311
            ]
312
        );
313
314
        $record = $biblio_ko->metadata->record;
315
        if ( my $field = $record->field($biblioitem_tag) ) {
316
            $field->update( $biblioitem_subfield => '-42' );
317
        }
318
        $biblio_ko->metadata->metadata( $record->as_xml )->store;
319
320
        $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios);
321
        is_deeply(
322
            $errors->{ids_not_in_marc},
323
            [
324
                sprintf(
325
                    q{Biblionumber %s has '%s' in %s$%s}, $biblio_ko->biblionumber, '-42', $biblio_tag,
326
                    $biblio_subfield
327
                ),
328
                sprintf(
329
                    q{Biblionumber %s has biblioitemnumber '%s' but should be '%s' in %s$%s}, $biblio_ko->biblionumber,
330
                    '-42', $biblio_ko->biblioitem->biblioitemnumber, $biblioitem_tag, $biblioitem_subfield
331
                )
332
            ]
333
        );
334
335
        $schema->storage->txn_rollback();
336
    };
337
338
    subtest 'item_fields_in_marc' => sub {
339
        plan tests => 1;
340
        $schema->storage->txn_begin();
341
        my ( $item_tag, $item_subfield ) = C4::Biblio::GetMarcFromKohaField("items.itemnumber");
342
        my $record = $biblio_ko->metadata->record;
343
        $record->append_fields( MARC::Field->new( $item_tag, '', '', $item_subfield => 'booh' ) );
344
        $biblio_ko->metadata->metadata( $record->as_xml )->store;
345
346
        my $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios);
347
        is_deeply(
348
            $errors->{item_fields_in_marc},
349
            [ sprintf q{Biblionumber %s has item fields (%s) in the marc record}, $biblio_ko->biblionumber, $item_tag ]
350
        );
351
352
        $schema->storage->txn_rollback();
353
    };
354
355
    subtest 'decoding_errors' => sub {
356
        plan tests => 2;
357
        $schema->storage->txn_begin();
358
        my $biblio_metadata = $biblio_ko->metadata;
359
        $biblio_metadata->metadata('oops');
360
        Koha::Object::store($biblio_metadata);
361
        my $errors;
362
        warning_like {
363
            $errors = Koha::Database::DataInconsistency->errors_in_marc($biblios);
364
        }
365
        qr{parser error};
366
        like( $errors->{decoding_errors}->[0], qr{Invalid data, cannot decode metadata object} );
367
        $schema->storage->txn_rollback();
368
    };
369
370
    $schema->storage->txn_rollback();
371
};

Return to bug 40777