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

(-)a/C4/Biblio.pm (-44 / +47 lines)
Lines 2211-2216 sub GetMarcHosts { Link Here
2211
    return $marchostsarray;
2211
    return $marchostsarray;
2212
}
2212
}
2213
2213
2214
=head2 UpsertMarcSubfield
2215
2216
    my $record = C4::Biblio::UpsertMarcSubfield($MARC::Record, $fieldTag, $subfieldCode, $subfieldContent);
2217
2218
=cut
2219
2220
sub UpsertMarcSubfield {
2221
    my ($record, $tag, $code, $content) = @_;
2222
    my $f = $record->field($tag);
2223
2224
    if ($f) {
2225
        $f->update( $code => $content );
2226
    }
2227
    else {
2228
        my $f = MARC::Field->new( $tag, '', '', $code => $content);
2229
        $record->insert_fields_ordered( $f );
2230
    }
2231
}
2232
2233
=head2 UpsertMarcControlField
2234
2235
    my $record = C4::Biblio::UpsertMarcControlField($MARC::Record, $fieldTag, $content);
2236
2237
=cut
2238
2239
sub UpsertMarcControlField {
2240
    my ($record, $tag, $content) = @_;
2241
    die "UpsertMarcControlField() \$tag '$tag' is not a control field\n" unless 0+$tag < 10;
2242
    my $f = $record->field($tag);
2243
2244
    if ($f) {
2245
        $f->update( $content );
2246
    }
2247
    else {
2248
        my $f = MARC::Field->new($tag, $content);
2249
        $record->insert_fields_ordered( $f );
2250
    }
2251
}
2252
2214
=head2 GetFrameworkCode
2253
=head2 GetFrameworkCode
2215
2254
2216
  $frameworkcode = GetFrameworkCode( $biblionumber )
2255
  $frameworkcode = GetFrameworkCode( $biblionumber )
