X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FReportGenerator.pm;h=f3030b2840392a74af2562b7fa84f47d7aaed745;hb=0a25d5a4019fabab620cae0ff7a0a713d132d2fa;hp=dbdbf72c9b954c08ee39e54a2062ac466f218fc9;hpb=49f0957f2d464a13f5cf46566333bc2293cf106b;p=kivitendo-erp.git diff --git a/SL/ReportGenerator.pm b/SL/ReportGenerator.pm index dbdbf72c9..f3030b284 100644 --- a/SL/ReportGenerator.pm +++ b/SL/ReportGenerator.pm @@ -37,7 +37,7 @@ sub new { 'quote_char' => '"', 'sep_char' => ';', 'escape_char' => '"', - 'eol_style' => 'DOS', + 'eol_style' => 'Unix', 'headers' => 1, }, }; @@ -93,18 +93,26 @@ sub add_data { my $last_row_set; while (my $arg = shift) { + my $row_set; + if ('ARRAY' eq ref $arg) { - push @{ $self->{data} }, $arg; - $last_row_set = $arg; + $row_set = $arg; } elsif ('HASH' eq ref $arg) { - my $row_set = [ $arg ]; - push @{ $self->{data} }, $row_set; - $last_row_set = $row_set; + $row_set = [ $arg ]; } else { $self->{form}->error('Incorrect usage -- expecting hash or array ref'); } + + foreach my $row (@{ $row_set }) { + foreach my $field (qw(data link)) { + map { $row->{$_}->{$field} = [ $row->{$_}->{$field} ] if (ref $row->{$_}->{$field} ne 'ARRAY') } keys %{ $row }; + } + } + + push @{ $self->{data} }, $row_set; + $last_row_set = $row_set; } return $last_row_set; @@ -116,6 +124,13 @@ sub add_separator { push @{ $self->{data} }, { 'type' => 'separator' }; } +sub add_control { + my $self = shift; + my $data = shift; + + push @{ $self->{data} }, $data; +} + sub clear_data { my $self = shift; @@ -158,24 +173,34 @@ sub set_export_options { }; } +sub get_attachment_basename { + my $self = shift; + my $filename = $self->{options}->{attachment_basename} || 'report'; + $filename =~ s|.*\\||; + $filename =~ s|.*/||; + + 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(); @@ -184,7 +209,7 @@ sub generate_with_headers { $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)'); } } @@ -234,9 +259,11 @@ sub prepare_html_content { foreach my $row_set (@{ $self->{data} }) { if ('HASH' eq ref $row_set) { my $row_data = { - 'IS_CONTROL' => 1, - 'IS_SEPARATOR' => $row_set->{type} eq 'separator', - 'NUM_COLUMNS' => scalar @visible_columns, + 'IS_CONTROL' => 1, + 'IS_SEPARATOR' => $row_set->{type} eq 'separator', + 'IS_COLSPAN_DATA' => $row_set->{type} eq 'colspan_data', + 'NUM_COLUMNS' => scalar @visible_columns, + 'data' => $row_set->{data}, }; push @rows, $row_data; @@ -249,7 +276,16 @@ sub prepare_html_content { foreach my $row (@{ $row_set }) { $inner_idx++; - map { $row->{$_}->{data} = $self->html_format($row->{$_}->{data}) } @visible_columns; + foreach my $col_name (@visible_columns) { + my $col = $row->{$col_name}; + $col->{CELL_ROWS} = [ ]; + foreach my $i (0 .. scalar(@{ $col->{data} })) { + push @{ $col->{CELL_ROWS} }, { + 'data' => $self->html_format($col->{data}->[$i]), + 'link' => $col->{link}->[$i], + }; + }; + } my $row_data = { 'COLUMNS' => [ map { $row->{$_} } @visible_columns ], @@ -381,6 +417,7 @@ END 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|; @@ -447,7 +484,11 @@ sub generate_csv_content { foreach my $row_set (@{ $self->{data} }) { next if ('ARRAY' ne ref $row_set); foreach my $row (@{ $row_set }) { - $csv->print($stdout, [ map { $row->{$_}->{data} } @visible_columns ]); + my @data; + foreach my $col (@visible_columns) { + push @data, join($eol, map { s/\r?\n/$eol/g; $_ } @{ $row->{$col}->{data} }); + } + $csv->print($stdout, \@data); } } }