bug 14504: (QA followup) fixing DelItemCheck arguments
[koha.git] / C4 / Suggestions.pm
index 8212307..8e76cea 100644 (file)
@@ -1,53 +1,57 @@
 package C4::Suggestions;
 
 # Copyright 2000-2002 Katipo Communications
+# Parts Copyright Biblibre 2011
 #
 # 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., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 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 CGI;
-use Mail::Sendmail;
+
+#use warnings; FIXME - Bug 2505
+use CGI qw ( -utf8 );
 
 use C4::Context;
 use C4::Output;
-use C4::Dates qw(format_date);
-use vars qw($VERSION @ISA @EXPORT);
-
-BEGIN {
-       # set the version for version checking
-       $VERSION = 3.01;
-       require Exporter;
-       @ISA = qw(Exporter);
-       @EXPORT = qw(
-               &NewSuggestion
-               &SearchSuggestion
-               &GetSuggestion
-               &GetSuggestionByStatus
-               &DelSuggestion
-               &CountSuggestion
-               &ModStatus
-               &ConnectSuggestionAndBiblio
-               &GetSuggestionFromBiblionumber
-       );
-}
+use C4::Debug;
+use C4::Letters;
+use Koha::DateUtils;
+
+use List::MoreUtils qw(any);
+use base qw(Exporter);
+
+our @EXPORT  = qw(
+  ConnectSuggestionAndBiblio
+  CountSuggestion
+  DelSuggestion
+  GetSuggestion
+  GetSuggestionByStatus
+  GetSuggestionFromBiblionumber
+  GetSuggestionInfoFromBiblionumber
+  GetSuggestionInfo
+  ModStatus
+  ModSuggestion
+  NewSuggestion
+  SearchSuggestion
+  DelSuggestionsOlderThan
+  GetUnprocessedSuggestions
+);
 
 =head1 NAME
 
-C4::Suggestions - Some useful functions for dealings with suggestions.
+C4::Suggestions - Some useful functions for dealings with aqorders.
 
 =head1 SYNOPSIS
 
@@ -55,7 +59,7 @@ use C4::Suggestions;
 
 =head1 DESCRIPTION
 
-The functions in this module deal with the suggestions in OPAC and in librarian interface
+The functions in this module deal with the aqorders in OPAC and in librarian interface
 
 A suggestion is done in the OPAC. It has the status "ASKED"
 
@@ -65,88 +69,142 @@ When the book is ordered, the suggestion status becomes "ORDERED"
 
 When a book is ordered and arrived in the library, the status becomes "AVAILABLE"
 
-All suggestions of a borrower can be seen by the borrower itself.
+All aqorders of a borrower can be seen by the borrower itself.
 Suggestions done by other borrowers can be seen when not "AVAILABLE"
 
 =head1 FUNCTIONS
 
 =head2 SearchSuggestion
 
-(\@array) = &SearchSuggestion($user,$author,$title,$publishercode,$status,$suggestedbyme)
+(\@array) = &SearchSuggestion($suggestionhashref_to_search)
 
 searches for a suggestion
 
 return :
-C<\@array> : the suggestions found. Array of hash.
+C<\@array> : the aqorders found. Array of hash.
 Note the status is stored twice :
 * in the status field
 * as parameter ( for example ASKED => 1, or REJECTED => 1) . This is for template & translation purposes.
 
 =cut
 
