Bug 30195: Search by ISBN if it is provided in suggestion
authorThomas Klausner <domm@plix.at>
Tue, 15 Mar 2022 15:00:48 +0000 (16:00 +0100)
committerTomas Cohen Arazi <tomascohen@theke.io>
Sat, 25 Jun 2022 14:20:37 +0000 (11:20 -0300)
When a patron enters an ISBN/ISSN when suggesting a new purchase, the
ISBN is used to find duplicates. Title/Author are ignored (as patrons
might misspell them, and the ISBN provides a better way to find
duplicates)

Test Plan:
* in the OPAC, go to /cgi-bin/koha/opac-suggestions.pl
* Click "new purchase suggestion"
* Enter any title
* Enter an ISBN that exists in your library
* Click "Submit your suggestion"
-> A new purchase suggestion has been submitted

* Apply the patch!

* Again start a new purchase suggestion, enter any title and the
  duplicate ISBN, and Submit
* You should see the note "A similar document already exists: ..."

Please note that the title should not be required when entering an ISBN,
but as the list of required fields is managed via OPACSuggestionMandatoryFields
I fear that it's rather complicated to make title an optional required
field if isbn is provided.

I also added a simple non-DB test case to t/db_dependent/Suggestions.t
(in a subtest at the end), but could not actually run it as I haven't
gotten around to set up / try a testing Koha dev env...

Sponsored-by: Steiermärkische Landesbibliothek
Signed-off-by: Paul Derscheid <paul.derscheid@lmscloud.de>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
C4/Suggestions.pm
suggestion/suggestion.pl
t/db_dependent/Suggestions.t

index 649fb96..2758ec7 100644 (file)
@@ -615,19 +615,29 @@ sub MarcRecordFromNewSuggestion {
     my ($suggestion) = @_;
     my $record = MARC::Record->new();
 
-    my ($title_tag, $title_subfield) = GetMarcFromKohaField('biblio.title', '');
-    $record->append_fields(
-        MARC::Field->new($title_tag, ' ', ' ', $title_subfield => $suggestion->{title})
-    );
-
-    my ($author_tag, $author_subfield) = GetMarcFromKohaField('biblio.author', '');
-    if ($record->field( $author_tag )) {
-        $record->field( $author_tag )->add_subfields( $author_subfield => $suggestion->{author} );
+    if (my $isbn = $suggestion->{isbn}) {
+        for my $field (qw(biblioitems.isbn biblioitems.issn)) {
+            my ($tag, $subfield) = GetMarcFromKohaField($field, '');
+            $record->append_fields(
+                MARC::Field->new($tag, ' ', ' ', $subfield => $isbn)
+            );
+        }
     }
     else {
+        my ($title_tag, $title_subfield) = GetMarcFromKohaField('biblio.title', '');
         $record->append_fields(
-            MARC::Field->new($author_tag, ' ', ' ', $author_subfield => $suggestion->{author})
+            MARC::Field->new($title_tag, ' ', ' ', $title_subfield => $suggestion->{title})
         );
+
+        my ($author_tag, $author_subfield) = GetMarcFromKohaField('biblio.author', '');
+        if ($record->field( $author_tag )) {
+            $record->field( $author_tag )->add_subfields( $author_subfield => $suggestion->{author} );
+        }
+        else {
+            $record->append_fields(
+                MARC::Field->new($author_tag, ' ', ' ', $author_subfield => $suggestion->{author})
+            );
+        }
     }
 
     my ($it_tag, $it_subfield) = GetMarcFromKohaField('biblioitems.itemtype', '');
index 12eb39f..6bea518 100755 (executable)
@@ -132,6 +132,7 @@ if ( $op =~ /save/i ) {
             title => $suggestion_only->{title},
             author => $suggestion_only->{author},
             itemtype => $suggestion_only->{itemtype},
+            isbn => $suggestion_only->{isbn},
     });
 
     my $manager = Koha::Patrons->find( $suggestion_only->{managedby} );
index 9093cfc..b0e8108 100755 (executable)
@@ -648,4 +648,26 @@ subtest 'ModSuggestion should work on suggestions without a suggester' => sub {
     is( $suggestion->{note}, "Test note", "ModSuggestion works on suggestions without a suggester" );
 };
 
+subtest 'Suggestion with ISBN' => sub {
+    my $suggestion_with_isbn = {
+        isbn     => '1940997232',
+        title    => "The Clouds",
+        author   => "Aristophanes",
+    };
+    my $record = MarcRecordFromNewSuggestion( $suggestion_with_isbn );
+    is("MARC::Record", ref($record), "MarcRecordFromNewSuggestion should return a MARC::Record object");
+
+    my ($isbn_tag, $isbn_subfield) = C4::Biblio::GetMarcFromKohaField('biblioitems.isbn', '');
+    is($record->field( $isbn_tag )->subfield( $isbn_subfield ), "1940997232", "ISBN Record from suggestion ISBN should be '1940997232'");
+
+    my ($issn_tag, $issn_subfield) = C4::Biblio::GetMarcFromKohaField('biblioitems.issn', '');
+    is($record->field( $issn_tag )->subfield( $issn_subfield ), "1940997232", "ISSN Record from suggestion ISBN should also be '1940997232'");
+
+    my ($title_tag, $title_subfield) = C4::Biblio::GetMarcFromKohaField('biblio.title', '');
+    is($record->field( $title_tag), undef, "Record from suggestion title should be empty");
+
+    my ($author_tag, $author_subfield) = C4::Biblio::GetMarcFromKohaField('biblio.author', '');
+    is($record->field( $author_tag), undef, "Record from suggestion author should be emtpy");
+}
+
 $schema->storage->txn_rollback;