From 04c713f956f0533af11724fa160076906023961d Mon Sep 17 00:00:00 2001 From: Hammat Wele Date: Tue, 6 Jun 2023 17:35:58 +0000 Subject: [PATCH] Bug 29522 - Bib record not correctly updated when merging identical authorities with LinkerModule set to First Match To test: Set system preferences AutoCreateAuthorities = don't generate RequireChoosingExistingAuthority = don't require AutoLinkBiblios = Do CatalogModuleRelink = Do LinkerKeepStale = Don't LinkerModule = first match LinkerRelink = Do 1. Create an authority record 1.1. Go to Authorities 1.2. Click on "New authority" and choose an authority type (I chose Corporate name)* 1.3. Fill in the mandatory fields (000, 003, 005, 008, 040) 1.4. In tab 1, click on the label of the main heading (110 for Corporate name) 1.5. Fill in subfield 1.6. Copy content of subfield 1.7. Click on "Save" 1.8. Note the authority record number 2. Duplicate the authority record 2.1. Click on "Edit" and choose "Edit as new (duplicate)" 2.2. Click on "Save" 2.3. Click on "No: Save as new authority" 2.4. Note the authority record number (should be the number from step 1.8 +1) 3. Link one of the authority records to a bibliographic record 3.1 In another tab, do a catalog search 3.2. Click on "Edit record" under one of the search results 3.3. Go to the relevant tab (for corporate name, I used field 710 in tab 7) 3.3.a. If there are no empty fields for that tag, click the "Repeat this tag" button (two rectangles) 3.4. Paste the text previously copied in subfield 3.5. Click on "Link authorities automatically" at the top of the page 3.6. Note the authority record number in subfield --> The linked authority record should be the first authority record (step 1.8) 3.7. Click on "Save" 4. Merge the two authority records, keep the one that is not linked to the bibliographic record 4.1. Go back to the tab with the authorities 4.1. Go to Authorities 4.2. Search for the aurhorities previous created 4.2. Click on "Actions" and choose "Merge" for both records 4.3. Select the record number that is NOT linked to the bibliographic record 4.4. Click on "Next" 4.5. Click on "Merge" 5. Check the bibliographic record 5.1. Go back to the tab with the bibliographic record and refresh the page (Ctrl+F5) 5.2. Hover the mouse cursor over the name or term, without clicking 5.3. Note the record number that appears at the bottom of the screen --> The record number was not changed 6. Apply the patch 6.1. Run prove t/AuthoritiesMarc_MARC21.t 6.2. Repeat Previous steps 1, 2, 3, 4, 5 --> The record number is change --- C4/AuthoritiesMarc.pm | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm index d21e7c059c..31d4653f16 100644 --- a/C4/AuthoritiesMarc.pm +++ b/C4/AuthoritiesMarc.pm @@ -67,6 +67,7 @@ BEGIN { merge FindDuplicateAuthority + isAuthorityDuplicated GuessAuthTypeCode GuessAuthId @@ -1162,6 +1163,35 @@ sub CompareFieldWithAuthority { return 0; } +=head2 isAuthorityDuplicated + + $match = &CompareFieldWithAuthority({ field => $field, authid => $authid }) + +Takes a MARC::Field from a bibliographic record and an authid, and returns true if they match. + +=cut + +sub isAuthorityDuplicated { + my ($record,$record2,$authtypecode)=@_; + return 0 unless ($record && $record2); + + my $auth_tag_to_report = Koha::Authority::Types->find($authtypecode)->auth_tag_to_report; + my $filtervalues=qr([\001-\040\Q!'"`#$%&*+,-./:;<=>?@(){[}_|~\E\]]); + my $duplicate = 1; + if ($record->field($auth_tag_to_report)) { + foreach ($record->field($auth_tag_to_report)->subfields()) { + $_->[1]=~s/$filtervalues/ /g; + if ($_->[0]=~/[A-z]/ ){ + if($record2->field($auth_tag_to_report)->subfield($_->[0]) ne $_->[1]){ + $duplicate = 0; + last; + } + } + } + } +return $duplicate; +} + =head2 BuildAuthHierarchies $text= &BuildAuthHierarchies( $authid, $force) @@ -1569,7 +1599,14 @@ sub merge { } } next if !$update; - ModBiblio($marcrecord, $biblionumber, GetFrameworkCode($biblionumber)); + my $option = {}; + #Check if the record is duplicate + my $authtypecode = ""; + $authtypecode = $authtypeto->authtypecode if($authtypeto); + if(isAuthorityDuplicated($MARCfrom, $MARCto,$authtypecode) ){ + $option = { disable_autolink => 1 }; + } + ModBiblio($marcrecord, $biblionumber, GetFrameworkCode($biblionumber),$option); $counteditedbiblio++; } return $counteditedbiblio; -- 2.34.1