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

use Loader qw(
	acct_kunde
	acct_list
	acct_snip
	add_kunde_accounting
	add_reseller
	delete_kunde
	edit_acct
	edit_aliase
	edit_arechnungen
	edit_confitems
	edit_domains
	edit_hardwares
	edit_hostgroups
	edit_ipaddrs
	edit_ipregions
	edit_konto
	edit_ktarife
	edit_kunde_passwort
	edit_kunde_stunden
	edit_leitungen
	edit_mailrules
	edit_personen
	edit_reseller
	edit_tarifaccts
	edit_tarifnamen
	edit_tickets
	export_acct_kunde
	export_kunde
	line_in
	list_kunde
	log_view
	pruefe_kunde
	rename_kunde
	select_date
	set_kunde_ansprechpartner
	set_kunde_berechnungsmodus
	set_kunde_datum
	set_kunde_erloeskonto
	set_kunde_flags
	set_kunde_naechsterechnung
	set_kunde_passwort
	set_kunde_prio
	set_kunde_reseller
	set_kunde_sprache
	set_kunde_steuernr
	set_kunde_uebergeordnet
	set_kunde_zahlung
	set_mail_ip
	strip_kn
	valid_kunde
	warn_arbeit
  );
use Fehler qw(problem report_fehler warnung);
use Dbase::Globals qw(name_kunde unterkunden);
use Dbase::Help qw(DoFn DoTime);

