Bug 5253: Add options to runreport.pl
authorJared Camins-Esakov <jcamins@bywatersolutions.com>
Tue, 29 Mar 2011 01:16:02 +0000 (21:16 -0400)
committerChris Nighswonger <chris.nighswonger@gmail.com>
Tue, 5 Apr 2011 00:03:34 +0000 (20:03 -0400)
This makes sending reports via e-mail with runreport.pl work properly. It also
adds a --format option to allow the user to select between text, html, csv, and
tsv. At the moment text is not implemented, and falls back to tsv, but that is
still more readable than the HTML that used to be produced.

Signed-off-by: Ian Walls <ian.walls@bywatersolutions.com>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
(cherry picked from commit 412966eff0016c69e5763197f1542e88c74580a1)

Signed-off-by: Chris Nighswonger <chris.nighswonger@gmail.com>
misc/cronjobs/runreport.pl

index 3187e92..8124845 100755 (executable)
@@ -52,6 +52,14 @@ runreport.pl [ -h | -m ] [ -v ] reportID [ reportID ... ]
    -m --man        full documentation, same as --help --verbose
    -v --verbose    verbose output
 
+   --format=s      selects format. Choice of text, html, csv, or tsv
+
+   -e --email      whether to use e-mail (implied by --to or --from)
+   --to=s          e-mail address to send report to
+   --from=s        e-mail address to send report from
+   --subject=s     subject for the e-mail
+
+
  Arguments:
    reportID        report ID Number from saved_sql.id, multiple ID's may be specified
 
@@ -71,6 +79,26 @@ Prints the manual page and exits.
 
 Verbose. Without this flag set, only fatal errors are reported.
 
+=item B<-format>
+
+Current options are text, html, csv, and tsv. At the moment, text and tsv both produce tab-separated tab-separated output.
+
+=item B<-email>
+
+Whether to use e-mail (implied by --to or --from).
+
+=item B<-to>
+
+E-mail address to send report to. Defaults to KohaAdminEmailAddress.
+
+=item B<-from>
+
+E-mail address to send report from. Defaults to KohaAdminEmailAddress.
+
+=item B<-subject>
+
+Subject for the e-mail message. Defaults to "Koha Saved Report"
+
 =back
 
 =head1 DESCRIPTION
@@ -92,17 +120,11 @@ Same as above, but also runs report #17.
 
 =over
 
-=item * 
-
-Complete testing for Sendmail related options: --email, --to, and --from.
 
 =item *
 
 Allow Saved Results option.
 
-=item *
-
-Possible --format option for CSV or tab-delimited output.
 
 =back
 
@@ -119,18 +141,21 @@ my $help    = 0;
 my $man     = 0;
 my $verbose = 0;
 my $email   = 0;
-my $format  = "";
+my $format  = "text";
 my $to      = "";
 my $from    = "";
 my $subject = 'Koha Saved Report';
+my $separator = ',';
+my $quote = '"';
 
 GetOptions(
     'help|?'     => \$help,
     'man'        => \$man,
     'verbose'    => \$verbose,
-    'format'     => \$format,
-    'to'         => \$to,
-    'from'       => \$from,
+    'format=s'   => \$format,
+    'to=s'       => \$to,
+    'from=s'     => \$from,
+    'subject=s'  => \$subject,
     'email'      => \$email,
 ) or pod2usage(2);
 pod2usage( -verbose => 2 ) if ($man);
@@ -139,8 +164,12 @@ pod2usage(1) if $help;
 
 unless ($format) {
     $verbose and print STDERR "No format specified, assuming 'text'\n";
-    $format = '';
-    # $format = 'text';
+    $format = 'text';
+}
+
+if ($format eq 'tsv' || $format eq 'text') {
+    $format = 'csv';
+    $separator = "\t";
 }
 
 if ($to or $from or $email) {
@@ -173,13 +202,31 @@ foreach my $report (@ARGV) {
     }
     $verbose and print "$count results from execute_query\n";
 
-    my $cgi = CGI->new();
-    my @rows = ();
-    while (my $line = $sth->fetchrow_arrayref) {
-        foreach (@$line) { defined($_) or $_ = ''; }    # catch undef values, replace w/ ''
-        push @rows, $cgi->TR( join('', $cgi->td($line)) ) . "\n";
+    my $message;
+    if ($format eq 'html') {
+        my $cgi = CGI->new();
+        my @rows = ();
+        while (my $line = $sth->fetchrow_arrayref) {
+            foreach (@$line) { defined($_) or $_ = ''; }    # catch undef values, replace w/ ''
+            push @rows, $cgi->TR( join('', $cgi->td($line)) ) . "\n";
+        }
+        $message = $cgi->table(join "", @rows);
+    } elsif ($format eq 'csv') {
+        my $csv = Text::CSV_XS->new({
+            quote_char  => $quote,
+            sep_char    => $separator,
+            });
+        while (my $line = $sth->fetchrow_arrayref) {
+            $csv->combine(@$line);
+#            foreach (@$line) {
+#                defined($_) or $_ = '';
+#                $_ =~ s/$quote/\\$quote/g;
+#                $_ = "$quote$_$quote";
+#            }    # catch undef values, replace w/ ''
+#            $message .= join ($separator, @$line) . "\n";
+            $message .= $csv->string() . "\n";
+        }
     }
-    my $message = $cgi->table(join "", @rows);
 
     if ($email){
         my %mail = (