(bug #3726) fix ISBD url translation
[koha.git] / C4 / Suggestions.pm
index 8609b96..c7955d7 100644 (file)
@@ -17,19 +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 DBI;
+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
 
@@ -41,41 +55,26 @@ use C4::Suggestions;
 
 =head1 DESCRIPTION
 
-The functions in this module deal with the suggestions :
-* in OPAC
-* in librarian interface
+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"
-When a librarian manages the suggestion, he can set the status to "REJECTED" or "ORDERED".
-When a book is ordered and arrived in the library, the status becomes "AVAILABLE"
-All suggestions of a borrower by the borrower itself.
-Suggestions done by other can be seen when not "AVAILABLE"
 
-=head1 FUNCTIONS
+When a librarian manages the suggestion, he can set the status to "REJECTED" or "ACCEPTED".
 
-=over 2
+When the book is ordered, the suggestion status becomes "ORDERED"
 
-=cut
+When a book is ordered and arrived in the library, the status becomes "AVAILABLE"
 
-@ISA = qw(Exporter);
-@EXPORT = qw(
-    &NewSuggestion
-    &SearchSuggestion
-    &GetSuggestion
-    &DelSuggestion
-    &CountSuggestion
-    &ModStatus
-    &ConnectSuggestionAndBiblio
-    &GetSuggestionFromBiblionumber
- );
+All suggestions of a borrower can be seen by the borrower itself.
+Suggestions done by other borrowers can be seen when not "AVAILABLE"
 
-=item SearchSuggestion
+=head1 FUNCTIONS
 
-(\@array) = &SearchSuggestion($user)
+=head2 SearchSuggestion
 
-searches for a suggestion
+(\@array) = &SearchSuggestion($user,$author,$title,$publishercode,$status,$suggestedbyme,$branchcode)
 
-C<$user> is the user code (used as suggestor filter)
+searches for a suggestion
 
 return :
 C<\@array> : the suggestions found. Array of hash.
@@ -84,19 +83,25 @@ Note the status is stored twice :
 * 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)=@_;
+    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.categorycode AS categorycodesuggestedby,
+        U2.branchcode AS branchcodemanagedby,
         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) {
@@ -111,12 +116,7 @@ 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){
@@ -124,10 +124,17 @@ sub SearchSuggestion  {
                 $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) {
-        if ($suggestedbyme eq -1) {        # FIXME ! what's this strange code ?
-        } else {
+        unless ($suggestedbyme eq -1) {
             push @sql_params,$user;
             $query .= " and suggestedby=?";
         }
@@ -146,91 +153,136 @@ sub SearchSuggestion  {
         } else {
             $even=1;
         }
+#         $data->{date} = format_date($data->{date});
         push(@results,$data);
     }
     return (\@results);
 }
 
-=item NewSuggestion
-
-&NewSuggestion($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber)
-
-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) = @_;
-    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);
-}
-
-=item GetSuggestion
+=head2 GetSuggestion
 
 \%sth = &GetSuggestion($suggestionid)
 
-this function get a suggestion from $suggestionid given on 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.
+
 =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);
 }
 
-=item DelSuggestion
+=head2 GetSuggestionFromBiblionumber
 
-&DelSuggestion($borrowernumber,$suggestionid)
+$suggestionid = &GetSuggestionFromBiblionumber($dbh,$biblionumber)
 
-Delete a suggestion. A borrower can delete a suggestion only if he is its owner.
+Get a suggestion from it's biblionumber.
+
+return :
+the id of the suggestion which is related to the biblionumber given on input args.
 
 =cut
-sub DelSuggestion {
-    my ($borrowernumber,$suggestionid) = @_;
-    my $dbh = C4::Context->dbh;
-    # check that the suggestion comes from the suggestor
-    my $query = qq |
-        SELECT suggestedby
+
+sub GetSuggestionFromBiblionumber {
+    my ($dbh,$biblionumber) = @_;
+    my $query = qq|
+        SELECT suggestionid
         FROM   suggestions
-        WHERE  suggestionid=?
+        WHERE  biblionumber=?
     |;
     my $sth = $dbh->prepare($query);
-    $sth->execute($suggestionid);
-    my ($suggestedby) = $sth->fetchrow;
-    if ($suggestedby eq $borrowernumber) {
-        my $queryDelete = qq|
-            DELETE FROM suggestions
-            WHERE suggestionid=?
-        |;
-        $sth = $dbh->prepare($queryDelete);
-        $sth->execute($suggestionid);
+    $sth->execute($biblionumber);
+    my ($suggestionid) = $sth->fetchrow;
+    return $suggestionid;
+}
+
+=head2 GetSuggestionByStatus
+
+$suggestions = &GetSuggestionByStatus($status,[$branchcode])
+
+Get a suggestion from it's status
+
+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,
+                       U1.categorycode AS categorycodesuggestedby,
+                        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} == 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;
 }
