X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FReportGenerator.pm;h=0a61195c919ec52a75f66f7b05c838de0ea8193a;hb=8172364e826b9d37fb977078a0eafb30450cf9ef;hp=e965e442294fe964e441e8059f98df04d54f48bd;hpb=dbda14c263efd93aca3b7114015a47d86b8581e3;p=kivitendo-erp.git diff --git a/SL/ReportGenerator.pm b/SL/ReportGenerator.pm index e965e4422..0a61195c9 100644 --- a/SL/ReportGenerator.pm +++ b/SL/ReportGenerator.pm @@ -7,6 +7,8 @@ use Text::CSV_XS; #use PDF::Table; use strict; +use SL::Helper::GlAttachments qw(append_gl_pdf_attachments); +use SL::Helper::CreatePDF qw(merge_pdfs); # Cause locales.pl to parse these files: # parse_html_template('report_generator/html_report') @@ -47,6 +49,7 @@ sub new { 'escape_char' => '"', 'eol_style' => 'Unix', 'headers' => 1, + 'encoding' => 'UTF-8', }, }; $self->{export} = { @@ -121,7 +124,7 @@ sub add_data { $row->{$column}->{align} = $self->{columns}->{$column}->{align} unless (defined $row->{$column}->{align}); } - foreach my $field (qw(data link)) { + foreach my $field (qw(data link link_class)) { map { $row->{$_}->{$field} = [ $row->{$_}->{$field} ] if (ref $row->{$_}->{$field} ne 'ARRAY') } keys %{ $row }; } } @@ -287,6 +290,7 @@ sub prepare_html_content { 'align' => $column->{align}, 'link' => $column->{link}, 'text' => $column->{text}, + 'raw_header_data' => $column->{raw_header_data}, 'show_sort_indicator' => $name eq $opts->{sort_indicator_column}, 'sort_indicator_direction' => $opts->{sort_indicator_direction}, }; @@ -351,6 +355,7 @@ sub prepare_html_content { push @{ $col->{CELL_ROWS} }, { 'data' => '' . $self->html_format($col->{data}->[$i]), 'link' => $col->{link}->[$i], + link_class => $col->{link_class}->[$i], }; } @@ -401,6 +406,7 @@ sub prepare_html_content { 'EXPORT_NEXTSUB' => $self->{export}->{nextsub}, 'DATA_PRESENT' => $self->{data_present}, 'CONTROLLER_DISPATCH' => $opts->{controller_class}, + 'TABLE_CLASS' => $opts->{table_class}, }; return $variables; @@ -495,7 +501,9 @@ sub generate_pdf_content { foreach (0 .. $num_columns - 1) { push @{ $cell_props_row }, { 'background_color' => '#666666', - 'font_color' => '#ffffff', + # BUG PDF:Table -> 0.9.12: + # font_color is used in next row, so dont set font_color + # 'font_color' => '#ffffff', 'colspan' => $_ == 0 ? -1 : undef, }; } } @@ -652,6 +660,11 @@ sub generate_pdf_content { my $content = $pdf->stringify(); + $main::lxdebug->message(LXDebug->DEBUG2(),"addattachments ?? =".$form->{report_generator_addattachments}." GL=".$form->{GL}); + if ( $form->{report_generator_addattachments} eq 'yes' && $form->{GL}) { + $content = $self->append_gl_pdf_attachments($form,$content); + } + my $printer_command; if ($pdfopts->{print} && $pdfopts->{printer_id}) { $form->{printer_id} = $pdfopts->{printer_id}; @@ -700,10 +713,10 @@ sub _print_content { } sub _handle_quoting_and_encoding { - my ($self, $text, $do_unquote) = @_; + my ($self, $text, $do_unquote, $encoding) = @_; $text = $main::locale->unquote_special_chars('HTML', $text) if $do_unquote; - $text = Encode::encode('UTF-8', $text); + $text = Encode::encode($encoding || 'UTF-8', $text); return $text; } @@ -742,7 +755,7 @@ sub _generate_csv_content { if ($opts->{headers}) { if (!$self->{custom_headers}) { - $csv->print($stdout, [ map { $self->_handle_quoting_and_encoding($self->{columns}->{$_}->{text}, 1) } @visible_columns ]); + $csv->print($stdout, [ map { $self->_handle_quoting_and_encoding($self->{columns}->{$_}->{text}, 1, $opts->{encoding}) } @visible_columns ]); } else { foreach my $row (@{ $self->{custom_headers} }) { @@ -750,7 +763,7 @@ sub _generate_csv_content { foreach my $col (@{ $row }) { my $num_output = ($col->{colspan} && ($col->{colspan} > 1)) ? $col->{colspan} : 1; - push @{ $fields }, ($self->_handle_quoting_and_encoding($col->{text}, 1)) x $num_output; + push @{ $fields }, ($self->_handle_quoting_and_encoding($col->{text}, 1, $opts->{encoding})) x $num_output; } $csv->print($stdout, $fields); @@ -772,7 +785,7 @@ sub _generate_csv_content { my $num_output = ($row->{$col}{colspan} && ($row->{$col}->{colspan} > 1)) ? $row->{$col}->{colspan} : 1; $skip_next = $num_output - 1; - push @data, join($eol, map { s/\r?\n/$eol/g; $self->_handle_quoting_and_encoding($_, 0) } @{ $row->{$col}->{data} }); + push @data, join($eol, map { s/\r?\n/$eol/g; $self->_handle_quoting_and_encoding($_, 0, $opts->{encoding}) } @{ $row->{$col}->{data} }); push @data, ('') x $skip_next if ($skip_next); } @@ -817,7 +830,7 @@ Then there are too many results, you need pagination, you want to print or expor The ReportGenerator class was designed because this exact scenario happened about half a dozen times in kivitendo. It's purpose is to manage all those formating, culling, sorting, and templating. -Which makes it almost as complicated to use as doing the work for yourself. +Which makes it almost as complicated to use as doing the work by yourself. =head1 FUNCTIONS @@ -837,16 +850,21 @@ Sets the order of columns. Any columns not present here are appended in alphabet =item set_sort_indicator $column,$direction -Sets sorting ot the table by specifying a column and a direction, where the direction will be evaluated to ascending if true. -Note that this is only for displaying. The data has to be presented already sorted. +Sets sorting of the table by specifying a column and a direction, where the direction will be evaluated to ascending if true. +Note that this is only for displaying. The data has to have already been sorted when it was added. =item add_data \@data =item add_data \%data -Adds data to the report. A given hash_ref is interpreted as a single line of data, every array_ref as a collection of lines. -Every line will be expected to be in a kay => value format. Note that the rows have to be already sorted. -ReportGenerator does only colum sorting on its own, and provides links to sorting and visual cue as to which column was sorted by. +Adds data to the report. A given hash_ref is interpreted as a single line of +data, every array_ref as a collection of lines. Every line will be expected to +be in a key => value format. Note that the rows have to already have been +sorted. + +The ReportGenerator is only able to display pre-sorted data and to indicate by +which column and in which direction the data has been sorted via visual clues +in the column headers. It also provides links to invert the sort direction. =item add_separator @@ -855,12 +873,12 @@ Adds a separator line to the report. =item add_control \%data Adds a control element to the data. Control elements are an experimental feature to add functionality to a report the regular data cannot. -Every control element needs to set IS_CONTROL_DATA, in order to be recongnized by the template. +Every control element needs to set IS_CONTROL_DATA, in order to be recognized by the template. Currently the only control element is a colspan element, which can be used as a mini header further down the report. =item clear_data -Deletes all data filled into the report, but keeps options set. +Deletes all data added to the report, but keeps options set. =item set_options %options @@ -894,7 +912,7 @@ Escapes HTML characters in $value and substitutes newlines with '
'. Returns =item prepare_html_content $column,$name,@column_headers Parses the data, and sets internal data needed for certain output format. Must be called once before the template is invoked. -Should not be called extrenally, since all render and generate functions invoke it anyway. +Should not be called externally, since all render and generate functions invoke it anyway. =item generate_html_content @@ -1018,6 +1036,10 @@ End of line style. Default is Unix. Include headers? Default is yes. +=item encoding + +Character encoding. Default is UTF-8. + =back =head1 SEE ALO