X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FRecordLinks.pm;h=6229cfe43389dcb1bdfefa8f053973e780148b45;hb=90daea72226506cd9f797ba2bfd7d3c39e19fe3e;hp=d421714157e085920695c4bef4e371131332fc3c;hpb=c42d0a36ebb2ff30748328f9d6380bb5f70ef77a;p=kivitendo-erp.git diff --git a/SL/RecordLinks.pm b/SL/RecordLinks.pm index d42171415..6229cfe43 100644 --- a/SL/RecordLinks.pm +++ b/SL/RecordLinks.pm @@ -2,6 +2,8 @@ package RecordLinks; use SL::Common; use SL::DBUtils; +use Data::Dumper; +use List::Util qw(reduce); sub create_links { $main::lxdebug->enter_sub(); @@ -109,4 +111,63 @@ sub get_links { return wantarray ? @{ $links } : $links; } +sub get_links_via { + $main::lxdebug->enter_sub(); + + use SL::MoreCommon; + use Data::Dumper; + + my $self = shift; + my %params = @_; + + Common::check_params(\%params, [ qw(from_table from_id to_table to_id) ]); + Common::check_params(\%params, "via"); + + my @hops = ref $params{via} eq 'ARRAY' + ? @{ $params{via} } + : $params{via}; + unshift @hops, +{ table => $params{from_table}, id => $params{from_id} }; + push @hops, +{ table => $params{to_table}, id => $params{to_id} }; + + my $myconfig = \%main::myconfig; + my $form = $main::form; + + my $last_hop = shift @hops; + my @links; + for my $hop (@hops) { + + my @temp_links = $self->get_links( + from_table => $last_hop->{table}, + from_id => $last_hop->{id}, + to_table => $hop->{table}, + to_id => $hop->{id}, + ); + + # short circuit if any of these are empty + return wantarray ? () : [] unless scalar @temp_links; + + push @links, \@temp_links; + $last_hop = $hop; + } + + my $result = reduce { + [ + grep { $_ } + cross { + if ( $a->{to_table} eq $b->{from_table} + && $a->{to_id} eq $b->{from_id} ) { + +{ from_table => $a->{from_table}, + from_id => $a->{from_id}, + to_table => $b->{to_table}, + to_id => $b->{to_id} } + } + } @{ $a }, @{ $b } + ] + } @links; + + $main::lxdebug->leave_sub(); + + return wantarray ? @{ $result } : $result; +} + 1;