1 package SL::Controller::Helper::ReportGenerator;
 
   6 use List::Util qw(max);
 
  11 use SL::ReportGenerator;
 
  13 use Exporter 'import';
 
  15   action_report_generator_export_as_pdf action_report_generator_export_as_csv
 
  16   action_report_generator_back report_generator_do
 
  17   report_generator_list_objects
 
  20 sub action_report_generator_export_as_pdf {
 
  22   if ($::form->{report_generator_pdf_options_set}) {
 
  23     my $saved_form = save_form();
 
  25     $self->report_generator_do('PDF');
 
  27     if ($::form->{report_generator_printed}) {
 
  28       restore_form($saved_form);
 
  29       $::form->{MESSAGE} = $::locale->text('The list has been printed.');
 
  30       $self->report_generator_do('HTML');
 
  36   my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
 
  38   $::form->get_lists('printers' => 'ALL_PRINTERS');
 
  39   map { $_->{selected} = $::myconfig{default_printer_id} == $_->{id} } @{ $::form->{ALL_PRINTERS} };
 
  41   $::form->{copies} = max $::myconfig{copies} * 1, 1;
 
  42   $::form->{title} = $::locale->text('PDF export -- options');
 
  44   print $::form->parse_html_template('report_generator/pdf_export_options', {
 
  45     'HIDDEN'               => \@form_values,
 
  46     'ALLOW_FONT_SELECTION' => SL::ReportGenerator->check_for_pdf_api, });
 
  49 sub action_report_generator_export_as_csv {
 
  51   if ($::form->{report_generator_csv_options_set}) {
 
  52     $self->report_generator_do('CSV');
 
  56   my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
 
  58   $::form->{title} = $::locale->text('CSV export -- options');
 
  60   print $::form->parse_html_template('report_generator/csv_export_options', { 'HIDDEN' => \@form_values });
 
  63 sub action_report_generator_back {
 
  64   $_[0]->report_generator_do('HTML');
 
  67 sub report_generator_do {
 
  68   my ($self, $format)  = @_;
 
  70   my $nextsub = $::form->{report_generator_nextsub};
 
  72     $::form->error($::locale->text('report_generator_nextsub is not defined.'));
 
  75   foreach my $key (split m/ +/, $::form->{report_generator_variable_list}) {
 
  76     $::form->{$key} = $::form->{"report_generator_hidden_${key}"};
 
  79   $::form->{report_generator_output_format} = $format;
 
  81   delete @{$::form}{map { "report_generator_$_" } qw(nextsub variable_list)};
 
  83   $self->_run_action($nextsub);
 
  86 sub report_generator_list_objects {
 
  87   my ($self, %params) = @_;
 
  89   croak "Parameter 'objects' must exist and be an array reference"                if                      ref($params{objects}) ne 'ARRAY';
 
  90   croak "Parameter 'report' must exist and be an instance of SL::ReportGenerator" if                      ref($params{report})  ne 'SL::ReportGenerator';
 
  91   croak "Parameter 'options', if exists, must be a hash reference"                if $params{options} && (ref($params{options}) ne 'HASH');
 
  92   $params{layout} //= 1;
 
  94   my $column_defs = $params{report}->{columns};
 
  95   my @columns     = $params{report}->get_visible_columns('HTML');
 
  97   for my $obj (@{ $params{objects} || [] }) {
 
  99       my $def = $column_defs->{$_};
 
 101         raw_data => $def->{raw_data} ? $def->{raw_data}->($obj) : '',
 
 102         data     => $def->{sub}      ? $def->{sub}->($obj)
 
 103                   : $obj->can($_)    ? $obj->$_
 
 105         link     => $def->{obj_link} ? $def->{obj_link}->($obj) : '',
 
 109     $params{data_callback}->(\%data) if $params{data_callback};
 
 111     $params{report}->add_data(\%data);
 
 114   if ($params{layout}) {
 
 115     return $params{report}->generate_with_headers(%{ $params{options} || {}});
 
 117     my $html = $params{report}->generate_html_content(%{ $params{options} || {}});
 
 118     $self->render(\$html , { layout => 0, process => 0 });
 
 131 SL::Controller::Helper::ReportGenerator - Mixin for controllers that
 
 132 use the L<SL::ReportGenerator> class
 
 136   package SL::Controller::Unicorn;
 
 138   use SL::Controller::Helper::ReportGenerator;
 
 143     # Set up the report generator instance. In this example this is
 
 144     # hidden in "prepare_report".
 
 145     my $report = $self->prepare_report;
 
 147     # Get objects from database.
 
 148     my $orders = SL::DB::Manager::Order->get_all(...);
 
 150     # Let report generator create the output.
 
 151     $self->report_generator_list_objects(
 
 161 =item C<action_report_generator_back>
 
 163 This is the controller action that's called from the one of the report
 
 164 generator's 'export options' pages when the user clicks on the 'back'
 
 167 It is never called from a controller manually and should just work
 
 170 =item C<action_report_generator_export_as_csv>
 
 172 This is the controller action that's called from the generated report
 
 173 when the user wants to export as CSV. First the CSV export options are
 
 174 shown and afterwards the CSV file is generated and offered for
 
 177 It is never called from a controller manually and should just work
 
 180 =item C<action_report_generator_export_as_pdf>
 
 182 This is the controller action that's called from the generated report
 
 183 when the user wants to export as PDF. First the PDF export options are
 
 184 shown and afterwards the PDF file is generated and offered for
 
 187 It is never called from a controller manually and should just work
 
 190 =item C<report_generator_do>
 
 192 This is a common function that's called from
 
 193 L<action_report_generator_back>,
 
 194 L<action_report_generator_export_as_csv> and
 
 195 L<action_report_generator_export_as_pdf>. It handles common options
 
 196 and report generation after options have been set.
 
 198 It is never called from a controller manually and should just work
 
 201 =item C<report_generator_list_objects %params>
 
 203 Iterates over all objects, creates the actual rows of data, hands them
 
 204 over to the report generator and lets the report generator create the
 
 207 C<%params> can contain the following values:
 
 213 Mandatory. An instance of L<SL::ReportGenerator> that has been set up
 
 214 already (column definitions, title, sort handling etc).
 
 218 Mandatory. An array reference of RDBO models to output.
 
 220 =item C<data_callback>
 
 222 Optional. A callback handler (code reference) that gets called for
 
 223 each row before it is passed to the report generator. The row passed
 
 224 will be the handler's first and only argument (a hash reference). It's
 
 225 the same hash reference that's passed to
 
 226 L<SL::ReportGenrator/add_data>.
 
 230 An optional hash reference that's passed verbatim to the function
 
 231 L<SL::ReportGenerator/generate_with_headers>.
 
 243 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>