Bug 6024 : add "Run report" link on the new report creation success page
[koha.git] / C4 / Reports / Guided.pm
index 9f64cd9..194c623 100644 (file)
@@ -13,12 +13,12 @@ package C4::Reports::Guided;
 # 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, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 use strict;
-# use warnings;  # FIXME: this module needs a lot of repair to run clean under warnings
+#use warnings; FIXME - Bug 2505 this module needs a lot of repair to run clean under warnings
 use CGI;
 use Carp;
 
@@ -29,7 +29,6 @@ use C4::Output;
 use C4::Dates;
 use XML::Simple;
 use XML::Dumper;
-use Switch;
 use C4::Debug;
 # use Smart::Comments;
 # use Data::Dumper;
@@ -44,7 +43,7 @@ BEGIN {
            save_report get_saved_reports execute_query get_saved_report create_compound run_compound
                get_column_type get_distinct_values save_dictionary get_from_dictionary
                delete_definition delete_report format_results get_sql
-        select_2_select_count_value update_sql
+        nb_rows update_sql
        );
 }
 
@@ -107,7 +106,7 @@ if (C4::Context->preference('item-level_itypes')) {
 }
 
 =head1 NAME
-   
+
 C4::Reports::Guided - Module for generating guided reports 
 
 =head1 SYNOPSIS
@@ -116,6 +115,7 @@ C4::Reports::Guided - Module for generating guided reports
 
 =head1 DESCRIPTION
 
+=cut
 
 =head1 METHODS
 
@@ -311,95 +311,94 @@ sub get_criteria {
     my ($area,$cgi) = @_;
     my $dbh    = C4::Context->dbh();
     my $crit   = $criteria{$area};
-       my $column_defs = _get_column_defs($cgi);
+    my $column_defs = _get_column_defs($cgi);
     my @criteria_array;
     foreach my $localcrit (@$crit) {
         my ( $value, $type )   = split( /\|/, $localcrit );
         my ( $table, $column ) = split( /\./, $value );
-       switch ($type) {
-           case 'textrange' {
-               my %temp;
-               $temp{'name'}        = $value;
-               $temp{'from'}        = "from_" . $value;
-               $temp{'to'}          = "to_" . $value;
-               $temp{'textrange'}   = 1;
-               $temp{'description'} = $column_defs->{$value};
-               push @criteria_array, \%temp;
-           }
-
-           case 'date' {
-               my %temp;
-               $temp{'name'}        = $value;
-               $temp{'date'}        = 1;
-               $temp{'description'} = $column_defs->{$value};
-               push @criteria_array, \%temp;
-           }
-
-           case 'daterange' {
-               my %temp;
-               $temp{'name'}        = $value;
-               $temp{'from'}        = "from_" . $value;
-               $temp{'to'}          = "to_" . $value;
-               $temp{'daterange'}   = 1;
-               $temp{'description'} = $column_defs->{$value};
-               push @criteria_array, \%temp;
-           }
-
-           else {
-               my $query =
-                 "SELECT distinct($column) as availablevalues FROM $table";
-               my $sth = $dbh->prepare($query);
-               $sth->execute();
-               my @values;
-        # push the runtime choosing option
-        my $list;
-        $list='branches' if $column eq 'branchcode' or $column eq 'holdingbranch' or $column eq 'homebranch';
-        $list='categorycode' if $column eq 'categorycode';
-        $list='itemtype' if $column eq 'itype';
-        $list='ccode' if $column eq 'ccode';
-        # TODO : improve to let the librarian choose the description at runtime
-        push @values, { availablevalues => "<<$column".($list?"|$list":'').">>" };
-               while ( my $row = $sth->fetchrow_hashref() ) {
-                   push @values, $row;
-                   if ($row->{'availablevalues'} eq '') { $row->{'default'} = 1 };
-               }
-               $sth->finish();
+        if ($type eq 'textrange') {
+            my %temp;
+            $temp{'name'}        = $value;
+            $temp{'from'}        = "from_" . $value;
+            $temp{'to'}          = "to_" . $value;
+            $temp{'textrange'}   = 1;
+            $temp{'description'} = $column_defs->{$value};
+            push @criteria_array, \%temp;
+        }
+        elsif ($type eq 'date') {
+            my %temp;
+            $temp{'name'}        = $value;
+            $temp{'date'}        = 1;
+            $temp{'description'} = $column_defs->{$value};
+            push @criteria_array, \%temp;
+        }
+        elsif ($type eq 'daterange') {
+            my %temp;
+            $temp{'name'}        = $value;
+            $temp{'from'}        = "from_" . $value;
+            $temp{'to'}          = "to_" . $value;
+            $temp{'daterange'}   = 1;
+            $temp{'description'} = $column_defs->{$value};
+            push @criteria_array, \%temp;
+        }
+        else {
+            my $query =
+            "SELECT distinct($column) as availablevalues FROM $table";
+            my $sth = $dbh->prepare($query);
+            $sth->execute();
+            my @values;
+            # push the runtime choosing option
+            my $list;
+            $list='branches' if $column eq 'branchcode' or $column eq 'holdingbranch' or $column eq 'homebranch';
+            $list='categorycode' if $column eq 'categorycode';
+            $list='itemtype' if $column eq 'itype';
+            $list='ccode' if $column eq 'ccode';
+            # TODO : improve to let the librarian choose the description at runtime
+            push @values, { availablevalues => "<<$column".($list?"|$list":'').">>" };
+            while ( my $row = $sth->fetchrow_hashref() ) {
+                push @values, $row;
+                if ($row->{'availablevalues'} eq '') { $row->{'default'} = 1 };
+            }
+            $sth->finish();
 
-               my %temp;
-               $temp{'name'}        = $value;
-               $temp{'description'} = $column_defs->{$value};
-               $temp{'values'}      = \@values;
-               
-               push @criteria_array, \%temp;
-     
-           }
+            my %temp;
+            $temp{'name'}        = $value;
+            $temp{'description'} = $column_defs->{$value};
+            $temp{'values'}      = \@values;
+
+            push @criteria_array, \%temp;
+        }
 
-       }
     }
     return ( \@criteria_array );
 }
 
