=head3 list_person

C<list_person( Person )>

Zeigt alle Daten in einem Personeneintrag an.

=cut

use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(DoFn DoSelect DoTime in_list isotime qquote);
use Dbase::Globals qw(
	beendet
	flag_names
	get_descr
	info_descr 
        list_descr
	mpersinfo
	name_kunde
	puny_decode
  );
use Fehler qw(problem warnung);
use Loader qw(line_printer check_perm print_adresse);
use Dbase::IP;

my $print_ipinfo = sub ($$$$$) {
	my($text, $id, $ip, $mask, $ende) = @_;
	printf $Db::pr_fh
	       "%-12s: #%4d: %s%s\n",
	        $text,
	        $id,
	        $ip->str(4),
	        beendet($ende);
};

my $has_perso_permissions = check_perm( perso => 1 );

# Flagbits:
# 2: auch URL für Landkarte anzeigen


# Bei der Suche nach MailRegeln, die auf eine bestimmte Person zeigen,
# sind nur Mailregeln interessant, bei denen rechts auch wirklich
# Personen stehen, vgl. Ticket 10131624. Da wir dafür keine eigene
# Gruppe haben, beziehen wir uns der Einfachheit halber erstmal auf
# die Gruppe "multiple_targets", die im Prinzip damit deckungsgleich
# sein sollte, abgesehen davon, dass bislang eh nur der Typ "virt"
# einschlägig ist, aber nur nach dem zu suchen, wäre zu einfach. :-)
my @mailrules_typen;
list_descr(
	mailrules => 0,
	'multiple_targets,!hide',
	sub {
		( undef, my $id, my $name, my $infotext ) = @_;
		push @mailrules_typen, $id;
	}
);
my $sql_mailrules_typen = in_list( 'mailrules.typ', '', @mailrules_typen );

