use utf8;
use warnings; no warnings "redefine";
use strict;

use Dbase::Globals qw(find_descr);
use Dbase::Help qw(DoSelect);

my $queue_ptr = find_descr( tickett => queue_ptr => 1 );

=head1 Funktionsname

verbundene_tickets

=head2 Eingabeparameter

=over 4

=item 1.

Liste von Ticket-IDs

=item 2.

(optional) Referenz auf eine Liste von Ticket-IDs

=back

=head2 Ausgabewerte

Numerisch aufsteigend sortierte Liste der IDs aller mit der in der ersten Liste
übergebenen Ticket-IDs verbundenen Tickets.
Wird die optionale Referenz auf eine zweite Liste übergeben, so werden
Verbindungen mit den darin enthaltenen Tickets nicht weiter verfolgt.

=cut

sub verbundene_tickets(@;\@) {
	return unless @_;
	my %tickets;
	@tickets{ @{+pop} } = () if ref $_[-1];
	@tickets{ my @tickets = @_ } = ();
	while (@tickets) {
		my @new_tickets;
		DoSelect { push @new_tickets, shift } <<_;
	SELECT dest_ticket.ticket
	FROM   ticket, ticket source_ticket, ticket dest_ticket, ticketid
	WHERE  ticketid.typ         = $queue_ptr
	   AND ticketid.ticket      = source_ticket.id
	   AND source_ticket.ticket = ticket.ticket
	   AND ticketid.inhalt      = dest_ticket.id
	   AND ticket.id              IN (${\ join ',',      @tickets })
	   AND dest_ticket.id     NOT IN (${\ join ',', keys %tickets })
	   AND dest_ticket.ticket NOT IN (${\ join ',', keys %tickets })
_
		@tickets{ @tickets = @new_tickets } = ();
	}
	return sort { $a <=> $b } keys %tickets;
}

1;