+sub nb_rows($) {
+    my $sql = shift or return;
+    my $sth = C4::Context->dbh->prepare($sql);
+    $sth->execute();
+    my $rows = $sth->fetchall_arrayref();
+    return scalar (@$rows);
+}
+
 =item execute_query
 
-=over
+  ($results, $total, $error) = execute_query($sql, $offset, $limit)
 
-($results, $total, $error) = execute_query($sql, $offset, $limit)
 
-=back
+When passed C<$sql>, this function returns an array ref containing a result set
+suitably formatted for display in html or for output as a flat file when passed in
+C<$format> and C<$id>. It also returns the C<$total> records available for the
+supplied query. If passed any query other than a SELECT, or if there is a db error,
+C<$errors> an array ref is returned containing the error after this manner:
 
-    When passed C<$sql>, this function returns an array ref containing a result set
-    suitably formatted for display in html or for output as a flat file when passed in
-    C<$format> and C<$id>. It also returns the C<$total> records available for the
-    supplied query. If passed any query other than a SELECT, or if there is a db error,
-    C<$errors> an array ref is returned containing the error after this manner:
+C<$error->{'sqlerr'}> contains the offending SQL keyword.
+C<$error->{'queryerr'}> contains the native db engine error returned for the query.
 
-    C<$error->{'sqlerr'}> contains the offending SQL keyword.
-    C<$error->{'queryerr'}> contains the native db engine error returned for the query.
-    
-    Valid values for C<$format> are 'text,' 'tab,' 'csv,' or 'url. C<$sql>, C<$type>,
-    C<$offset>, and C<$limit> are required parameters. If a valid C<$format> is passed
-    in, C<$offset> and C<$limit> are ignored for obvious reasons. A LIMIT specified by
-    the user in a user-supplied SQL query WILL apply in any case.
+Valid values for C<$format> are 'text,' 'tab,' 'csv,' or 'url. C<$sql>, C<$type>,
+C<$offset>, and C<$limit> are required parameters. If a valid C<$format> is passed
+in, C<$offset> and C<$limit> are ignored for obvious reasons. A LIMIT specified by
+the user in a user-supplied SQL query WILL apply in any case.
 
 =cut
 
@@ -408,16 +407,6 @@ sub get_criteria {
 #  ~ remove any LIMIT clause
 #  ~ repace SELECT clause w/ SELECT count(*)
 
-sub select_2_select_count_value ($) {
-    my $sql = shift or return;
-    my $countsql = select_2_select_count($sql);
-    $debug and warn "original query: $sql\ncount query: $countsql\n";
-    my $sth1 = C4::Context->dbh->prepare($countsql);
-    $sth1->execute();
-    my $total = $sth1->fetchrow();
-    $debug and warn "total records for this query: $total\n";
-    return $total;
-}
 sub select_2_select_count ($) {
     # Modify the query passed in to create a count query... (I think this covers all cases -crn)
     my ($sql) = strip_limit(shift) or return;
@@ -441,7 +430,7 @@ sub execute_query ($;$$$) {
         return;
     }
     $offset = 0    unless $offset;
-    $limit  = 9999 unless $limit;
+    $limit  = 999999 unless $limit;
     $debug and print STDERR "execute_query($sql, $offset, $limit)\n";
     if ($sql =~ /;?\W?(UPDATE|DELETE|DROP|INSERT|SHOW|CREATE)\W/i) {
         return (undef, {  sqlerr => $1} );
@@ -460,7 +449,7 @@ sub execute_query ($;$$$) {
     if (defined($userlimit)) {
         if ($offset + $limit > $userlimit ) {
             $limit = $userlimit - $offset;
-        } elsif ( ! $offset && $limit > $userlimit ) {
+        } elsif ( ! $offset && $limit < $userlimit ) {
             $limit = $userlimit;
         }
     }
@@ -477,7 +466,8 @@ sub execute_query ($;$$$) {
 
 =item save_report($sql,$name,$type,$notes)
 
-Given some sql and a name this will saved it so that it can resued
+Given some sql and a name this will saved it so that it can reused
+Returns id of the newly created report
 
 =cut
 
@@ -487,8 +477,10 @@ sub save_report {
     $sql =~ s/(\s*\;\s*)$//; # removes trailing whitespace and /;/
     my $query =
 "INSERT INTO saved_sql (borrowernumber,date_created,last_modified,savedsql,report_name,type,notes)  VALUES (?,now(),now(),?,?,?,?)";
-    my $sth = $dbh->prepare($query);
-    $sth->execute( $borrowernumber, $sql, $name, $type, $notes );
+    $dbh->do( $query, undef, $borrowernumber, $sql, $name, $type, $notes );
+    my $id = $dbh->selectrow_array("SELECT max(id) FROM saved_sql WHERE borrowernumber=? AND report_name=?", undef,
+                                   $borrowernumber, $name);
+    return $id;
 }
 
 sub update_sql {
@@ -724,8 +716,9 @@ sub _get_column_defs {
        my $full_path_to_columns_def_file="$htdocs/$theme/$lang/$columns_def_file";    
        open (COLUMNS,$full_path_to_columns_def_file);
        while (my $input = <COLUMNS>){
+               chomp $input;
                my @row =split(/\t/,$input);
-               $columns{$row[0]}=$row[1];
+               $columns{$row[0]}= $row[1];
        }
 
        close COLUMNS;