Der ReportGenerator macht selber ein Quoting der HTML-Zeichen, um Zeilenumbrüche...
[kivitendo-erp.git] / SL / ReportGenerator.pm
index 306236f..59a878b 100644 (file)
@@ -1,6 +1,7 @@
 package SL::ReportGenerator;
 
 use IO::Wrap;
+use List::Util qw(max);
 use Text::CSV_XS;
 
 use SL::Form;
@@ -28,6 +29,9 @@ sub new {
       'margin_bottom'       => 1.5,
       'margin_right'        => 1.5,
       'number'              => 1,
+      'print'               => 0,
+      'printer_id'          => 0,
+      'copies'              => 1,
     },
     'csv_export'            => {
       'quote_char'          => '"',
@@ -154,57 +158,43 @@ sub set_export_options {
   };
 }
 
-sub generate_content {
-  my $self   = shift;
-  my $format = lc $self->{options}->{output_format};
-
-  if (!$self->{columns}) {
-    $self->{form}->error('Incorrect usage -- no columns specified');
-  }
-
-  if ($format eq 'html') {
-    return $self->generate_html_content();
-
-  } elsif ($format eq 'csv') {
-    return $self->generate_csv_content();
-
-  } elsif ($format eq 'pdf') {
-    return $self->generate_pdf_content();
+sub get_attachment_basename {
+  my $self     = shift;
+  my $filename =  $self->{options}->{attachment_basename} || 'report';
+  $filename    =~ s|.*\\||;
+  $filename    =~ s|.*/||;
 
-  } else {
-    $self->{form}->error('Incorrect usage -- unknown format (supported are HTML, CSV, PDF)');
-  }
+  return $filename;
 }
 
 sub generate_with_headers {
   my $self   = shift;
   my $format = lc $self->{options}->{output_format};
+  my $form   = $self->{form};
 
   if (!$self->{columns}) {
-    $self->{form}->error('Incorrect usage -- no columns specified');
+    $form->error('Incorrect usage -- no columns specified');
   }
 
-  my $filename =  $self->{options}->{attachment_basename} || 'report';
-  $filename    =~ s|.*\\||;
-  $filename    =~ s|.*/||;
-
   if ($format eq 'html') {
-    $self->{form}->{title} = $self->{title};
-    $self->{form}->header();
+    my $title      = $form->{title};
+    $form->{title} = $self->{title} if ($self->{title});
+    $form->header();
+    $form->{title} = $title;
+
     print $self->generate_html_content();
 
   } elsif ($format eq 'csv') {
+    my $filename = $self->get_attachment_basename();
     print qq|content-type: text/csv\n|;
     print qq|content-disposition: attachment; filename=${filename}.csv\n\n|;
     $self->generate_csv_content();
 
   } elsif ($format eq 'pdf') {
-    print qq|content-type: application/pdf\n|;
-    print qq|content-disposition: attachment; filename=${filename}.pdf\n\n|;
     $self->generate_pdf_content();
 
   } else {
-    $self->{form}->error('Incorrect usage -- unknown format (supported are HTML, CSV, PDF)');
+    $form->error('Incorrect usage -- unknown format (supported are HTML, CSV, PDF)');
   }
 }
 
@@ -368,6 +358,13 @@ BODY {
 END
   ;
 
+  my $printer_command;
+  if ($opt->{print} && $opt->{printer_id}) {
+    $form->{printer_id} = $opt->{printer_id};
+    $form->get_printer_code($myconfig);
+    $printer_command = $form->{printer_command};
+  }
+
   my $cfg_file_name = Common::tmpname() . '-html2ps-config';
   my $cfg_file      = IO::File->new($cfg_file_name, 'w') || $form->error($locale->text('Could not write the html2ps config file.'));
 
@@ -391,12 +388,39 @@ END
 
   my $gs = IO::File->new("${cmdline} |");
   if ($gs) {
-    while (my $line = <$gs>) {
-      print $line;
+    my $content;
+
+    if (!$printer_command) {
+      my $filename = $self->get_attachment_basename();
+      print qq|content-type: application/pdf\n|;
+      print qq|content-disposition: attachment; filename=${filename}.pdf\n\n|;
+
+      while (my $line = <$gs>) {
+        print $line;
+      }
+
+    } else {
+      while (my $line = <$gs>) {
+        $content .= $line;
+      }
     }
+
     $gs->close();
     unlink $cfg_file_name, $html_file_name;
 
+    if ($printer_command && $content) {
+      foreach my $i (1 .. max $opt->{copies}, 1) {
+        my $printer = IO::File->new("| ${printer_command}");
+        if (!$printer) {
+          $form->error($locale->text('Could not spawn the printer command.'));
+        }
+        $printer->print($content);
+        $printer->close();
+      }
+
+      $form->{report_generator_printed} = 1;
+    }
+
   } else {
     unlink $cfg_file_name, $html_file_name;
     $form->error($locale->text('Could not spawn html2ps or GhostScript.'));