use Text::CSV_XS;
use SL::DB::CustomDataExportQuery;
+use SL::Controller::Helper::ReportGenerator;
use SL::Locale::String qw(t8);
use Rose::Object::MakeMethods::Generic
(
scalar => [ qw(rows) ],
- 'scalar --get_set_init' => [ qw(query queries parameters today) ],
+ 'scalar --get_set_init' => [ qw(query queries parameters) ],
);
__PACKAGE__->run_before('check_auth');
sub action_list {
my ($self) = @_;
- $self->render('custom_data_export/list', title => $::locale->text('Execute a custom data export query'));
+ $self->render('custom_data_export/list', title => $::locale->text('Execute a custom report query'));
}
sub action_export {
my ($self) = @_;
- if (!$::form->{format}) {
+ if (!$::form->{parameters_set}) {
$self->setup_export_action_bar;
- return $self->render('custom_data_export/export', title => t8("Execute custom data export '#1'", $self->query->name));
+ return $self->render('custom_data_export/export', title => t8("Execute custom report '#1'", $self->query->name));
}
$self->execute_query;
if (scalar(@{ $self->rows // [] }) == 1) {
$self->setup_empty_result_set_action_bar;
- return $self->render('custom_data_export/empty_result_set', title => t8("Execute custom data export '#1'", $self->query->name));
+ return $self->render('custom_data_export/empty_result_set', title => t8("Execute custom report '#1'", $self->query->name));
}
+ my $report = SL::ReportGenerator->new(\%::myconfig, $::form);
- my $method = "export_as_" . $::form->{format};
- $self->$method;
+ my $report_name = $self->query->name;
+ $report_name =~ s{[^[:word:]]+}{_}ig;
+ $report_name .= strftime('_%Y-%m-%d_%H-%M-%S', localtime());
+
+ $report->set_options(
+ std_column_visibility => 1,
+ controller_class => 'CustomDataExport',
+ output_format => 'HTML',
+ top_info_text => $self->query->name,
+ title => $self->query->name,
+ allow_pdf_export => 1,
+ allow_csv_export => 1,
+ allow_chart_export => 1,
+ attachment_basename => $report_name,
+ );
+
+ my %column_defs;
+ foreach my $key (@{ $self->rows->[0] }) {
+ $column_defs{$key} = { text => $key, sub => sub { $_[0]->{$key} } };
+ }
+
+ $report->set_columns(%column_defs);
+ $report->set_column_order(@{ $self->rows->[0] });
+
+ $report->set_export_options(qw(export id parameters_set parameters));
+ $report->set_options_from_form;
+
+ # Setup data objects (which in this case is an array of hashes).
+ my @objects;
+ foreach my $set_idx (1..$#{ $self->rows }) {
+ my %row_set;
+ foreach my $key_idx (0..$#{ $self->rows->[0] }) {
+ my $key = $self->rows->[0]->[$key_idx];
+ my $value = $self->rows->[$set_idx]->[$key_idx];
+ $row_set{$key} = $value;
+ }
+ push @objects, \%row_set;
+ }
+
+ $self->report_generator_list_objects(report => $report,
+ objects => \@objects,
+ options => {
+ action_bar_additional_submit_values => { id => $::form->{id}, },
+ },
+ );
}
#
sub check_auth {
my ($self) = @_;
+ $::auth->assert('custom_data_report');
$::auth->assert($self->query->access_right) if $self->query->access_right;
}
sub init_query { $::form->{id} ? SL::DB::CustomDataExportQuery->new(id => $::form->{id})->load : SL::DB::CustomDataExportQuery->new }
sub init_parameters { [ sort_by { lc $_->name } @{ $_[0]->query->parameters // [] } ] }
-sub init_today { DateTime->today_local }
sub init_queries {
my %rights_map = %{ $::auth->load_rights_for_user($::form->{login}) };
for my $bar ($::request->layout->get('actionbar')) {
$bar->add(
action => [
- t8('Export'),
+ t8('Execute'),
submit => [ '#form', { action => 'CustomDataExport/export' } ],
checks => [ 'kivi.validate_form' ],
accesskey => 'enter',
]);
}
-sub export_as_csv {
- my ($self) = @_;
-
- my $csv = Text::CSV_XS->new({
- binary => 1,
- sep_char => ';',
- eol => "\n",
- });
-
- my ($file_handle, $file_name) = File::Temp::tempfile;
-
- binmode $file_handle, ":encoding(utf8)";
-
- $csv->print($file_handle, $_) for @{ $self->rows };
-
- $file_handle->close;
-
- my $report_name = $self->query->name;
- $report_name =~ s{[^[:word:]]+}{_}ig;
- $report_name .= strftime('_%Y-%m-%d_%H-%M-%S.csv', localtime());
-
- $self->send_file(
- $file_name,
- content_type => 'text/csv',
- name => $report_name,
- );
-}
-
1;