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

use Loader qw(
	add_kunde_person
	current_user
	edit_alle_kunden edit_ausgaben
	edit_deskrips edit_dienste
	edit_eems
	edit_fnbatches
	edit_kunde
	edit_laender
	edit_nicdatas
	edit_personen
	edit_queues
	edit_tarifnamen edit_templateses
	edit_wartungsvertraege
	edit_zustandss
	get_mailadr
	line_in list_kunden log_update log_view
	pruefe_alles
	strip_kn
  );
use Fehler qw(report_fehler problem);
use Dbase::Globals qw(content find_descr get_gruppen get_kunde get_person sendmail);
use Dbase::Help qw(Do DoFn DoSelect qquote);
use Cf qw($MAILDOM $MODE);

# Flag: 1: Auto-Return
#       2: Hauptmenu-Features
#       4: '-' wird akzeptiert
#       8: '*' wird akzeptiert

use Fehler qw(fehler);

sub edit_kunden(;$$) {
	my($flag,$kn) = @_;
	$flag=0 unless defined $flag;

	$kn = '' unless defined $kn;
	Input: while(1) {
		my $act = line_in "$kn Kunde >",($flag&1)?0:4;
		return undef unless content $act;

		if($act eq "?") {
			print <<'END';
a  neuer Kunde
l  Kundenliste; dabei sind folgende Filter möglich:
   n?...  nur Kunden, in deren Name ... vorkommt
   n:...  nur Kunden, deren Name zu SQL-Wildcard ... passt
   f:...  nur Kunden, bei denen Flag ... gesetzt ist
   pr:... nur Kunden mit Priorität ...
   d?...  nur Kunden mit einem eigenen Tarif zu einem Dienst,
          in dessen Name ... vorkommt
   d:...  nur Kunden mit einem eigenen Tarif zu einem Dienst namens ...
   t?...  nur Kunden mit einem aktiven Tarif, in dessen Name ... vorkommt
   t:...  nur Kunden mit einem aktiven Tarif namens ...
   tp     nur Kunden, bei denen Du technischer Ansprechpartner bist
   tp:... nur Kunden mit dem technischen Ansprechpartner ...
   vp     nur Kunden, bei denen Du vertrieblicher Ansprechpartner bist
   vp:... nur Kunden mit dem vertrieblichen Ansprechpartner ...
   Beispiele:
   * "l f:ezmlm,!rz3karte tp vp:armin" zeigt alle Kunden mit ezmlm- aber ohne
      rz3karte-Flag, bei denen man selbst technischer und Armin vertrieblicher
      Ansprechpartner ist.
   * "l t?netentry vp" zeigt alle Kunden mit mindestens einem aktiven
      netentry-Tarif, bei denen man selbst vertrieblicher Ansprechpartner ist
   * "l pr:a,-" zeigt alle aktiven A-Kunden sowie aktive Kunden ohne Priorität
   * "l d:support" zeigt alle aktiven Kunden mit eigenen support-Tarifen an
L  wie "l", zeigt aber auch beendete Kunden an

END
			print <<'END' if $flag & 2;
-     Funktionen für alle Kunden gemeinsam
      (z. B. Rechnungen schreiben, Konsistenzprüfung über alle Kunden)
t     TarifDefinitionen pflegen         w     Wartungsverträge pflegen
d     Deskriptoren pflegen (= Dienste etc.)
u     Dienste+Umrechnungen pflegen      pr    Druckertabelle editieren
M     Mustertexte editieren             la    Länderdaten
q     RT-Queues editieren               fb    Fibunet-Batch-Statusliste
r     NIC-Daten editieren               ds    Domainstatusübergänge
                                        hs    Handlestatusübergänge
                                        ee    Elek. Energ. Mgmt. System

Es funktionieren in (fast) jedem Untermenu:
!     Konsistenzprüfung              !!   rekursiv prüfen
>?    Hilfe zur Ausgabe-Umleitung    H    Update-Log ansehen
END
			print <<'END' if $flag & 8;
*     alle Kunden
END
			print <<'END' if $flag & 4;
-     dieser Kunde
END
			print <<'END';

Kundenauswahl: via Kundennummer, Name, Kurzname, Domain, IP-Adresse, Username,
               Mailadresse, Hardware-ID, Reseller-Handle-Name oder
               "R" + Rechnungsnummer
END

			next;
		}
		if($act =~ s/^=//) { 
			my $res = eval $act;
			if($@) {
				fehler $@;
				print "!> $@\n";
			} else {
				print "=> $res\n";
			}
		    next; }
		if( lc $act eq 'l' ) { list_kunden( $kn, $act eq 'L' ); next; }

		if ( $act =~ /^(l)\s+(.*)/i ) {

			my @kunde_ids;

		 	for ( split ' ', $2 ) {

				my $sql;

				if ( /^f:(.*)/ ) {
					my($grs,$grc) = get_gruppen( kunde => $1, 1 ) or next Input;
					$sql = "SELECT id FROM kunde WHERE flags & $grs AND ( flags & $grc ) = 0";
				}
				elsif ( /^n([?:])(.*)/ ) {
					# Da Kundennamen weder "%" noch "_" enthalten,
					# können wir auf Escaping dieser Zeichen verzichten
					# und es als (verstecktes) Feature betrachten, dass
					# man sie auch bei "?" als Wildcards verwenden kann.
					$sql = 'SELECT id FROM kunde WHERE name LIKE ' . qquote( $1 eq '?' ? "%$2%" : $2 );
				}
				elsif ( /^pr:(.*)/ ) {
					my @kprio;
					for ( split /,/, $1 ) {
						unless ( $_ eq '-' || defined( find_descr( kprio => $_ ) ) ) {
							problem( qq(Kunden-Priorität "$_" gibt es nicht.) );
							next Input;
						}
						push @kprio, 'kprio ' . ( $_ eq '-' ? 'IS NULL' : '= ' . qquote($_) );
					}
					$sql = 'SELECT id FROM kunde WHERE ' . join ' OR ', @kprio;
				}
				elsif ( /^t([?:])(.*)/ ) {
					$sql = <<_;
	SELECT DISTINCT tarifkunde.kunde
	FROM            tarifkunde, tarifname
	WHERE           tarifkunde.tarifname = tarifname.id
	            AND ( tarifkunde.ende IS NULL                  OR
	                  tarifkunde.ende >= UNIX_TIMESTAMP(NOW()) )
	            AND tarifname.name LIKE ${\ qquote( $1 eq ':' ? $2 : "%$2%" ) }
_
				}
				elsif ( /^d([?:])(.*)/ ) { $sql = <<_ }
	SELECT DISTINCT tarifklasse.kunde
	FROM            dienst, tarif, tarifklasse
	WHERE           dienst.name LIKE ${\ qquote( $1 eq ':' ? $2 : "%$2%" ) }
	            AND dienst.id    = tarif.dienst
	            AND tarif.klasse = tarifklasse.id
		    AND tarifklasse.kunde IS NOT NULL
_
				elsif ( /^([tv])p(?::(.+))?$/ ) {
					my $typ = { t=>'technik', v=>'vertrieb' }->{$1};
					my $person;
					unless ( defined $2 ) {
						$person = current_user();
					} elsif ( $2 ne '-' && not( $person = get_person($2) ) ) {
						problem qq(Ich kenne keine Person "$2".);
						next Input;
					}
					$sql = defined $person ? <<1 : <<2;
	SELECT id FROM kunde WHERE ap_$typ = $person
1
	SELECT id FROM kunde WHERE ap_$typ IS NULL
2
				}
				else {
					problem("Unbekannter Filter: $_");
					next Input;
				}

				my %kunde_id;
				DoSelect { $kunde_id{+shift} = undef } $sql;
				unless (@kunde_ids) { @kunde_ids = keys %kunde_id }
				else {
					# UND-Verknüpfung mit bisherigem Filterergebnis:
					@kunde_ids = grep exists $kunde_id{$_}, @kunde_ids or last;
				}
			}
			list_kunden($kn, $1 eq 'L', @kunde_ids);
			next;
		}

		if($flag & 2) {
			if($act eq "t") { edit_tarifnamen($flag & 2,$kn); next; }
			if($act eq "w") { edit_wartungsvertraege($kn); next; }
			if($act eq "pr") { edit_ausgaben($kn); next; }
			if($act eq "u") { edit_dienste(2,$kn); next; }
			if($act eq "d") { edit_deskrips(0,$kn); next; }
			if($act eq "M") { edit_templateses($kn); next; }
			if($act eq "q") { edit_queues($flag & 2,$kn); next; }
			if($act eq "r") { edit_nicdatas($kn); next; }
			if($act eq "H") { log_view($kn); next; }
			if($act eq "fb") { edit_fnbatches($kn); next; }
			if($act eq "la") { edit_laender(0,$kn); next; }
			if($act eq "ds") { edit_zustandss("domain",0,$kn); next; }
			if($act eq "hs") { edit_zustandss("handle",0,$kn); next; }
			if($act eq "ee") { edit_eems($kn); next; }
			if($act eq "dsr") { edit_zustandss("domain",1,$kn); next; }
			if($act eq "hsr") { edit_zustandss("handle",1,$kn); next; }
			if($act eq "!") {
				next;
			}
			if($act eq "!!") {
				next;
			}
		}

		if($act eq 'a') {
			$act = line_in "Neuer Kunde: ";
			next if $act =~ /^\d*$/ or length($act) < 3;
			if(get_kunde $act) {
				print "Diesen Kunden gibt es schon!\n";
				next;
			}
			$act = lc $act; # s. RT#323657
			if($act !~ /^[_a-z0-9]*[a-z][-_a-z0-9]*$/) {
				print "Kundennamen sind einzelne Wörter. Nix da.\n";
				next;
			}
			my $idi = Do(<<_);
	INSERT INTO kunde SET
		name        = ${\qquote($act)},
		beginn      = UNIX_TIMESTAMP(NOW()),
		flags       = 0,
		berechne    = 'm',
		skip        = 'y'
_
			log_update("kunde","id",$idi,undef,"*");

			my $user = get_mailadr();
			sendmail(<<END, $user,"neukunden\@$MAILDOM");
Subject: ${\( $MODE ne 'production' && "[$MODE] " )}Neuer Kunde: $act #$idi
From: $user

Soeben hat '$user' ${\(
$MODE ne 'production' && "in der $MODE-Umgebung " )}
den Kunden '$act' (#$idi) angelegt.
END
			print <<_;
So, Du möchtest nun gleich einen Haupt-Personeneintrag anlegen, vgl. RT#272984:
_
			my $pkn = strip_kn($kn)."Kunde_$idi:$act";
			my $pers = edit_personen($idi, 1, $pkn);
			if($pers) {
				Do("update kunde set hauptperson=$pers where id=$idi");
			} else {
				print "Du Schlimmer! Hol das gefälligst ASAP nach!\n";
			}

			$act = edit_kunde($idi,$kn);
			return $act if defined $act && $act > 0 and $flag & 1;
			next;
		}
		if($act eq "*") {
			return "*" if $flag & 8 and $flag & 1;
			print "Das geht hier nicht.\n";
			next;
		}
		if($act eq "%") {
			unless($flag & 2) {
				print "Das geht hier nicht.\n";
				next;
			}
			pruefe_alles();
			next;
		}
		if($act eq "%%") {
			unless($flag & 2) {
				print "Das geht hier nicht.\n";
				next;
			}
			pruefe_alles(1);
			next;
		}
		if($act eq "-") {
			if($flag & 2) { edit_alle_kunden($kn); next; }
			return "-" if $flag & 4;
			print "Das geht hier nicht.\n";
			next;
		} else {
			my $force = ($act =~ s/^\?//);
			my $id = get_kunde $act;
			unless($id) {
				print "Den Kunden '$act' kenne ich nicht -- Hilfe mit '?'.\n";
				next;
			}
			return $id if $flag & 1 and not $force;

			{
				my $aid;
				$act .= "/$aid" if $aid = DoFn("select kunde from kunde where id = $id");
			}
			edit_kunde($id,$kn);
		}
		next; fehler: report_fehler(4);
	}
	undef;
}

1
