diff --git a/C4/Suggestions.pm b/C4/Suggestions.pm index 836b13fc42..268915107d 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 Koha::Suggestions; @@ -48,6 +49,7 @@ our @EXPORT = qw( SearchSuggestion DelSuggestionsOlderThan GetUnprocessedSuggestions + MarcRecordFromNewSuggestion ); =head1 NAME @@ -655,6 +657,46 @@ sub GetUnprocessedSuggestions { return $s; } +=head2 MarcRecordFromNewSuggestion + + $record = MarcRecordFromNewSuggestion ( $suggestion ) + +This function build a marc record object from a suggestion + +=cut + +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} ); + } + 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 2da7660e84..6208287188 100644 --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-suggestions.tt +++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-suggestions.tt @@ -40,79 +40,90 @@

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

Only certain fields (marked in red) are 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. [% IF ( title_required ) %] - + Required [% ELSE %] - + [% END %]
  2. [% IF ( author_required ) %] - + Required [% ELSE %] - + [% END %]
  3. [% IF ( copyrightdate_required ) %] - + Required [% ELSE %] - + [% END %]
  4. [% IF ( isbn_required ) %] - + Required [% ELSE %] - + [% END %]
  5. [% IF ( publishercode_required ) %] - + Required [% ELSE %] - + [% END %]
  6. [% IF ( collectiontitle_required ) %] - + Required [% ELSE %] - + [% END %]
  7. [% IF ( place_required ) %] - + Required [% ELSE %] - + [% END %]
  8. @@ -181,6 +192,7 @@ [% ELSE %] + [% END %]
  9. @@ -194,7 +206,12 @@
    - Cancel + [% IF ( need_confirm ) %] + + [% ELSE %] + + [% END %] + Cancel
    [% END %] diff --git a/opac/opac-suggestions.pl b/opac/opac-suggestions.pl index 8f792cd98f..b5765f3ab2 100755 --- a/opac/opac-suggestions.pl +++ b/opac/opac-suggestions.pl @@ -27,6 +27,7 @@ use C4::Output; use C4::Suggestions; use C4::Koha; use C4::Scrubber; +use C4::Search qw( FindDuplicate ); use Koha::AuthorisedValues; use Koha::Libraries; @@ -39,6 +40,7 @@ my $op = $input->param('op'); my $suggestion = $input->Vars; 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 ) { @@ -56,7 +58,7 @@ if ( ! C4::Context->preference('suggestion') ) { exit; } -delete $suggestion->{$_} foreach qw; +delete $suggestion->{$_} foreach qw; $op = 'else' unless $op; my ( $template, $borrowernumber, $cookie, @messages ); @@ -114,6 +116,16 @@ if ( $op eq 'else' ) { } } +if ( $op eq "add_validate" ) { + $op = 'add_confirm'; + my $biblio = MarcRecordFromNewSuggestion($suggestion); + if ( my ($duplicatebiblionumber, $duplicatetitle) = FindDuplicate($biblio) ) { + push @messages, { type => 'error', code => 'biblio_exists', id => $duplicatebiblionumber, title => $duplicatetitle }; + $need_confirm = 1; + $op = 'add'; + } +} + my $patrons_pending_suggestions_count = 0; if ( $borrowernumber && C4::Context->preference("MaxOpenSuggestions") ne '' ) { $patrons_pending_suggestions_count = scalar @{ SearchSuggestion( { suggestedby => $borrowernumber, STATUS => 'ASKED' } ) } ; @@ -164,6 +176,7 @@ if ( $op eq "add_confirm" ) { $op = 'else'; } +my $suggestions_loop = &SearchSuggestion({suggestedby => $suggestion->{suggestedby}}); if ( $op eq "delete_confirm" ) { my @delete_field = $input->multi_param("delete_field"); foreach my $delete_field (@delete_field) { @@ -228,6 +241,7 @@ $template->param( suggestionsview => 1, suggested_by_anyone => $suggested_by_anyone, patrons_pending_suggestions_count => $patrons_pending_suggestions_count, + need_confirm => $need_confirm, ); output_html_with_http_headers $input, $cookie, $template->output, undef, { force_no_caching => 1 }; diff --git a/t/db_dependent/Suggestions.t b/t/db_dependent/Suggestions.t index 7a75264412..0349353d02 100644 --- a/t/db_dependent/Suggestions.t +++ b/t/db_dependent/Suggestions.t @@ -18,7 +18,7 @@ use Modern::Perl; use DateTime::Duration; -use Test::More tests => 110; +use Test::More tests => 113; use Test::Warn; use t::lib::Mocks; @@ -423,6 +423,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 = MarcRecordFromNewSuggestion($suggestion2); + +is("MARC::Record", ref($record), "MarcRecordFromNewSuggestion 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|);