=head1 Name

kunde


=head1 Ziel

Testen aller Befehlskürzel in kunde


=head1 Testfälle

Es wird getestet:

=over 4

=item *

Alles, was unter '...> ?' zu sehen ist.

=back


=head1 nicht-Testfälle

Folgende Tests sind noch nicht implementiert:

=over 4

=item *

Ausgabeprompts

=item *

Externe Programme, insbes. Domainanträge und Nameservereinträge

=back


=cut

package Test::kunde;
use utf8;
use warnings;
use strict; use warnings; use utf8;
BEGIN { unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
			unless $ENV{'KUNDE_NO_PERLPATH'};
      }


use Test::More tests => 1041; $|=1;
use Dbase::Test;

my @tests;

use Dbase::Help qw(DoFn Do quote DoSelect);
use Dbase::Globals qw(gen_descr get_person);
use Cf qw($MAILDOM $WDESCR);
use Dbase::MailTest qw(rep);
use Dbase::Test qw(okL okS);
use Dbase::KundeTest qw(kunde kunde_at okK okP);
use Loader qw(delete_kunde);

my $kundenname = sprintf "test-%s",$ENV{'USER'};
my $kundenname2 = sprintf "test2-%s",$ENV{'USER'};
my $domainname = sprintf "run.%s.test.%s",$ENV{'USER'},$MAILDOM;
my $ipname = sprintf "run.%s.test.%s",$ENV{'USER'},$MAILDOM;
my $txt;

DoFn("select 1");
my $db=Dbase::db_handle;
if(-f "test.dump.sql.current") {
	pass "Dump OK";
	unlink "test.dump.sql.current";
} else {
	ok(!system("mysql -h'$db->{DATAHOST}' -u'$db->{DATAUSER}' -p'$db->{DATAPASS}' '$db->{DBDATABASE}' < test.dump.sql"));
}

my $kid = DoFn("select id from kunde where name='$kundenname'");
ok((not defined $kid), "der Test-Kunde existiert nicht");

okS "ipflags_ident//monitoring",sub { gen_descr( ipflags_ident => 1, 'monitoring' ) };
okS 'kunde//eigene_re', sub { gen_descr( kunde => undef, 'eigene_re' ) };

okK();


kunde "d", sub { # Deskriptoren
	okK();
	kunde "domainstatus", sub { # Spielkram ...
		okK 'ja';
		okK "a","101","ja","";
		okK "a","102","nein","";
		okK "a","103","janein","";
		okK "a","104","nixda","";
		kunde "101", sub { # Ident 'rein' anlegen. Liste gibt es.
			## okK "g","a","1","rein","","","1","";
			okK "g","!","a","1","rein","","","1","";
		};
		kunde "102", sub { # Ident 'raus' anlegen. Liste gibt es.
			okK "g","!","a","2","raus","","","2","";
		};
		kunde "103", sub { # Idents gibt es schon
			okK "g","1","raus","";
			$txt = okK "l";
			like($txt,qr/^Gruppe\s*:\s+(?:rein,raus|raus,rein)\n/m,"rein und raus");

			okP "l","Infotext","i", undef, "maybe","=", "-",undef, "irgend ein Text halt";
			okP "l","Text","n", "janein", "vielleicht","=";
		};
		okK "104", "del";
		$txt = okK("l");
	};
	kunde "tarifklasse", sub {
		okK 'ja';
		okK "a","1","x","";
		okK "a","2","y","";
		okK "a","3","z","";
	};
	kunde "jbool", sub {
		okK 'ja';
		okK "a","j","ja","";
		okK "a","n","nein","";
	};
	kunde "domainaktion", sub {
		okK 'ja';
		okK "a","11","daneben","";
	};
	kunde "handleaktion", sub {
		okK 'ja';
		okK "a","12","ganz_daneben","";
	};
	kunde "acctinfo", sub {
		okK 'ja';
		okK "a","3","grummel","";
	};

	# Test ob Löschen aller Deskriptoren eines Typs tut
	kunde "killer", sub {
		okK 'ja';
		okK "a","1","zielen","";
		okK "a","2","schiessen","";
	};
	$txt = okK "l";
	like($txt,qr/^killer\b/m,"Testkram da");

	okK "killer","del";
	$txt = okK "l";
	unlike($txt,qr/^killer\b/m,"Testkram weg");

	$txt = okK( qw( nichtwirklich eher.net l ) );
	unlike( $txt, qr/^nichtwirklich\b/m, 'Deskriptorenliste nicht angelegt' );

	kunde "handlestatus", sub { # mehr Spielkram ...
		okK 'ja';
		okK "a","23","hachja","";
		okK "a","34","huchnein","";
		okK "a","45","oochvielleicht","";
	};
	$txt = okK("l");

	# Für die nächsten Schritte braucht es noch Deskriptoren en masse
	kunde "folge", sub { # Umrechnungstabelle (*ALT*)
		okK 'ja';
		okK "a","0","KBytes","";
		okK "a","1","einheit","i","ISDN-Einheiten","";
		okK "a","2","platz","i","Plattenplatz (obsolet)","";
		okK "a","3","arbeit","i","Arbeitszeit, Gutschriften, ...","";
		okK "a","4","zeit","i","Zeit (Minuten)","";
		okK "a","5","ipass","i","Zeit in Minuten,Paketanzahl","";
		okK "a","6","std","i","Zeit in Stunden","";
	};
	kunde "kprio", sub { # A/B/C oder so
		okK 'ja';
		okK "a","a","wichtig","";
		okK "a","z","unwichtig","";
	};
	kunde "sprache", sub {
		okK 'ja';
		okK "a","l","Lojban","";
		okK "a","v","Volapuek","";
		okK "a","e","Esperanto","";
	};
	kunde "rechnung", sub { # tarif.modus
		okK 'ja';
		okK "a","m","Monat","";
		okK "a","n","Staffel","";
		okK "a","x","nicht","";
		okK "a","y","jährlich","";
		okK "a","s","einmal","";
		okK "a","i","max","";
	};
	kunde "zsreseller", sub { # Resellerstatus in der Übergangstabelle
		okK 'ja';
		okK "a","j","ja","";
		okK "a","n","nein","";
		okK "a","b","egal","";
	};
	kunde "reseller", sub { # Reseller-Arten
		okK 'ja';
		okK "a",12,"retest","";
		okK "a",13,"rebla","";
	};
	kunde "rs_flag", sub { # Reseller-Flags
		okK 'ja';
		okK "a",1,"signed","";
		okK "a",6,"unfug","";
	};
	kunde "ipflags", sub {
		okK 'ja';
		okK "a","1","Wald","";
		okK "a","2","Tal","";
	};
	kunde "lieferant", sub { # für Hardware
		okK 'ja';
		okK "a",6,"alle","";
		okK "a",7,"niemand","";
	};
	kunde "hardware_klasse", sub {
		okK 'ja';
		okK "a",22,"Kiste","";
		okK "a",23,"Loch","";
	};
	kunde "hardware_status", sub {
		okK 'ja';
		okK "a",3,"putt","";
		okK "a",4,"ganz","";
	};
	kunde "hardware_typ", sub {
		okK 'ja';
		okK "a",32,"Ding","";
		okK "a",33,"Tier","";
	};
	kunde "pwdomain", sub {
		okK 'ja';
		okK "a","19","meier","";
	};
	kunde "re", sub { # umrechnung.einheit
		okK 'ja';
		okK "a","1","byte","";
		okK "a","2","bit","";
	};
	kunde "nic", sub { # nicdatas etc.
		okK 'ja';
		okK "a","h","hier","";
		okK "a","d","dort","";
		okK "a","r","ripe","";
	};
	kunde "ziel", sub { # mehr als nur 'std'
		okK 'ja';
		okK "a","h","hier","";
		okK "a","a","da","";
		okK "a","o","dort","";
	};
	kunde "ausgabe", sub { # Output redir
		okK 'ja';
		okK "a","1","direkt","";
		okK "a","2","less","";
		okK "a","3","Datei","";
		okK "a","4","Null","";
		okK "a","5","String","";
	};
	kunde "intervall", sub { # Rechnungsintervalle
		okK 'ja';
		okK "a","m","monatlich","";
		okK "a","y","jaehrlich","";
		okK "a","x","garnich","";
	};
	kunde "reg_flag", sub {
		okK 'ja';
		okK "a",5,"deschd","";
	};
	kunde "acctflag", sub {
		okK 'ja';
		okK "a",1,"ignore","";
		okK "a",2,"anz_pakete","";
	};
	kunde "dienst", sub {
		okK "a",9,"-","";
		okK "a",10,"sonstwer","g","person","","";
		okK "a",11,"blubb","g","person","","";
	};
};
# .. und Dienste auch
kunde "u", sub { # Dienste
	okK();
	okK "a","alles","";
	$txt = okK("l");
	my $pat = qr/^\s*(\d+)\s+alles\b/m;
	like($txt,$pat,"Eintrag 'alles'");
	$txt =~ $pat;
	my $did=$1;

	okK "a","vieles","";
	okK "a","manches","";
	okK "a","nix","";
	okK "a","general","";

	kunde "vieles", sub {
		$txt = okK("l");
 		like($txt,qr/^Name\s*:\s+vieles\n/m,"Name");
	};
	kunde $did, sub {
		okP "l","Name","n", "alles", "bla","=", "alles","=";
		$txt = okK "l";

		okP "l","Infotext","i", undef, "Blubber","=", "-",undef, "irgendein Text","=", 
		kunde "u", sub {
			okP "l","Faktor","f", 100, 345,345;
			okP "l","Infotext","i", undef, "Sowas aber auch","=", "-",undef, "Alles, aber nicht nichts","=";
			okP "l","Ziel","z", "-", "vieles","=", "-","-";
			okP "l","rekursiv","r", "ja", [],"nein", [],"ja";
		};
		$txt = okK("l");
 		unlike($txt,qr/^Umrechnen\s*:\s+manches\b/m,"Umrechnung");
		$txt = okK("l");
		okK "u", "del";
		$txt = okK("l");
 		unlike($txt,qr/^Umrechnen\s*:/m,"keine Umrechnung mehr");
	};
	$txt = okK("l");
	like($txt,qr/^\s*\d+\s+manches\b/m,"Eintrag 'manches'");
	okK "manches","del";
	$txt = okK("l");
	unlike($txt,qr/^\s*\d+\s+manches\b/m,"kein Eintrag 'manches'");
	okK "a","manches","";
	$txt = okK("l");
	like($txt,qr/^\s*\d+\s+manches\b/m,"Eintrag 'manches'");
};

