=head4 db_stunden_konflikt

C<db_stunden_konflikt( Person Beginn Ende/Dauer ID [sub] )>

Prüft, ob sich die eingegebene Arbeitszeit mit einer existierenden
überschneidet. 

Liefert eine Liste der betreffenden IDs. Falls I<sub> angegeben wurde,
wird die Prozedur für jede ID aufgerufen und die Anzahl zurückgeliefert.

I<ID> ist die ID einer zu ändernden Zeit, die ignoriert wird.

=cut

use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(DoSelect);

sub db_stunden_konflikt($$$;$&) {
	my($person,$beginn,$ende,$id,$sub) = @_;
	$ende += $beginn if $ende < $beginn;
	my @res = ();
	my $num = 0;

	my $sel = "";
	$sel = " and id != $id" if $id;
	$sel = " ( ( beginn < $beginn and $beginn < beginn+dauer and beginn+dauer < $ende ) 
				  or ( $beginn < beginn and beginn < $ende and $ende < beginn+dauer )
				  or ( $beginn = beginn and $ende = beginn+dauer ) )
			    and person = $person $sel";

	DoSelect {
		if (ref $sub) {
			$num++;
			&$sub(@_);
		} else {
			push(@res, $_[0])
		}
	} "select id from stunden where $sel order by beginn,dauer";

	$sub ? $num : @res;
}
1;
