Bessere Parameterüberprüfung
[kivitendo-erp.git] / SL / DB / Helper / LinkedRecords.pm
1 package SL::DB::Helpers::LinkedRecords;
2
3 require Exporter;
4 our @ISA    = qw(Exporter);
5 our @EXPORT = qw(linked_records);
6
7 use Carp;
8
9 use SL::DB::Helpers::Mappings;
10 use SL::DB::RecordLink;
11
12 sub linked_records {
13   my $self     = shift;
14   my %params   = @_;
15
16   my $wanted   = $params{direction} || croak("Missing parameter `direction'");
17   my $myself   = $wanted eq 'from' ? 'to' : $wanted eq 'to' ? 'from' : croak("Invalid parameter `direction'");
18
19   my $my_table = SL::DB::Helpers::Mappings::get_table_for_package(ref($self));
20
21   my @query    = ( "${myself}_table" => $my_table,
22                    "${myself}_id"    => $self->id );
23
24   if ($params{$wanted}) {
25     my $wanted_table = SL::DB::Helpers::Mappings::get_table_for_package($params{$wanted}) || croak("Invalid parameter `${wanted}'");
26     push @query, ("${wanted}_table" => $wanted_table);
27   }
28
29   my $links            = SL::DB::Manager::RecordLink->get_all(query => [ and => \@query ]);
30
31   my $sub_wanted_table = "${wanted}_table";
32   my $sub_wanted_id    = "${wanted}_id";
33
34   my $records          = [];
35   @query               = ref($params{query}) eq 'ARRAY' ? @{ $params{query} } : ();
36
37   foreach my $link (@{ $links }) {
38     my $class = SL::DB::Helpers::Mappings::get_manager_package_for_table($link->$sub_wanted_table);
39     push @{ $records }, @{ $class->get_all(query => [ id => $link->$sub_wanted_id, @query ]) };
40   }
41
42   return $records;
43 }
44
45 1;
46
47 __END__
48
49 =encoding utf8
50
51 =head1 NAME
52
53 SL::DB::Helpers::LinkedRecords - Mixin for retrieving linked records via the table C<record_links>
54
55 =head1 FUNCTIONS
56
57 =over 4
58
59 =item C<linked_records %params>
60
61 Retrieves records linked from or to C<$self> via the table
62 C<record_links>. The mandatory parameter C<direction> (either C<from>
63 or C<to>) determines whether the function retrieves records that link
64 to C<$self> (for C<direction> = C<to>) or that are linked from
65 C<$self> (for C<direction> = C<from>).
66
67 The optional parameter C<from> or C<to> (same as C<direction>)
68 contains the package name of a Rose model for table limitation. If you
69 only need invoices created from an order C<$order> then the call could
70 look like this:
71
72   my $invoices = $order->linked_records(direction => 'to',
73                                         to        => 'SL::DB::Invoice');
74
75 The optional parameter C<query> can be used to limit the records
76 returned. The following call limits the earlier example to invoices
77 created today:
78
79   my $invoices = $order->linked_records(direction => 'to',
80                                         to        => 'SL::DB::Invoice',
81                                         query     => [ transdate => DateTime->today ]);
82
83 Returns an array reference.
84
85 =back
86
87 =head1 BUGS
88
89 Nothing here yet.
90
91 =head1 AUTHOR
92
93 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
94
95 =cut