sub list_person($;$) {
	my ( $pers, $flags ) = @_;
	$flags = 0 unless defined $flags;

	line_printer;
	DoSelect {
		my($timestamp,$name,$abt,$mail,$fone,$fax,$page,$isdn,$adrid,$zusa,$nick,$descr,$kunde,$user,$uid,$pass,$udir,$nagiosconf,$redirect,$pppoe,$radiustemplate,$uremip,$pwuse,$maxk,$vrf,$pref,$tar,$mpers,$ausw,$funk,$gebjahr,$gebtag,$pbe,$pen) = @_;

		print $Db::pr_fh "ID          : $pers\n";
		print $Db::pr_fh "Timestamp   : ".isotime($timestamp)."\n";
		if ($has_perso_permissions) {
			print $Db::pr_fh "Mitarb. seit: ".isotime($pbe)."\n" if $pbe;
			print $Db::pr_fh "Mitarb. bis : ".isotime($pen)."\n" if $pen;
		} elsif(defined $pbe) {
			if($pbe > DoTime()) {
				print $Db::pr_fh "Mitarbeiter : noch nicht\n";
			} elsif(defined $pen and $pen < DoTime()) {
				print $Db::pr_fh "Mitarbeiter : nicht mehr\n";
			} else {
				print $Db::pr_fh "Mitarbeiter : ja\n";
			}
		}
		
		print $Db::pr_fh "Name        : $name\n" if defined $name;
		print $Db::pr_fh "Funktion    : $funk\n" if defined $funk;
		if($kunde) {
			my($name, $ende) = DoFn "SELECT name, ende FROM kunde WHERE id = $kunde";
			printf $Db::pr_fh "primär.Kunde: %5s %-16s%s\n", "#$kunde", $name, beendet($ende);
		}
		print $Db::pr_fh "Flags       : ".flag_names($pwuse,"pwdomain")."\n";
		{
			my %assoz;
			DoSelect {
				my( $dienst, $kunden ) = @_;
				$assoz{ get_descr( dienst => $dienst ) } = $kunden;
			} <<_;
	SELECT   dienst, GROUP_CONCAT( kunde.name ORDER BY kunde.name SEPARATOR ', ' )
	FROM     kunde, kundemail
	WHERE    kunde.id = kundemail.kunde
	     AND kundemail.person = $pers
	     AND ( kunde.ende IS NULL OR kunde.ende >= UNIX_TIMESTAMP(NOW()) )
	GROUP BY kundemail.dienst
	ORDER BY kundemail.dienst, kunde.name
_
			printf $Db::pr_fh 'assoz. unter: '
			                  . join( "\n              ",
			                          map sprintf( '%-14s bei %s',
			                                       $_, $assoz{$_}
			                                     ),
			                              sort keys %assoz
			                        )
			                  . "\n"
			  if keys %assoz;
		}
		# Trennung von Variablen-Deklaration und bedingter
		# Initialisierung wichtig, vgl. RT#244828
		printf $Db::pr_fh "E-Mail-Adr. : %s\n", puny_decode($mail,4) if defined $mail;
		for ( my %found = map( (lc() => undef), grep defined, $mail, $user ),
		      my $depth = 1;
		      keys %found;
		      ++$depth )
		{
			my $look4 = join ',', map qquote($_), keys %found;
			%found = ();
			DoSelect {
				my($quelle, $ziel, $kunde_id) = @_;
				printf $Db::pr_fh ">MailRegel#%d: %32s -> %-16s%s\n",
				                  $depth,
				                  defined $quelle ? puny_decode($quelle,4) : '*',
				                  puny_decode($ziel,4),
				                  $kunde_id != $kunde && " [#$kunde_id:".name_kunde($kunde_id).']';
				$found{$quelle} = undef if defined $quelle;
			} <<_;
	SELECT   mailrules.quelle, mailrules.ziel, mailrules.kunde
	FROM     kunde, mailrules
	WHERE    mailrules.ziel IN ($look4)
	     AND mailrules.kunde = kunde.id
	     AND ( kunde.ende IS NULL                  OR
	           kunde.ende >= UNIX_TIMESTAMP(NOW()) )
	     AND $sql_mailrules_typen
	ORDER BY mailrules.quelle IS NULL,
	         SUBSTRING_INDEX(mailrules.quelle, '\@', -1),
	         INSTR(mailrules.quelle, '\@') DESC,
	         mailrules.quelle
_
		}
		DoSelect {
			my($adr) = @_;
			$adr = puny_decode($adr,4);
			print $Db::pr_fh "              ($adr)\n";
		} <<_;
	SELECT email
	FROM   mailassoc
	WHERE  person = $pers
_
		print $Db::pr_fh "Abteilung   : $abt\n" if defined $abt;
		print $Db::pr_fh "Telefon     : $fone\n" if defined $fone;
		print $Db::pr_fh "Fax         : $fax\n" if defined $fax;
		print $Db::pr_fh "Handy/Pager : $page\n" if defined $page;
		print $Db::pr_fh "Benachrichtg: ".get_descr("mailart",$pref)."\n" if defined $pref;
		print $Db::pr_fh "ISDN-Nr     : $isdn\n" if defined $isdn;
		if(defined $descr) {
			$descr =~ s/\|/\n            : /g;
			print $Db::pr_fh "Beschreibung: $descr\n";
		}
		if($adrid) {
			my $kurz = DoFn "select kurz from adresse where id=$adrid";
			my ( $lines, $url );
			if ( $flags & 2 ) { ( $lines, $url ) = print_adresse($adrid) }
			else { $lines = print_adresse($adrid) }
			chomp $lines;
			$lines =~ s/\n/\n            : /g;
			print $Db::pr_fh "Adresse     : #$adrid".((defined $kurz)?":$kurz":"")."\n";
			print $Db::pr_fh "            : $lines\n";
			print $Db::pr_fh "->Landkarte : $url\n" if defined $url;
		}
		print $Db::pr_fh "Zusatzinfo  : $zusa\n" if defined $zusa;
		if($gebjahr or $gebtag) {
			if($gebtag) {
				$gebtag = sprintf "%02d-%02d",$gebtag/100,$gebtag%100;
			} else {
				$gebtag = "??-??";
			}
			$gebjahr = "????" unless $gebjahr;
			print $Db::pr_fh "Geburtstag  : $gebjahr-$gebtag\n"; 
		}
		print $Db::pr_fh "Ausweis-Nr. : $ausw\n" if defined $ausw;
		print $Db::pr_fh "Kurzname    : $nick\n" if defined $nick;
		print $Db::pr_fh "Tarif       : ".DoFn("select name from tarifname where id=$tar")."\n" if $tar;

		DoSelect {
			my($nic,$handle,$sta) = @_;
			$handle = '?' unless $handle;
			print $Db::pr_fh "NIC-Handle  : $handle (".get_descr("nic",$nic).":".get_descr("handlestatus",$sta).")\n";
		} "select nic,handle,status from nic where person = $pers order by nic";
		DoSelect {
			my($rs,$handle) = @_;
			print $Db::pr_fh "Reseller-Hdl: $handle [".name_kunde($rs)."]\n";
		} "select reseller,handle from resellernic where person = $pers order by reseller";
		if(defined $user) {
			print $Db::pr_fh "Username    : \L$user\n";
			warnung <<_ if $user ne lc $user;
Der Username dieser Person enthält datenbankintern Großbuchstaben
("$user"); bei Problemen vgl. RT#129214 und RT#222328.
_
		}
		print $Db::pr_fh "User-ID     : $uid\n" if defined $uid;
		print $Db::pr_fh "Passwort    : ".("*" x length($pass))."\n" if defined $pass;
		print $Db::pr_fh "FTP-HomeDir.: $udir\n" if defined $udir;
		print $Db::pr_fh "Nagios-Conf.: $nagiosconf\n" if defined $nagiosconf;
		DoSelect {
			my($id,$dom,$dend) = @_;
			print $Db::pr_fh "Web-Domain  : $id: "
			  . puny_decode($dom)
			  . beendet($dend) . "\n";
		} "select id,domain,ende from domainkunde where person = $pers";
		print $Db::pr_fh "RedirectZiel: $redirect\n" if defined $redirect;

		if($uremip) {
			my($ip,$bits, $ende) = DoFn "select ip6,bits, ende from ipkunde where id = $uremip";
			$ip = Dbase::IP->new_db($ip,$bits);
			$print_ipinfo->( 'Peer-IP', $uremip, $ip, $bits, $ende );
		}
		{
		my $count=0;
			DoSelect {
				my( $id, $ip,$bits, $ende, $metrik ) = @_;
				$ip = Dbase::IP->new_db( $ip,$bits );
				$print_ipinfo->(
					sprintf( 'IP-Route %3d', $metrik ),
					$id, $ip, $bits, $ende
				);
			} <<_;
	SELECT   ipkunde.id,
	         ipkunde.ip6,
	         ipkunde.bits,
	         ipkunde.ende,
	         ipmap.metrik
	FROM     ipkunde, ipmap
	WHERE    ipmap.person = $pers AND ipkunde.id = ipmap.ipkunde
	ORDER BY ipmap.metrik, ipkunde.ip6
_
		}

		if ( defined $pppoe ) {
			my $info = info_descr 'pppoe' => $pppoe;
			$info =~ s/.*\+//;
			$info =~ s/\[%person\.user%\]/$user/;
			print $Db::pr_fh 'PPPoE-Profil: ' . get_descr('pppoe' => $pppoe) . ( defined $info && ": $info" ) . "\n" if defined $pppoe;
		}
		if ( defined $radiustemplate ) {
			my $info = info_descr 'radius-templates' => $radiustemplate;
			print $Db::pr_fh 'Radius-Tmpl.: ' . get_descr('radius-templates' => $radiustemplate) . ( defined $info && ": $info" ) . "\n" if defined $radiustemplate;
		}
		if($maxk) { print $Db::pr_fh "Multilink#  : $maxk\n"; }
		print $Db::pr_fh "VRF         : #$vrf:" . get_descr(vrf => $vrf) . "\n" if defined $vrf;
		if($mpers) { print $Db::pr_fh "Übergeordnet: #$mpers ".mpersinfo($mpers)."\n"; }
		my $unt = "Subeinträge ";
		DoSelect {
			my($pid) = @_;
			print $Db::pr_fh "$unt: #$pid ".mpersinfo($pid)."\n";
			$unt = "            ";
		} "select id from person where mperson = $pers";
	} <<_ or problem("Person '$pers' unbekannt");
	SELECT    person.timestamp,
	          person.name,
	          person.abt,
	          person.email,
	          person.fon,
	          person.fax,
	          person.pager,
	          person.isdn,
	          person.adresse,
	          person.zusatzinfo,
	          person.suchbegriff,
	          person.infotext,
	          person.kunde,
	          person.user,
	          person.uid,
	          person.pass,
	          person.homedir,
	          person.nagiosconf,
	          person.redirect,
	          person.pppoe,
	          person.radiustemplate,
	          person.uremip,
	          person.pwuse,
	          person.maxconn,
	          person.vrf,
	          person.prefcall,
	          person.tarifname,
	          person.mperson,
	          person.ausweisnr,
	          person.job,
	          person.gebjahr,
	          person.gebtag,
	          perso.beginn,
	          perso.ende
	FROM      person
	LEFT JOIN perso ON person.id = perso.person
	WHERE     id = $pers
_
}

1;
