From e0f82a8269f3c08ee8f9adef242aee40275a57b7 Mon Sep 17 00:00:00 2001 From: Alex Arnaud Date: Wed, 7 Oct 2015 17:34:33 +0200 Subject: [PATCH] Bug 14973: Check existing biblio when submitting a purchase suggestion Test plan: - Go to opac suggestions page (opac-suggestions.pl) and click on "New purchase suggestion", - type the title (and author?) of a document that stand in you database - you should get a warning message about an exiting biblio. - clicking on confirm your suggestion add it, cancel does nothing --- C4/Suggestions.pm | 42 +++++++++++++++ .../bootstrap/en/modules/opac-suggestions.tt | 40 ++++++++++----- opac/opac-suggestions.pl | 54 +++++++++++--------- t/db_dependent/Suggestions.t | 20 +++++++- 4 files changed, 120 insertions(+), 36 deletions(-) diff --git a/C4/Suggestions.pm b/C4/Suggestions.pm index 02e32b9..b9728be 100644 --- a/C4/Suggestions.pm +++ b/C4/Suggestions.pm @@ -27,6 +27,7 @@ use C4::Context; use C4::Output; use C4::Debug; use C4::Letters; +use C4::Biblio qw( GetMarcFromKohaField ); use Koha::DateUtils; use List::MoreUtils qw(any); @@ -48,6 +49,7 @@ our @EXPORT = qw( SearchSuggestion DelSuggestionsOlderThan GetUnprocessedSuggestions + MarcRecordFromSuggestion ); =head1 NAME @@ -613,6 +615,46 @@ sub GetUnprocessedSuggestions { return $s; } +=head2 MarcRecordFromSuggestion + + $record = MarcRecordFromSuggestion ( $suggestion ) + +This function build a marc record object from a suggestion + +=cut + +sub MarcRecordFromSuggestion { + 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} ); + } + else { + $record->append_fields( + MARC::Field->new($author_tag, ' ', ' ', $author_subfield => $suggestion->{author}) + ); + } + + my ($it_tag, $it_subfield) = GetMarcFromKohaField('biblioitems.itemtype', ''); + if ($record->field( $it_tag )) { + $record->field( $it_tag )->add_subfields( $it_subfield => $suggestion->{itemtype} ); + } + else { + $record->append_fields( + MARC::Field->new($it_tag, ' ', ' ', $it_subfield => $suggestion->{author}) + ); + } + + return $record; +} + 1; __END__ diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-suggestions.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-suggestions.tt index 1753d8e..a686c89 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-suggestions.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-suggestions.tt @@ -32,21 +32,32 @@

Please fill out this form to make a purchase suggestion. You will receive an email when the library processes your suggestion

Only the title is required, but the more information you enter the easier it will be for the librarians to find the title you're requesting. The "Notes" field can be used to provide any additional information.

+ [% FOR m IN messages %] +
+ [% SWITCH m.code %] + [% CASE 'biblio_exists' %] + A similar document already exists: [% m.title %]. Click on "Confirm your suggestion" to ignore this message. + [% CASE %] + [% m.code %] + [% END %] +
+ [% END %] +
    -
  1. -
  2. -
  3. -
  4. -
  5. -
  6. -
  7. +
  8. +
  9. +
  10. +
  11. +
  12. +
  13. +
  14. [% FOREACH branchloo IN branchloop %] - [% IF ( branchloo.selected ) %] + [% IF ( branchloo.branchcode == branchcode ) %] [% ELSE %] @@ -82,7 +93,7 @@ [% END %]
  15. - +
  16. @@ -94,8 +105,13 @@