Lines 3033-3088 the MARC XML. Link Here
3033
sub _koha_marc_update_bib_ids {
3072
sub _koha_marc_update_bib_ids {
3034
    my ( $record, $frameworkcode, $biblionumber, $biblioitemnumber ) = @_;
3073
    my ( $record, $frameworkcode, $biblionumber, $biblioitemnumber ) = @_;
3035
3074
3036
    # we must add bibnum and bibitemnum in MARC::Record...
3037
    # we build the new field with biblionumber and biblioitemnumber
3038
    # we drop the original field
3039
    # we add the new builded field.
3040
    my ( $biblio_tag,     $biblio_subfield )     = GetMarcFromKohaField( "biblio.biblionumber",          $frameworkcode );
3075
    my ( $biblio_tag,     $biblio_subfield )     = GetMarcFromKohaField( "biblio.biblionumber",          $frameworkcode );
3041
    die qq{No biblionumber tag for framework "$frameworkcode"} unless $biblio_tag;
3076
    die qq{No biblionumber tag for framework "$frameworkcode"} unless $biblio_tag;
3042
    my ( $biblioitem_tag, $biblioitem_subfield ) = GetMarcFromKohaField( "biblioitems.biblioitemnumber", $frameworkcode );
3077
    my ( $biblioitem_tag, $biblioitem_subfield ) = GetMarcFromKohaField( "biblioitems.biblioitemnumber", $frameworkcode );
3043
    die qq{No biblioitemnumber tag for framework "$frameworkcode"} unless $biblioitem_tag;
3078
    die qq{No biblioitemnumber tag for framework "$frameworkcode"} unless $biblioitem_tag;
3044
3079
3045
    if ( $biblio_tag == $biblioitem_tag ) {
3080
    if ( $biblio_tag < 10 ) {
3046
3081
        C4::Biblio::UpsertMarcControlField( $record, $biblio_tag, $biblionumber );
3047
        # biblionumber & biblioitemnumber are in the same field (can't be <10 as fields <10 have only 1 value)
3048
        my $new_field = MARC::Field->new(
3049
            $biblio_tag, '', '',
3050
            "$biblio_subfield"     => $biblionumber,
3051
            "$biblioitem_subfield" => $biblioitemnumber
3052
        );
3053
3054
        # drop old field and create new one...
3055
        my $old_field = $record->field($biblio_tag);
3056
        $record->delete_field($old_field) if $old_field;
3057
        $record->insert_fields_ordered($new_field);
3058
    } else {
3082
    } else {
3059
3083
        C4::Biblio::UpsertMarcSubfield($record, $biblio_tag, $biblio_subfield, $biblionumber);
3060
        # biblionumber & biblioitemnumber are in different fields
3084
    }
3061
3085
    if ( $biblioitem_tag < 10 ) {
3062
        # deal with biblionumber
3086
        C4::Biblio::UpsertMarcControlField( $record, $biblioitem_tag, $biblioitemnumber );
3063
        my ( $new_field, $old_field );
3087
    } else {
3064
        if ( $biblio_tag < 10 ) {
3088
        C4::Biblio::UpsertMarcSubfield($record, $biblioitem_tag, $biblioitem_subfield, $biblioitemnumber);
3065
            $new_field = MARC::Field->new( $biblio_tag, $biblionumber );
3066
        } else {
3067
            $new_field = MARC::Field->new( $biblio_tag, '', '', "$biblio_subfield" => $biblionumber );
3068
        }
3069
3070
        # drop old field and create new one...
3071
        $old_field = $record->field($biblio_tag);
3072
        $record->delete_field($old_field) if $old_field;
3073
        $record->insert_fields_ordered($new_field);
3074
3075
        # deal with biblioitemnumber
3076
        if ( $biblioitem_tag < 10 ) {
3077
            $new_field = MARC::Field->new( $biblioitem_tag, $biblioitemnumber, );
3078
        } else {
3079
            $new_field = MARC::Field->new( $biblioitem_tag, '', '', "$biblioitem_subfield" => $biblioitemnumber, );
3080
        }
3081
3082
        # drop old field and create new one...
3083
        $old_field = $record->field($biblioitem_tag);
3084
        $record->delete_field($old_field) if $old_field;
3085
        $record->insert_fields_ordered($new_field);
3086
    }
3089
    }
3087
}
3090
}
3088
3091
(-)a/t/Biblio2.t (-1 / +55 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
use Modern::Perl;
4
use Test::More;
5
use Test::MockModule;
6
7
use MARC::Record;
8
9
use C4::Biblio;
10
11
subtest "_koha_marc_update_bib_ids basic Field", \&_koha_marc_update_bib_ids_simple;
12
sub _koha_marc_update_bib_ids_simple {
13
    my $module = Test::MockModule->new('C4::Biblio');
14
    $module->mock('GetMarcFromKohaField', sub {
15
            my ($source) = @_;
16
            return ('999','c') if $source eq 'biblio.biblionumber';
17
            return ('999','d') if $source eq 'biblioitems.biblioitemnumber';
18
        }
19
    );
20
21
    my $r = MARC::Record->new();
22
    C4::Biblio::_koha_marc_update_bib_ids($r, undef, 10, 20);
23
    is($r->subfield('999', 'c'), 10, 'Biblionumber');
24
    is($r->subfield('999', 'd'), 20, 'Biblioitemnumber');
25
26
    C4::Biblio::_koha_marc_update_bib_ids($r, undef, 10, 20);
27
    my @f = $r->field('999');
28
    is(scalar(@f), 1, 'Field not duplicated');
29
    is($r->subfield('999', 'c'), 10, 'Biblionumber');
30
    is($r->subfield('999', 'd'), 20, 'Biblioitemnumber');
31
}
32
33
subtest "_koha_marc_update_bib_ids ControlField", \&_koha_marc_update_bib_ids_control;
34
sub _koha_marc_update_bib_ids_control {
35
    my $module = Test::MockModule->new('C4::Biblio');
36
    $module->mock('GetMarcFromKohaField', sub {
37
            my ($source) = @_;
38
            return ('001',undef) if $source eq 'biblio.biblionumber';
39
            return ('004',undef) if $source eq 'biblioitems.biblioitemnumber';
40
        }
41
    );
42
43
    my $r = MARC::Record->new();
44
    C4::Biblio::_koha_marc_update_bib_ids($r, undef, 10, 20);
45
    is($r->field('001')->data(), 10, 'Biblionumber to control field');
46
    is($r->field('004')->data(), 20, 'Biblioitemnumber to control field');
47
48
    C4::Biblio::_koha_marc_update_bib_ids($r, undef, 10, 20);
49
    my @f = $r->field('001');
50
    is(scalar(@f), 1, 'Control field not duplicated');
51
    is($r->field('001')->data(), 10, 'Biblionumber to control field');
52
    is($r->field('004')->data(), 20, 'Biblioitemnumber to control field');
53
}
54
55
done_testing();

Return to bug 16556