(bug #2040) This prevent users to post empty suggestions, and post the same suggestio...
[koha.git] / C4 / Suggestions.pm
index 29896e9..1f9daef 100644 (file)
@@ -17,18 +17,33 @@ package C4::Suggestions;
 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 # Suite 330, Boston, MA  02111-1307 USA
 
-# $Id$
 
 use strict;
-require Exporter;
+use CGI;
+use Mail::Sendmail;
+
 use C4::Context;
 use C4::Output;
-use Mail::Sendmail;
+use C4::Dates qw(format_date);
 use vars qw($VERSION @ISA @EXPORT);
 
-# set the version for version checking
-$VERSION = do { my @v = '$Revision$' =~ /\d+/g;
-  shift(@v) . "." . join("_", map {sprintf "%03d", $_ } @v); };
+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
+       );
+}
 
 =head1 NAME
 
@@ -40,8 +55,6 @@ use C4::Suggestions;
 
 =head1 DESCRIPTION
 
-=over 4
-
 The functions in this module deal with the suggestions in OPAC and in librarian interface
 
 A suggestion is done in the OPAC. It has the status "ASKED"
@@ -55,29 +68,11 @@ 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.
 Suggestions done by other borrowers can be seen when not "AVAILABLE"
 
-=back
-
 =head1 FUNCTIONS
 
-=cut
-
-@ISA = qw(Exporter);
-@EXPORT = qw(
-    &NewSuggestion
-    &SearchSuggestion
-    &GetSuggestion
-    &DelSuggestion
-    &CountSuggestion
-    &ModStatus
-    &ConnectSuggestionAndBiblio
-    &GetSuggestionFromBiblionumber
- );
-
 =head2 SearchSuggestion
 
-=over 4
-
-(\@array) = &SearchSuggestion($user,$author,$title,$publishercode,$status,$suggestedbyme)
+(\@array) = &SearchSuggestion($user,$author,$title,$publishercode,$status,$suggestedbyme,$branchcode)
 
 searches for a suggestion
 
@@ -87,23 +82,25 @@ 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.
 
