Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Controller / Helper / ReportGenerator / ControlRow.pm
1 package SL::Controller::Helper::ReportGenerator::ControlRow;
2
3 use strict;
4 use Carp;
5
6 use SL::Controller::Helper::ReportGenerator::ControlRow::ALL;
7
8 use Exporter 'import';
9 our @EXPORT = qw(
10   make_control_row
11 );
12
13
14 sub make_control_row {
15   my ($type, %args) = @_;
16
17   my $class  = $SL::Controller::Helper::ReportGenerator::ControlRow::ALL::type_to_class{$type} // croak "unknown type $type";
18   my $obj    = $class->new(params => \%args);
19   my @errors = $obj->validate_params;
20   croak join("\n", @errors) if @errors;
21
22   return $obj;
23 }
24
25
26 1;
27
28 __END__
29
30 =encoding utf-8
31
32 =head1 NAME
33
34 SL::Controller::Helper::ReportGenerator::ControlRow - an interface for
35 report generator control rows
36
37 =head1 DESCRIPTION
38
39 ControlRow is an interface that allows generic control rows to be added
40 to objects for the C<SL::Controller::Helper::ReportGenerator>.
41
42 Each control row implementation can access the report and add data for a row.
43
44 =head1 SYNOPSIS
45
46   package SL::Controller::TimeRecording;
47
48   use SL::Controller::Helper::ReportGenerator;
49   use SL::Controller::Helper::ReportGenerator::ControlRow qw(make_control_row);
50
51   sub action_list {
52     my ($self) = @_;
53
54     # Set up the report generator instance. In this example this is
55     # hidden in "prepare_report".
56     my $report = $self->prepare_report;
57
58     # Get objects from database.
59     my $objects = SL::DB::Manager::TimeRecording->get_all(...);
60
61     # Add a separator
62     push @$objects, make_control_row("separator");
63
64     # And a simple total
65     my $total = sum0 map { _round_total($_->duration_in_hours) } @$objects;
66     push @$objects, make_control_row("simple_data", data => {duration => $total});
67
68     # Let report generator create the output.
69     $self->report_generator_list_objects(
70       report  => $report,
71       objects => $objects,
72     );
73   }
74
75
76 =head1 WRITING OWN CONTROL ROW CLASSES
77
78 See C<SL::Controller::Helper::ReportGenerator::ControlRow::Base>.
79
80 =head1 FUNCTIONS
81
82 =over 4
83
84 =item C<make_control_row TYPE %PARAMS>
85
86 Returns an instance of the control row class for the given type. This
87 object can be used as an element of objects to the report generator helper
88 (see C<SL::Controller::Helper::ReportGenerator>).
89
90 Available types are 'separator', 'data, 'simple_data' for now.
91
92 C<%PARAMS> depends on the type. See also:
93
94 L<SL::Controller::Helper::ReportGenerator::ControlRow::ALL>
95 L<SL::Controller::Helper::ReportGenerator::ControlRow::*>
96
97 =back
98
99 =head1 AUTHOR
100
101 Bernd Bleßmann E<lt>bernd@kivitendo-premium.deE<gt>
102
103 =cut