use utf8;
use warnings; no warnings "redefine";
use strict;
use Loader qw(check_perm line_in line_ja_nein log_update select_date);
use Fehler qw(problem warnung);
use Dbase::Globals qw(aufzaehlung);
use Dbase::Help qw(Do DoFn DoSelect DoTime isotime);

sub set_kunde_datum($;$) {
	return undef unless check_perm('verwaltung');

	my($id,$kn) = @_;
	my $datum;
	my $done;	
	my($obeginn,$oende) = DoFn("select beginn,ende from kunde where id=$id");
	$oende=0 if not defined $oende;
	$datum = select_date(256,"Startdatum",undef,qw(= jetzt));
	if(defined $datum) {
		$datum = DoTime if $datum eq "=";
		
		unless (
			line_ja_nein(
				"Startdatum wirklich auf '" . isotime($datum) . "' setzen"
			)
		  )
		{
			print "Also doch nicht.\n";
		} else {
			log_update("kunde","id",$id,undef,"beginn",undef,scalar isotime $obeginn);
			Do("update kunde set beginn=$datum, geaendert=UNIX_TIMESTAMP(NOW()) where id=$id");
		}
		$done += 2;
	}
	$datum = select_date(16|256|1024,"Enddatum",undef,qw(= jetzt 0 unbegrenzt));

	if(defined $datum) {

		if ( $datum eq '=' ) { $datum = DoTime() }
		elsif ( $datum == 0 ) { $datum = 'NULL' }

		unless (
			$datum eq 'NULL'
			|| line_ja_nein(
				"Enddatum wirklich auf '" . isotime($datum) . "' setzen"
			)
		  )
		{
			print "Also doch nicht.\n";
		} else {
			log_update("kunde","id",$id,undef,"ende",undef,scalar isotime $oende);

			if( $oende == 0 && $datum && $datum ne 'NULL' ) {
				### TODO Updates aufzeichnen
				Do("update domainkunde set ende=$datum where kunde=$id and ende is null");
				Do("update ipkunde     set ende=$datum where kunde=$id and ende is null");
				Do("update tarifkunde  set ende=$datum where kunde=$id and ende is null");
				# TarifAcct-Regeln bleiben aktiv, weil sie eh nicht mehr verwendet werden, vgl. RT#3333981.
				print "Alle Enddaten eingestellt, soweit möglich.\n";
			} else {
				print "Enddaten NICHT umgestellt. Zu Fuß!\n";
			}
			Do("update kunde set ende=$datum, geaendert=UNIX_TIMESTAMP(NOW()) where id=$id");
			{
				my( %tarifacct, %kunde_id );
				if (
					my $tarifacct = DoSelect {
						my ( $id, $kunde_id, $kunde_name ) = @_;
						push @{$tarifacct{$kunde_name}}, $id;
						$kunde_id{$kunde_name} ||= $kunde_id;
					} <<_
	SELECT   tarifacct.id, kunde.id, kunde.name
	FROM     kunde, tarifacct
	WHERE    tarifacct.dkunde = $id
	     AND ( tarifacct.ende IS NULL OR tarifacct.ende >= UNIX_TIMESTAMP(NOW()) )
	     AND tarifacct.kunde  = kunde.id
	     AND ( kunde.ende IS NULL OR kunde.ende >= UNIX_TIMESTAMP(NOW()) )
	ORDER BY kunde.name, tarifacct.id
_
				) {
					warnung( 'Es gibt noch ' . ( $tarifacct == 1 ? 'eine TarifAcct-Regel' : 'TarifAcct-Regeln' )
					         . ', die auf diese Kunden zeig' . ( $tarifacct == 1 ? 't' : 'en' )
					         . ":\n"
					         . join "\n",
					                map aufzaehlung( map "#$_", @{$tarifacct{$_}} ) . " bei Kunde #$kunde_id{$_}:$_",
					                sort keys %tarifacct
					  );
				}
			}
			$done++;
		}
	}
	$done;
}

1;
