1 package SL::Controller::Helper::ReportGenerator;
 
   6 use List::Util qw(max);
 
  10 use SL::ReportGenerator;
 
  12 use Exporter 'import';
 
  14   action_report_generator_export_as_pdf action_report_generator_export_as_csv
 
  15   action_report_generator_back report_generator_do
 
  16   report_generator_list_objects
 
  19 sub action_report_generator_export_as_pdf {
 
  22   delete $::form->{action_report_generator_export_as_pdf};
 
  24   if ($::form->{report_generator_pdf_options_set}) {
 
  25     my $saved_form = save_form();
 
  27     $self->report_generator_do('PDF');
 
  29     if ($::form->{report_generator_printed}) {
 
  30       restore_form($saved_form);
 
  31       $::form->{MESSAGE} = $::locale->text('The list has been printed.');
 
  32       $self->report_generator_do('HTML');
 
  38   my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
 
  40   $::form->get_lists('printers' => 'ALL_PRINTERS');
 
  41   map { $_->{selected} = $::myconfig{default_printer_id} == $_->{id} } @{ $::form->{ALL_PRINTERS} };
 
  43   $::form->{copies} = max $::myconfig{copies} * 1, 1;
 
  44   $::form->{title} = $::locale->text('PDF export -- options');
 
  46   print $::form->parse_html_template('report_generator/pdf_export_options', {
 
  47     'HIDDEN'               => \@form_values,
 
  48     'ALLOW_FONT_SELECTION' => SL::ReportGenerator->check_for_pdf_api, });
 
  51 sub action_report_generator_export_as_csv {
 
  54   delete $::form->{action_report_generator_export_as_csv};
 
  56   if ($::form->{report_generator_csv_options_set}) {
 
  57     $self->report_generator_do('CSV');
 
  61   my @form_values = $::form->flatten_variables(grep { ($_ ne 'login') && ($_ ne 'password') } keys %{ $::form });
 
  63   $::form->{title} = $::locale->text('CSV export -- options');
 
  65   print $::form->parse_html_template('report_generator/csv_export_options', { 'HIDDEN' => \@form_values });
 
  68 sub action_report_generator_back {
 
  69   $_[0]->report_generator_do('HTML');
 
  72 sub report_generator_do {
 
  73   my ($self, $format)  = @_;
 
  75   my $nextsub = $::form->{report_generator_nextsub};
 
  77     $::form->error($::locale->text('report_generator_nextsub is not defined.'));
 
  80   foreach my $key (split m/ +/, $::form->{report_generator_variable_list}) {
 
  81     $::form->{$key} = $::form->{"report_generator_hidden_${key}"};
 
  84   $::form->{report_generator_output_format} = $format;
 
  86   delete @{$::form}{map { "report_generator_$_" } qw(nextsub variable_list)};
 
  88   $self->_run_action($nextsub);
 
  91 sub report_generator_list_objects {
 
  92   my ($self, %params) = @_;
 
  94   croak "Parameter 'objects' must exist and be an array reference"                if                      ref($params{objects}) ne 'ARRAY';
 
  95   croak "Parameter 'report' must exist and be an instance of SL::ReportGenerator" if                      ref($params{report})  ne 'SL::ReportGenerator';
 
  96   croak "Parameter 'options', if exists, must be a hash reference"                if $params{options} && (ref($params{options}) ne 'HASH');
 
  97   $params{layout} //= 1;
 
  99   my $column_defs = $params{report}->{columns};
 
 100   my @columns     = $params{report}->get_visible_columns('HTML');
 
 102   for my $obj (@{ $params{objects} || [] }) {
 
 104       my $def = $column_defs->{$_};
 
 106         raw_data => $def->{raw_data} ? $def->{raw_data}->($obj) : '',
 
 107         data     => $def->{sub}      ? $def->{sub}->($obj)
 
 108                   : $obj->can($_)    ? $obj->$_
 
 110         link     => $def->{obj_link} ? $def->{obj_link}->($obj) : '',
 
 114     $params{data_callback}->(\%data) if $params{data_callback};
 
 116     $params{report}->add_data(\%data);
 
 119   if ($params{layout}) {
 
 120     return $params{report}->generate_with_headers(%{ $params{options} || {}});
 
 122     my $html = $params{report}->generate_html_content(%{ $params{options} || {}});
 
 123     $self->render(\$html , { layout => 0, process => 0 });
 
 136 SL::Controller::Helper::ReportGenerator - Mixin for controllers that
 
 137 use the L<SL::ReportGenerator> class
 
 141   package SL::Controller::Unicorn;
 
 143   use SL::Controller::Helper::ReportGenerator;
 
 148     # Set up the report generator instance. In this example this is
 
 149     # hidden in "prepare_report".
 
 150     my $report = $self->prepare_report;
 
 152     # Get objects from database.
 
 153     my $orders = SL::DB::Manager::Order->get_all(...);
 
 155     # Let report generator create the output.
 
 156     $self->report_generator_list_objects(
 
 166 =item C<action_report_generator_back>
 
 168 This is the controller action that's called from the one of the report
 
 169 generator's 'export options' pages when the user clicks on the 'back'
 
 172 It is never called from a controller manually and should just work
 
 175 =item C<action_report_generator_export_as_csv>
 
 177 This is the controller action that's called from the generated report
 
 178 when the user wants to export as CSV. First the CSV export options are
 
 179 shown and afterwards the CSV file is generated and offered for
 
 182 It is never called from a controller manually and should just work
 
 185 =item C<action_report_generator_export_as_pdf>
 
 187 This is the controller action that's called from the generated report
 
 188 when the user wants to export as PDF. First the PDF export options are
 
 189 shown and afterwards the PDF file is generated and offered for
 
 192 It is never called from a controller manually and should just work
 
 195 =item C<report_generator_do>
 
 197 This is a common function that's called from
 
 198 L<action_report_generator_back>,
 
 199 L<action_report_generator_export_as_csv> and
 
 200 L<action_report_generator_export_as_pdf>. It handles common options
 
 201 and report generation after options have been set.
 
 203 It is never called from a controller manually and should just work
 
 206 =item C<report_generator_list_objects %params>
 
 208 Iterates over all objects, creates the actual rows of data, hands them
 
 209 over to the report generator and lets the report generator create the
 
 212 C<%params> can contain the following values:
 
 218 Mandatory. An instance of L<SL::ReportGenerator> that has been set up
 
 219 already (column definitions, title, sort handling etc).
 
 223 Mandatory. An array reference of RDBO models to output.
 
 225 =item C<data_callback>
 
 227 Optional. A callback handler (code reference) that gets called for
 
 228 each row before it is passed to the report generator. The row passed
 
 229 will be the handler's first and only argument (a hash reference). It's
 
 230 the same hash reference that's passed to
 
 231 L<SL::ReportGenrator/add_data>.
 
 235 An optional hash reference that's passed verbatim to the function
 
 236 L<SL::ReportGenerator/generate_with_headers>.
 
 248 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>