kunde "la", sub { # Länder
	okK();
	okK "a","de","deu","D","Deutschland","Germany","j","";
	my $txt = okK("l");
	like($txt,qr/^\s*\d+\s.*\sDeutschland$/m);
	my ($id) = ($txt =~ /^\s*(\d+)\s.*\sDeutschland\s*$/m);
	kunde $id, sub {
		okK();
		okP "l","Name","n", "Deutschland", "Blubb","Blubb","Deutschland","Deutschland";
		my $txt = okK("l");
		like($txt,qr/^EU\b.*:\s+ja$/m,"in der EU");
		okK "e";
		$txt = okK("l");
		like($txt,qr/^EU\b.*:\s+nein$/m,"nicht in der EU");
		okK "e";
		$txt = okK("l");
		like($txt,qr/^EU\b.*:\s+ja$/m,"wieder in der EU");
	};
	okK "a","xx","xxu","x","IxBurg","IxBurgEN","n","";
	$txt = okK("l");
	like($txt,qr/^\s*\d+\s.*\sIxBurg$/m);
	($id) = ($txt =~ /^\s*(\d+)\s.*\sIxBurg$/m);
	okK $id, "del";
	$txt = okK("l");
	unlike($txt,qr/^\s*\d+\s.*\sIxBurg$/m);
};

kunde "t", sub { # Tarife
	okK();
	okK "a","Koschten","","","","";
	okK "a","unbekannt","","","","";
	kunde "unbekannt", sub {
		okK "a","alles","";
	};
	my $tid;
	kunde "Koschten", sub {
		okK "a","alles","";
		$txt = okK("LL");
		my $pat = qr/^\s*(\d+)\s+m\s+Koschten\s+alles\s+0\b/m;
		like($txt,$pat,"Tarifeintrag vorher");
		$txt =~ $pat;
		$tid=$1;
		kunde $tid, sub {
			okP "l",qr/Aufli\w*/,"r", qr/auch\b.*/, [],qr/nur\b.*/, [],qr/auch\b.*/;
			okP "l",qr/EUR\/\s*Paket\w*/,"pd", undef, 123,qr/\s+123\.000\b.*/,
				0,undef,123;
			okP "l",qr/EUR\/\s*Best\w*/,"pb", undef, "23,4",qr/\s+23\.400\b.*/,
				0,undef,"23,4";
			okP "l",qr/EUR\/\s*Block\w*/,"pe", undef, "3.45",qr/\s+3\.450\b.*/,
				0,undef,"3.45";
			okP "l","Modus","b", "Monat", "n","Staffel";
			okP "l","Bytes/Block","g", undef, 9999,qr/9999\b.*/, 0,undef, 12345;
			okP "l","Tarif","d", "Koschten/alles", "nix","Koschten/nix", "alles";
			okK "x",0;
			okP "l","Beginn","x", undef, "2004-01","2004-01-01";

			$txt = okK("l");
			unlike($txt,qr/^EUR frei/m,"!Freipreis");
			unlike($txt,qr/^Info Frei/m,"!FreiInfo");
			unlike($txt,qr/^\s+:/m,"!fortgesetzt");
			like($txt,qr/^Anzahl\s*:\s+wird/m,"Anz wird");
			okK "ap","f",1234.567,"ff","alles frei","im Mai","";
			$txt = okK("l");
			like($txt,qr/^EUR frei\w*\s*:\s+1234\.567\b/m,"Freipreis");
			like($txt,qr/^Info Frei\w*\s*:\s+alles frei\n/m,"FreiInfo");
			like($txt,qr/^\s+:\s+im Mai\n/m,"Mai 1");
			like($txt,qr/^Anzahl\s*:\s+multipli/m,"Anz multip");
			okK "ap","f",0,"ff","-";
			$txt = okK("l");
			unlike($txt,qr/^EUR frei/m,"!Freipreis");
			unlike($txt,qr/^Info Frei\w*\s*:/m,"!FreiInfo");
			unlike($txt,qr/^\s+:/m,"!fortgesetzt");
			like($txt,qr/^Anzahl\s*:\s+wird/m,"Anz wird");

			unlike($txt,qr/^Info Fest\w*\s*:/m,"!InfoFest");
			unlike($txt,qr/^Info var[\.\w]*\s*:/m,"!InfoVar");
			unlike($txt,qr/^Info\s*:/m,"!Info");
			unlike($txt,qr/^Beschrei\w*\s*:/m,"!Beschreib");
			unlike($txt,qr/^Wart\w*\s*:/m,"!Wartung");
			unlike($txt,qr/^SLA\b/m,"!SLA");
			okK "a","i","Hallo Info","if","Dies ist frei","auch im Mai","";
			$txt = okK("l");
			okK "iv","Nix ist frei","ausser im Mai","","D",<<END,"w","wd {Mon-Fri}","sz","wd {Sat-Sun}";
Huzza, dies ist eine längere
Beschrei(b)ung!
END
			$txt = okK("l");
			like($txt,qr/^Info Fest\w*\s*:\s+Dies/m,"InfoFest");
			like($txt,qr/^Info var[\.\w]*\s*:\s+Nix/m,"InfoVar");
			like($txt,qr/^Info\s*:\s+Hallo/m,"Info");
			like($txt,qr/^Beschrei\w*\s*:\s+Huzza/m,"Huzza");
			like($txt,qr/^Wart\w*\s*:\s+wd..Mon-Fri/m,"Woche");
			like($txt,qr/^SLA\s*\w*\s*:\s+wd..Sat-Sun/m,"Wochenende");
			like($txt,qr/^\s+:\s+auch/m,"auch");
			like($txt,qr/^\s+:\s+ausser/m,"ausser");
			like($txt,qr/^\s+:\s+Beschrei/m,"Beschreibung");
			my $s=0;
			$s += ($txt =~ /^SLA.*JETZT/m);
			$s += ($txt =~ /^Wart.*JETZT/m);
			ok($s==1, "Entweder es ist Wochenende oder nicht");

			okK "a","i","-","if","-","iv","-","D","","w","-","sz","-";
			$txt = okK("l");
			unlike($txt,qr/^Info Fest\w*\s*:/m,"!InfoFest");
			unlike($txt,qr/^Info var[\.\w]*\s*:/m,"!InfoVar");
			unlike($txt,qr/^Info\s*:/m,"!Info");
			unlike($txt,qr/^\s+:/m,"!fortgesetzt");
			unlike($txt,qr/^Beschrei\w*\s*:/m,"!Beschreibung");
			unlike($txt,qr/^Wart\w*\s*:/m,"!Wartung");
			unlike($txt,qr/^SLA\b/m,"!SLA");


			unlike($txt,qr/^Festkonto\b/m,"!FestK");
			unlike($txt,qr/^Varkonto\b/m,"!VarK");
			unlike($txt,qr/^minBlock\b/m,"!MinB");
			unlike($txt,qr/^minPaket\b/m,"!MinP");
			okK "kf",111,"kv",222,"md",987,"me",876;
			$txt = okK("l");
			like($txt,qr/^Festkonto\s*:\s+111/m,"FestK");
			like($txt,qr/^Varkonto\s*:\s+222/m,"VarK");
			like($txt,qr/^minBlock\s*:\s+876/m,"MinB");
			like($txt,qr/^minPaket\s*:\s+987/m,"MinP");
			okK "kf",222,"kk",333;
			$txt = okK("l");
			like($txt,qr/^Festkonto\s*:\s+333/m,"FestK3");
			like($txt,qr/^Varkonto\s*:\s+333/m,"VarK3");
			okK "kf",0,"me",0;
			$txt = okK("l");
			unlike($txt,qr/^Festkonto\b/m,"!FestK");
			unlike($txt,qr/^minBlock\b/m,"!MinB");
			like($txt,qr/^Varkonto\s*:\s+333/m,"VarK");
			like($txt,qr/^minPaket\s*:\s+987/m,"MinP");
			okK "kv",0,"md",0;
			$txt = okK("l");
			unlike($txt,qr/^Varkonto\b/m,"!VarK");
			unlike($txt,qr/^minPaket\b/m,"!MinP");

			okK "kf",111,"kv",222,"md",987,"me",876;
			# für später
		};
	};
	okK "Koschten","ren","Kosten","";
	kunde "Kosten", sub {
		kunde $tid, sub {
			$txt = okK("l");
			like($txt,qr/^Tarif\s*:\s+Kosten\/alles/m,"Kosten/alles");
		};
		
		$txt = okK("l");
		unlike($txt,qr/^Laufzeit\s*:/m,"Laufzeit");
		unlike($txt,qr/^verl.*ngern\s*:/m,"Verlängerung");
		okP "l","Klassen","k", "-", ["x",""],"x", ["x","y",""],"y";
		$txt = okK("l");
		okK "ak","lz",1,"vl",2;
		$txt = okK("l");
		like($txt,qr/^Laufzeit\s*:\s+1\sMon/m,"Laufzeit");
		like($txt,qr/^verl.*ngern\s*:\s+2\sMon/m,"Verlängerung");
		okK "ak","k","y","","vl","-";
		$txt = okK("l");
		like($txt,qr/^verl.*ngern\s*:\s+.*nicht einge/m,"Verlängerung");
	};
};

# ein Kunde:
okK("a",$kundenname,"","");
$kid = DoFn("select id from kunde where name='$kundenname'");
ok((defined $kid and $kid>0), "Kunde existiert");

# noch ein Kunde:
okK("a",$kundenname2,"","");
my $kid2 = DoFn("select id from kunde where name='$kundenname2'");
ok((defined $kid2 and $kid2>0), "Kunde2 existiert");

okL(1, "kunde","id",$kid);

$txt = okK("l");
ok($txt =~ /^\s*$kid\s+$kundenname\b/m, "Kundenname im Listing");