- - Cancel + + [% IF ( need_confirm ) %] + + [% ELSE %] + + [% END %] + Cancel
[% END # IF op_add %] diff --git a/opac/opac-suggestions.pl b/opac/opac-suggestions.pl index 6b7f8d4..b09eb89 100755 --- a/opac/opac-suggestions.pl +++ b/opac/opac-suggestions.pl @@ -29,6 +29,7 @@ use C4::Suggestions; use C4::Koha; use C4::Dates; use C4::Scrubber; +use C4::Search qw( FindDuplicate ); use Koha::DateUtils qw( dt_from_string ); @@ -38,6 +39,7 @@ my $suggestion = $input->Vars; delete $suggestion->{negcap}; my $negcaptcha = $input->param('negcap'); my $suggested_by_anyone = $input->param('suggested_by_anyone') || 0; +my $need_confirm = 0; # If a spambot accidentally populates the 'negcap' field in the sugesstions form, then silently skip and return. if ($negcaptcha ) { @@ -51,7 +53,7 @@ if ( ! C4::Context->preference('suggestion') ) { exit; } -delete $suggestion->{$_} foreach qw; +delete $suggestion->{$_} foreach qw; $op = 'else' unless $op; my ( $template, $borrowernumber, $cookie, @messages ); @@ -109,35 +111,40 @@ if ( $op eq 'else' ) { } } -my $suggestions_loop = - &SearchSuggestion( $suggestion); -if ( $op eq "add_confirm" ) { - if (@$suggestions_loop>=1){ +if ( $op eq "add_validate" ) { + $op = 'add_confirm'; + my $suggestions = &SearchSuggestion($suggestion); + my $biblio = MarcRecordFromSuggestion($suggestion); + if (@$suggestions >=1 ){ #some suggestion are answering the request Donot Add - for my $suggestion ( @$suggestions_loop ) { + for my $suggestion ( @$suggestions ) { push @messages, { type => 'error', code => 'already_exists', id => $suggestion->{suggestionid} }; last; } + $op = 'else'; } - else { - my $scrubber = C4::Scrubber->new(); - foreach my $suggest (keys %$suggestion){ - # Don't know why the encode is needed for Perl v5.10 here - $suggestion->{$suggest} = Encode::encode("utf8", $scrubber->scrub($suggestion->{$suggest}) ); - } - $suggestion->{suggesteddate} = dt_from_string; - $suggestion->{branchcode} = $input->param('branchcode') || C4::Context->userenv->{"branch"}; - - &NewSuggestion($suggestion); - # empty fields, to avoid filter in "SearchSuggestion" - $$suggestion{$_}='' foreach qw; - $suggestions_loop = - &SearchSuggestion( $suggestion ); - push @messages, { type => 'info', code => 'success_on_inserted' }; - } + elsif (my ($duplicatebiblionumber, $duplicatetitle) = FindDuplicate($biblio)) { + push @messages, { type => 'error', code => 'biblio_exists', id => $duplicatebiblionumber, title => $duplicatetitle }; + $need_confirm = 1; + $op = 'add'; + } +} + +if ($op eq "add_confirm") { + my $scrubber = C4::Scrubber->new(); + foreach my $suggest (keys %$suggestion) { + # Don't know why the encode is needed for Perl v5.10 here + $suggestion->{$suggest} = Encode::encode("utf8", $scrubber->scrub($suggestion->{$suggest}) ); + } + $suggestion->{suggesteddate} = dt_from_string; + $suggestion->{branchcode} = $input->param('branchcode') || C4::Context->userenv->{"branch"}; + + &NewSuggestion($suggestion); + push @messages, { type => 'info', code => 'success_on_inserted' }; $op = 'else'; } +my $suggestions_loop = &SearchSuggestion({suggestedby => $suggestion->{suggestedby}}); if ( $op eq "delete_confirm" ) { my @delete_field = $input->param("delete_field"); foreach my $delete_field (@delete_field) { @@ -189,7 +196,7 @@ if ( C4::Context->preference("AllowPurchaseSuggestionBranchChoice") ) { $template->param( %$suggestion, - itemtypeloop=> $supportlist, + placeitemtypeloop=> $supportlist, suggestions_loop => $suggestions_loop, patron_reason_loop => $patron_reason_loop, "op_$op" => 1, @@ -197,6 +204,7 @@ $template->param( messages => \@messages, suggestionsview => 1, suggested_by_anyone => $suggested_by_anyone, + need_confirm => $need_confirm, ); output_html_with_http_headers $input, $cookie, $template->output; diff --git a/t/db_dependent/Suggestions.t b/t/db_dependent/Suggestions.t index 29e59bb..8f83974 100644 --- a/t/db_dependent/Suggestions.t +++ b/t/db_dependent/Suggestions.t @@ -26,7 +26,7 @@ use C4::Budgets qw( AddBudgetPeriod AddBudget ); use Koha::DateUtils qw( dt_from_string ); use DateTime::Duration; -use Test::More tests => 105; +use Test::More tests => 108; use Test::Warn; BEGIN { @@ -364,6 +364,24 @@ ModSuggestion( $my_suggestion ); $suggestion = GetSuggestion($my_suggestionid_test_budgetid); is( $suggestion->{budgetid}, undef, 'NewSuggestion Should set budgetid to NULL if equals an empty string' ); +my $suggestion2 = { + title => "Cuisine d'automne", + author => "Catherine", + itemtype => "LIV" +}; + +my $record = MarcRecordFromSuggestion($suggestion2); + +is("MARC::Record", ref($record), "MarcRecordFromSuggestion should return a MARC::Record object"); + +my ($title_tag, $title_subfield) = C4::Biblio::GetMarcFromKohaField('biblio.title', ''); + +is($record->field( $title_tag )->subfield( $title_subfield ), "Cuisine d'automne", "Record from suggestion title should be 'Cuisine d'automne'"); + +my ($author_tag, $author_subfield) = C4::Biblio::GetMarcFromKohaField('biblio.author', ''); + +is($record->field( $author_tag )->subfield( $author_subfield ), "Catherine", "Record from suggestion author should be 'Catherine'"); + subtest 'GetUnprocessedSuggestions' => sub { plan tests => 11; $dbh->do(q|DELETE FROM suggestions|); -- 1.7.10.4