Bug 14973: Check existing biblio when submitting a purchase suggestion (staff side)
authorAlex Arnaud <alex.arnaud@biblibre.com>
Wed, 8 Mar 2017 11:23:12 +0000 (11:23 +0000)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Thu, 2 Jan 2020 12:31:20 +0000 (12:31 +0000)
Signed-off-by: Lisette Scheer <lisetteslatah@gmail.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

C4/Suggestions.pm
koha-tmpl/intranet-tmpl/prog/en/modules/suggestion/suggestion.tt
suggestion/suggestion.pl

index 2689151..cab3080 100644 (file)
@@ -690,7 +690,7 @@ sub MarcRecordFromNewSuggestion {
     }
     else {
         $record->append_fields(
-            MARC::Field->new($it_tag, ' ', ' ', $it_subfield => $suggestion->{author})
+            MARC::Field->new($it_tag, ' ', ' ', $it_subfield => $suggestion->{itemtype})
         );
     }
 
index 38e5410..3680918 100644 (file)
 [% END %]
 
 [% IF ( op_save ) %]
+    [% FOR m IN messages %]
+        <div class="dialog [% m.type %]">
+            [% SWITCH m.code %]
+            [% CASE 'biblio_exists' %]
+                A similar document already exists: <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% m.id %]">[% m.title %]</a>. Click on "Confirm your suggestion" to ignore this message.
+            [% CASE %]
+                [% m.code %]
+            [% END %]
+        </div>
+    [% END %]
     <form id="add_edit" action="suggestion.pl" method="post" class="validated">
     <input type="hidden" name="redirect" id="redirect" value="[% redirect | html %]" />
     <input type="hidden" name="borrowernumber" id="borrowernumber" value="[% borrowernumber | html %]" />
                        <input type="text" readonly="readonly" id="total" name="total" size="10" value="[% total | html %]"/>
                 </li></ol>
     </fieldset><input type="hidden" id="returnsuggested" name="returnsuggested" value="[% IF ( returnsuggestedby ) %][% returnsuggestedby | html %][% ELSE %]noone[% END %]"/>
-    <fieldset class="action"><input type="hidden" name="op" value="[% op | html %]" />[% IF ( suggestionid ) %]<input type="submit" value="Save" /> <a class="cancel" href="[% IF ( returnsuggestedby ) %]/cgi-bin/koha/members/moremember.pl?borrowernumber=[% returnsuggestedby | uri %]#suggestions[% ELSE %]suggestion.pl[% END %]">Cancel</a>[% ELSE %]<input type="submit" value="Submit your suggestion" /> <a class="cancel" href="suggestion.pl">Cancel</a>[% END %]
+    <fieldset class="action">
+        <input type="hidden" name="op" value="[% op | html %]" />
+        [% IF ( suggestionid ) %]
+            [% IF ( need_confirm ) %]
+                <input type="hidden" name="save_confirmed" value="1" />
+                <input onclick="this.form.op.value = 'save'; this.form.submit();" type="submit" value="Confirm your suggestion" />
+            [% ELSE %]
+                <input type="submit" value="Save" />
+            [% END %]
+            <a class="cancel" href="[% IF ( returnsuggestedby ) %]/cgi-bin/koha/members/moremember.pl?borrowernumber=[% returnsuggestedby | uri %]#suggestions[% ELSE %]suggestion.pl[% END %]">Cancel</a>
+        [% ELSE %]
+            [% IF ( need_confirm ) %]
+                <input type="hidden" name="save_confirmed" value="1" />
+                <input onclick="this.form.op.value = 'save'; this.form.submit();" type="submit" value="Confirm your suggestion" />
+            [% ELSE %]
+                <input type="submit" value="Submit your suggestion" />
+            [% END %]
+            <a class="cancel" href="suggestion.pl">Cancel</a>
+        [% END %]
     </fieldset>
     </form>
 [% END %]
         [% SWITCH m.code %]
         [% CASE 'already_exists' %]
             The suggestion has not been added. A suggestion with this title already exists (<a href='/cgi-bin/koha/suggestion/suggestion.pl?suggestionid=[% m.id | html %]&op=show'>suggestion #[% m.id | html %]</a>)
+        [% CASE 'biblio_exists' %]
+            A similar document already exists: <a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% m.id %]">[% m.title %]</a>. Click on "Confirm your suggestion" to ignore this message.
         [% CASE %]
             [% m.code | html %]
         [% END %]
index e98bbd9..ba27992 100755 (executable)
@@ -90,6 +90,8 @@ my $returnsuggested = $input->param('returnsuggested');
 my $managedby       = $input->param('managedby');
 my $displayby       = $input->param('displayby') || '';
 my $tabcode         = $input->param('tabcode');
+my $save_confirmed  = $input->param('save_confirmed') || 0;
+
 my $reasonsloop     = GetAuthorisedValues("SUGGEST");
 
 # filter informations which are not suggestion related.
