=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 isotime qquote DoTime);
use Dbase::Globals qw(
	beendet
	flag_names
	get_descr
	info_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

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,$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()) )
	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 $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.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;