-=back
-
 =cut
 
 sub SearchSuggestion  {
-    my ($user,$author,$title,$publishercode,$status,$suggestedbyme)=@_;
+    my ($user,$author,$title,$publishercode,$status,$suggestedbyme,$branchcode)=@_;
     my $dbh = C4::Context->dbh;
-    my $query = qq|
+    my $query = "
     SELECT suggestions.*,
+        U1.branchcode   AS branchcodesuggestedby,
         U1.surname   AS surnamesuggestedby,
         U1.firstname AS firstnamesuggestedby,
+        U1.borrowernumber AS borrnumsuggestedby,
+        U1.branchcode AS branchcodesuggestedby,
         U2.surname   AS surnamemanagedby,
-        U2.firstname AS firstnamemanagedby
+        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
-    WHERE 1=1 |;
+    WHERE 1=1 ";
 
     my @sql_params;
     if ($author) {
@@ -118,19 +115,22 @@ sub SearchSuggestion  {
         push @sql_params,"%".$publishercode."%";
         $query .= " and publishercode like ?";
     }
-    if ($status) {
-        push @sql_params,$status;
-        $query .= " and status=?";
-    }
-
-    if (C4::Context->preference("IndependantBranches")) {
+    if (C4::Context->preference("IndependantBranches") || $branchcode) {
         my $userenv = C4::Context->userenv;
         if ($userenv) {
-            unless ($userenv->{flags} == 1){
+            unless ($userenv->{flags} % 2 == 1){
                 push @sql_params,$userenv->{branch};
                 $query .= " and (U1.branchcode = ? or U1.branchcode ='')";
             }
         }
+        if ($branchcode) {
+            push @sql_params,$branchcode;
+            $query .= " and (U1.branchcode = ? or U1.branchcode ='')";
+        }
+    }
+    if ($status) {
+        push @sql_params,$status;
+        $query .= " and status=?";
     }
     if ($suggestedbyme) {
         unless ($suggestedbyme eq -1) {
@@ -152,6 +152,7 @@ sub SearchSuggestion  {
         } else {
             $even=1;
         }
+#         $data->{date} = format_date($data->{date});
         push(@results,$data);
     }
     return (\@results);
@@ -159,8 +160,6 @@ sub SearchSuggestion  {
 
 =head2 GetSuggestion
 
-=over 4
-
 \%sth = &GetSuggestion($suggestionid)
 
 this function get the detail of the suggestion $suggestionid (input arg)
@@ -168,17 +167,16 @@ this function get the detail of the suggestion $suggestionid (input arg)
 return :
     the result of the SQL query as a hash : $sth->fetchrow_hashref.
 
-=back
-
 =cut
+
 sub GetSuggestion {
     my ($suggestionid) = @_;
     my $dbh = C4::Context->dbh;
-    my $query = qq|
+    my $query = "
         SELECT *
         FROM   suggestions
         WHERE  suggestionid=?
-    |;
+    ";
     my $sth = $dbh->prepare($query);
     $sth->execute($suggestionid);
     return($sth->fetchrow_hashref);
@@ -186,8 +184,6 @@ sub GetSuggestion {
 
 =head2 GetSuggestionFromBiblionumber
 
-=over 4
-
 $suggestionid = &GetSuggestionFromBiblionumber($dbh,$biblionumber)
 
 Get a suggestion from it's biblionumber.
@@ -195,9 +191,8 @@ Get a suggestion from it's biblionumber.
 return :
 the id of the suggestion which is related to the biblionumber given on input args.
 
-=back
-
 =cut
+
 sub GetSuggestionFromBiblionumber {
     my ($dbh,$biblionumber) = @_;
     my $query = qq|
@@ -211,19 +206,65 @@ sub GetSuggestionFromBiblionumber {
     return $suggestionid;
 }
 
+=head2 GetSuggestionByStatus
 
-=head2 CountSuggestion
+$suggestions = &GetSuggestionByStatus($status,[$branchcode])
+
+Get a suggestion from it's status
 
-=over 4
+return :
+all the suggestion with C<$status>
+
+=cut
+
+sub GetSuggestionByStatus {
+    my $status = shift;
+    my $branchcode = shift;
+    my $dbh = C4::Context->dbh;
+    my @sql_params=($status);  
+    my $query = qq(SELECT suggestions.*,
+                        U1.surname   AS surnamesuggestedby,
+                        U1.firstname AS firstnamesuggestedby,
+            U1.branchcode AS branchcodesuggestedby,
+                                               U1.borrowernumber AS borrnumsuggestedby,
+                        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
+                        WHERE status = ?);
+    if (C4::Context->preference("IndependantBranches") || $branchcode) {
+        my $userenv = C4::Context->userenv;
+        if ($userenv) {
+            unless ($userenv->{flags} % 2 == 1){
+                push @sql_params,$userenv->{branch};
+                $query .= " and (U1.branchcode = ? or U1.branchcode ='')";
+            }
+        }
+        if ($branchcode) {
+            push @sql_params,$branchcode;
+            $query .= " and (U1.branchcode = ? or U1.branchcode ='')";
+        }
+    }
+    
+    my $sth = $dbh->prepare($query);
+    $sth->execute(@sql_params);
+    
+    my $results;
+    $results=  $sth->fetchall_arrayref({});
+#     map{$_->{date} = format_date($_->{date})} @$results;
+    return $results;
+}
+
+=head2 CountSuggestion
 
 &CountSuggestion($status)
 
 Count the number of suggestions with the status given on input argument.
 the arg status can be :
 
-=over
-
-=over
+=over 2
 
 =item * ASKED : asked by the user, not dealed by the librarian
 
@@ -235,21 +276,18 @@ the arg status can be :
 
 =back
 
-=back
-
 return :
 the number of suggestion with this status.
 
-=back
-
 =cut
+
 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){
+        if ($userenv->{flags} % 2 == 1){
             my $query = qq |
                 SELECT count(*)
                 FROM   suggestions
@@ -261,9 +299,8 @@ sub CountSuggestion {
         else {
             my $query = qq |
                 SELECT count(*)
-                FROM suggestions,borrowers
+                FROM suggestions LEFT JOIN borrowers ON borrowers.borrowernumber=suggestions.suggestedby
                 WHERE status=?
-                AND borrowers.borrowernumber=suggestions.suggestedby
                 AND (borrowers.branchcode='' OR borrowers.branchcode =?)
             |;
             $sth = $dbh->prepare($query);
@@ -286,33 +323,29 @@ sub CountSuggestion {
 =head2 NewSuggestion
 
 
-=over 4
-
 &NewSuggestion($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber)
 
 Insert a new suggestion on database with value given on input arg.
 
-=back
-
 =cut
-sub NewSuggestion {
-    my ($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber) = @_;
-    my $dbh = C4::Context->dbh;
 
-    my $query = qq |
-        INSERT INTO suggestions
-            (status,suggestedby,title,author,publishercode,note,copyrightdate,
-            volumedesc,publicationyear,place,isbn,biblionumber)
-        VALUES ('ASKED',?,?,?,?,?,?,?,?,?,?,?)
-    |;
-    my $sth = $dbh->prepare($query);
-    $sth->execute($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber);
+sub NewSuggestion {
+    my ($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber,$reason) = @_;
+    if ($title) {
+        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);
+    }
 }
 
 =head2 ModStatus
 
-=over 4
-
 &ModStatus($suggestionid,$status,$managedby,$biblionumber)
 
 Modify the status (status can be 'ASKED', 'ACCEPTED', 'REJECTED', 'ORDERED')
@@ -320,70 +353,68 @@ and 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.
 
-=back
-
 =cut
+
 sub ModStatus {
-    my ($suggestionid,$status,$managedby,$biblionumber,$input) = @_;
+    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=?
+            SET    status=?,managedby=?,biblionumber=?,reason=?
             WHERE  suggestionid=?
         |;
         $sth = $dbh->prepare($query);
-        $sth->execute($status,$managedby,$biblionumber,$suggestionid);
+        $sth->execute($status,$managedby,$biblionumber,$reason,$suggestionid);
         } else {
             my $query = qq|
                 UPDATE suggestions
-                SET    status=?,managedby=?
+                SET    status=?,managedby=?,reason=?
                 WHERE  suggestionid=?
             |;
             $sth = $dbh->prepare($query);
-            $sth->execute($status,$managedby,$suggestionid);
+            $sth->execute($status,$managedby,$reason,$suggestionid);
         }
    } else {
         if ($biblionumber) {
             my $query = qq|
                 UPDATE suggestions
-                SET    status=?,biblionumber=?
+                SET    status=?,biblionumber=?,reason=?
                 WHERE  suggestionid=?
             |;
             $sth = $dbh->prepare($query);
-            $sth->execute($status,$biblionumber,$suggestionid);
+            $sth->execute($status,$biblionumber,$reason,$suggestionid);
         }
         else {
             my $query = qq|
                 UPDATE suggestions
-                SET    status=?
+                SET    status=?,reason=?
                 WHERE  suggestionid=?
             |;
             $sth = $dbh->prepare($query);
-            $sth->execute($status,$suggestionid);
+            $sth->execute($status,$reason,$suggestionid);
         }
     }
     # check mail sending.
-    my $queryMail = qq|
+    my $queryMail = "
         SELECT suggestions.*,
             boby.surname AS bysurname,
             boby.firstname AS byfirstname,
-            boby.emailaddress AS byemail,
+            boby.email AS byemail,
             lib.surname AS libsurname,
             lib.firstname AS libfirstname,
-            lib.emailaddress AS libemail
+            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;
-if ($emailinfo->{byemail}){
-    my $template = gettemplate("suggestion/mail_suggestion_$status.tmpl","intranet",$input);
+    my $template = gettemplate("suggestion/mail_suggestion_$status.tmpl", "intranet", CGI->new());
 
     $template->param(
         byemail => $emailinfo->{byemail},
@@ -395,69 +426,76 @@ if ($emailinfo->{byemail}){
         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
+        Message => "".$template->output,
+        'Content-Type' => 'text/plain; charset="utf8"',
     );
     sendmail(%mail);
 }
-}
 
 =head2 ConnectSuggestionAndBiblio
 
-=over 4
 &ConnectSuggestionAndBiblio($suggestionid,$biblionumber)
 
 connect a suggestion to an existing biblio
 
-=back
-
 =cut
+
 sub ConnectSuggestionAndBiblio {
     my ($suggestionid,$biblionumber) = @_;
     my $dbh=C4::Context->dbh;
-    my $query = qq |
+    my $query = "
         UPDATE suggestions
         SET    biblionumber=?
         WHERE  suggestionid=?
-    |;
+    ";
     my $sth = $dbh->prepare($query);
     $sth->execute($biblionumber,$suggestionid);
 }
 
 =head2 DelSuggestion
 
-=over 4
-
 &DelSuggestion($borrowernumber,$suggestionid)
 
 Delete a suggestion. A borrower can delete a suggestion only if he is its owner.
 
-=back
-
 =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 = qq |
+    my $query = "
         SELECT suggestedby
         FROM   suggestions
         WHERE  suggestionid=?
-    |;
+    ";
     my $sth = $dbh->prepare($query);
     $sth->execute($suggestionid);
     my ($suggestedby) = $sth->fetchrow;
-    if ($suggestedby eq $borrowernumber) {
-        my $queryDelete = qq|
+    if ($type eq "intranet" || $suggestedby eq $borrowernumber ) {
+        my $queryDelete = "
             DELETE FROM suggestions
             WHERE suggestionid=?
-        |;
+        ";
         $sth = $dbh->prepare($queryDelete);
-        $sth->execute($suggestionid);
+        my $suggestiondeleted=$sth->execute($suggestionid);
+        return $suggestiondeleted;  
     }
-}
\ No newline at end of file
+}
+
+1;
+__END__
+
+
+=head1 AUTHOR
+
+Koha Developement team <info@koha.org>
+
+=cut
+