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 qw( digest );
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 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 / +76 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 qw( digest );
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 = 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
729
                ( $template, undef, undef ) = get_template_and_user(
730
                    {
731
                        template_name => "cataloguing/merge.tt",
732
                        query         => $input,
733
                        type          => "intranet",
734
                        flagsrequired => { editcatalogue => 'edit_catalogue' },
735
                    }
736
                );
737
738
                my $framework_database = GetFrameworkCode($biblionumber);
739
740
                # Getting MARC Structure
741
                my $tagslib = GetMarcStructure( 1, $framework_database );
742
743
                my $marcflavour = lc( C4::Context->preference('marcflavour') );
744
745
                # Creating a loop for display
746
                my @records;
747
748
                for my $i ( 0 .. 1 ) {
749
                    my $biblio;
750
                    my $marcrecord;
751
                    my $frmwkcode;
752
                    my $template_record;
753
                    if ( $i == 0 ) {    #database version
754
                        $biblio                       = Koha::Biblios->find($biblionumber);
755
                        $marcrecord                   = $biblio->record;
756
                        $frmwkcode                    = $framework_database;
757
                        $template_record->{reference} = 1;
758
                        $template->param( ref_record => $template_record );
759
                        $template_record->{recordid} = $biblionumber;
760
                    } else {            #modified version
761
                        $marcrecord                  = $record;
762
                        $frmwkcode                   = $frameworkcode;
763
                        $template_record->{recordid} = -1;  # NOTE for the modified version
764
                    }
765
766
                    my $recordObj = Koha::MetadataRecord->new( { 'record' => $marcrecord, schema => $marcflavour } );
767
                    $template_record->{record}        = $marcrecord;
768
                    $template_record->{frameworkcode} = $frmwkcode;
769
                    $template_record->{display}       = $recordObj->createMergeHash($tagslib);
770
                    push @records, $template_record;
771
                }
772
773
                my ($biblionumbertag) = GetMarcFromKohaField('biblio.biblionumber');
774
775
                # Parameters
776
                $template->param(
777
                    ref_biblionumber  => $biblionumber,
778
                    records           => \@records,
779
                    ref_record        => $records[0],
780
                    framework         => $framework_database,
781
                    biblionumbertag   => $biblionumbertag,
782
                    mid_air_collision => 1,
783
                    digest            => digest( $records[0]->{record} ),
784
                );
785
786
                output_html_with_http_headers $input, $cookie, $template->output;
787
                exit;
788
            }
720
        }
789
        }
721
        else {
790
        else {
722
            ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
791
            ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
Lines 845-857 elsif ( $op eq "cud-delete" ) { Link Here
845
    build_tabs( $template, $record, $dbh, $encoding,$input );
914
    build_tabs( $template, $record, $dbh, $encoding,$input );
846
    $template->param(
915
    $template->param(
847
        biblionumber             => $biblionumber,
916
        biblionumber             => $biblionumber,
848
        biblionumbertagfield        => $biblionumbertagfield,
917
        biblionumbertagfield     => $biblionumbertagfield,
849
        biblionumbertagsubfield     => $biblionumbertagsubfield,
918
        biblionumbertagsubfield  => $biblionumbertagsubfield,
850
        biblioitemnumtagfield    => $biblioitemnumtagfield,
919
        biblioitemnumtagfield    => $biblioitemnumtagfield,
851
        biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
920
        biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
852
        biblioitemnumber         => $biblioitemnumber,
921
        biblioitemnumber         => $biblioitemnumber,
853
	hostbiblionumber	=> $hostbiblionumber,
922
        hostbiblionumber         => $hostbiblionumber,
854
	hostitemnumber		=> $hostitemnumber
923
        hostitemnumber           => $hostitemnumber,
924
        digest                   => $digest,
855
    );
925
    );
856
}
926
}
857
927
(-)a/cataloguing/merge.pl (-3 / +79 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 qw( digest );
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 $framework_database = GetFrameworkCode($ref_biblionumber);
101
102
        # Getting MARC Structure
103
        my $tagslib = GetMarcStructure( 1, $framework_database );
104
105
        my $marcflavour = lc( C4::Context->preference('marcflavour') );
106
107
        # Creating a loop for display
108
        my @records;
109
110
        for my $i ( 0 .. 1 ) {
111
            my $biblio;
112
            my $marcrecord;
113
            my $frmwkcode;
114
            my $template_record;
115
            if ( $i == 0 ) {    #database version
116
                $biblio                       = Koha::Biblios->find($ref_biblionumber);
117
                $marcrecord                   = $biblio->record;
118
                $frmwkcode                    = $framework_database;
119
                $template_record->{reference} = 1;
120
                $template->param( ref_record => $template_record );
121
                $template_record->{recordid} = $ref_biblionumber;
122
            } else {            #modified version
123
                $marcrecord                  = $record;
124
                $frmwkcode                   = $frameworkcode;
125
                $template_record->{recordid} = -1;               # NOTE for the modified version
126
            }
127
128
            my $recordObj = Koha::MetadataRecord->new( { 'record' => $marcrecord, schema => $marcflavour } );
129
            $template_record->{record}        = $marcrecord;
130
            $template_record->{frameworkcode} = $frmwkcode;
131
            $template_record->{display}       = $recordObj->createMergeHash($tagslib);
132
            push @records, $template_record;
133
        }
134
135
        my ($biblionumbertag) = GetMarcFromKohaField('biblio.biblionumber');
136
137
        # Parameters
138
        $template->param(
139
            ref_biblionumber  => $ref_biblionumber,
140
            records           => \@records,
141
            ref_record        => $records[0],
142
            framework         => $framework_database,
143
            biblionumbertag   => $biblionumbertag,
144
            mid_air_collision => 1,
145
            digest            => digest( $records[0]->{record} ),
146
        );
147
148
        output_html_with_http_headers $input, $cookie,
149
            $template->output;
150
        exit;
151
    }
152
153
    # This is a merge after a mid-air collision, not a real merge
154
    if ( $biblionumbers[0] == -1 ) {
155
        my $defaultview = C4::Context->preference('IntranetBiblioDefaultView');
156
        my $views       = {C4::Search::enabled_staff_search_views};
157
        if ( $defaultview eq 'isbd' && $views->{can_view_ISBD} ) {
158
            print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$ref_biblionumber");
159
        } elsif ( $defaultview eq 'marc' && $views->{can_view_MARC} ) {
160
            print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$ref_biblionumber");
161
        } elsif ( $defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC} ) {
162
            print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$ref_biblionumber");
163
        } else {
164
            print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$ref_biblionumber");
165
        }
166
        exit;
167
    }