@@ -121,60 +123,78 @@ my $branchfilter = $input->param('branchcode') || C4::Context->userenv->{'branch
 #########################################
 ##  Operations
 ##
-if ( $op =~ /save/i ) {
 
-    for my $date_key ( qw( suggesteddate manageddate accepteddate rejecteddate ) ) {
-        $suggestion_only->{$date_key} = dt_from_string( $suggestion_only->{$date_key} )
-            if $suggestion_only->{$date_key};
+if ( $op =~ /save/i ) {
+    my @messages;
+    my $biblio = MarcRecordFromNewSuggestion({
+            title => $suggestion_only->{title},
+            author => $suggestion_only->{author},
+            itemtype => $suggestion_only->{itemtype},
+    });
+
+    if ( ( my ($duplicatebiblionumber, $duplicatetitle) = FindDuplicate($biblio) ) && !$save_confirmed ) {
+        push @messages, { type => 'error', code => 'biblio_exists', id => $duplicatebiblionumber, title => $duplicatetitle };
+        $template->param(
+            messages => \@messages,
+            need_confirm => 1
+        );
+        delete $suggestion_ref->{suggesteddate};
+        Init($suggestion_ref);
     }
+    else {
 
-    if ( $suggestion_only->{"STATUS"} ) {
-        if ( my $tmpstatus = lc( $suggestion_only->{"STATUS"} ) =~ /ACCEPTED|REJECTED/i ) {
-            $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "date" } = dt_from_string;
-            $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "by" }   = C4::Context->userenv->{number};
+        for my $date_key ( qw( suggesteddate manageddate accepteddate rejecteddate ) ) {
+            $suggestion_only->{$date_key} = dt_from_string( $suggestion_only->{$date_key} )
+                if $suggestion_only->{$date_key};
         }
-        $suggestion_only->{manageddate} = dt_from_string;
-        $suggestion_only->{"managedby"}   = C4::Context->userenv->{number};
-    }
 
-    my $otherreason = $input->param('other_reason');
-    if ($suggestion_only->{reason} eq 'other' && $otherreason) {
-        $suggestion_only->{reason} = $otherreason;
-    }
+        if ( $suggestion_only->{"STATUS"} ) {
+            if ( my $tmpstatus = lc( $suggestion_only->{"STATUS"} ) =~ /ACCEPTED|REJECTED/i ) {
+                $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "date" } = dt_from_string;
+                $suggestion_only->{ lc( $suggestion_only->{"STATUS"}) . "by" }   = C4::Context->userenv->{number};
+            }
+            $suggestion_only->{manageddate} = dt_from_string;
+            $suggestion_only->{"managedby"}   = C4::Context->userenv->{number};
+        }
+
+        my $otherreason = $input->param('other_reason');
+        if ($suggestion_only->{reason} eq 'other' && $otherreason) {
+            $suggestion_only->{reason} = $otherreason;
+        }
 
-    if ( $suggestion_only->{'suggestionid'} > 0 ) {
-        &ModSuggestion($suggestion_only);
-    } else {
-        ###FIXME:Search here if suggestion already exists.
-        my $suggestions_loop =
-            SearchSuggestion( $suggestion_only );
-        if (@$suggestions_loop>=1){
-            #some suggestion are answering the request Donot Add
-            my @messages;
-            for my $suggestion ( @$suggestions_loop ) {
-                push @messages, { type => 'error', code => 'already_exists', id => $suggestion->{suggestionid} };
+        if ( $suggestion_only->{'suggestionid'} > 0 ) {
+            &ModSuggestion($suggestion_only);
+        } else {
+            ###FIXME:Search here if suggestion already exists.
+            my $suggestions_loop =
+                SearchSuggestion( $suggestion_only );
+            if (@$suggestions_loop>=1){
+                #some suggestion are answering the request Donot Add
+                my @messages;
+                for my $suggestion ( @$suggestions_loop ) {
+                    push @messages, { type => 'error', code => 'already_exists', id => $suggestion->{suggestionid} };
+                }
+                $template->param( messages => \@messages );
+            }
+            else {
+                ## Adding some informations related to suggestion
+                &NewSuggestion($suggestion_only);
             }
-            $template->param( messages => \@messages );
-        } 
-        else {    
-            ## Adding some informations related to suggestion
-            &NewSuggestion($suggestion_only);
+            # empty fields, to avoid filter in "SearchSuggestion"
         }
-        # empty fields, to avoid filter in "SearchSuggestion"
-    }  
-    map{delete $$suggestion_ref{$_}} keys %$suggestion_ref;
-    $op = 'else';
+        map{delete $$suggestion_ref{$_}} keys %$suggestion_ref;
+        $op = 'else';
 
-    if( $redirect eq 'purchase_suggestions' ) {
-        print $input->redirect("/cgi-bin/koha/members/purchase-suggestions.pl?borrowernumber=$borrowernumber");
+        if( $redirect eq 'purchase_suggestions' ) {
+            print $input->redirect("/cgi-bin/koha/members/purchase-suggestions.pl?borrowernumber=$borrowernumber");
+        }
     }
-
 }
 elsif ($op=~/add/) {
-    #Adds suggestion  
+    #Adds suggestion
     Init($suggestion_ref);
     $op ='save';
-} 
+}
 elsif ($op=~/edit/) {
     #Edit suggestion  
     $suggestion_ref=&GetSuggestion($$suggestion_ref{'suggestionid'});