Bug 30952: Fix background color of dialogs (message, alert, error)
[koha-ffzg.git] / C4 / Suggestions.pm
index 764c331..dc92c15 100644 (file)
@@ -18,24 +18,20 @@ package C4::Suggestions;
 # 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 Modern::Perl;
 use CGI qw ( -utf8 );
 
 use C4::Context;
 use C4::Output;
-use C4::Debug;
 use C4::Letters;
-use Koha::DateUtils;
+use C4::Biblio qw( GetMarcFromKohaField );
+use Koha::DateUtils qw( dt_from_string );
 use Koha::Suggestions;
 
-use List::MoreUtils qw(any);
 use base qw(Exporter);
 
 our @EXPORT  = qw(
   ConnectSuggestionAndBiblio
-  CountSuggestion
   DelSuggestion
   GetSuggestion
   GetSuggestionByStatus
@@ -45,9 +41,9 @@ our @EXPORT  = qw(
   ModStatus
   ModSuggestion
   NewSuggestion
-  SearchSuggestion
   DelSuggestionsOlderThan
   GetUnprocessedSuggestions
+  MarcRecordFromNewSuggestion
 );
 
 =head1 NAME
@@ -75,147 +71,6 @@ Suggestions done by other borrowers can be seen when not "AVAILABLE"
 
 =head1 FUNCTIONS
 
-=head2 SearchSuggestion
-
-(\@array) = &SearchSuggestion($suggestionhashref_to_search)
-
-searches for a suggestion
-
-return :
-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 ($suggestion) = @_;
-    my $dbh = C4::Context->dbh;
-    my @sql_params;
-    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,
-            BU.budget_name      AS budget_name
-        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
-            LEFT JOIN aqbudgets     AS BU ON budgetid=BU.budget_id
-        WHERE 1=1
-    }
-    );
-
-    # 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 ? };
-        }
-    }
-
-    # filter on user branch
-    if (   C4::Context->preference('IndependentBranches')
-        && !C4::Context->IsSuperLibrarian() )
-    {
-        # If IndependentBranches is set and the logged in user is not superlibrarian
-        # Then we want to filter by the user's library (i.e. cannot see suggestions from other libraries)
-        my $userenv = C4::Context->userenv;
-        if ($userenv) {
-            {
-                push @sql_params, $$userenv{branch};
-                push @query,      q{
-                    AND (suggestions.branchcode=? OR suggestions.branchcode='')
-                };
-            }
-        }
-    }
-    elsif (defined $suggestion->{branchcode}
-        && $suggestion->{branchcode}
-        && $suggestion->{branchcode} ne '__ANY__' )
-    {
-        # If IndependentBranches is not set OR the logged in user is not superlibrarian
-        # AND the branchcode filter is passed and not '__ANY__'
-        # Then we want to filter using this parameter
-        push @sql_params, $suggestion->{branchcode};
-        push @query,      qq{ AND suggestions.branchcode=? };
-    }
-
-    # 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 = ? };
-            }
-        }
-    }
-
-    # 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 });
-        }
-    }
-
-    $debug && warn "@query";
-    my $sth = $dbh->prepare("@query");
-    $sth->execute(@sql_params);
-    my @results;
-
-    # add status as field
-    while ( my $data = $sth->fetchrow_hashref ) {
-        $data->{ $data->{STATUS} } = 1;
-        push( @results, $data );
-    }
-
-    return ( \@results );
-}
-
 =head2 GetSuggestion
 
 \%sth = &GetSuggestion($suggestionid)
@@ -353,6 +208,7 @@ sub GetSuggestionByStatus {
             LEFT JOIN categories    AS C1 ON C1.categorycode=U1.categorycode
             LEFT JOIN branches      AS B1 on B1.branchcode=U1.branchcode
         WHERE status = ?
+        ORDER BY suggestionid
     };
 
     # filter on branch
@@ -377,61 +233,6 @@ sub GetSuggestionByStatus {
     return $results;
 }
 
-=head2 CountSuggestion
-
-&CountSuggestion($status)
-
-Count the number of aqorders 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;
-    my $sth;
-    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 (suggestions.branchcode='' OR suggestions.branchcode=?)
-        };
-        $sth = $dbh->prepare($query);
-        $sth->execute( $status, $userenv->{branch} );
-    }
-    else {
-        my $query = q{
-            SELECT count(*)
-            FROM suggestions
-            WHERE STATUS=?
-        };
-        $sth = $dbh->prepare($query);
-        $sth->execute($status);
-    }
-    my ($result) = $sth->fetchrow;
-    return $result;
-}
-
 =head2 NewSuggestion
 
 