93
168
94
    my $report_header = {};
169
    my $report_header = {};
95
    foreach my $biblionumber ($ref_biblionumber, @biblionumbers) {
170
    foreach my $biblionumber ($ref_biblionumber, @biblionumbers) {
Lines 174-179 if ($op eq 'cud-merge') { Link Here
174
            if ($ref_biblionumber and $ref_biblionumber == $biblionumber) {
249
            if ($ref_biblionumber and $ref_biblionumber == $biblionumber) {
175
                $record->{reference} = 1;
250
                $record->{reference} = 1;
176
                $template->param(ref_record => $record);
251
                $template->param(ref_record => $record);
252
                $template->param(digest => digest($marcrecord));
177
                unshift @records, $record;
253
                unshift @records, $record;
178
            } else {
254
            } else {
179
                push @records, $record;
255
                push @records, $record;
(-)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
                [% END %]
58
                [% END %]
55
            [% END %]
59
            [% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (+2 lines)
Lines 905-910 $(document).ready(function(){ Link Here
905
                            </form>
905
                            </form>
906
                        </div> <!-- /.dialog.alert -->
906
                        </div> <!-- /.dialog.alert -->
907
                    [% END # /IF duplicatebiblionumber %]
907
                    [% END # /IF duplicatebiblionumber %]
908
908
                [% END # /UNLESS number %]
909
                [% END # /UNLESS number %]
909
910
910
                [% IF ( done ) %]
911
                [% IF ( done ) %]
Lines 920-925 $(document).ready(function(){ Link Here
920
                        <input type="hidden" value="" id="current_tab" name="current_tab" />
921
                        <input type="hidden" value="" id="current_tab" name="current_tab" />
921
                        <input type="hidden" name="original_op" value="[% op | html %]" />
922
                        <input type="hidden" name="original_op" value="[% op | html %]" />
922
                        <input type="hidden" value="0" id="confirm_not_duplicate" name="confirm_not_duplicate" />
923
                        <input type="hidden" value="0" id="confirm_not_duplicate" name="confirm_not_duplicate" />
924
                        <input type="hidden" value="[% digest | html %]" id="digest" name="digest" />
923
                [% END %]
925
                [% END %]
924
926
925
                <div id="toolbar" class="btn-toolbar">
927
                <div id="toolbar" class="btn-toolbar">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/merge.tt (-1 / +14 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 version of the record or cancel and abandon changes.
47
        </div>
48
    [% END %]
49
43
[% IF ( result ) %]
50
[% IF ( result ) %]
44
    [% IF ( errors.size ) %]
51
    [% IF ( errors.size ) %]
45
       [% FOREACH error IN errors %]
52
       [% FOREACH error IN errors %]
Lines 179-184 div#result { margin-top: 1em; } Link Here
179
</div> <!-- .col-sm-6 -->
186
</div> <!-- .col-sm-6 -->
180
187
181
<input type="hidden" name="ref_biblionumber" value="[% ref_biblionumber | html %]" />
188
<input type="hidden" name="ref_biblionumber" value="[% ref_biblionumber | html %]" />
189
<input type="hidden" id="digest" name="digest" value="[% digest | html %]" />
182
[% FOREACH record IN records %]
190
[% FOREACH record IN records %]
183
    <input type="hidden" name="biblionumber" value="[% record.recordid | html %]" />
191
    <input type="hidden" name="biblionumber" value="[% record.recordid | html %]" />
184
[% END %]
192
[% END %]
Lines 187-195 div#result { margin-top: 1em; } Link Here
187
<fieldset class="action">
195
<fieldset class="action">
188
    <input type="hidden" name="op" value="cud-merge" />
196
    <input type="hidden" name="op" value="cud-merge" />
189
    <input type="submit" name="merge" class="btn btn-primary" value="Merge" />
197
    <input type="submit" name="merge" class="btn btn-primary" value="Merge" />
198
    [% IF ! mid_air_collision %]
190
    <label for="report_fields">Fields to display in report:</label>
199
    <label for="report_fields">Fields to display in report:</label>
191
    <input type="text" name="report_fields" id="report_fields" value="[% MergeReportFields | html %]" />
200
    <input type="text" name="report_fields" id="report_fields" value="[% MergeReportFields | html %]" />
192
    <span class="hint">(Example: "001,245ab,600")</span>
201
    <span class="hint">(Example: "001,245ab,600")</span>
202
    [% ELSE %]
203
        <div class="btn-group">
204
            <a href="[% PROCESS biblio_a_href biblionumber => ref_biblionumber %]" class="btn btn-link" id="cancel">Cancel</a>
205
        </div>
206
    [% END %]
193
</fieldset>
207
</fieldset>
194
</form>
208
</form>
195
[% END %]
209
[% END %]
196
- 

Return to bug 31109