-sub SearchSuggestion  {
-    my ($user,$author,$title,$publishercode,$status,$suggestedbyme)=@_;
+sub SearchSuggestion {
+    my ($suggestion) = @_;
     my $dbh = C4::Context->dbh;
-    my $query = "
-    SELECT suggestions.*,
-        U1.surname   AS surnamesuggestedby,
-        U1.firstname AS firstnamesuggestedby,
-        U2.surname   AS surnamemanagedby,
-        U2.firstname AS firstnamemanagedby
-    FROM suggestions
-    LEFT JOIN borrowers AS U1 ON suggestedby=U1.borrowernumber
-    LEFT JOIN borrowers AS U2 ON managedby=U2.borrowernumber
-    WHERE 1=1 ";
-
     my @sql_params;
-    if ($author) {
-       push @sql_params,"%".$author."%";
-       $query .= " and author like ?";
-    }
-    if ($title) {
-        push @sql_params,"%".$title."%";
-        $query .= " and suggestions.title like ?";
+    my @query = (
+        q{
+        SELECT suggestions.*,
+            U1.branchcode       AS branchcodesuggestedby,
+            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,
+            C1.description      AS categorydescriptionsuggestedby,
+            U2.surname          AS surnamemanagedby,
+            U2.firstname        AS firstnamemanagedby,
+            B2.branchname       AS branchnamesuggestedby,
+            U2.email            AS emailmanagedby,
+            U2.branchcode       AS branchcodemanagedby,
+            U2.borrowernumber   AS borrnummanagedby
+        FROM suggestions
+            LEFT JOIN borrowers     AS U1 ON suggestedby=U1.borrowernumber
+            LEFT JOIN branches      AS B1 ON B1.branchcode=U1.branchcode
+            LEFT JOIN categories    AS C1 ON C1.categorycode=U1.categorycode
+            LEFT JOIN borrowers     AS U2 ON managedby=U2.borrowernumber
+            LEFT JOIN branches      AS B2 ON B2.branchcode=U2.branchcode
+            LEFT JOIN categories    AS C2 ON C2.categorycode=U2.categorycode
+        WHERE 1=1
     }
-    if ($publishercode) {
-        push @sql_params,"%".$publishercode."%";
-        $query .= " and publishercode like ?";
+    );
+
+    # filter on biblio informations
+    foreach my $field (
+        qw( title author isbn publishercode copyrightdate collectiontitle ))
+    {
+        if ( $suggestion->{$field} ) {
+            push @sql_params, '%' . $suggestion->{$field} . '%';
+            push @query,      qq{ AND suggestions.$field LIKE ? };
+        }
     }
-    if (C4::Context->preference("IndependantBranches")) {
+
+    # filter on user branch
+    if ( C4::Context->preference('IndependentBranches') ) {
         my $userenv = C4::Context->userenv;
         if ($userenv) {
-            unless ($userenv->{flags} == 1){
-                push @sql_params,$userenv->{branch};
-                $query .= " and (U1.branchcode = ? or U1.branchcode ='')";
+            if ( !C4::Context->IsSuperLibrarian() && !$suggestion->{branchcode} )
+            {
+                push @sql_params, $$userenv{branch};
+                push @query,      q{
+                    AND (suggestions.branchcode=? OR suggestions.branchcode='')
+                };
+            }
+        }
+    } else {
+        if ( defined $suggestion->{branchcode} && $suggestion->{branchcode} ) {
+            unless ( $suggestion->{branchcode} eq '__ANY__' ) {
+                push @sql_params, $suggestion->{branchcode};
+                push @query,      qq{ AND suggestions.branchcode=? };
             }
         }
     }
-    if ($status) {
-        push @sql_params,$status;
-        $query .= " and status=?";
+
+    # filter on nillable fields
+    foreach my $field (
+        qw( STATUS itemtype suggestedby managedby acceptedby budgetid biblionumber )
+      )
+    {
+        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 @sql_params, $suggestion->{$field};
+                push @query, qq{ AND suggestions.$field = ? };
+            }
+        }
     }
-    if ($suggestedbyme) {
-        unless ($suggestedbyme eq -1) {
-            push @sql_params,$user;
-            $query .= " and suggestedby=?";
+
+    # filter on date fields
+    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,
+              output_pref({ dt => dt_from_string( $suggestion->{$to} ), dateformat => 'iso', dateonly => 1 }) || output_pref({ dt => dt_from_string, dateformat => 'iso', dateonly => 1 });
         }
-    } else {
-        $query .= " and managedby is NULL";
     }
-    my $sth=$dbh->prepare($query);
+
+    $debug && warn "@query";
+    my $sth = $dbh->prepare("@query");
     $sth->execute(@sql_params);
     my @results;
-    my $even=1; # the even variable is used to set even / odd lines, for highlighting
-    while (my $data=$sth->fetchrow_hashref){
-        $data->{$data->{STATUS}} = 1;
-        if ($even) {
-            $even=0;
-            $data->{even}=1;
-        } else {
-            $even=1;
-        }
-        push(@results,$data);
+
+    # add status as field
+    while ( my $data = $sth->fetchrow_hashref ) {
+        $data->{ $data->{STATUS} } = 1;
+        push( @results, $data );
     }
-    return (\@results);
+
+    return ( \@results );
 }
 
 =head2 GetSuggestion
@@ -162,20 +220,20 @@ return :
 
 sub GetSuggestion {
     my ($suggestionid) = @_;
-    my $dbh = C4::Context->dbh;
-    my $query = "
+    my $dbh           = C4::Context->dbh;
+    my $query         = q{
         SELECT *
         FROM   suggestions
         WHERE  suggestionid=?
-    ";
+    };
     my $sth = $dbh->prepare($query);
     $sth->execute($suggestionid);
-    return($sth->fetchrow_hashref);
+    return ( $sth->fetchrow_hashref );
 }
 
 =head2 GetSuggestionFromBiblionumber
 
-$suggestionid = &GetSuggestionFromBiblionumber($dbh,$biblionumber)
+$ordernumber = &GetSuggestionFromBiblionumber($biblionumber)
 
 Get a suggestion from it's biblionumber.
 
@@ -185,21 +243,76 @@ the id of the suggestion which is related to the biblionumber given on input arg
 =cut
 
 sub GetSuggestionFromBiblionumber {
-    my ($dbh,$biblionumber) = @_;
-    my $query = qq|
+    my ($biblionumber) = @_;
+    my $query = q{
         SELECT suggestionid
         FROM   suggestions
-        WHERE  biblionumber=?
-    |;
+        WHERE  biblionumber=? LIMIT 1
+    };
+    my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare($query);
     $sth->execute($biblionumber);
     my ($suggestionid) = $sth->fetchrow;
     return $suggestionid;
 }
 
+=head2 GetSuggestionInfoFromBiblionumber
+
+Get a suggestion and borrower's informations from it's biblionumber.
+
+return :
+all informations (suggestion and borrower) of the suggestion which is related to the biblionumber given.
+
+=cut
+
+sub GetSuggestionInfoFromBiblionumber {
+    my ($biblionumber) = @_;
+    my $query = q{
+        SELECT suggestions.*,
+            U1.surname          AS surnamesuggestedby,
+            U1.firstname        AS firstnamesuggestedby,
+            U1.borrowernumber   AS borrnumsuggestedby
+        FROM suggestions
+            LEFT JOIN borrowers AS U1 ON suggestedby=U1.borrowernumber
+        WHERE biblionumber=?
+        LIMIT 1
+    };
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare($query);
+    $sth->execute($biblionumber);
+    return $sth->fetchrow_hashref;
+}
+
+=head2 GetSuggestionInfo
+
+Get a suggestion and borrower's informations from it's suggestionid
+
+return :
+all informations (suggestion and borrower) of the suggestion which is related to the suggestionid given.
+
+=cut
+
+sub GetSuggestionInfo {
+    my ($suggestionid) = @_;
+    my $query = q{
+        SELECT suggestions.*,
+            U1.surname          AS surnamesuggestedby,
+            U1.firstname        AS firstnamesuggestedby,
+            U1.borrowernumber   AS borrnumsuggestedby
+        FROM suggestions
+            LEFT JOIN borrowers AS U1 ON suggestedby=U1.borrowernumber
+        WHERE suggestionid=?
+        LIMIT 1
+    };
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare($query);
+    $sth->execute($suggestionid);
+    return $sth->fetchrow_hashref;
+}
+
 =head2 GetSuggestionByStatus
 
-$suggestions = &GetSuggestionByStatus($status)
+$aqorders = &GetSuggestionByStatus($status,[$branchcode])
 
 Get a suggestion from it's status
 
@@ -209,34 +322,57 @@ all the suggestion with C<$status>
 =cut
 
 sub GetSuggestionByStatus {
-    my $status = shift;
-    my $dbh = C4::Context->dbh;
-    my $query = "SELECT suggestions.*,
-                        U1.surname   AS surnamesuggestedby,
-                        U1.firstname AS firstnamesuggestedby,
-                        U2.surname   AS surnamemanagedby,
-                        U2.firstname AS firstnamemanagedby
-                        FROM suggestions
-                        LEFT JOIN borrowers AS U1 ON suggestedby=U1.borrowernumber
-                        LEFT JOIN borrowers AS U2 ON managedby=U2.borrowernumber
-                        WHERE status = ?
-                        ";
-    my $sth = $dbh->prepare($query);
-    $sth->execute($status);
-    
-    my @results;
-    while(my $data = $sth->fetchrow_hashref){
-        $data->{date} = format_date($data->{date});
-        push @results,$data;
+    my $status     = shift;
+    my $branchcode = shift;
+    my $dbh        = C4::Context->dbh;
+    my @sql_params = ($status);
+    my $query      = q{
+        SELECT suggestions.*,
+            U1.surname          AS surnamesuggestedby,
+            U1.firstname        AS firstnamesuggestedby,
+            U1.branchcode       AS branchcodesuggestedby,
+            B1.branchname       AS branchnamesuggestedby,
+            U1.borrowernumber   AS borrnumsuggestedby,
+            U1.categorycode     AS categorycodesuggestedby,
+            C1.description      AS categorydescriptionsuggestedby,
+            U2.surname          AS surnamemanagedby,
+            U2.firstname        AS firstnamemanagedby,
+            U2.borrowernumber   AS borrnummanagedby
+        FROM suggestions
+            LEFT JOIN borrowers     AS U1 ON suggestedby=U1.borrowernumber
+            LEFT JOIN borrowers     AS U2 ON managedby=U2.borrowernumber
+            LEFT JOIN categories    AS C1 ON C1.categorycode=U1.categorycode
+            LEFT JOIN branches      AS B1 on B1.branchcode=U1.branchcode
+        WHERE status = ?
+    };
+
+    # filter on branch
+    if ( C4::Context->preference("IndependentBranches") || $branchcode ) {
+        my $userenv = C4::Context->userenv;
+        if ($userenv) {
+            unless ( C4::Context->IsSuperLibrarian() ) {
+                push @sql_params, $userenv->{branch};
+                $query .= q{ AND (U1.branchcode = ? OR U1.branchcode ='') };
+            }
+        }
+        if ($branchcode) {
+            push @sql_params, $branchcode;
+            $query .= q{ AND (U1.branchcode = ? OR U1.branchcode ='') };
+        }
     }
-    return \@results;
+
+    my $sth = $dbh->prepare($query);
+    $sth->execute(@sql_params);
+    my $results;
+    $results = $sth->fetchall_arrayref( {} );
+    return $results;
 }
 
 =head2 CountSuggestion
 
 &CountSuggestion($status)
 
-Count the number of suggestions with the status given on input argument.
+Count the number of aqorders with the status given on input argument.
 the arg status can be :
 
 =over 2
@@ -260,35 +396,27 @@ sub CountSuggestion {
     my ($status) = @_;
     my $dbh = C4::Context->dbh;
     my $sth;
-    if (C4::Context->preference("IndependantBranches")){
-        my $userenv = C4::Context->userenv;
-        if ($userenv->{flags} == 1){
-            my $query = qq |
-                SELECT count(*)
-                FROM   suggestions
-                WHERE  status=?
-            |;
-            $sth = $dbh->prepare($query);
-            $sth->execute($status);
-        }
-        else {
-            my $query = qq |
-                SELECT count(*)
-                FROM suggestions LEFT JOIN borrowers ON borrowers.borrowernumber=suggestions.suggestedby
-                WHERE status=?
-                AND (borrowers.branchcode='' OR borrowers.branchcode =?)
-            |;
-            $sth = $dbh->prepare($query);
-            $sth->execute($status,$userenv->{branch});
-        }
+    my $userenv = C4::Context->userenv;
+    if ( C4::Context->preference("IndependentBranches")
+        && !C4::Context->IsSuperLibrarian() )
+    {
+        my $query = q{
+            SELECT count(*)
+            FROM suggestions
+                LEFT JOIN borrowers ON borrowers.borrowernumber=suggestions.suggestedby
+            WHERE STATUS=?
+                AND (borrowers.branchcode='' OR borrowers.branchcode=?)
+        };
+        $sth = $dbh->prepare($query);
+        $sth->execute( $status, $userenv->{branch} );
     }
     else {
-        my $query = qq |
+        my $query = q{
             SELECT count(*)
             FROM suggestions
-            WHERE status=?
-        |;
-         $sth = $dbh->prepare($query);
+            WHERE STATUS=?
+        };
+        $sth = $dbh->prepare($query);
         $sth->execute($status);
     }
     my ($result) = $sth->fetchrow;
@@ -298,175 +426,207 @@ sub CountSuggestion {
 =head2 NewSuggestion
 
 
-&NewSuggestion($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber)
+&NewSuggestion($suggestion);
 
 Insert a new suggestion on database with value given on input arg.
 
 =cut
 
 sub NewSuggestion {
-    my ($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber,$reason) = @_;
-    my $dbh = C4::Context->dbh;
-    my $query = qq |
-        INSERT INTO suggestions
-            (status,suggestedby,title,author,publishercode,note,copyrightdate,
-            volumedesc,publicationyear,place,isbn,biblionumber,reason)
-        VALUES ('ASKED',?,?,?,?,?,?,?,?,?,?,?,?)
-    |;
-    my $sth = $dbh->prepare($query);
-    $sth->execute($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber,$reason);
+    my ($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};
+
+    $suggestion->{suggesteddate} = dt_from_string unless $suggestion->{suggesteddate};
+
+    my $rs = Koha::Database->new->schema->resultset('Suggestion');
+    return $rs->create($suggestion)->id;
 }
 
-=head2 ModStatus
+=head2 ModSuggestion
 
-&ModStatus($suggestionid,$status,$managedby,$biblionumber)
+&ModSuggestion($suggestion)
 
-Modify the status (status can be 'ASKED', 'ACCEPTED', 'REJECTED', 'ORDERED')
-and send a mail to notify the user that did the suggestion.
+Modify the suggestion according to the hash passed by ref.
+The hash HAS to contain suggestionid
+Data not defined is not updated unless it is a note or sort1
+Send a mail to notify the user that did the suggestion.
 
-Note that there is no function to modify a suggestion : only the status can be modified, thus the name of the function.
+Note that there is no function to modify a suggestion.
 
 =cut
 
-sub ModStatus {
-    my ($suggestionid,$status,$managedby,$biblionumber,$reason) = @_;
-    my $dbh = C4::Context->dbh;
-    my $sth;
-    if ($managedby>0) {
-        if ($biblionumber) {
-        my $query = qq|
-            UPDATE suggestions
-            SET    status=?,managedby=?,biblionumber=?,reason=?
-            WHERE  suggestionid=?
-        |;
-        $sth = $dbh->prepare($query);
-        $sth->execute($status,$managedby,$biblionumber,$reason,$suggestionid);
-        } else {
-            my $query = qq|
-                UPDATE suggestions
-                SET    status=?,managedby=?,reason=?
-                WHERE  suggestionid=?
-            |;
-            $sth = $dbh->prepare($query);
-            $sth->execute($status,$managedby,$reason,$suggestionid);
-        }
-   } else {
-        if ($biblionumber) {
-            my $query = qq|
-                UPDATE suggestions
-                SET    status=?,biblionumber=?,reason=?
-                WHERE  suggestionid=?
-            |;
-            $sth = $dbh->prepare($query);
-            $sth->execute($status,$biblionumber,$reason,$suggestionid);
-        }
-        else {
-            my $query = qq|
-                UPDATE suggestions
-                SET    status=?,reason=?
-                WHERE  suggestionid=?
-            |;
-            $sth = $dbh->prepare($query);
-            $sth->execute($status,$reason,$suggestionid);
+sub ModSuggestion {
+    my ($suggestion) = @_;
+    return unless( $suggestion and defined($suggestion->{suggestionid}) );
+
+    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($suggestion);
+    };
+    $status_update_table = 0 if( $@ );
+
+    if ( $suggestion->{STATUS} ) {
+
+        # fetch the entire updated suggestion so that we can populate the letter
+        my $full_suggestion = GetSuggestion( $suggestion->{suggestionid} );
+        if (
+            my $letter = C4::Letters::GetPreparedLetter(
+                module      => 'suggestions',
+                letter_code => $full_suggestion->{STATUS},
+                branchcode  => $full_suggestion->{branchcode},
+                tables      => {
+                    'branches'    => $full_suggestion->{branchcode},
+                    'borrowers'   => $full_suggestion->{suggestedby},
+                    'suggestions' => $full_suggestion,
+                    'biblio'      => $full_suggestion->{biblionumber},
+                },
+            )
+          )
+        {
+            C4::Letters::EnqueueLetter(
+                {
+                    letter         => $letter,
+                    borrowernumber => $full_suggestion->{suggestedby},
+                    suggestionid   => $full_suggestion->{suggestionid},
+                    LibraryName    => C4::Context->preference("LibraryName"),
+                    message_transport_type => 'email',
+                }
+            ) or warn "can't enqueue letter $letter";
         }
     }
-    # check mail sending.
-    my $queryMail = "
-        SELECT suggestions.*,
-            boby.surname AS bysurname,
-            boby.firstname AS byfirstname,
-            boby.email AS byemail,
-            lib.surname AS libsurname,
-            lib.firstname AS libfirstname,
-            lib.email AS libemail
-        FROM suggestions
-            LEFT JOIN borrowers AS boby ON boby.borrowernumber=suggestedby
-            LEFT JOIN borrowers AS lib ON lib.borrowernumber=managedby
-        WHERE suggestionid=?
-    ";
-    $sth = $dbh->prepare($queryMail);
-    $sth->execute($suggestionid);
-    my $emailinfo = $sth->fetchrow_hashref;
-    my $template = gettemplate("suggestion/mail_suggestion_$status.tmpl", "intranet", CGI->new());
-
-    $template->param(
-        byemail => $emailinfo->{byemail},
-        libemail => $emailinfo->{libemail},
-        status => $emailinfo->{status},
-        title => $emailinfo->{title},
-        author =>$emailinfo->{author},
-        libsurname => $emailinfo->{libsurname},
-        libfirstname => $emailinfo->{libfirstname},
-        byfirstname => $emailinfo->{byfirstname},
-        bysurname => $emailinfo->{bysurname},
-        reason => $emailinfo->{reason}
-    );
-    my %mail = (
-        To => $emailinfo->{byemail},
-        From => $emailinfo->{libemail},
-        Subject => 'Koha suggestion',
-        Message => "".$template->output
-    );
-    sendmail(%mail);
+    return $status_update_table;
 }
 
 =head2 ConnectSuggestionAndBiblio
 
-&ConnectSuggestionAndBiblio($suggestionid,$biblionumber)
+&ConnectSuggestionAndBiblio($ordernumber,$biblionumber)
 
 connect a suggestion to an existing biblio
 
 =cut
 
 sub ConnectSuggestionAndBiblio {
-    my ($suggestionid,$biblionumber) = @_;
-    my $dbh=C4::Context->dbh;
-    my $query = "
+    my ( $suggestionid, $biblionumber ) = @_;
+    my $dbh   = C4::Context->dbh;
+    my $query = q{
         UPDATE suggestions
         SET    biblionumber=?
         WHERE  suggestionid=?
-    ";
+    };
     my $sth = $dbh->prepare($query);
-    $sth->execute($biblionumber,$suggestionid);
+    $sth->execute( $biblionumber, $suggestionid );
 }
 
 =head2 DelSuggestion
 
-&DelSuggestion($borrowernumber,$suggestionid)
+&DelSuggestion($borrowernumber,$ordernumber)
 
 Delete a suggestion. A borrower can delete a suggestion only if he is its owner.
 
 =cut
 
 sub DelSuggestion {
-    my ($borrowernumber,$suggestionid) = @_;
+    my ( $borrowernumber, $suggestionid, $type ) = @_;
     my $dbh = C4::Context->dbh;
+
     # check that the suggestion comes from the suggestor
-    my $query = "
+    my $query = q{
         SELECT suggestedby
         FROM   suggestions
         WHERE  suggestionid=?
-    ";
+    };
     my $sth = $dbh->prepare($query);
     $sth->execute($suggestionid);
     my ($suggestedby) = $sth->fetchrow;
-    if ($suggestedby eq $borrowernumber) {
-        my $queryDelete = "
+    if ( $type eq 'intranet' || $suggestedby eq $borrowernumber ) {
+        my $queryDelete = q{
             DELETE FROM suggestions
             WHERE suggestionid=?
-        ";
+        };
         $sth = $dbh->prepare($queryDelete);
-        $sth->execute($suggestionid);
+        my $suggestiondeleted = $sth->execute($suggestionid);
+        return $suggestiondeleted;
     }
 }
 
+=head2 DelSuggestionsOlderThan
+    &DelSuggestionsOlderThan($days)
+
+    Delete all suggestions older than TODAY-$days , that have be accepted or rejected.
+
+=cut
+
+sub DelSuggestionsOlderThan {
+    my ($days) = @_;
+    return unless $days;
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare(
+        q{
+        DELETE FROM suggestions
+        WHERE STATUS<>'ASKED'
+            AND date < ADDDATE(NOW(), ?)
+    }
+    );
+    $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__
 
 
 =head1 AUTHOR
 
-Koha Developement team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
 
 =cut