Bug 20912: (QA follow-up) Rebase error corrections
[koha.git] / C4 / Suggestions.pm
index ddfa1b6..e2dd3e7 100644 (file)
@@ -5,34 +5,33 @@ package C4::Suggestions;
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 use strict;
 
 #use warnings; FIXME - Bug 2505
-use CGI;
+use CGI qw ( -utf8 );
 
 use C4::Context;
 use C4::Output;
-use C4::Dates qw(format_date format_date_in_iso);
 use C4::Debug;
 use C4::Letters;
+use Koha::DateUtils;
+
 use List::MoreUtils qw(any);
-use C4::Dates qw(format_date_in_iso);
 use base qw(Exporter);
 
-our $VERSION = 3.07.00.049;
 our @EXPORT  = qw(
   ConnectSuggestionAndBiblio
   CountSuggestion
@@ -47,6 +46,7 @@ our @EXPORT  = qw(
   NewSuggestion
   SearchSuggestion
   DelSuggestionsOlderThan
+  GetUnprocessedSuggestions
 );
 
 =head1 NAME
@@ -63,7 +63,7 @@ The functions in this module deal with the aqorders in OPAC and in librarian int
 
 A suggestion is done in the OPAC. It has the status "ASKED"
 
-When a librarian manages the suggestion, he can set the status to "REJECTED" or "ACCEPTED".
+When a librarian manages the suggestion, they can set the status to "REJECTED" or "ACCEPTED".
 
 When the book is ordered, the suggestion status becomes "ORDERED"
 
@@ -99,6 +99,7 @@ sub SearchSuggestion {
             B1.branchname       AS branchnamesuggestedby,
             U1.surname          AS surnamesuggestedby,
             U1.firstname        AS firstnamesuggestedby,
+            U1.cardnumber       AS cardnumbersuggestedby,
             U1.email            AS emailsuggestedby,
             U1.borrowernumber   AS borrnumsuggestedby,
             U1.categorycode     AS categorycodesuggestedby,
@@ -156,31 +157,39 @@ sub SearchSuggestion {
         qw( STATUS itemtype suggestedby managedby acceptedby budgetid biblionumber )
       )
     {
-        if ( exists $suggestion->{$field} ) {
-            if ( defined $suggestion->{$field} and $suggestion->{$field} ne '' )
-            {
-                push @sql_params, $suggestion->{$field};
-                push @query,      qq{ AND suggestions.$field=? };
+        if ( exists $suggestion->{$field}
+                and defined $suggestion->{$field}
+                and $suggestion->{$field} ne '__ANY__'
+                and (
+                    $suggestion->{$field} ne q||
+                        or $field eq 'STATUS'
+                )
+        ) {
+            if ( $suggestion->{$field} eq '__NONE__' ) {
+                push @query, qq{ AND (suggestions.$field = '' OR suggestions.$field IS NULL) };
             }
             else {
-                push @query, qq{
-                    AND (suggestions.$field='' OR suggestions.$field IS NULL)
-                };
+                push @sql_params, $suggestion->{$field};
+                push @query, qq{ AND suggestions.$field = ? };
             }
         }
     }
 
     # filter on date fields
-    my $today = C4::Dates->today('iso');
     foreach my $field (qw( suggesteddate manageddate accepteddate )) {
         my $from = $field . "_from";
         my $to   = $field . "_to";
+        my $from_dt;
+        $from_dt = eval { dt_from_string( $suggestion->{$from} ) } if ( $suggestion->{$from} );
+        my $from_sql = '0000-00-00';
+        $from_sql = output_pref({ dt => $from_dt, dateformat => 'iso', dateonly => 1 })
+            if ($from_dt);
+        $debug && warn "SQL for start date ($field): $from_sql";
         if ( $suggestion->{$from} || $suggestion->{$to} ) {
             push @query, qq{ AND suggestions.$field BETWEEN ? AND ? };
+            push @sql_params, $from_sql;
             push @sql_params,
-              format_date_in_iso( $suggestion->{$from} ) || '0000-00-00';
-            push @sql_params,
-              format_date_in_iso( $suggestion->{$to} ) || $today;
+              output_pref({ dt => dt_from_string( $suggestion->{$to} ), dateformat => 'iso', dateonly => 1 }) || output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 });
         }
     }
 
@@ -200,9 +209,9 @@ sub SearchSuggestion {
 
 =head2 GetSuggestion
 
-\%sth = &GetSuggestion($ordernumber)
+\%sth = &GetSuggestion($suggestionid)
 
-this function get the detail of the suggestion $ordernumber (input arg)
+this function get the detail of the suggestion $suggestionid (input arg)
 
 return :
     the result of the SQL query as a hash : $sth->fetchrow_hashref.
@@ -210,7 +219,7 @@ return :
 =cut
 
 sub GetSuggestion {
-    my ($ordernumber) = @_;
+    my ($suggestionid) = @_;
     my $dbh           = C4::Context->dbh;
     my $query         = q{
         SELECT *
@@ -218,7 +227,7 @@ sub GetSuggestion {
         WHERE  suggestionid=?
     };
     my $sth = $dbh->prepare($query);
-    $sth->execute($ordernumber);
+    $sth->execute($suggestionid);
     return ( $sth->fetchrow_hashref );
 }
 
@@ -426,13 +435,26 @@ Insert a new suggestion on database with value given on input arg.
 sub NewSuggestion {
     my ($suggestion) = @_;
 
-    my $new_suggestion = { %$suggestion };
+    for my $field ( qw(
+        suggestedby
+        managedby
+        manageddate
+        acceptedby
+        accepteddate
+        rejectedby
+        rejecteddate
+        budgetid
+    ) ) {
+        # Set the fields to NULL if not given.
+        $suggestion->{$field} ||= undef;
+    }
+
     $suggestion->{STATUS} = "ASKED" unless $suggestion->{STATUS};
-    $new_suggestion->{status} = $suggestion->{STATUS};
-    delete $new_suggestion->{STATUS};
+
+    $suggestion->{suggesteddate} = dt_from_string unless $suggestion->{suggesteddate};
 
     my $rs = Koha::Database->new->schema->resultset('Suggestion');
-    return $rs->create($new_suggestion)->id;
+    return $rs->create($suggestion)->id;
 }
 
 =head2 ModSuggestion
@@ -452,27 +474,44 @@ sub ModSuggestion {
     my ($suggestion) = @_;
     return unless( $suggestion and defined($suggestion->{suggestionid}) );
 
-    my $mod_suggestion = { %$suggestion };
-    my $status = $suggestion->{STATUS};
-    delete $mod_suggestion->{STATUS};
-    $mod_suggestion->{status} = $status;
+    for my $field ( qw(
+        suggestedby
+        managedby
+        manageddate
+        acceptedby
+        accepteddate
+        rejectedby
+        rejecteddate
+        budgetid
+    ) ) {
+        # Set the fields to NULL if not given.
+        $suggestion->{$field} = undef
+          if exists $suggestion->{$field}
+          and ($suggestion->{$field} eq '0'
+            or $suggestion->{$field} eq '' );
+    }
 
     my $rs = Koha::Database->new->schema->resultset('Suggestion')->find($suggestion->{suggestionid});
     my $status_update_table = 1;
     eval {
-        $rs->update($mod_suggestion);
+        $rs->update($suggestion);
     };
     $status_update_table = 0 if( $@ );
 
-    if ( $status ) {
+    if ( $suggestion->{STATUS} ) {
 
         # fetch the entire updated suggestion so that we can populate the letter
         my $full_suggestion = GetSuggestion( $suggestion->{suggestionid} );
+        my $patron = Koha::Patrons->find( $full_suggestion->{suggestedby} );
+
+        my $transport = (C4::Context->preference("FallbackToSMSIfNoEmail")) && ($patron->smsalertnumber) && (!$patron->email) ? 'sms' : 'email';
+
         if (
             my $letter = C4::Letters::GetPreparedLetter(
                 module      => 'suggestions',
                 letter_code => $full_suggestion->{STATUS},
                 branchcode  => $full_suggestion->{branchcode},
+                lang        => $patron->lang,
                 tables      => {
                     'branches'    => $full_suggestion->{branchcode},
                     'borrowers'   => $full_suggestion->{suggestedby},
@@ -488,7 +527,7 @@ sub ModSuggestion {
                     borrowernumber => $full_suggestion->{suggestedby},
                     suggestionid   => $full_suggestion->{suggestionid},
                     LibraryName    => C4::Context->preference("LibraryName"),
-                    message_transport_type => 'email',
+                    message_transport_type => $transport,
                 }
             ) or warn "can't enqueue letter $letter";
         }
@@ -520,7 +559,7 @@ sub ConnectSuggestionAndBiblio {
 
 &DelSuggestion($borrowernumber,$ordernumber)
 
-Delete a suggestion. A borrower can delete a suggestion only if he is its owner.
+Delete a suggestion. A borrower can delete a suggestion only if they are its owner.
 
 =cut
 
@@ -552,12 +591,13 @@ sub DelSuggestion {
     &DelSuggestionsOlderThan($days)
 
     Delete all suggestions older than TODAY-$days , that have be accepted or rejected.
+    We do now allow a negative number. If you want to delete all suggestions, just use Koha::Suggestions->delete or so.
 
 =cut
 
 sub DelSuggestionsOlderThan {
     my ($days) = @_;
-    return unless $days;
+    return unless $days && $days > 0;
     my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare(
         q{
@@ -569,6 +609,23 @@ sub DelSuggestionsOlderThan {
     $sth->execute("-$days");
 }
 
+sub GetUnprocessedSuggestions {
+    my ( $number_of_days_since_the_last_modification ) = @_;
+
+    $number_of_days_since_the_last_modification ||= 0;
+
+    my $dbh = C4::Context->dbh;
+
+    my $s = $dbh->selectall_arrayref(q|
+        SELECT *
+        FROM suggestions
+        WHERE STATUS = 'ASKED'
+            AND budgetid IS NOT NULL
+            AND CAST(NOW() AS DATE) - INTERVAL ? DAY = CAST(suggesteddate AS DATE)
+    |, { Slice => {} }, $number_of_days_since_the_last_modification );
+    return $s;
+}
+
 1;
 __END__