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

(-)a/C4/Biblio.pm (-30 / +51 lines)
Lines 116-121 use Koha::SearchEngine::Indexer; Link Here
116
use Koha::SimpleMARC;
116
use Koha::SimpleMARC;
117
use Koha::Libraries;
117
use Koha::Libraries;
118
use Koha::Util::MARC;
118
use Koha::Util::MARC;
119
use Koha::Util::Misc;
119
120
120
=head1 NAME
121
=head1 NAME
121
122
Lines 377-385 Used when the indexing schedulling will be handled by the caller Link Here
377
378
378
Set as the record source when saving the record.
379
Set as the record source when saving the record.
379
380
381
=item C<original_digest>
382
383
Digest of the original version of the modified record.
384
380
=back
385
=back
381
386
382
Returns 1 on success 0 on failure
387
Returns 1 on success, -1 in case of modification collision, 0 on other failure.
383
388
384
=cut
389
=cut
385
390
Lines 401-420 sub ModBiblio { Link Here
401
        return 0;
406
        return 0;
402
    }
407
    }
403
408
404
    if ( C4::Context->preference("CataloguingLog") ) {
405
        my $biblio = Koha::Biblios->find($biblionumber);
406
        my $record;
407
        my $decoding_error = "";
408
        eval { $record = $biblio->metadata->record };
409
        if ($@) {
410
            my $exception = $@;
411
            $exception->rethrow unless ( $exception->isa('Koha::Exceptions::Metadata::Invalid') );
412
            $decoding_error = "There was an error with this bibliographic record: " . $exception;
413
            $record         = $biblio->metadata->record_strip_nonxml;
414
        }
415
        logaction( "CATALOGUING", "MODIFY", $biblionumber, "biblio $decoding_error BEFORE=>" . $record->as_formatted );
416
    }
417
418
    if ( !$options->{disable_autolink} && C4::Context->preference('AutoLinkBiblios') ) {
409
    if ( !$options->{disable_autolink} && C4::Context->preference('AutoLinkBiblios') ) {
419
        BiblioAutoLink( $record, $frameworkcode );
410
        BiblioAutoLink( $record, $frameworkcode );
420
    }
411
    }