sub edit_kunde ($;$) {
	my($id,$kn) = @_;

	return unless valid_kunde($id);

	my($nam,$end,$uk) = DoFn("select name,ende,kunde from kunde where id = $id");
	warnung "Kunde wird beendet (".isotime($end).")" if defined $end and $end > DoTime;

	if ( my @unterkunden = grep $_ != $id, unterkunden($id, undef, 1) ) {
		warnung(
			join "\n",
			'Dieser Kunde besitzt '
			  . ( @unterkunden == 1 && 'einen ' )
			  . 'Unterkunden:',
			map sprintf( "#%4d:%s", @$_ ),
			sort { $a->[1] cmp $b->[1] } map [ $_, name_kunde($_) ],
			@unterkunden
		);
	}
	
	if($uk) {
		$uk="(UK:#${uk}_".name_kunde($uk).")";
	} else {
		$uk="";
	}
	$kn = strip_kn($kn)."Kunde_$id:$nam$uk";
	my $work = warn_arbeit("kunde",$id,"*",$kn);

	kunde: while(1) {
		my $act = line_in "$kn >",4; print "\n",last if not defined $act or $act eq "";
		if($act eq "?") {
			print <<'END';

a    Accounting (intern)        aa Accounting (Einzeldatensätze)
aA   neuen Accounting-Datensatz eingeben
##-# Accountingdatensatz bearbeiten  AS Accounting umschnipsen (GEFAHR)

g    Erlöskonto
X    Export zur Buchhaltung      XT Test         XB# buchen (ab #)
XBT  testbuchen
=*   Rechnung generieren         =   Test (nächste Rechnung)
=?   ...in Monat                 Z   Zahlungsziel
b    Berechnungsintervall setzen B   Zeitpunkt der ersten Rechnung setzen
tt   Tarifaccounting ("wie")     TT  kundenspezifische TarifDefinitionen
t    Tarife / Dienstnutzung ("was berechnen wir")

R    Rechnungen                  k    Konto (zwecks Abbuchung)
SN   USt-ID-Nr
K    zu "übergeordnetem" Kunden assoziieren (an den geht die Rechnung)

pr   Prio (A/B/C)                s   Sprache setzen
x    Kunde (de)aktivieren        del Kunde löschen
ren  Kunde umbenennen            T   Tickets
f    Flags                       u   Aliasnamen für diesen Kunden
rs   Kunde ist Reseller?
RS   einen Reseller zuweisen (der darf für diesen Kunden Domains etc.)
W    Arbeitsstunden

hp   Hauptperson des Kunden setzen   va  vertrieblichen bzw.
bi   Rechnungsanschrift setzen       ta  technischen Ansprechpartner
ad   AdminC setzen (für Domains)         setzen

l ll Kundeninfo ausgeben         m    Personeneinträge
lp   Paßwörter des Kunden auflisten     ep ... editieren        NP ... neu
ci   Conf. Items                        sp ... PW-Klasse        cp ... ändern

d    Domains                     M   Mailregeln editieren
h    Hardware                    i   IP-Nummern/Netze
hg   Hostgroups                  Md  Default-IP-Adresse für ausgehende E-Mails
lt   Leitungen                   ii  IP-Zonen

END
			next;
		}
		if($act eq "X") { export_kunde($id,0,$kn); next; }
		if($act eq "XT") { export_kunde($id,2,$kn); next; }
		if($act =~ s/^XB(\d*)$//) { export_acct_kunde($id,8,$kn,$1); next; }
		if($act =~ s/^XBT(\d*)$//) { export_acct_kunde($id,2|8,$kn,$1); next; }
		if($act eq "T") { edit_tickets($id,2,$kn); next; }
		if($act eq "W") { edit_kunde_stunden($id,$kn); next; }
		if($act eq "rs") {
			my $rid = DoFn("select id from reseller where kunde=$id");
			if($rid) {
				edit_reseller($rid,$kn,$id);
			} else {
				add_reseller($id,0,$kn);
			}
			next;
		}
		if($act eq "TT") { edit_tarifnamen(2,$kn,undef,$id); next; }
		if($act eq "g") { set_kunde_erloeskonto($id,$kn); next; }
		if($act eq "b") { set_kunde_berechnungsmodus($id,$kn); next; }
		if($act eq "H") { log_view($kn,"kunde","id",$id); next; }
		if($act eq "pr") { set_kunde_prio($id,$kn); next; }
		if($act eq "B") { set_kunde_naechsterechnung($id,$kn); next; }
		if($act eq "Z") { set_kunde_zahlung($id,$kn); next; }
		if($act eq "sp") { set_kunde_passwort($id); next; }
		if($act eq "ep") { edit_kunde_passwort($id,0,$kn); next; }
		if($act eq "lp") { edit_kunde_passwort($id,1,$kn); next; }
		if($act eq "SN") { set_kunde_steuernr($id,$kn); next; }
		if($act =~ /^lp(\d+)$/) { edit_kunde_passwort($id,1,$kn,$1); next; }
		if($act eq "NP") { edit_kunde_passwort($id,4,$kn); next; }
		if($act eq "cp") { edit_kunde_passwort($id,2,$kn); next; }
		if($act eq "K") { set_kunde_uebergeordnet($id,$kn); next; }
		if($act eq "RS") { set_kunde_reseller($id,$kn); next; }
		if($act eq "k") { edit_konto($id,$kn); next; }
		if($act eq "tt") { edit_tarifaccts($id,$kn); next; }
		if($act eq "t") { edit_ktarife($id,2,$kn); next; }
		if($act eq "=*") { acct_kunde($id, $kn, 1); next; }
		if($act eq "=") { acct_kunde($id, $kn, 0); next; }
		if($act eq "=?") {
			my $anf = select_date(4,"Monat");
			next unless $anf;
			acct_kunde($id, $kn, 0, undef, $anf); next;
		}
		if($act eq "=+") { acct_kunde($id, $kn, 256); next; }
		if($act eq "=d") { acct_kunde($id, $kn, 8); next; }
		if($act eq "=dd") { acct_kunde($id, $kn, 8+4+2); next; }
		if($act eq "a") { acct_list($id, $kn); next; }
		if($act eq "aa") { acct_list($id, $kn, 1); next; }
		if($act eq 'aA') { add_kunde_accounting($id, $kn); next; }
		if($act eq "AS") { acct_snip($id, $kn); next; }
		if($act eq "m") { edit_personen($id,64,$kn); next; }
		if ($act eq 'h') { edit_hardwares($id,$kn); next; }
		if ( $act eq 'hg' ) { edit_hostgroups( $id, 0, $kn ); next; }
		if ($act eq 'lt') { edit_leitungen($id,$kn); next; }
		if ($act eq 'ci') { edit_confitems($id,$kn); next; }
		if($act eq "i") { edit_ipaddrs($id,0,$kn); next; }
		if($act eq "ii") { edit_ipregions($id,0,$kn); next; }
		if($act eq "d") { edit_domains($id,0,$kn); next; }
		if($act eq "u") { edit_aliase($id,$kn); next; }
		if($act eq "f") { set_kunde_flags($id,$kn); next; }
		if($act eq 'M') { edit_mailrules($id,$kn); next; }
		if ( $act eq 'Md' ) { set_mail_ip( $id, kunde => $id ); next; }
		if($act eq "del") { next unless delete_kunde($id,0,$kn); return undef; }
		if($act eq "ren") { rename_kunde($id,$kn); next; }
		if($act eq "x") { set_kunde_datum($id,$kn); next; }
		if($act eq "l") { list_kunde($id,$kn,0); next; }
		if($act eq "ll") { list_kunde($id,$kn,1); next; }
		if($act eq "R") { edit_arechnungen($id,2,$kn); next; }
		if($act eq "%") { pruefe_kunde($id); next; }
		if($act eq "%%") { pruefe_kunde($id,1); next; }
		if($act eq 's') { set_kunde_sprache($id); next; }
		if($act eq 'hp') { set_kunde_ansprechpartner( "Kundenname etc", $id, 'hauptperson' ); next; }
		if($act eq 'bi') { set_kunde_ansprechpartner( "Rechnungsanschrift", $id, 'billc' ); next; }
		if($act eq 'ad') { set_kunde_ansprechpartner( "Admin-C", $id, 'adminc' ); next; }
		if($act eq 'ta' ) { set_kunde_ansprechpartner( "Ansprechpartner Technik", $id, 'ap_technik', 1); next; }
		if($act eq 'va' ) { set_kunde_ansprechpartner( "Ansprechpartner Vertrieb", $id, 'ap_vertrieb', 1); next; }
		if($act =~ /^(-?\d+)-(\d+)$/) {
			my $hash = $1; my $seq = $2;
			edit_acct($hash,$seq,$id,$kn); next; }

		print "Aktion '$act' kenne ich nicht. Liste mit '?'.\n";
		next; fehler: report_fehler(4);
	}
	$id;
}

1;