kunde $kid, sub { # in einem Kunden
	okK();
	$txt = okK("l");
	ok($txt =~ /^Kunde\s*:\s$kundenname\n/m, "Kundenname im Listing");

	kunde "m", sub {
		okK 'aa', '+', 'u', 'ttfirma', '', 'sonstwer', '0';
		okK 'aa', '+', 'u', 'ttadmin', '', 'sonstwer', '1';
		okK 'aa', '+', 'u', 'ttbill',  '', 'sonstwer', '2';
		okK 'aa', '+', 'u', 'tttech',  '', 'sonstwer', '3';
		okK 'aa', '+', 'u', 'ttzone',  '', 'sonstwer', '4';

		$txt = okK("la");
		like($txt,qr/^sonstwer\s+0\s+#\s*\d+\s+ttfirma\s*$/m,"Fa da");
		like($txt,qr/^sonstwer\s+1\s+#\s*\d+\s+ttadmin\s*$/m,"adm da");
		like($txt,qr/^sonstwer\s+2\s+#\s*\d+\s+ttbill\s*$/m,"bill da");
		like($txt,qr/^sonstwer\s+3\s+#\s*\d+\s+tttech\s*$/m,"tech da");
		like($txt,qr/^sonstwer\s+4\s+#\s*\d+\s+ttzone\s*$/m,"zone da");
};
	};

kunde "-", sub {
	okK();
	kunde "ds", sub {
		okK();
		$txt = okK("l");
		is($txt,"","empty list");

		okK "a","12","alles","m","sec","";
		$txt = okK("l");
		like($txt,qr/^\s*12\s+alles\b/mi,"Eintrag");
		kunde "12", sub {
			$txt = okK("l");
			like($txt,qr/^Dienst\s*:\s+alles\n/m,"Dienst");
			like($txt,qr/^Schritt\s*:\s+12\n/m,"Schritt");
			like($txt,qr/^Flags\s*:\s+-\n/m,"Flags");
			unlike($txt,qr/^Info\s*:/m,"kein Info");
			like($txt,qr/^Einheiten\s*:\s+1 \(Bytes\)\n/m,"Einheiten");
			like($txt,qr/^Einheiten\s*:\s+1 \(Pakete\)\n/m,"Einheiten");

			kunde "eb", sub {
				$txt = okK("l");
				like($txt,qr/^\s*\d+\s+m\b/m,"Eintrag");
				$txt =~ /^\s*(\d+)\s+m\b/m;
				my $eid = $1;
				kunde "m", sub {
					$txt = okK("l");
					like($txt,qr/^ID\s*:\s$eid\n/m,"ID $eid");
					like($txt,qr/^Faktor\s*:\s1\.000\n/m,"Faktor");
					like($txt,qr/^Anzeige ab\s*:\s0\.000\n/m,"Start");
					like($txt,qr/^Name\s*:\sm\n/m,"Name");
					like($txt,qr/^Info\s*:\sm\n/m,"Info");
				};
				okK "a","nm","1234","";
				$txt = okK("l");
				like($txt,qr/^\s*\d+\s+nm\b/m,"derselbe Eintrag");
				$txt =~ /^\s*(\d+)\s+nm\b/m;
				$eid = $1;
				kunde "nm", sub {
					$txt = okK("l");
					like($txt,qr/^ID\s*:\s$eid\n/m,"ID $eid");
					like($txt,qr/^Faktor\s*:\s1234\.000\n/m,"Faktor");
					like($txt,qr/^Anzeige ab\s*:\s1234\.000\n/m,"Start");
					like($txt,qr/^Name\s*:\snm\n/m,"Name");
					like($txt,qr/^Info\s*:\snm\n/m,"Info");
					okK "n","km","i","Kilometer","f",1000,"s",10000;
				};
				$txt = okK("l");
				like($txt,qr/^\s*$eid\s+km\b/m,"derselbe Eintrag");
				kunde "km", sub {
					$txt = okK("l");
					like($txt,qr/^ID\s*:\s$eid\n/m,"ID $eid");
					like($txt,qr/^Faktor\s*:\s1000\.000\n/m,"Faktor");
					like($txt,qr/^Anzeige ab\s*:\s10000\.000\n/m,"Start");
					like($txt,qr/^Name\s*:\skm\n/m,"Name");
					like($txt,qr/^Info\s*:\sKilometer\n/m,"Info");
				};
			};
			$txt = okK("l");
			like($txt,qr/^Einheiten\s*:\s+2\s+\(Bytes\)\n/m,"Einheiten");
			like($txt,qr/^Einheiten\s*:\s+1\s+\(Pakete\)\n/m,"Einheiten");

			okK "s",34,"d","manches","f","anz_pakete","","i","fasel";
		};
		kunde "34", sub {
			$txt = okK("l");
			like($txt,qr/^Dienst\s*:\s+manches\n/m,"Dienst");
			like($txt,qr/^Schritt\s*:\s+34\n/m,"Schritt");
			like($txt,qr/^Flags\s*:\s+anz_pakete\n/m,"Flags");
			like($txt,qr/^Info\s*:\s+fasel\n/m,"Info");
			like($txt,qr/^Einheiten\s*:\s+2\s+\(Bytes\)\n/m,"Einheiten");
			like($txt,qr/^Einheiten\s*:\s+1\s+\(Pakete\)\n/m,"Einheiten");
		};
		okK "34","nk",$kid,"","";
#		$txt = okK("l");
#		is($txt,"","empty list");
	};
};
kunde $kid, sub {
	okK();
	kunde "R", sub {
		okK();
		kunde "ds", sub {
			okK();
			$txt = okK("l");
			like($txt,qr/^\s*\d+\s+manches\b/mi,"Eintrag");

#			okK "34","nk","-","";
#			$txt = okK("l");
#			is($txt,"","empty list");

			okK "a","12","nix","sec","bla","";
			$txt = okK("l");
			like($txt,qr/^\s*\d+\s+nix\b/mi,"Eintrag beim Kunden");
			kunde "12", sub {
				$txt = okK("l");
				like($txt,qr/^Dienst\s*:\s+nix\n/m,"Dienst");
				like($txt,qr/^Einheiten\s*:\s+1\s+\(Bytes\)\n/m,"Einheiten");
				like($txt,qr/^Einheiten\s*:\s+1\s+\(Pakete\)\n/m,"Einheiten");
			};
			okK "12","nk","-","","";
#			$txt = okK("l");
#			is($txt,"","empty list");
		};
	};
};
kunde "-", sub {
	okK();
	kunde "ds", sub {
		$txt = okK("l");
		like($txt,qr/^\s*34\b/m,"Eintrag");
		like($txt,qr/^\s*12\b/m,"Eintrag");

		okK "12","del";
		kunde "34", sub {
			okK "d","alles","i","-";
			$txt = okK("l");
			unlike($txt,qr/^Info\s*:/m,"kein Info");
		};

		$txt = okK("l");
		like($txt,qr/^\s*34\b/m,"Eintrag");
		unlike($txt,qr/^\s*12\b/m,"kein Eintrag");

		kunde "34", sub {
			okK "s","12";
		};

		$txt = okK("l");
		unlike($txt,qr/^\s*34\b/m,"kein Eintrag");
		like($txt,qr/^\s*12\b/m,"Eintrag");
	};
	kunde "lt", sub {
		okK "l";
		okK "*l";
	};
};

kunde "r", sub { # NIC-Daten
	$txt = okK("l");
	unlike($txt,qr/^\s*\d+\s+hier\b/m,"neuer Nic existiert noch nicht");

	okK("a","hier","");
	$txt = okK("l");
	like($txt,qr/^\s*\d+\s+hier\b/m,"neuer Nic ist angelegt");

	okK("a","dort","");

	kunde "hier", sub {
		$txt = okK("l");
		like($txt,qr/^NIC\s*:\s+hier\n/m, "NIC-name");
		unlike($txt,qr/^Handle-RE\s*:/m, "keine RE");

		okK("h","bla");
		$txt = okK("l");
		like($txt,qr/^Handle-RE\s*:\s+\^bla\$\n/m, "hat RE");

		okK("h","-");
		$txt = okK("l");
		unlike($txt,qr/^Handle-RE\s*:/m, "keine RE");

		kunde "d", sub {
			$txt = okK("l");
			unlike($txt,qr/^hier\.test\b/m,"Testdomain nein");
			unlike($txt,qr/^dort\.test\b/m,"Testdomain nein");

			okK "a","hier.test","";
			okK "a","dort.test","";
			$txt = okK("l");
			like($txt,qr/^hier\.test\b/m,"Testdomain hier");
			like($txt,qr/^dort\.test\b/m,"Testdomain dort");
			kunde "hier.test", sub {
				$txt = okK("l");
				like($txt,qr/^Name\s*:\s+hier\.test\n/m, "hat Name");
				like($txt,qr/^Registrar\s*:\s+hier\n/m, "hat Reg");
				like($txt,qr/^Dienst\s*:\s+general\n/m, "Standarddienst");
				unlike($txt,qr/^Whois\s*:/m, "hat Name");
				unlike($txt,qr/^Tech-C\s*:/m, "kein tech-c");
				unlike($txt,qr/^Zone-C\s*:/m, "kein zone-c");
				unlike($txt,qr/^Bill-C\s*:/m, "kein bill-c");

				okK "w","ab cd","d","manches";
				okK "t","tttech","z","ttzone","b","ttbill";
				$txt = okK("l");
				like($txt,qr/^Whois\s*:\s+ab cd\n/m, "hat whois");
				like($txt,qr/^Dienst\s*:\s+manches\n/m, "neuer Dienst");
				like($txt,qr/^Tech-C\s*:.*\btttech\n/m, "neuer tech-c");
				like($txt,qr/^Zone-C\s*:.*\bttzone\n/m, "neuer zone-c");
				like($txt,qr/^Bill-C\s*:.*\bttbill\n/m, "neuer bill-c");

				okK "w","-","t","-","z","-","b","-";
				$txt = okK("l");
				unlike($txt,qr/^Whois\s*:/m, "hat Name");
				unlike($txt,qr/^Tech-C\s*:/m, "kein tech-c");
				unlike($txt,qr/^Zone-C\s*:/m, "kein zone-c");
				unlike($txt,qr/^bill-C\s*:/m, "kein bill-c");

			};
			okK "hier.test","r","dort";
			kunde "hier.test", sub {
				$txt = okK("l");
				like($txt,qr/^Registrar\s*:\s+dort\n/m, "hat Name");
			};
			okK "hier.test","r","hier";

			okK "dort.test","del";
			$txt = okK("l");
			unlike($txt,qr/^dort\.test\b/m,"Testdomain wieder weg");

		};
		kunde "m", sub { # Mailadressen
			$txt = okK("l");
			unlike($txt,qr/^\s*\d+/m,"kein Eintrag");

			okK("a","");
			$txt = okK("l");
			like($txt,qr/^\s*\d+/m,"Eintrag vorhanden");
			my ($id) = ($txt =~ /^\s*(\d+)/m);
			kunde $id, sub {
				$txt = okK("l");
				like($txt,qr/^Registrar\s*:.*:hier\n/m,"Registrar");
				like($txt,qr/^Flags\s*:\s+-\n/m,"keine Flags");
				unlike($txt,qr/^PGP\S*\s*:/m,"kein Testkey");
				unlike($txt,qr/^Mail\S*\s*:/m,"keine Testmail");

				okK "f","deschd","";
				okK "m","ab\@cd.test","k","1234abcd";
				$txt = okK("l");
				like($txt,qr/^Flags\s*:\s+deschd\n/m,"Testflag");
				like($txt,qr/^PGP\S*\s*:\s+1234abcd\n/m,"Testkey");
				like($txt,qr/^Mail\S*\s*:\s+ab\@cd\.test\n/m,"Testmail");

				okK "f","deschd","";
				okK "m","-","k","-";
				$txt = okK("l");
				like($txt,qr/^Flags\s*:\s+-\n/m,"keine Flags");
				unlike($txt,qr/^PGP\S*\s*:/m,"kein Testkey mehr");
				unlike($txt,qr/^Mail\S*\s*:/m,"keine Testmail mehr");

			};
			okK($id,"del");
			$txt = okK("l");
			unlike($txt,qr/^\s*\d+/m,"Eintrag futsch");
		};
	};
};
kunde "pr", sub { # Druckerdaten
	okK();
	$txt = okK("l");
	is($txt,"","keine Daten");

	kunde "3", sub {
		okK(); # implizit anlegen
	};
	$txt = okK("l");
	like($txt,qr/^\s*3\s+Datei\b/m,"Ausgabe in der Liste");
	
	kunde "3", sub {
		$txt = okK("l");
		like($txt,qr/^Ausgabe\s*:\s+3:Datei\n/m,"Name");
		unlike($txt,qr/^Befehl\s*:/m,"kein Befehl");

		okK "e","Hurz";
		$txt = okK("l");
		like($txt,qr/^Befehl\s*:\s+Hurz\n/m,"Befehl da");

		okK "e","-";
		$txt = okK("l");
		unlike($txt,qr/^Befehl\s*:/m,"kein Befehl mehr");
	};
	okK "3","del";
	$txt = okK("l");
	is($txt,"","keine Daten mehr");
};
kunde "M", sub { # Mustertexte
	okK();
	$txt = okK("l");
	unlike($txt,qr/^\s*\d+\s+dienst\b/m,"kein Dienst");
	kunde "rech_fuss", sub {
		$txt = okK("l");
		is($txt,"","kein Eintrag");
		kunde "test123", sub {
			okK "e",<<END;
Jausa
Hepp!
END
			$txt = okK("l");
			like($txt,qr/^Hepp/m,"Hepp da");
		};
		$txt = okK("l");
		like($txt,qr/^\s*\d+\s+test123\s+12\b/m,"Eintrag da");
	};
	$txt = okK("l");
	like($txt,qr/^rech_fuss\s+1\b/m,"Text mit Dienst");

	kunde "rech_fuss", sub {
		okK "test123","del";
	};
	$txt = okK("l");
	like($txt,qr/^rech_fuss\s+0\b/m,"Dienst, aber ohne Template");
};
kunde "ds", sub { # Domainübergänge
	okK();
	$txt = okK("l");
	unlike($txt,qr/^. ja\b/, "Spielkram nicht da");
	kunde "ja", sub {
		$txt = okK("l");
		unlike($txt,qr/^. nein\b/, "mehr Spielkram nicht da");
		kunde "nein", sub {
			$txt = okK "l";
			unlike($txt,qr/^Ticketstatus\s*:/m, "alter Ticketstatus");
			unlike($txt,qr/^Statustext\s*:/m, "alter Statustext");
			unlike($txt,qr/^Acct-Info\s*:/m, "alter AcctInfo");
			like($txt,qr/^von Status\s*:.*\bja\s*$/m, "alter vonStatus");
			like($txt,qr/^\s*Event\s*:.*\bnein\s*$/m, "alter vonStatus");
			like($txt,qr/^\s*Reseller\s*:.*egal\s*$/m, "alter Reseller");
			like($txt,qr/^zu Status\s*:.*\(keine\b/m, "alter zuStatus");
			like($txt,qr/^Aktionen\s*:\s*-\s$/m, "keine Aktionen");
		};
	};
	$txt = okK("l");
	like($txt,qr/^b ja\s+nein\s+-\s+-\s*$/m, "Spielkram da");
	kunde "ja", sub {
		$txt = okK("l");
		like($txt,qr/^b nein\s+-\s+-\s+-\s*$/m, "Spielkram da");
		kunde "nein", sub {
			okK "s","vielleicht", "t","open", "i","Bla Blubber";
			okK "f","daneben","", "r","j", "a","3";
		};
		kunde ["!","j","nein"], sub {
			$txt = okK "l";
			like($txt,qr/^zu Status\s*:.*\bvielleicht\s*$/m, "neuer Status da");
			like($txt,qr/^Aktionen\s*:.*\bdaneben\s*$/m, "neue Aktion");
			like($txt,qr/^Ticketstatus\s*:.*\bopen\s*$/m, "neuer Ticketstatus");
			like($txt,qr/^Statustext\s*:\s*Bla Blubber\s*$/m, "neuer Statustext");
			like($txt,qr/^Acct-Info\s*:\s.*\bgrummel\s*$/m, "neuer AcctStatus");
			like($txt,qr/^\s*Reseller\s*:.*ja\s*$/m, "neuer Reseller");

			okK "s","-", "t","-", "i","-";
			okK "f","daneben","", "r","b", "a","-";
		};
		kunde "nein", sub {
			$txt = okK "l";
			unlike($txt,qr/^Ticketstatus\s*:/m, "alter Ticketstatus");
			unlike($txt,qr/^Statustext\s*:/m, "alter Statustext");
			unlike($txt,qr/^Acct-Info\s*:/m, "alter AcctInfo");
			like($txt,qr/^\s*Reseller\s*:.*egal\s*$/m, "alter Reseller");
			like($txt,qr/^zu Status\s*:.*\(keine\b/m, "alter zuStatus");
			like($txt,qr/^Aktionen\s*:\s*-\s$/m, "keine Aktionen");

			okK "s","vielleicht", "t","open", "i","Bla Blubber";
			okK "f","daneben","", "r","n", "a","3";
		};
		okK "vielleicht", "";
		$txt = okK("l");
		like($txt,qr/^b vielleicht\s+-\s+-\s+-\s*$/m, "Spielkram2 da");
		like($txt,qr/^n nein\s+vielleicht\s+open\s+daneben\s+Bla Blubber\s*$/m, "Spielkram hier");

		okK "vielleicht", "del";
		$txt = okK("l");
		unlike($txt,qr/^. vielleicht\b/m, "Spielkram2 weg");
	};
	$txt = okK("l");
	like($txt,qr/^n ja\s+nein\s+vielleicht\s+open\s+Bla Blubber\s*$/m, "Spielkram auch hier");
};
kunde "hs", sub { # Handleübergänge
	okK();
	$txt = okK("l");
	unlike($txt,qr/^. hachja\b/, "Spielkram nicht da");
	kunde "hachja", sub {
		$txt = okK("l");
		unlike($txt,qr/^. huchnein\b/, "mehr Spielkram nicht da");
		kunde "huchnein", sub {
			$txt = okK "l";
			unlike($txt,qr/^Ticketstatus\s*:/m, "alter Ticketstatus");
			unlike($txt,qr/^Statustext\s*:/m, "alter Statustext");
			unlike($txt,qr/^Acct-Info\s*:/m, "alter AcctInfo");
			like($txt,qr/^von Status\s*:.*\bhachja\s*$/m, "alter vonStatus");
			like($txt,qr/^\s*Event\s*:.*\bhuchnein\s*$/m, "alter vonStatus");
			like($txt,qr/^\s*Reseller\s*:.*egal\s*$/m, "alter Reseller");
			like($txt,qr/^zu Status\s*:.*\(keine\b/m, "alter zuStatus");
			like($txt,qr/^Aktionen\s*:\s*-\s$/m, "keine Aktionen");
		};
	};
	$txt = okK("l");
	like($txt,qr/^b hachja\s+huchnein\s+-\s+-\s*$/m, "Spielkram da");
	kunde "hachja", sub {
		$txt = okK("l");
		like($txt,qr/^b huchnein\s+-\s+-\s+-\s*$/m, "Spielkram da");
		kunde "huchnein", sub {
			okK "s","oochvielleicht", "t","open", "i","Bla Blubber";
			okK "f","ganz_daneben","", "r","j", "a","3";
		};
		kunde ["!","j","huchnein"], sub {
			$txt = okK "l";
			like($txt,qr/^zu Status\s*:.*\boochvielleicht\s*$/m, "neuer Status da");
			like($txt,qr/^Aktionen\s*:.*\bganz_daneben\s*$/m, "neue Aktion");
			like($txt,qr/^Ticketstatus\s*:.*\bopen\s*$/m, "neuer Ticketstatus");
			like($txt,qr/^Statustext\s*:\s*Bla Blubber\s*$/m, "neuer Statustext");
			like($txt,qr/^Acct-Info\s*:\s.*\bgrummel\s*$/m, "neuer AcctStatus");
			like($txt,qr/^\s*Reseller\s*:.*ja\s*$/m, "neuer Reseller");

			okK "s","-", "t","-", "i","-";
			okK "f","ganz_daneben","", "r","b", "a","-";
		};
		kunde "huchnein", sub {
			$txt = okK "l";
			unlike($txt,qr/^Ticketstatus\s*:/m, "alter Ticketstatus");
			unlike($txt,qr/^Statustext\s*:/m, "alter Statustext");
			unlike($txt,qr/^Acct-Info\s*:/m, "alter AcctInfo");
			like($txt,qr/^\s*Reseller\s*:.*egal\s*$/m, "alter Reseller");
			like($txt,qr/^zu Status\s*:.*\(keine\b/m, "alter zuStatus");
			like($txt,qr/^Aktionen\s*:\s*-\s$/m, "keine Aktionen");

			okK "s","oochvielleicht", "t","open", "i","Bla Blubber";
			okK "f","ganz_daneben","", "r","n", "a","3";
		};
		okK "oochvielleicht", "";
		$txt = okK("l");
		like($txt,qr/^b oochvielleicht\s+-\s+-\s+-\s*$/m, "Spielkram2 da");
		like($txt,qr/^n huchnein\s+oochvielleicht\s+open\s+ganz_daneben\s+Bla Blubber\s*$/m, "Spielkram hier");

		okK "oochvielleicht", "del";
		$txt = okK("l");
		unlike($txt,qr/^. oochvielleicht\b/m, "Spielkram2 weg");
	};
	$txt = okK("l");
	like($txt,qr/^n hachja\s+huchnein\s+oochvielleicht\s+open\s+Bla Blubber\s*$/m, "Spielkram auch hier");
};

my $wv_id; # für später brauchen wir einen Wartungsvertrag
kunde "w", sub { # Wartungsverträge
	$txt = okK("l");
	is($txt,"","kein Eintrag");
	okK "a","bla","SlaKram","1","ttadmin",<<_,"";
Wir vertragen uns
mit einem
Wartungsvertrag.
_
	$txt = okK("l");
	like($txt,qr/^\s*\d+\s+bla\b/m,"Bla-Vertrag");
	($wv_id)=($txt =~ /^\s*(\d+)/m);
	kunde $wv_id, sub {
		$txt = okK("l");
		like($txt,qr/^Name\s*:\s+bla\n/m,"Name");
		like($txt,qr/^SLA\s*:\s+SlaKram\n/m,"SLA");
		like($txt,qr/^Ansprechpartner\s*:\s+\S+:ttadmin\n/m,"Name");
		$txt = okK("p");
		like($txt,qr/^mit einem\n/m,"alter Text");

		okK "a","1","tttech","s","nix","n","fasel";
		okK "b",<<_;
Dies ist eine komplet neue Wartungs-
vertrag.
_
		$txt = okK("l");
		like($txt,qr/^Ansprechpartner\s*:\s+\S+:tttech\n/m,"neuer Name");
		like($txt,qr/^SLA\s*:\s+nix\n/m,"SLA");
		like($txt,qr/^Name\s*:\s+fasel\n/m,"neuer Name");
		$txt = okK("p");
		like($txt,qr/ komplet neue /,"neuer Text");
	};
};
kunde "q", sub { # RT-Queues
	$txt = okK("l");
	unlike($txt,qr/^bla\b/m, "keine bla-Queue");
	okK "a","bla","fasel\@laber.de.example","";
	$txt = okK("l");
	like($txt,qr/^bla\s+fasel\@laber\.de\.example\s+0\s+0\s+-\s*$/m, "bla-Queue");
	kunde "bla", sub {
		$txt = okK "l";
		like($txt,qr/^Name\s+:\s+bla\s*$/m,"Name da");
		like($txt,qr/^Mailadr\.\s+:\s+fasel\@laber\.de\.example\s*$/m,"Email da");
		like($txt,qr/^Flags\s+:\s+-\s*$/m,"keine Flags da");
		like($txt,qr/^init\.Prio\s*:\s+0\s*$/m,"keine init Prio");
		unlike($txt,qr/^Termin\s*:\s+0\s*$/m,"kein Termin");

		okK "f","m_mail","", "p","12", "d","6", "n","blaff";
	};
	kunde "blaff", sub {
		$txt = okK "l";
		like($txt,qr/^Name\s+:\s+blaff\s*$/m,"Name da");
		like($txt,qr/^Flags\s*:\s+m_mail\s*$/m,"Flags da");
		like($txt,qr/^init\.Prio\s*:\s+12\s*$/m,"init Prio");
		like($txt,qr/^Termin\s*:\s+nach 6 Tagen\s*$/m,"Termin");

		okK "f","m_mail","", "m","fasel\@laber.depp.example", "d","-";
		$txt = okK "l";
		like($txt,qr/^Mailadr\.\s+:\s+fasel\@laber\.depp\.example\s*$/m,"Email da");
		like($txt,qr/^Flags\s*:\s+-\s*$/m,"keine Flags da");
		like($txt,qr/^init\.Prio\s*:\s+12\s*$/m,"init Prio");
		unlike($txt,qr/^Termin\s*:/m,"kein Termin");

		okK "f","m_mail","", "p","12", "d","8";
		$txt = okK "l";
		like($txt,qr/^Flags\s*:\s+m_mail\s*$/m,"Flags da");
		like($txt,qr/^init.Prio\s*:\s+12\s*$/m,"init Prio");
		like($txt,qr/^Termin\s*:\s+nach 8 Tagen\s*$/m,"Termin");

		unlike($txt,qr/^Areas\s*:/m,"keine Areas");
		kunde "a", sub {
			okK "eins";
			okK "zwei";
			okK "drei";

			$txt = okK "l";
			like($txt,qr/^eins\n/m,"Area:eins");
			like($txt,qr/^zwei\n/m,"Area:zwei");
			like($txt,qr/^drei\n/m,"Area:drei");
		};
		$txt = okK "l";
		like($txt,qr/^Areas\s*:\s+3\s*$/m,"drei Areas");
		kunde "a", sub {
			okK "zwei";
			$txt = okK "l";
			like($txt,qr/^eins\n/m,"Area:eins");
			unlike($txt,qr/^zwei\n/m,"keine Area:zwei");
			like($txt,qr/^drei\n/m,"Area:drei");
		};
		$txt = okK "l";
		like($txt,qr/^Areas\s*:\s+2\s*$/m,"zwei Areas");
	};
	$txt = okK("l");
	like($txt,qr/^blaff\s+fasel\@laber\.depp\.example\s+12\s+8\s+m_mail\s*$/m, "blaff-Queue");
};

kunde $kid, sub { # in einem Kunden
	okK();
	$txt = okK("l");
	ok($txt =~ /^Kunde\s*:\s$kundenname\n/m, "Kundenname im Listing");

	kunde "m", sub { # Leute
		# TODO: suchen
		okK 'aa', '+', 'u', 'spieler', '', 'sonstwer', '9';
		$txt = okK("la");
		like($txt,qr/^sonstwer\s+9\s+#\s*\d+\s+spieler\s*$/m,"ist da");
		$txt = okK("L");
		unlike($txt,qr/\bspieler\s*$/m,"ist da");

		# Test dass beim Deassoziieren genau das Notwendige gefragt wird
		okK 'aa', 'spieler', 'blubb', '10';
		okK "d","spieler","sonstwer";
		okK "d","spieler";
		$txt = okK("la");
		unlike($txt,qr/\bspieler\s*$/m,"ist weg");
		$txt = okK("L");
		like($txt,qr/\bspieler\s*$/m,"ist da");

		okK 'aa', 'spieler', 'sonstwer', '9';
		my $sid;
		kunde "spieler", sub {
			$txt = okK("l");
			like($txt,qr/^Username\s*:\sspieler\s*$/m, "Username");
			like($txt,qr/^Flags\s*:\s-\s*$/m, "keine Flags");
			my $pat = qr/^ID\s*:\s(\d+)\s*$/m;
			like($txt,$pat,"ID");
			$txt =~ $pat;
			$sid = $1;
			okK "u","-";
		};
		kunde $sid, sub {
			$txt = okK("l");
			unlike($txt,qr/^Username\s*:/m, "kein Username");
			unlike($txt,qr/^User-ID\s*:/m, "keine UserID");
			unlike($txt,qr/^Passwort\s*:/m, "kein PW");
			unlike($txt,qr/^Beschreibung\s*:/m, "keine Beschreibung");
			unlike($txt,qr/^Geburtstag\s*:/m, "kein Geburtstag");
			unlike($txt,qr/^Name\s*:/m, "kein Name");
			unlike($txt,qr/^Abteilung\s*:/m, "keine Abteilung");
			unlike($txt,qr/^Telefon\s*:/m, "kein Telefon");
			unlike($txt,qr/^Fax\s*:/m, "kein Fax");
			unlike($txt,qr/^Handy\/Pager\s*:/m, "kein Handy");
			unlike($txt,qr/^Adresse\s*:/m, "keine Adresse");
			unlike($txt,qr/^=\s/m, "keine geparste Adresse");
			unlike($txt,qr/^Zusatzinfo\s*:/m, "keine Zusatzinfo");
			unlike($txt,qr/^Funktion\s*:/m, "keine Funktion");
			unlike($txt,qr/^RedirectZiel\s*:/m, "kein RedirectZiel");
			unlike( $txt, qr/^FTP-HomeDir\.\s*:/m, 'kein FTP-Home' );
			unlike($txt,qr/^Kurzname\.\s*:/m, "kein Kurzname");
			unlike($txt,qr/^Ausweis-Nr\.\s*:/m, "kein Ausweis");
			okK "u","spieler";
		};
		kunde "spieler", sub {
			okK "uu","4242", "uf","meier","", "G","2000-12-23";
			okK "UP","blaffa","blaffa", "d","Testmensch","heute","";
			okK "n","Herr Meier", "a","hier und da", "p","+12 34 56";
			okK "g","+23 45 67";
			okK "w","D","12345","HierDort","Wegweg 1","";
			okK "i","Welch Unfug", "F","Schrott", "k","spil";
			okK 'r', 'http://nirgend.wo.example/', 'uh', '/www/spielkram';
			okK "au","abziesl 123", "f","+12 34 567 89";
			$txt = okK("l");
			like($txt,qr/^Flags\s*:\smeier\s*$/m, "Flags");
			like($txt,qr/^User-ID\s*:\s4242\s*$/m, "UserID");
			like($txt,qr/^Passwort\s*:\s\*+\s*$/m, "Passwort");
			like($txt,qr/^Beschreibung\s*:\sTestmensch\s*$/m, "Beschreibung 1");
			like($txt,qr/^\s+:\sheute\s*$/m, "Beschreibung 2");
			like($txt,qr/^Geburtstag\s*:\s2000-12-23\s*$/m, "Geburtstag voll");
			like($txt,qr/^Name\s*:\sHerr Meier\s*$/m, "Name");
			like($txt,qr/^Abteilung\s*:\shier und da\s*$/m, "Abteilung");
			like($txt,qr/^Telefon\s*:\s\+12 34 56\s*$/m, "TelNr");
			like($txt,qr/^Fax\s*:\s\+12 34 567 89\s*$/m, "TelNr");
			like($txt,qr/^Handy\/Pager\s*:\s\+23 45 67\s*$/m, "Handy");
			like($txt,qr/^Adresse\s*: #\d+$/m, "Adresse");
			like($txt,qr/^\s+:\sWegweg 1\s*$/m, "=Strasse");
			like($txt,qr/^\s+:\s12345 HierDort\s*$/m, "=Ort");
			like($txt,qr/^\s+:\sDeutschland\s*$/m, "=Land");
			like($txt,qr/^Zusatzinfo\s*:\sWelch Unfug\s*$/m, "Zusatzinfo");
			like($txt,qr/^Funktion\s*:\sSchrott\s*$/m, "Funktion");
			like($txt,qr/^RedirectZiel\s*:\shttp:\/\/nirgend\.wo\.example\/\s*$/m, "RedirectZiel");
			like( $txt, qr#^FTP-HomeDir\.\s*:\s/www/spielkram\s*$#m, 'FTP-HomeDir.' );
			like($txt,qr/^Kurzname\s*:\sspil\s*$/m, "Kurzname");
			like($txt,qr/^Ausweis-Nr\.\s*:\sabziesl 123\s*$/m, "Ausweis");

			okK "uf","meier","", "uu","-", "UP","-", "d","-", "GG","-";
			okK "n","-", "a","-", "t","-", "w","-", "i","-", "F","-";
			okK "uh","-", "k","-", "f","-","au","-", "g","-", "r","-";
			# t == p
			$txt = okK("l");
			like($txt,qr/^Flags\s*:\s-\s*$/m, "keine Flags");
			unlike($txt,qr/^User-ID\s*:/m, "keine UserID");
			unlike($txt,qr/^Passwort\s*:/m, "kein PW");
			unlike($txt,qr/^Beschreibung\s*:/m, "keine Beschreibung");
			like($txt,qr/^Geburtstag\s*:\s\?{4}-12-23\s*$/m, "Geburtstag MM-TT");
			unlike($txt,qr/^Name\s*:/m, "kein Name");
			unlike($txt,qr/^Abteilung\s*:/m, "keine Abteilung");
			unlike($txt,qr/^Telefon\s*:/m, "kein Telefon");
			unlike($txt,qr/^Fax\s*:/m, "kein Fax");
			unlike($txt,qr/^Handy\/Pager\s*:/m, "kein Handy");
			unlike($txt,qr/^Adresse\s*:/m, "keine Adresse");
			unlike($txt,qr/^Zusatzinfo\s*:/m, "keine Zusatzinfo");
			unlike($txt,qr/^Funktion\s*:/m, "keine Funktion");
			unlike($txt,qr/^RedirectZiel\s*:/m, "kein RedirectZiel");
			unlike( $txt, qr/^FTP-HomeDir\.\s*:/m, 'kein FTP-HomeDir.' );
			unlike($txt,qr/^Kurzname\.\s*:/m, "kein Kurzname");
			unlike($txt,qr/^Ausweis-Nr\.\s*:/m, "kein Ausweis");

			okK "G","-";
			$txt = okK("l");
			unlike($txt,qr/^Geburtstag\s*:/m, "kein Geburtstag");

			okK "GG","2000";
			$txt = okK("l");
			like($txt,qr/^Geburtstag\s*:\s2000-\?\?-\?\?\s*$/m, "Geburtstag JJJJ");

			okK "uu","4242", "uf","meier","", "G","12-23";
			okK "UP","blaffb","blaffb", "d","Testmensch","heute","";
			okK "n","Herr Meier", "a","hier und da", "p","+12 345 6789";
			okK "g","+23 456 789 0";
			okK "w","D","12345","HierDort","Wegweg 1","";
			okK "i","Geraffel hoch drei", "F","Schrott", "k","spil";
			okK 'r', 'http://nirgend.wo.example/', 'uh', '/www/spielkram';
			okK "au","abziesl 123", "f","+12 345 67 890";

			$txt = okK("l");
			like($txt,qr/^Geburtstag\s*:\s2000-12-23\s*$/m, "Geburtstag JJJJ-MM-TT");

			# TODO: M b h ac W ri uk v K rh del d? m? w?
		};
	};
	kunde "h", sub { # Hardware
		okK( 'a', 'Kasten', '', '', '', 'spieler', '', 'ttfirma', '' );
		okK( 'a', 'Kram',   '', '', '', 'spieler', '', 'ttfirma', '' );
		$txt = okK "l";
		like($txt,qr/2 weitere.*ohne\b/, "nix mit ID");

		$txt = okK "ll";
		my $pat = qr/^\s*(\d+)\s+Kram\b/m;
		like($txt,$pat,"Eintrag 'Kram'");
		$txt =~ $pat;
		my $hid=$1;
		my $wvid;
		kunde "Kram", sub {
			$txt = okK("L");
			like($txt,qr/^Name\s*:\sKram\s*$/m, "der Name");
			like($txt,qr/^Eigent.*mer\s*:\s#\d+:ttfirma\s*$/m, "der Besitzer");
			unlike($txt,qr/^Klasse\s*:/m, "keine Klasse");
			unlike($txt,qr/^Typ\s*:/m, "kein Typ");
			unlike($txt,qr/^InventarNr\s*:/m, "keine InventarNr");
			unlike($txt,qr/^SerienNummer\s*:/m, "keine SerienNummer");
			unlike($txt,qr/^enthalten in\s*:/m, "kein Ding drüber");
			like( $txt, qr/^Standort\s*:/m, 'Standort' );
			unlike($txt,qr/^Status\s*:/m, "kein Status");
			unlike($txt,qr/^Lieferant\s*:/m, "kein Lieferant");
			unlike($txt,qr/^Console\s*:/m, "keine Console");
			unlike($txt,qr/^Zusatzinfo\s*:/m, "keine Zusatzinfo");
			unlike($txt,qr/^Ende\s*:/m, "kein Enddatum");
			unlike($txt,qr/^WartungsV\.\s*:/m, "kein Wartungsvertrag");
			unlike($txt,qr/^Hardware-ID\s*:/m, "keine Hardware-ID");

			okK "iv","1234567", "sn","elf zwoelf";
			okK "st","ttadmin", "s","ganz", "lf","alle", "c","sonstwas";
			okK "i","sonst ein Text", "e","ttbill", "x","2000-01-02 12:34","2001-10-11";
			okK "k","Loch", "n","Kiste", "T","Ding", "id","D123456";
		}; # umbenannt!
		my $wvhid;
		kunde "Kiste", sub {
			kunde [ "w","fasel","2000-01-02","2002-12-13" ], sub {
				$txt = okK("l");
				like($txt,qr/^Laufzeit-Beginn\s*:\s2000-01-02\s*$/mi, "WVH Anfang");
				like($txt,qr/^Laufzeit-Ende\s*:\s2002-12-13\s*$/mi, "WVH Ende");
				like($txt,qr/^\>Ansprechpartner\s*:\s#\d+:tttech\s*$/mi, "WVH Ansprechpartner");
				my $pat = qr/^ID\s*:\s(\d+)\s*$/m;
				like($txt,$pat,"Eintrag 'ID'");
				$txt =~ $pat;
				$wvhid=$1;
			};
			$txt = okK("L");
			like($txt,qr/^Eigent.*mer\s*:\s#\d+:ttbill\s*$/m, "der neue Besitzer");
			like($txt,qr/^Klasse\s*:\sLoch\s*$/m, "die Klasse");
			like($txt,qr/^Name\s*:\sKiste\s*$/m, "der neue Name");
			like($txt,qr/^Typ\s*:\sDing\s*$/m, "der neue Typ");
			like($txt,qr/^Hardware-ID\s*:\sD123456\s*$/mi, "die neue ID");
			like($txt,qr/^InventarNr\s*:\s1234567\s*$/mi, "die neue InventarNr");
			like($txt,qr/^SerienNummer\s*:\self zwoelf\s*$/mi, "die neue SerienNummer");
			like($txt,qr/^Standort\s*:\s#\d+:ttadmin\s*$/mi, "neuer Standort");
			like($txt,qr/^Status\s*:\sganz\s*$/mi, "neuer Status");
			like($txt,qr/^Lieferant\s*:\salle\s*$/mi, "neuer Lieferant");
			like($txt,qr/^Console\s*:\ssonstwas\s*$/mi, "neue Console");
			like($txt,qr/^Zusatzinfo\s*:\ssonst ein Text\s*$/mi, "neue Zusatzinfo");
			like($txt,qr/^Beginn\s*:\s2000-01-02 12:34\s*$/mi, "neuer Anfang");
			like($txt,qr/^Ende\s*:\s2001-10-11\s*$/mi, "neues Ende");
			like($txt,qr/^WartungsV\.\s*:\s#${wvhid}\:fasel von 2000-01-02 bis 2002-12-13\s*$/mi, "neuer WVH");

			okK( 'p', 'Kasten' );
			$txt = okK("L");
			like( $txt, qr/^Standort\s*:/m, 'Standort' );
			like($txt,qr/^enthalten in\s*:\s#\d+:Kasten\s*$/mi, "das Ding drüber");
		};
		kunde "Kasten", sub {
			$txt = okK("L");
			like($txt,qr/^\>eingebaut\s*:\s#\d+:Kiste\s/mi, "Kiste ist drin");
		};
		kunde "Kiste", sub {
			okK "k","-", "T","-", "id","-", "iv","-", "sn","-", qw(p - 1);
			okK "s","-", "lf","-", "c","-", "i","-";
			okK "x","","0", "w$wvhid","del";
			$txt = okK("L");
			unlike($txt,qr/^Klasse\s*:/m, "keine Klasse");
			unlike($txt,qr/^Typ\s*:/m, "kein Typ");
			unlike($txt,qr/^Hardware-ID\s*:/m, "keine Hardware-ID");
			unlike($txt,qr/^InventarNr\s*:/m, "keine InventarNr");
			unlike($txt,qr/^SerienNummer\s*:/m, "keine SerienNummer");
			unlike($txt,qr/^enthalten in\s*:/m, "kein Ding drüber");
			unlike($txt,qr/^Status\s*:/m, "kein Status");
			unlike($txt,qr/^Lieferant\s*:/m, "kein Lieferant");
			unlike($txt,qr/^Console\s*:/m, "keine Console");
			unlike($txt,qr/^Zusatzinfo\s*:/m, "keine Zusatzinfo");
			like($txt,qr/^Beginn\s*:\s2000-01-02 12:34\s*$/mi, "alter Anfang");
			unlike($txt,qr/^Ende\s*:/m, "kein Enddatum");
			unlike($txt,qr/^WartungsV\.\s*:/m, "kein Wartungsvertrag");
		};
		kunde "Kasten", sub {
			$txt = okK("L");
			unlike($txt,qr/^\>eingebaut\s*:/m, "Kiste ist nicht drin");
		};
		kunde "Kiste", sub {
			okK "k","Loch", "T","Ding", "id","D987654", "iv","98765432";
			okK "sn","elf zwoelf", "p","Kasten";
			okK "s","putt", "lf","niemand", "c","sonstwas";
			okK "i","Unfug zum Testen";
			okK "w","fasel","2001-02-03","2002-03-04","";
			# TODO: K
		};
	};
	kunde "lt", sub { # Leitungen
		okK();
		# TODO
	};
	kunde "t", sub { # Tarife
		okK();
		# TODO
	};
	kunde "d", sub { # Domains
		okK();
		# TODO
	};
	kunde "i", sub { # IP-Adressen
		okK "a","10.2.3.0","24", "";
		kunde "10.2.3.0/24", sub {
			$txt = okK("l");
			okP "l","Ziel","z", "std","dort","=";
			okP "l","Dienst","sd", "ip","alles","=","ip","=";
			okP "l","Gateway","k", undef, "im Wald","=", "-",undef, "Regenwald","=";
			okP "l","Flags","f", "-", ["2",""],"Tal", ["2",""],"-", ["1",""],"Wald";
			okP "l","Netzname","n", undef, "Pampa","=","-",undef,"Waldbaer","=";
			okP "l","Zusatzinfo","i", undef, "Welch Unfug","=", "-",undef, "dies ist mein Testnetz","=";
			okP "l","Registrar","rg", undef, "hier","=", "-",undef, "ripe","=";
			okP "l","Firma","sf", undef, "ttadmin",":ttadmin", "-",undef,
				"ttfirma",":ttfirma";
			okP "l","Admin-C","sa", undef, "tttech",":tttech", "-",undef,
				"ttadmin",":ttadmin";
			okP "l","Tech-C","st", undef, "ttbill",":ttbill", "-",undef,
				"tttech",":tttech";
			# TODO: sind das auch die richtigen Personen?
			kunde "ef", sub { kunde_at 'edit_person'; };
			kunde "ea", sub { kunde_at 'edit_person'; };
			kunde "et", sub { kunde_at 'edit_person'; };
			okK "sf","-", "sa","-", "st","-";
			kunde ["ef","ttfirma"], sub {
				kunde_at 'edit_person';
			};
			kunde ["ea","ttadmin"], sub {
				kunde_at 'edit_person';
				okK "h","ripe","$WDESCR-ripe-admin","","","","";
			};
			kunde ["et","tttech"], sub {
				kunde_at 'edit_person';
				okK "h","ripe","$WDESCR-ripe-tech","","","","";
			};
			$txt = okK("p");
			like($txt,qr/^mnt-by:\s*$WDESCR-MNT\s*$/mi,"Ripe Mnt");
			like($txt,qr/^admin-c:\s*$WDESCR-ripe-admin\s*$/m,"Ripe admin");
			like($txt,qr/^tech-c:\s*$WDESCR-ripe-tech\s*$/m,"Ripe tech");
			like($txt,qr/^inetnum:\s*10\.2\.3\.0 - 10\.2\.3\.255\s*$/m,"Ripe Adr");
			like($txt,qr/^netname:\s*waldbaer\s*$/mi,"Ripe Netname");
			# TODO: Adresse setzen und in descr:-Zeilen wiederfinden

			# TODO: x t j J r K 
			# TODO: m pp mf ap tp af tf am tm
		};
		okK "a","10.2.3.16","28", "";
		okK "a","10.2.3.15","", "";
		kunde "10.2.3.15", sub {
			okP "l","MAC-Adr.","c", undef, "223456789abf","22:34:56:78:9A:BF",
				"-",undef, "123456789ABC","12:34:56:78:9A:BC";
		};
		okK "a","10.2.3.129","", "expunge";
		kunde "10.2.3.16/28", sub {
			okK "n","Netzli";
			$txt = okK("l");
			like($txt,qr/^Ziel\s*:\sdort\s*$/m, "Ziel übergeordnet");
		};
		kunde "10.2.3.0/24", sub {
			$txt=okK("q");
			like($txt,qr/^Freie Adressen: 239\n/, "239 Adressen frei");
		};
		$txt = okK("lv");
		is($txt,"","no VRFs");
		okK "v","123","TestVRF","";
		$txt = okK("lv");
		like($txt,qr/^\s*123\s+\S+\s+TestVRF\s*$/m, "VRF-Liste");
		kunde "123!0.0.0.0/0", sub {
			$txt = okK("l");
			like($txt,qr/^Adresse\s*:\s+1234:5678:9ABC:DEF0:0:7B::\/96\s*$/m,"VRF");
		};
		okK "a","123!10.10.10.0/24","";
		kunde "123!10.10.10.0/24", sub {
			$txt = okK("l");
			like($txt,qr/^Adresse\s*:\s+TestVRF!10.10.10.0\/24\E\s*$/m,"unterVRF");
		};
		okK "a","FE80::10:20:30/128","";
		kunde "FE80::10:20:30", sub {
			$txt = okK("l");
			like($txt,qr/^Adresse\s*:\s+FE80::10:20:30\s*$/m,"v6-Adresse");
		};
#[DEV] ### Kunde_3:test-smurf IP> l
#   ID Adress{e,bereich}            Ziel FQDN/Netzname und Zeit(raum)
#    1 10.2.3.0/24                     d Waldbaer seit 2008-08-13 13:13
#    3 10.2.3.15                       d  seit 2008-08-13 13:13
#    2 10.2.3.16/28                    d Netzli seit 2008-08-13 13:13
#    8 10.2.3.32                       d ding.example seit 2008-08-13 13:13
#    7 10.2.3.32/27                    d neuBlubb seit 2008-08-13 13:13
#    9 10.2.3.33                       d bumm.example seit 2008-08-13 13:13
#    5 TestVRF!0.0.0.0/0               s  seit 2008-08-13 13:13
#    6 TestVRF!10.10.10.0/24           s  seit 2008-08-13 13:13
#
#[DEV] ### Kunde_3:test-smurf IP> l6
#   ID Adress{e,bereich}            Ziel FQDN/Netzname und Zeit(raum)
#    5 1234:5678:9ABC:DEF0:0:7B::/96   s  seit 2008-08-13 13:13
#    6 1234:5678:9ABC:DEF0:0:7B:A0A:A00/120 s  seit 2008-08-13 13:13
#   12 FE80::10:20:30                  s  seit 2008-08-13 13:45
#
#[DEV] ### Kunde_3:test-smurf IP> ll
#   ID Adress{e,bereich}            Ziel FQDN/Netzname und Zeit(raum)
#    1 10.2.3.0/24                     d Waldbaer seit 2008-08-13 13:13
#    3 10.2.3.15                       d  seit 2008-08-13 13:13
#    2 10.2.3.16/28                    d Netzli seit 2008-08-13 13:13
#    8 10.2.3.32                       d ding.example seit 2008-08-13 13:13
#    7 10.2.3.32/27                    d neuBlubb seit 2008-08-13 13:13
#    9 10.2.3.33                       d bumm.example seit 2008-08-13 13:13
#    5 TestVRF!0.0.0.0/0               s  seit 2008-08-13 13:13
#    6 TestVRF!10.10.10.0/24           s  seit 2008-08-13 13:13
#   12 FE80::10:20:30                  s  seit 2008-08-13 13:45
#
#[DEV] ### Kunde_3:test-smurf IP> l4
#   ID Adress{e,bereich}            Ziel FQDN/Netzname und Zeit(raum)
#    1 10.2.3.0/24                     d Waldbaer seit 2008-08-13 13:13
#    3 10.2.3.15                       d  seit 2008-08-13 13:13
#    2 10.2.3.16/28                    d Netzli seit 2008-08-13 13:13
#    8 10.2.3.32                       d ding.example seit 2008-08-13 13:13
#    7 10.2.3.32/27                    d neuBlubb seit 2008-08-13 13:13
#    9 10.2.3.33                       d bumm.example seit 2008-08-13 13:13
		my $p4 = qr/10\.2\.3\.16\/28/;
		my $p6 = qr/FE80::10:20:30/;
		my $pv = qr/TestVRF!10\.10\.10\.0\/24/;
		my $pw = qr/1234:5678:9ABC:DEF0:0:7B:A0A:A00\/120/;

		$txt = okK("l");
		like($txt,qr/^\s*\d+\s+$p4\s/m,"v4-Adresse in 'l'");
		unlike($txt,qr/^\s*\d+\s+$p6\s/m,"v6-Adresse in 'l'");
		like($txt,qr/^\s*\d+\s+$pv\s/m,"vv-Adresse in 'l'");
		unlike($txt,qr/^\s*\d+\s+$pw\s/m,"vw-Adresse in 'l'");

		$txt = okK("ll");
		like($txt,qr/^\s*\d+\s+$p4\s/m,"v4-Adresse in 'll'");
		like($txt,qr/^\s*\d+\s+$p6\s/m,"v6-Adresse in 'll'");
		like($txt,qr/^\s*\d+\s+$pv\s/m,"vv-Adresse in 'll'");
		unlike($txt,qr/^\s*\d+\s+$pw\s/m,"vw-Adresse in 'll'");

		$txt = okK("l4");
		like($txt,qr/^\s*\d+\s+$p4\s/m,"v4-Adresse in 'l4'");
		unlike($txt,qr/^\s*\d+\s+$p6\s/m,"v6-Adresse in 'l4'");
		unlike($txt,qr/^\s*\d+\s+$pv\s/m,"vv-Adresse in 'l4'");
		unlike($txt,qr/^\s*\d+\s+$pw\s/m,"vw-Adresse in 'l4'");

		$txt = okK("l6");
		unlike($txt,qr/^\s*\d+\s+$p4\s/m,"v4-Adresse in 'l6'");
		like($txt,qr/^\s*\d+\s+$p6\s/m,"v6-Adresse in 'l6'");
		unlike($txt,qr/^\s*\d+\s+$pv\s/m,"vv-Adresse in 'l6'");
		like($txt,qr/^\s*\d+\s+$pw\s/m,"vw-Adresse in 'l6'");

		my $nm4 = qr/10\.2\.3\.0\/24/;
		$txt = okK("ll /");
		like($txt,qr/^\s*\d+\s+$nm4\s/m,"Netzmaske 1 in 'll /'");
		like($txt,qr/^\s*\d+\s+$p4\s/m,"Netzmaske 2 in 'll /'");

		my $ip4 = qr/10\.2\.3\.15/;
		$txt = okK("ll #1");
		like($txt,qr/^\s*\d+\s+$ip4\s/m,"ip-Adresse in 'll #1'");
		like($txt,qr/^\s*\d+\s+$p4\s/m,"v4-Adresse in 'll #1'");

	};
	my $kram;
	kunde "ii", sub { # Zonen
		okK "a","kramladen","10.2.3.0/24","27","";
		kunde "kramladen", sub {
			$txt = okK("l");
			my $pat = qr/^ID\s*:\s(\d+)\s*$/m;
			like($txt,$pat,"ID");
			$txt =~ $pat;
			$kram = $1;
		};
		kunde $kram, sub {
			$txt = okK("l");
			unlike($txt,qr/^Netze\s*:/m, "keine Netze");
			okP "l","Name","n", "kramladen", "kramkiste","=", "kramladen","=";
			okP "l","neuVon","N", ":Waldbaer", "-",undef,"10.2.3.0/24",":Waldbaer";
			okP "l","neuBlock","B","/27", "-",undef,"28","/28","27","/27";
			# TODO: del K
		};
		# TODO: l ll
	};
	kunde "i", sub {
		okK "a","kramladen","", "n","neuBlubb","", "n","ding.example","";
		kunde "10.2.3.0/24", sub {
			okP "l","Alloc","a", undef, "kramladen","=","-",undef;
		};

		okK "a",$kram,"", "n","bumm.example","";
		kunde "10.2.3.0/24", sub {
			okP "l","Alloc","a", undef, "kramladen","=","-",undef;
		};
		$txt = okK("l");
		like($txt,qr/ding\.example/,"FQDN wird ausgegeben");
		$txt = okK("L");
		like($txt,qr/ding\.example/,"FQDN wird ausgegeben");
		$txt = okK("ll");
		like($txt,qr/ding\.example/,"FQDN wird ausgegeben");
	};
	kunde "ii", sub {
		kunde "kramladen", sub {
			$txt = okK("l");
			like($txt,qr/^Netze\s*:/m, "hat Netze (OK, eines)");
			my $pat = qr/^\s*(\d+)\s\d+\.\d+\.\d+\.\d+\/27\s+neuBlubb\s*$/m;
			like($txt,$pat, "das Netz");
			$txt =~ $pat;
			my $nadr = $1;

			okK($nadr);
			$txt = okK("l");
			unlike($txt,qr/^Netze\s*:/m, "keine Netze");

			okK($nadr);
			$txt = okK("l");
			like($txt,qr/^Netze\s*:/m, "hat wieder Netze (OK, immer noch eines)");
			like($txt,$pat, "das Netz");
		};
	};
	kunde "i", sub {
		kunde "Waldbaer", sub {
			$txt = okK("q");
			like($txt,qr/^Freie Adressen:\s207\s*$/m, "207 frei");
			$txt = okK("qq");
			like($txt,qr/:\sNetzli\s*$/m, "Netzli da");
			unlike($txt,qr/:\sding\.example\s*$/m, "ding.example nicht da");
			$txt = okK("qa");
			like($txt,qr/:\sNetzli\s*$/m, "Netzli da");
			like($txt,qr/:\sding\.example\s*$/m, "ding.example da");
		};
	};
	kunde "ii", sub {
		kunde "kramladen", sub {
			$txt = okK("q");
			like($txt,qr/^Freie Adressen:\s30\s*$/m, "30 frei2");
			$txt = okK("qq");
			unlike($txt,qr/:\sNetzli\s*$/m, "Netzli nicht da");
			like($txt,qr/:\sneuBlubb\s*$/m, "neuBlubb da");
			unlike($txt,qr/:\sding\.example\s*$/m, "ding.example nicht da2");
			$txt = okK("qa");
			unlike($txt,qr/:\sNetzli\s*$/m, "Netzli nicht da");
			like($txt,qr/:\sneuBlubb\s*$/m, "neuBlubb da");
			like($txt,qr/:\sding\.example\s*$/m, "ding.example da2");
		};
	};

	kunde "M", sub { # Mailregeln
		okK();
		# TODO
	};
	kunde "T", sub { # Tickets
		okK();
		# TODO
	};

	$txt = okK("l");
	unlike($txt,qr/^Reseller\s*:\s/m, "kein Reseller");
	okK "rs","rebla","Grumpf","";

	$txt = okK("l");
	like($txt,qr/^Reseller\s*:\srebla\s*$/m, "Reseller");

	okK "rs","del";
	$txt = okK("l");
	unlike($txt,qr/^Reseller\s*:\s/m, "kein Reseller");

	okK "rs","rebla","Grumpf","";
	kunde "rs", sub { # Reseller
		$txt = okK("l");
		like($txt,qr/^Kunde\s*:\s#$kid:\S+\s*$/m, "Kunde");

		okP "l","Name","n", "Grumpf", "TestSeller","=";
		okP "l","Flags","f", "-", ["signed",""],"signed", ["signed",""],"-";
		okP "l","Art","t", "rebla", "retest","=";
		okP "l","Mailadr\\.","m", undef, "ga\@buffi.example","=", "-",undef, "re\@seller.example","=";
		okP "l","PGP-Key.","p", undef, "12345678","=", "-",undef,"12348765","=";
	};
	kunde "ci", sub {
		okK "a","eins";
		okK "a","zwei";
		okK "a","drei";
		$txt = okK "l";
		like($txt,qr/^eins\n/m,"CI:eins");
		like($txt,qr/^zwei\n/m,"CI:zwei");
		like($txt,qr/^drei\n/m,"CI:drei");

		okK "d","zwei";
		$txt = okK "l";
		like($txt,qr/^eins\n/m,"CI:eins");
		unlike($txt,qr/^zwei\n/m,"kein CI:zwei");
		like($txt,qr/^drei\n/m,"CI:drei");
	};
	kunde "u", sub {
		okK "a","blafasel";
		okK "a","fasellaber";
		okK "a","labergerede";
		$txt = okK "l";
		like($txt,qr/^blafasel\n/m,"Alias:blafasel");
		like($txt,qr/^fasellaber\n/m,"Alias:fasellaber");
		like($txt,qr/^labergerede\n/m,"Alias:labergerede");

		okK "d","fasellaber";
		$txt = okK "l";
		like($txt,qr/^blafasel\n/m,"Alias:blafasel");
		unlike($txt,qr/^fasellaber\n/m,"kein Alias:fasellaber");
		like($txt,qr/^labergerede\n/m,"Alias:labergerede");
	};
	okP "l","BuchKonto","g", undef, 54321,"=", 0,undef, 12345,"=";
	okP "l","ZahlungsZ","Z", undef,13,"13 Tage", "-",undef,10,"10 Tage";
	okP "l","berechne","b", "monatlich", "y","jaehrlich", "m","monatlich";
	okP "l","Rechnung","B", undef,"200012","=", "-",undef;
	kunde "k", sub {
		$txt = okK("l");
		unlike($txt,qr/\n.*\n/, "kein Eintrag");
		okK "a","eins",11111,"zwei",22222;
		$txt = okK("l");
		like($txt,qr/11111\s+eins\s*\n22222\s+zwei\s*$/, "Eintrag");
		okK "d";
		$txt = okK("l");
		unlike($txt,qr/\n.*\n/, "kein Eintrag");

		okK "a","Fred Feuerstein",161803399,"Steinzeitbank OhG",3141592653;
	};
	okK "m","aa","ttfirma",":","0","";
	okP "l","USt-ID-Nr","SN", undef, "blubberkram","=","-",undef, "DE-0815-4711","=";
	okP "l",qr/Priorit.*t/,"pr", undef, "a","wichtig", "-",undef, "z","unwichtig";
	okP "l","Sprache","s", undef, "Esperanto","=", "-",undef, "Lojban","=";
	okP "l","Flags","f", "-", ["keine_ust",""],"keine_ust", ["keine_ust",""],"-";
	# TODO: X XB = =* =? tt TT R ren x del 
	# TODO: W P N NN ND lp ep sp NP cp 
};
kunde $kid2, sub {
	okP "l","Reseller","RS", undef, $kid,":$kundenname", "-",undef, $kid,":$kundenname";
};

kunde "w", sub { # Wartungsvertrag rauswerfen
	$txt = okK("l");
	unlike($txt,qr/^\s*\d+\s+kill\b/m,"Tilt-Vertrag ist nicht da");

	okK "a","kill","kill me","1","ttadmin",<<_,"";
Dies ist Unfug.
Er wird sogleich wieder getiltet.
_
	$txt = okK("l");
	like($txt,qr/^\s*\d+\s+kill\b/m,"Tilt-Vertrag ist da");
	($wv_id)=($txt =~ /^\s*(\d+)\s+kill\b/m);
	okK $wv_id,"del";

	$txt = okK("l");
	unlike($txt,qr/^\s*\d+\s+kill\b/m,"Tilt-Vertrag ist weg");
};

kunde "-", sub { # alle Kunden
	okK();
	# TODO: d h t m W = =* == i M a ml cl T tt X XB
};
# TODO: k fb

okK("a","delete_me","n","","");
$kid = DoFn("select id from kunde where name='delete_me'");
ok((defined $kid and $kid>0), "Kunde existiert");

okS "Kunde löschen", sub { delete_kunde($kid,3); };
$kid = DoFn("select id from kunde where name='delete_me'");
ok((not defined $kid), "Kunde weg");