@@ -448,6 +249,9 @@ sub NewSuggestion {
 
     $suggestion->{suggesteddate} = dt_from_string unless $suggestion->{suggesteddate};
 
+    delete $suggestion->{branchcode}
+      if defined $suggestion->{branchcode} and $suggestion->{branchcode} eq '';
+
     my $suggestion_object = Koha::Suggestion->new( $suggestion )->store;
     my $suggestion_id = $suggestion_object->suggestionid;
 
@@ -470,11 +274,7 @@ sub NewSuggestion {
             if ( $emailpurchasesuggestions eq "BranchEmailAddress" ) {
                 my $library =
                   Koha::Libraries->find( $full_suggestion->{branchcode} );
-                $toaddress =
-                     $library->branchreplyto
-                  || $library->branchemail
-                  || C4::Context->preference('ReplytoDefault')
-                  || C4::Context->preference('KohaAdminEmailAddress');
+                $toaddress = $library->inbound_email_address;
             }
             elsif ( $emailpurchasesuggestions eq "KohaAdminEmailAddress" ) {
                 $toaddress = C4::Context->preference('ReplytoDefault')
@@ -525,10 +325,11 @@ sub ModSuggestion {
     };
     return 0 if $@;
 
-    if ( $suggestion->{STATUS} ) {
+    if ( $suggestion->{STATUS} && $suggestion_object->suggestedby ) {
 
         # 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';
@@ -603,7 +404,9 @@ sub DelSuggestion {
     my $sth = $dbh->prepare($query);
     $sth->execute($suggestionid);
     my ($suggestedby) = $sth->fetchrow;
-    if ( $type eq 'intranet' || $suggestedby eq $borrowernumber ) {
+    $suggestedby //= '';
+    $borrowernumber //= '';
+    if ( defined $type && $type eq 'intranet' || $suggestedby eq $borrowernumber ) {
         my $queryDelete = q{
             DELETE FROM suggestions
             WHERE suggestionid=?
@@ -630,7 +433,7 @@ sub DelSuggestionsOlderThan {
         q{
         DELETE FROM suggestions
         WHERE STATUS<>'ASKED'
-            AND date < ADDDATE(NOW(), ?)
+            AND manageddate < ADDDATE(NOW(), ?)
     }
     );
     $sth->execute("-$days");
@@ -653,6 +456,56 @@ sub GetUnprocessedSuggestions {
     return $s;
 }
 
+=head2 MarcRecordFromNewSuggestion
+
+    $record = MarcRecordFromNewSuggestion ( $suggestion )
+
+This function build a marc record object from a suggestion
+
+=cut
+
+sub MarcRecordFromNewSuggestion {
+    my ($suggestion) = @_;
+    my $record = MARC::Record->new();
+
+    if (my $isbn = $suggestion->{isbn}) {
+        for my $field (qw(biblioitems.isbn biblioitems.issn)) {
+            my ($tag, $subfield) = GetMarcFromKohaField($field);
+            $record->append_fields(
+                MARC::Field->new($tag, ' ', ' ', $subfield => $isbn)
+            );
+        }
+    }
+    else {
+        my ($title_tag, $title_subfield) = GetMarcFromKohaField('biblio.title');
+        $record->append_fields(
+            MARC::Field->new($title_tag, ' ', ' ', $title_subfield => $suggestion->{title})
+        );
+
+        my ($author_tag, $author_subfield) = GetMarcFromKohaField('biblio.author');
+        if ($record->field( $author_tag )) {
+            $record->field( $author_tag )->add_subfields( $author_subfield => $suggestion->{author} );
+        }
+        else {
+            $record->append_fields(
+                MARC::Field->new($author_tag, ' ', ' ', $author_subfield => $suggestion->{author})
+            );
+        }
+    }
+
+    my ($it_tag, $it_subfield) = GetMarcFromKohaField('biblioitems.itemtype');
+    if ($record->field( $it_tag )) {
+        $record->field( $it_tag )->add_subfields( $it_subfield => $suggestion->{itemtype} );
+    }
+    else {
+        $record->append_fields(
+            MARC::Field->new($it_tag, ' ', ' ', $it_subfield => $suggestion->{itemtype})
+        );
+    }
+
+    return $record;
+}
+
 1;
 __END__