Lines 465-491 sub ModBiblio { Link Here
465
    # update MARC subfield that stores biblioitems.cn_sort
456
    # update MARC subfield that stores biblioitems.cn_sort
466
    _koha_marc_update_biblioitem_cn_sort( $record, $oldbiblio, $frameworkcode );
457
    _koha_marc_update_biblioitem_cn_sort( $record, $oldbiblio, $frameworkcode );
467
458
468
    # update the MARC record (that now contains biblio and items) with the new record data
459
    my $schema = Koha::Database->schema;
469
    ModBiblioMarc( $record, $biblionumber, $mod_biblio_marc_options );
460
    my $result = 0;
461
    $schema->txn_do(
462
        sub {
470
463
471
    # modify the other koha tables
464
            my $biblio = Koha::Biblios->find($biblionumber);
472
    _koha_modify_biblio( $dbh, $oldbiblio, $frameworkcode );
465
            my $orig_rec;
473
    _koha_modify_biblioitem_nonmarc( $dbh, $oldbiblio );
466
            my $decoding_error = "";
467
            eval { $orig_rec = $biblio->metadata->record };
468
            if ($@) {
469
                my $exception = $@;
470
                $exception->rethrow unless ( $exception->isa('Koha::Exceptions::Metadata::Invalid') );
471
                $decoding_error = "There was an error with this bibliographic record: " . $exception;
472
                $orig_rec       = $biblio->metadata->record_strip_nonxml;
473
            }
474
            if ( !$options->{original_digest} || $options->{original_digest} eq Koha::Util::Misc::digest($orig_rec) ) {
474
475
475
    _after_biblio_action_hooks({ action => 'modify', biblio_id => $biblionumber });
476
                if ( C4::Context->preference("CataloguingLog") ) {
477
                    logaction(
478
                        "CATALOGUING", "MODIFY", $biblionumber,
479
                        "biblio $decoding_error BEFORE=>" . $orig_rec->as_formatted
480
                    );
481
                }
476
482
477
    # update OAI-PMH sets
483
                # update the MARC record (that now contains biblio and items) with the new record data
478
    if(C4::Context->preference("OAI-PMH:AutoUpdateSets")) {
484
                ModBiblioMarc( $record, $biblionumber, $mod_biblio_marc_options );
479
        C4::OAI::Sets::UpdateOAISetsBiblio($biblionumber, $record);
480
    }
481
485
482
    Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue(
486
                # modify the other koha tables
483
        {
487
                _koha_modify_biblio( $dbh, $oldbiblio, $frameworkcode );
484
            biblio_ids => [ $biblionumber ]
488
                _koha_modify_biblioitem_nonmarc( $dbh, $oldbiblio );
489
490
                _after_biblio_action_hooks( { action => 'modify', biblio_id => $biblionumber } );
491
492
                # update OAI-PMH sets
493
                if ( C4::Context->preference("OAI-PMH:AutoUpdateSets") ) {
494
                    C4::OAI::Sets::UpdateOAISetsBiblio( $biblionumber, $record );
495
                }
496
497
                Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue->new->enqueue( { biblio_ids => [$biblionumber] } )
498
                    unless $options->{skip_holds_queue}
499
                    or !C4::Context->preference('RealTimeHoldsQueue');
500
501
                $result = 1;
502
503
            } else {
504
                $result = -1;
505
            }
485
        }
506
        }
486
    ) unless $options->{skip_holds_queue} or !C4::Context->preference('RealTimeHoldsQueue');
507
    );
487
508
488
    return 1;
509
    return $result;
489
}
510
}
490
511
491
=head2 _strip_item_fields
512
=head2 _strip_item_fields
(-)a/cataloguing/addbiblio.pl (-6 / +42 lines)
Lines 57-62 use Koha::Libraries; Link Here
57
use Koha::BiblioFrameworks;
57
use Koha::BiblioFrameworks;
58
use Koha::Patrons;
58
use Koha::Patrons;
59
use Koha::UI::Form::Builder::Biblio;
59
use Koha::UI::Form::Builder::Biblio;
60
use Koha::Util::Misc;
60
61
61
use MARC::File::USMARC;
62
use MARC::File::USMARC;
62
use MARC::File::XML;
63
use MARC::File::XML;
Lines 603-608 my ( Link Here
603
	$biblioitemnumber
604
	$biblioitemnumber
604
);
605
);
605
606
607
my $digest;
606
if ( $biblio && !$breedingid ) {
608
if ( $biblio && !$breedingid ) {
607
    eval { $record = $biblio->metadata->record };
609
    eval { $record = $biblio->metadata->record };
608
    if ($@) {
610
    if ($@) {
Lines 611-616 if ( $biblio && !$breedingid ) { Link Here
611
        $record = $biblio->metadata->record_strip_nonxml;
613
        $record = $biblio->metadata->record_strip_nonxml;
612
        $template->param( INVALID_METADATA => $exception );
614
        $template->param( INVALID_METADATA => $exception );
613
    }
615
    }
616
    $digest = Koha::Util::Misc::digest($record) if $record;
614
}
617
}
615
if ($breedingid) {
618
if ($breedingid) {
616
    ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ;
619
    ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ;
Lines 701-711 if ( $op eq "cud-addbiblio" ) { Link Here
701
        ( $duplicatebiblionumber, $duplicatetitle ) = FindDuplicate($record);
704
        ( $duplicatebiblionumber, $duplicatetitle ) = FindDuplicate($record);
702
    }
705
    }
703
    my $confirm_not_duplicate = $input->param('confirm_not_duplicate');
706
    my $confirm_not_duplicate = $input->param('confirm_not_duplicate');
707
    my $digest_orig = $input->param('digest');
704
    # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate)
708
    # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate)
705
    if ( !$duplicatebiblionumber or $confirm_not_duplicate ) {
709
    if ( !$duplicatebiblionumber or $confirm_not_duplicate ) {
706
        my $oldbibitemnum;
710
        my $oldbibitemnum;
707
        if ( $is_a_modif ) {
711
        if ( $is_a_modif ) {
708
            ModBiblio(
712
            my $mod_biblio_result = ModBiblio(
709
                $record,
713
                $record,
710
                $biblionumber,
714
                $biblionumber,
711
                $frameworkcode,
715
                $frameworkcode,
Lines 714-722 if ( $op eq "cud-addbiblio" ) { Link Here
714
                        source       => $z3950 ? 'z3950' : 'intranet',
718
                        source       => $z3950 ? 'z3950' : 'intranet',
715
                        categorycode => $logged_in_patron->categorycode,
719
                        categorycode => $logged_in_patron->categorycode,
716
                        userid       => $logged_in_patron->userid,
720
                        userid       => $logged_in_patron->userid,
717
                    }
721
                    },
722
                    original_digest => $digest_orig,
718
                }
723
                }
719
            );
724
            );
725
726
            # in case of unsuccessful record modification let's redirect to merge
727
            if ( $mod_biblio_result == -1 ) {
728
                ( $template, undef, undef ) = get_template_and_user(
729
                    {
730
                        template_name => "cataloguing/merge.tt",
731
                        query         => $input,
732
                        type          => "intranet",
733
                        flagsrequired => { editcatalogue => 'edit_catalogue' },
734
                    }
735
                );
736
737
                my ( $records, $framework_database ) = Koha::Util::Misc::prepare_mid_air_collision_merge({ biblionumber => $biblionumber, modified_record => $record });
738
739
                my ($biblionumbertag) = GetMarcFromKohaField('biblio.biblionumber');
740
741
                # Parameters
742
                $template->param(
743
                    ref_biblionumber  => $biblionumber,
744
                    records           => $records,
745
                    ref_record        => $records->[0],
746
                    framework         => $framework_database,
747
                    biblionumbertag   => $biblionumbertag,
748
                    mid_air_collision => 1,
749
                    digest            => Koha::Util::Misc::digest( $records->[0]->{record} ),
750
                );
751
752
                output_html_with_http_headers $input, $cookie, $template->output;
753
                exit;
754
            }
720
        }
755
        }
721
        else {
756
        else {
722
            ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
757
            ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
Lines 845-857 elsif ( $op eq "cud-delete" ) { Link Here
845
    build_tabs( $template, $record, $dbh, $encoding,$input );
880
    build_tabs( $template, $record, $dbh, $encoding,$input );
846
    $template->param(
881
    $template->param(
847
        biblionumber             => $biblionumber,
882
        biblionumber             => $biblionumber,
848
        biblionumbertagfield        => $biblionumbertagfield,
883
        biblionumbertagfield     => $biblionumbertagfield,
849
        biblionumbertagsubfield     => $biblionumbertagsubfield,
884
        biblionumbertagsubfield  => $biblionumbertagsubfield,
850
        biblioitemnumtagfield    => $biblioitemnumtagfield,
885
        biblioitemnumtagfield    => $biblioitemnumtagfield,
851
        biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
886
        biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
852
        biblioitemnumber         => $biblioitemnumber,
887
        biblioitemnumber         => $biblioitemnumber,
853
	hostbiblionumber	=> $hostbiblionumber,
888
        hostbiblionumber         => $hostbiblionumber,
854
	hostitemnumber		=> $hostitemnumber
889
        hostitemnumber           => $hostitemnumber,
890
        digest                   => $digest,
855
    );
891
    );
856
}
892
}
857
893
(-)a/cataloguing/merge.pl (-3 / +47 lines)
Lines 32-45 use C4::Biblio qw( Link Here
32
    ModBiblio
32
    ModBiblio
33
    TransformHtmlToMarc
33
    TransformHtmlToMarc
34
);
34
);
35
use C4::Serials qw( CountSubscriptionFromBiblionumber );
35
use C4::Serials     qw( CountSubscriptionFromBiblionumber );
36
use C4::Reserves qw( MergeHolds );
36
use C4::Reserves    qw( MergeHolds );
37
use C4::Acquisition qw( ModOrder GetOrdersByBiblionumber );
37
use C4::Acquisition qw( ModOrder GetOrdersByBiblionumber );
38
use C4::Search      qw( enabled_staff_search_views );
38
39
39
use Koha::BiblioFrameworks;
40
use Koha::BiblioFrameworks;
40
use Koha::Biblios;
41
use Koha::Biblios;
41
use Koha::Items;
42
use Koha::Items;
42
use Koha::MetadataRecord;
43
use Koha::MetadataRecord;
44
use Koha::Util::Misc;
43
45
44
my $input = CGI->new;
46
my $input = CGI->new;
45
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
47
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
Lines 88-95 if ($op eq 'cud-merge') { Link Here
88
    #Take new framework code
90
    #Take new framework code
89
    my $frameworkcode = $input->param('frameworkcode');
91
    my $frameworkcode = $input->param('frameworkcode');
90
92
93
    my $digest = $input->param('digest');
94
91
    # Modifying the reference record
95
    # Modifying the reference record
92
    ModBiblio($record, $ref_biblionumber, $frameworkcode);
96
    my $mod_biblio_result = ModBiblio( $record, $ref_biblionumber, $frameworkcode, { original_digest => $digest } );
97
98
    # in case of unsuccessful record modification let's redirect to merge again
99
    if ( $mod_biblio_result == -1 ) {
100
        my ( $records, $framework_database ) = Koha::Util::Misc::prepare_mid_air_collision_merge(
101
            { biblionumber => $ref_biblionumber, modified_record => $record } );
102
103
        my ($biblionumbertag) = GetMarcFromKohaField('biblio.biblionumber');
104
105
        # Parameters
106
        $template->param(
107
            ref_biblionumber  => $ref_biblionumber,
108
            records           => $records,
109
            ref_record        => $records->[0],
110
            framework         => $framework_database,
111
            biblionumbertag   => $biblionumbertag,
112
            mid_air_collision => 1,
113
            digest            => Koha::Util::Misc::digest( $records->[0]->{record} ),
114
        );
115
116
        output_html_with_http_headers $input, $cookie,
117
            $template->output;
118
        exit;
119
    }
120
121
    # This is a merge after a mid-air collision, not a real merge
122
    if ( $biblionumbers[0] == -1 ) {
123
        my $defaultview = C4::Context->preference('IntranetBiblioDefaultView');
124
        my $views       = {C4::Search::enabled_staff_search_views};
125
        if ( $defaultview eq 'isbd' && $views->{can_view_ISBD} ) {
126
            print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$ref_biblionumber");
127
        } elsif ( $defaultview eq 'marc' && $views->{can_view_MARC} ) {
128
            print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$ref_biblionumber");
129
        } elsif ( $defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC} ) {
130
            print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$ref_biblionumber");
131
        } else {
132
            print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$ref_biblionumber");
133
        }
134
        exit;
135
    }
93
136
94
    my $report_header = {};
137
    my $report_header = {};
95
    foreach my $biblionumber ($ref_biblionumber, @biblionumbers) {
138
    foreach my $biblionumber ($ref_biblionumber, @biblionumbers) {
Lines 174-179 if ($op eq 'cud-merge') { Link Here
174
            if ($ref_biblionumber and $ref_biblionumber == $biblionumber) {
217
            if ($ref_biblionumber and $ref_biblionumber == $biblionumber) {
175
                $record->{reference} = 1;
218
                $record->{reference} = 1;
176
                $template->param(ref_record => $record);
219
                $template->param(ref_record => $record);
220
                $template->param(digest => Koha::Util::Misc::digest($marcrecord));
177
                unshift @records, $record;
221
                unshift @records, $record;
178
            } else {
222
            } else {
179
                push @records, $record;
223
                push @records, $record;
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/cateditor-ui.inc (+28 lines)
Lines 393-398 require( [ 'koha-backend', 'search', 'macros', 'marc-editor', 'marc-record', 'pr Link Here
393
            return;
393
            return;
394
        }
394
        }
395
395
396
        if ( state.digest ) {
397
            record.addField( new MARC.Field( 'DGS', ' ', ' ', [ [ 'a', state.digest ] ] ) );
398
        }
396
        backends[ parts[0] ].save( parts[1], record, function(data) {
399
        backends[ parts[0] ].save( parts[1], record, function(data) {
397
            state.saving = false;
400
            state.saving = false;
398
401
Lines 400-405 require( [ 'koha-backend', 'search', 'macros', 'marc-editor', 'marc-record', 'pr Link Here
400
                var record = new MARC.Record();
403
                var record = new MARC.Record();
401
                record.loadMARCXML(data.newRecord);
404
                record.loadMARCXML(data.newRecord);
402
                record.frameworkcode = data.newRecord.frameworkcode;
405
                record.frameworkcode = data.newRecord.frameworkcode;
406
                if ( record.hasField("DGS") ) {
407
                    state.digest = record.field("DGS").subfield("a");
408
                    record.removeField("DGS");
409
                }
403
                editor.displayRecord( record );
410
                editor.displayRecord( record );
404
            }
411
            }
405
412
Lines 423-428 require( [ 'koha-backend', 'search', 'macros', 'marc-editor', 'marc-record', 'pr Link Here
423
            if ( !record.error ) {
430
            if ( !record.error ) {
424
                var remove_control_num = [% IF Koha.Preference('autoControlNumber') == 'OFF' %] false [% ELSE %] true [% END %];
431
                var remove_control_num = [% IF Koha.Preference('autoControlNumber') == 'OFF' %] false [% ELSE %] true [% END %];
425
                if( remove_control_num ){ record.removeField("001"); }
432
                if( remove_control_num ){ record.removeField("001"); }
433
                if ( record.hasField("DGS") ) {
434
                    state.digest = record.field("DGS").subfield("a");
435
                    record.removeField("DGS");
436
                }
426
                editor.displayRecord( record );
437
                editor.displayRecord( record );
427
                editor.focus();
438
                editor.focus();
428
            }
439
            }
Lines 1108-1113 require( [ 'koha-backend', 'search', 'macros', 'marc-editor', 'marc-record', 'pr Link Here
1108
                    humanMsg.displayAlert( _("Incorrect syntax, cannot save"), { className: 'humanError' } );
1119
                    humanMsg.displayAlert( _("Incorrect syntax, cannot save"), { className: 'humanError' } );
1109
                } else if ( result.error == 'invalid' ) {
1120
                } else if ( result.error == 'invalid' ) {
1110
                    humanMsg.displayAlert( _("Record structure invalid, cannot save"), { className: 'humanError' } );
1121
                    humanMsg.displayAlert( _("Record structure invalid, cannot save"), { className: 'humanError' } );
1122
                } else if ( result.error == 'mid-air-collision' ) {
1123
                    humanMsg.displayAlert( _("Record edited elsewhere, cannot save. You can merge your modifications with the current database version of the record"), { className: 'humanError' } );
1124
                    const xhr = new XMLHttpRequest;
1125
                    xhr.onreadystatechange=function(){
1126
                        if (xhr.readyState === 4 && xhr.status === 200) {
1127
                            const merge_window = window.open();
1128
                            merge_window.document.write(xhr.responseText);
1129
                            merge_window.document.close();
1130
                        }
1131
                    }
1132
                    const merge_url = "/cgi-bin/koha/svc/mid_air_collision/"+result.newId[1];
1133
                    xhr.open("POST", merge_url, true);
1134
                    const csrf_token = $('meta[name="csrf-token"]').attr("content");
1135
                    xhr.setRequestHeader("Content-Type", "text/xml");
1136
                    xhr.setRequestHeader("CSRF-TOKEN", csrf_token);
1137
                    const xml_editor_record = `<?xml version="1.0" encoding="UTF-8"?>\n${result.newRecord.outerHTML}`;
1138
                    xhr.send(xml_editor_record);
1111
                } else if ( result.error ) {
1139
                } else if ( result.error ) {
1112
                    humanMsg.displayAlert( _("Something went wrong, cannot save"), { className: 'humanError' } );
1140
                    humanMsg.displayAlert( _("Something went wrong, cannot save"), { className: 'humanError' } );
1113
                } else if ( !result.error ) {
1141
                } else if ( !result.error ) {
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/merge-record.inc (-1 / +5 lines)
Lines 49-55 Link Here
49
        [% WRAPPER tabs_nav %]
49
        [% WRAPPER tabs_nav %]
50
            [% FOREACH record IN sourcerecords %]
50
            [% FOREACH record IN sourcerecords %]
51
                [% WRAPPER tab_item tabname= "tabrecord${record.recordid}" %]
51
                [% WRAPPER tab_item tabname= "tabrecord${record.recordid}" %]
52
                    [% record.recordid | html %]
52
                    [% IF record.recordid == -1 %]
53
                        your version
54
                    [% ELSE %]
55
                        [% record.recordid | html %]
56
                    [% END %]
53
                    [% IF record.reference %]<span>(ref)</span>[% END %]
57
                    [% IF record.reference %]<span>(ref)</span>[% END %]
54
                    <span>([% record.frameworktext | html %])</span>
58
                    <span>([% record.frameworktext | html %])</span>
55
                [% END %]
59
                [% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (+1 lines)
Lines 920-925 $(document).ready(function(){ Link Here
920
                        <input type="hidden" value="" id="current_tab" name="current_tab" />
920
                        <input type="hidden" value="" id="current_tab" name="current_tab" />
921
                        <input type="hidden" name="original_op" value="[% op | html %]" />
921
                        <input type="hidden" name="original_op" value="[% op | html %]" />
922
                        <input type="hidden" value="0" id="confirm_not_duplicate" name="confirm_not_duplicate" />
922
                        <input type="hidden" value="0" id="confirm_not_duplicate" name="confirm_not_duplicate" />
923
                        <input type="hidden" value="[% digest | html %]" id="digest" name="digest" />
923
                [% END %]
924
                [% END %]
924
925
925
                <div id="toolbar" class="btn-toolbar">
926
                <div id="toolbar" class="btn-toolbar">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/merge.tt (+13 lines)
Lines 40-45 div#result { margin-top: 1em; } Link Here
40
            [% INCLUDE 'messages.inc' %]
40
            [% INCLUDE 'messages.inc' %]
41
41
42
<h1>Merging records</h1>
42
<h1>Merging records</h1>
43
    [% IF mid_air_collision %]
44
        <div class="dialog alert">
45
            <h3>Record edited elsewhere</h3>
46
            You can try to merge your version with the current database version of the record or cancel and abandon changes.
47
        </div>
48
    [% END %]
43
[% IF ( result ) %]
49
[% IF ( result ) %]
44
    [% IF ( errors.size ) %]
50
    [% IF ( errors.size ) %]
45
       [% FOREACH error IN errors %]
51
       [% FOREACH error IN errors %]
Lines 179-184 div#result { margin-top: 1em; } Link Here
179
</div> <!-- .col-sm-6 -->
185
</div> <!-- .col-sm-6 -->
180
186
181
<input type="hidden" name="ref_biblionumber" value="[% ref_biblionumber | html %]" />
187
<input type="hidden" name="ref_biblionumber" value="[% ref_biblionumber | html %]" />
188
<input type="hidden" id="digest" name="digest" value="[% digest | html %]" />
182
[% FOREACH record IN records %]
189
[% FOREACH record IN records %]
183
    <input type="hidden" name="biblionumber" value="[% record.recordid | html %]" />
190
    <input type="hidden" name="biblionumber" value="[% record.recordid | html %]" />
184
[% END %]
191
[% END %]
Lines 187-195 div#result { margin-top: 1em; } Link Here
187
<fieldset class="action">
194
<fieldset class="action">
188
    <input type="hidden" name="op" value="cud-merge" />
195
    <input type="hidden" name="op" value="cud-merge" />
189
    <input type="submit" name="merge" class="btn btn-primary" value="Merge" />
196
    <input type="submit" name="merge" class="btn btn-primary" value="Merge" />
197
    [% IF ! mid_air_collision %]
190
    <label for="report_fields">Fields to display in report:</label>
198
    <label for="report_fields">Fields to display in report:</label>
191
    <input type="text" name="report_fields" id="report_fields" value="[% MergeReportFields | html %]" />
199
    <input type="text" name="report_fields" id="report_fields" value="[% MergeReportFields | html %]" />
192
    <span class="hint">(Example: "001,245ab,600")</span>
200
    <span class="hint">(Example: "001,245ab,600")</span>
201
    [% ELSE %]
202
        <div class="btn-group">
203
            <a href="[% PROCESS biblio_a_href biblionumber => ref_biblionumber %]" class="btn btn-link" id="cancel">Cancel</a>
204
        </div>
205
    [% END %]
193
</fieldset>
206
</fieldset>
194
</form>
207
</form>
195
[% END %]
208
[% END %]
(-)a/svc/bib (-10 / +33 lines)
Lines 27-32 use C4::Biblio qw( GetFrameworkCode ); Link Here
27
use C4::Items;
27
use C4::Items;
28
use XML::Simple;
28
use XML::Simple;
29
use Koha::Biblios;
29
use Koha::Biblios;
30
use Koha::Util::Misc;
30
31
31
my $query = CGI->new;
32
my $query = CGI->new;
32
binmode STDOUT, ':encoding(UTF-8)';
33
binmode STDOUT, ':encoding(UTF-8)';
Lines 79-84 sub fetch_bib { Link Here
79
            $invalid_metadata = 1;
80
            $invalid_metadata = 1;
80
        }
81
        }
81
        print $query->header( -type => 'text/xml', -charset => 'utf-8', -invalid_metadata => $invalid_metadata );
82
        print $query->header( -type => 'text/xml', -charset => 'utf-8', -invalid_metadata => $invalid_metadata );
83
        my $digest = Koha::Util::Misc::digest($record);
84
        $record->append_fields( MARC::Field->new( 'DGS', ' ', ' ', a => $digest ) );
82
        print $record->as_xml_record();
85
        print $record->as_xml_record();
83
    } else {
86
    } else {
84
        print $query->header( -type => 'text/xml', -status => '404 Not Found' );
87
        print $query->header( -type => 'text/xml', -status => '404 Not Found' );
Lines 124-139 sub update_bib { Link Here
124
            }
127
            }
125
        }
128
        }
126
129
127
        C4::Biblio::ModBiblio( $record, $biblionumber, $frameworkcode );
130
        my $mod_biblio_options;
128
        my $biblio = Koha::Biblios->find( $biblionumber );
131
        if ( $record->subfield( 'DGS', 'a' ) ) {
129
        my $new_record = $biblio->metadata->record({ embed_items => scalar $query->url_param('items') });
132
            $mod_biblio_options->{original_digest} = $record->subfield( 'DGS', 'a' );
130
133
            $record->delete_fields( $record->field('DGS') );
131
        $result->{'status'} = "ok";
134
        }
132
        $result->{'biblionumber'} = $biblionumber;
135
        my $res = C4::Biblio::ModBiblio( $record, $biblionumber, $frameworkcode, $mod_biblio_options );
133
        my $xml = $new_record->as_xml_record();
136
        if ( $res == 1 ) {
134
        $xml =~ s/<\?xml.*?\?>//i;
137
            my $biblio     = Koha::Biblios->find($biblionumber);
135
        $result->{'marcxml'} =  $xml;
138
            my $new_record = $biblio->metadata->record( { embed_items => scalar $query->url_param('items') } );
136
        $do_not_escape = 1;
139
140
            $result->{'status'}       = "ok";
141
            $result->{'biblionumber'} = $biblionumber;
142
            my $digest = Koha::Util::Misc::digest($new_record);
143
            $new_record->append_fields( MARC::Field->new( 'DGS', ' ', ' ', a => $digest ) );
144
            my $xml = $new_record->as_xml_record();
145
            $xml =~ s/<\?xml.*?\?>//i;
146
            $result->{'marcxml'} = $xml;
147
            $do_not_escape = 1;
148
        } elsif ( $res == -1 ) {
149
            $result->{'status'}       = "failed";
150
            $result->{'error'}        = "mid-air-collision";
151
            $result->{'biblionumber'} = $biblionumber;
152
            my $xml = $record->as_xml_record();
153
            $xml =~ s/<\?xml.*?\?>//i;
154
            $result->{'marcxml'} = $xml;
155
            $do_not_escape = 1;
156
        } else {
157
            $result->{'status'} = "failed";
158
            $result->{'error'}  = "unexpected modification status";
159
        }
137
    }
160
    }
138
   
161
   
139
    print XMLout($result, NoAttr => 1, RootName => 'response', XMLDecl => 1, NoEscape => $do_not_escape); 
162
    print XMLout($result, NoAttr => 1, RootName => 'response', XMLDecl => 1, NoEscape => $do_not_escape); 
(-)a/svc/mid_air_collision (-1 / +68 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
use Modern::Perl;
3
use CGI      qw ( -utf8 );
4
use C4::Auth qw( get_template_and_user check_api_auth );
5
use C4::Context;
6
use C4::Output qw( output_html_with_http_headers );
7
use C4::Biblio qw( GetFrameworkCode GetMarcStructure GetMarcFromKohaField );
8
9
use Koha::Biblios;
10
use Koha::MetadataRecord;
11
use Koha::Util::Misc;
12
13
my $query = CGI->new;
14
binmode STDOUT, ':encoding(UTF-8)';
15
16
my ( $status, $cookie, $sessionID ) = check_api_auth( $query, { editcatalogue => 'edit_catalogue' } );
17
unless ( $status eq "ok" ) {
18
    print $query->header( -type => 'text/xml', -status => '403 Forbidden' );
19
    print XMLout( { auth_status => $status }, NoAttr => 1, RootName => 'response', XMLDecl => 1 );
20
    exit 0;
21
}
22
23
# do initial validation
24
my $path_info = $query->path_info();
25
26
my $biblionumber = undef;
27
if ( $path_info =~ m!^/(\d+)$! ) {
28
    $biblionumber = $1;
29
} else {
30
    print $query->header( -type => 'text/xml', -status => '400 Bad Request' );
31
}
32
33
my $frameworkcode   = $query->url_param('frameworkcode') // GetFrameworkCode($biblionumber);
34
my $inxml           = $query->param('POSTDATA');
35
my $modified_record = eval {
36
    MARC::Record::new_from_xml(
37
        $inxml, "UTF-8",
38
        C4::Context->preference('marcflavour')
39
    );
40
};
41
42
my ( $template, undef, undef ) = get_template_and_user(
43
    {
44
        template_name => "cataloguing/merge.tt",
45
        query         => $query,
46
        type          => "intranet",
47
        flagsrequired => { editcatalogue => 'edit_catalogue' },
48
    }
49
);
50
51
my ( $records, $framework_database ) =
52
    Koha::Util::Misc::prepare_mid_air_collision_merge(
53
    { biblionumber => $biblionumber, modified_record => $modified_record } );
54
55
my ($biblionumbertag) = GetMarcFromKohaField('biblio.biblionumber');
56
57
# Parameters
58
$template->param(
59
    ref_biblionumber  => $biblionumber,
60
    records           => $records,
61
    ref_record        => $records->[0],
62
    framework         => $framework_database,
63
    biblionumbertag   => $biblionumbertag,
64
    mid_air_collision => 1,
65
    digest            => Koha::Util::Misc::digest( $records->[0]->{record} ),
66
);
67
68
output_html_with_http_headers $query, $cookie, $template->output;

Return to bug 31109