use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(Do DoFn isotime DoTime);
use Fehler qw(problem);
use Loader qw(log_update select_date check_overlap);

sub set_hardware_datum($;$) {

	my ( $idi, $kn ) = @_;

	my ( $id, $beginn, $ende ) =
	  DoFn "SELECT kunde,beginn,ende FROM hardware WHERE id = $idi"
	  or return problem "Hardware #$idi nicht gefunden.";
	$ende=0 if not defined $ende;

	my $neu_beginn = select_date( 256, 'Startdatum', undef, qw(- jetzt) );
	unless ( defined $neu_beginn ) { $neu_beginn = $beginn }
	elsif ( $neu_beginn eq '-'   ) { $neu_beginn = DoTime  }

	my $neu_ende = select_date( 16 | 256 | 1024,
		'Enddatum', undef, '-' => 'jetzt', 0 => 'Datum löschen' );
	unless ( defined $neu_ende   ) { $neu_ende   = $ende  }
	elsif ( $neu_ende   eq '-'   ) { $neu_ende   = DoTime }

	return problem 'Das Enddatum darf nicht vor dem Startdatum liegen.'
	  if defined $neu_beginn && $neu_ende && $neu_beginn > $neu_ende;

	if (my $other = check_overlap( hardware => id => $idi, 'name,seriennr', $neu_beginn, $neu_ende) ) {
		return problem <<_;
Die Daten können nicht so gesetzt werden, da sich sonst eine zeitliche
Überschneidung mit Hardware-Objekt #$other ergeben würde.
_
	}

	my @updates;
	if ($beginn != $neu_beginn) {
		log_update hardware => id => $idi, undef, 'beginn', undef,
			scalar isotime $beginn;
		push @updates, "beginn=$neu_beginn";
	}
	if ($ende != $neu_ende ) {
		$neu_ende = "NULL" if $neu_ende == 0;
		log_update hardware => id => $idi, undef, 'ende', undef,
			scalar isotime $ende;
		push @updates, "ende=$neu_ende";
	}
	Do 'UPDATE hardware SET ' . join(', ', @updates) . " WHERE id=$idi"
	  if @updates;
}

1