-=item CountSuggestion
+
+=head2 CountSuggestion
 
 &CountSuggestion($status)
 
 Count the number of suggestions with the status given on input argument.
+the arg status can be :
+
+=over 2
+
+=item * ASKED : asked by the user, not dealed by the librarian
+
+=item * ACCEPTED : accepted by the librarian, but not yet ordered
+
+=item * REJECTED : rejected by the librarian (definitive status)
+
+=item * ORDERED : ordered by the librarian (acquisition module)
+
+=back
 
 return :
 the number of suggestion with this status.
 
 =cut
+
 sub CountSuggestion {
     my ($status) = @_;
     my $dbh = C4::Context->dbh;
@@ -249,9 +301,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);
@@ -271,73 +322,99 @@ sub CountSuggestion {
     return $result;
 }
 
-=item ModStatus
+=head2 NewSuggestion
+
+
+&NewSuggestion($borrowernumber,$title,$author,$publishercode,$note,$copyrightdate,$volumedesc,$publicationyear,$place,$isbn,$biblionumber)
+
+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);
+}
+
+=head2 ModStatus
 
 &ModStatus($suggestionid,$status,$managedby,$biblionumber)
 
-Modify the status (status can be 'ASKED', 'ACCEPTED', 'REJECTED'...)
-and send a mail to notify the librarian.
+Modify the status (status can be 'ASKED', 'ACCEPTED', 'REJECTED', 'ORDERED')
+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.
+
 =cut
+
 sub ModStatus {
-    my ($suggestionid,$status,$managedby,$biblionumber) = @_;
+    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;
-    my $template = gettemplate("suggestion/mail_suggestion_$status.tmpl","intranet");
+    my $template = gettemplate("suggestion/mail_suggestion_$status.tmpl", "intranet", CGI->new());
 
     $template->param(
         byemail => $emailinfo->{byemail},
@@ -349,57 +426,76 @@ sub ModStatus {
         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);
 }
-=item GetSuggestionFromBiblionumber
-
-$suggestionid = &GetSuggestionFromBiblionumber($dbh,$biblionumber)
-
-Get a suggestion from the biblionumber.
 
-return :
- the id of the suggestion which has the biblionumber given on input args.
-
-=cut
-sub GetSuggestionFromBiblionumber {
-    my ($dbh,$biblionumber) = @_;
-    my $query = qq|
-        SELECT suggestionid
-        FROM   suggestions
-        WHERE  biblionumber=?
-    |;
-    my $sth = $dbh->prepare($query);
-    $sth->execute($biblionumber);
-    my ($suggestionid) = $sth->fetchrow;
-    return $suggestionid;
-}
-=item ConnectSuggestionAndBiblio
+=head2 ConnectSuggestionAndBiblio
 
 &ConnectSuggestionAndBiblio($suggestionid,$biblionumber)
 
- connect a suggestion to an existing biblio
+connect a suggestion to an existing biblio
 
 =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);
 }
-=back
 
-=head1 SEE ALSO
+=head2 DelSuggestion
+
+&DelSuggestion($borrowernumber,$suggestionid)
+
+Delete a suggestion. A borrower can delete a suggestion only if he is its owner.
+
+=cut
+
+sub DelSuggestion {
+    my ($borrowernumber,$suggestionid,$type) = @_;
+    my $dbh = C4::Context->dbh;
+    # check that the suggestion comes from the suggestor
+    my $query = "
+        SELECT suggestedby
+        FROM   suggestions
+        WHERE  suggestionid=?
+    ";
+    my $sth = $dbh->prepare($query);
+    $sth->execute($suggestionid);
+    my ($suggestedby) = $sth->fetchrow;
+    if ($type eq "intranet" || $suggestedby eq $borrowernumber ) {
+        my $queryDelete = "
+            DELETE FROM suggestions
+            WHERE suggestionid=?
+        ";
+        $sth = $dbh->prepare($queryDelete);
+        my $suggestiondeleted=$sth->execute($suggestionid);
+        return $suggestiondeleted;  
+    }
+}
+
+1;
+__END__
+
+
+=head1 AUTHOR
+
+Koha Developement team <info@koha.org>
 
 =cut
+