use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Globals qw(get_kunde);
use Loader qw(check_perm line_in log_update edit_dienste);

sub acct_snip($;$) {
	my($id,$kn) = @_;
	my($knd);
	my($quelle,$dienst,$ziel,$jjmm,$tt);

	return undef unless check_perm("verwaltung");

	print <<END;

Mit dieser Funktion werden Accountingdaten en masse von Kunde A auf Kunde B
umassoziiert, d.h. dem Kunden B berechnet.

ACHTUNG, damit kann man ziemlich viel kaputtmachen. Es ist verdammt
schwierig, Fehler im Nachhinein wieder auszubügeln!

END

	while(1) {
		my $kund;
		$knd = line_in "Ziel-Kunde >"; return undef if $knd eq "";
		if($knd eq "?") {
			print <<'END';
NAME     Kundenname
END
			next;
		}
		if($kund = get_kunde $knd) {
			$knd = $kund;
			last;
		}
		print "Kunde '$knd' unbekannt!\n";
	}
	while(1) {
		$jjmm = line_in "Zeitraum >"; return undef if $jjmm eq "";
		if($jjmm eq "?") {
			print <<'END';
-       Alle Monate
JJMM    Jahr und Monat
JJJJMM  Jahr und Monat
XX-YY   von-bis
END
			next;
		}
		if($jjmm eq "-") {
			$jjmm = "";
			last;
		}
		if($jjmm =~ /^(\d{4,6})?-(\d{4,6})?$/) {
			my $j1 = $1; my $j2 = $2;

			if($j1 =~ /^\d{4,5}$/) { $j1 += 190000; }
			if($j2 =~ /^\d{4,5}$/) { $j2 += 190000; }

			(print "Das kann nicht funktionieren...\n"),return undef if $j1 > $j2 and $j2 > 0;
			$jjmm = "$j1-$j2";
			last;
		}
		if($jjmm =~ /^\d{4,5}$/) {
			$jjmm += 190000;
		}
		if($jjmm =~ /^\d{6}$/) {
			last;
		}

		print "Jahr/Monat '$jjmm' ungültig!\n";
	}
	while(1) {
		$tt = line_in "Tag >"; return undef if $tt eq "";
		if($tt eq "?") {
			print <<'END';
-     Alle Tage
TT    Tag
T1-T2 von T1 bis T2
END
			next;
		}
		if($tt eq "-") {
			$tt = "";
			last;
		}

		if($tt =~ /^(\d\d?)?-(\d\d?)?$/) {
			if($1 > $2 and $2 > 0) {
				(print "Das kann nicht funktionieren..."),return undef unless $jjmm =~ /^\d{6}$/;
			}
			$tt="$1-$2";
			last;
		}
		if($tt eq "-") {
			$tt = "";
			last;
		}
		if($tt > 0 and $tt <= 31) {
			last;
		}

		print "Tag '$tt' ungültig!\n";
	}

	$quelle = select_descr("quelle",1+4+8,<<END,"","!hide");
"Quelle" gibt an, welches Subsystem die Accountingdaten geliefert hat.

-     Alle Quellen
END
	return undef unless defined $quelle;

	if($quelle eq "-") {
		$quelle = "";
	}

	$dienst = edit_dienste("",1+4,<<END);
-     Alle Dienste
END
	return undef unless defined $dienst;
	if($dienst eq "-") {
		$dienst = "";
	}

	$ziel = select_descr("ziel",4, <<END,"","!hide");
-    Alle Ziele
END
	return undef unless defined $ziel;
	
	if($ziel eq "-") {
		$ziel = "";
	}


	my $cmd = "";
	my $cmd1 = "where";

	if($id > 0) {
		$cmd .= " $cmd1 kunde = $id"; $cmd1 = "and";
	}
	if($jjmm =~ /^(\d*)-(\d*)$/) {
		if($1 > 0) {
			$cmd .= " $cmd1 jjmm >= $1"; $cmd1 = "and";
		}
		if($2 > 0) {
			$cmd .= " $cmd1 jjmm <= $2"; $cmd1 = "and";
		}
	} elsif($jjmm ne "") {
		$cmd .= " $cmd1 jjmm = $jjmm"; $cmd1 = "and";
	}
	if($tt =~ /^(\d*)-(\d*)$/) {
		if($1 > 0) {
			$cmd .= " $cmd1 tt >= $1"; $cmd1 = "and";
		}
		if($2 > 0) {
			$cmd .= " $cmd1 tt <= $2"; $cmd1 = "and";
		}
	} elsif($tt ne "") {
		$cmd .= " $cmd1 tt = $tt"; $cmd1 = "and";
	}
	if($dienst > 0) {
		$cmd .= " $cmd1 dienst = $dienst"; $cmd1 = "and";
	}
	if($ziel > 0) {
		$cmd .= " $cmd1 ziel = $ziel"; $cmd1 = "and";
	}
	if($quelle > 0) {
		$cmd .= " $cmd1 quelle = $quelle"; $cmd1 = "and";
	}

	my $cnt = DoFn("select count(*) from acct $cmd");
	if($cnt == 0) {
		print "... keine Datensätze ($cmd).\n"; return 0;
	} elsif($cnt == 1) {
		$cnt .= " Datensatz";
	} else {
		$cnt .= " Datensätze";
	}
	print <<END;

*** $cnt gefunden.
*** Zielkunde: #$knd.
*** $cmd

END
	my $resp = line_in "Sollen die Einträge wirklich umgeschnipst werden? ";
	return undef if $resp eq "";
	if($resp =~ /^n/i) {
		print "Abgebrochen.\n";
		return undef;
	}
	log_update("acct","kunde",$knd,undef,"kunde");
	$cnt = Do("update acct set kunde = $knd $cmd");
	if($cnt) {
		print "...ausgeführt ($cnt Änderungen).\n";
	} else {
		print "... keine Änderungen.\n";
	}
}
1;
