use utf8;
use warnings; no warnings "redefine";
use strict;
use Fehler qw(problem);
use Loader qw(line_printer);
use Dbase::Globals qw(in_euro get_descr name_kunde in_period rund
	name_dienst);
use Dbase::Help qw(DoSelect DoFn isotime);

sub list_tarif($$) {
	my($tari,$kn) = @_;
	line_printer;

	sub lt_dem($) {
		my($d)=@_;
		rund($d,-1);
	}
	DoSelect {
		my($timestamp,$name,$dienst,$beginn,$intval,$frei,$festpreis,$preis,$skala,$unitpreis,$info,$finfo,$vinfo,$dnull,$fnull,$mini,$umini,$fkonto,$vkonto,$pfrei,$nonum,$kunde,$betriebszeit,$servicezeit,$wartungsfenster,$description,$tkid,$tnid) = @_;
		$nonum="n" unless defined $nonum;
		my $EUR = in_euro($beginn) ? "EUR" : "DM ";
		my($npr,$cpr,$nupr,$cupr);
		if($mini) {
			my($lid,$lfrei,$lblock,$lpreis,$lbasis)=DoFn("select id,frei,skala,preis,festpreis from tarif where tarif.klasse=$tkid and dienst=$dienst and beginn=$beginn and mini < $mini order by mini desc limit 1");
			if($lid) {
				$npr = $mini*lt_dem($lpreis)-lt_dem($lfrei)+lt_dem($lbasis); # Preis von unten
				$cpr = $mini*lt_dem($preis); # Preis jetzt
			}
		}
		if($umini) {
			my($lid,$lfrei,$lblock,$lunitpreis,$lbasis)=DoFn("select id,frei,skala,unitpreis,festpreis from tarif where tarif.klasse=$tkid and dienst=$dienst and beginn=$beginn and unitmini < $umini order by unitmini desc limit 1");
			if($lid) {
				$nupr = $umini*lt_dem($lunitpreis)-lt_dem($lfrei)+lt_dem($lbasis); # Preis von unten
				$cupr = $umini*lt_dem($unitpreis); # Preis jetzt
			}
		}
		print $Db::pr_fh "ID         : $tari\n";
		print $Db::pr_fh "Timestamp  : ".isotime($timestamp)."\n";
		print $Db::pr_fh "Tarif      : ".$name."/".name_dienst($dienst)."\n";
		print $Db::pr_fh "Kunde      : ".($kunde ? name_kunde($kunde) : "- (alle)")."\n";
		printf$Db::pr_fh "$EUR/ Bestlg: %8.3f\n",$festpreis/1000 if $festpreis or $npr or $nupr;
		printf$Db::pr_fh "    Basis V: %8.3f\n",$npr/1000 if $npr;
		printf$Db::pr_fh "    Basis P: %8.3f\n",$nupr/1000 if $nupr;
		printf$Db::pr_fh "$EUR/ Paket : %8.3f\n",$unitpreis/1000 if $unitpreis;
		printf$Db::pr_fh "$EUR/ Block : %8.3f\n",$preis/1000 if $preis;
		print $Db::pr_fh "Bytes/Block: $skala\n" if $skala;
		printf$Db::pr_fh "$EUR frei   : %8.3f\n",$frei/1000 if $frei or $cpr or $cupr;
		printf$Db::pr_fh "    Basis V: %8.3f\n",$cpr/1000 if $cpr;
		printf$Db::pr_fh "    Basis P: %8.3f\n",$cupr/1000 if $cupr;
		print $Db::pr_fh 'Modus      : '.get_descr(rechnung=>$intval)."\n" if defined $intval;
		print $Db::pr_fh "Anzahl     : ".(($nonum eq "j")?"multipliziert Preis":"wird ausgewiesen")."\n";
		print $Db::pr_fh "Beginn     : ".(isotime $beginn)."\n" if $beginn;
		{
			my($en,$nid);
			($en,$nid) = DoFn("select beginn,id from tarif where klasse=$tkid and dienst = $dienst and mini=$mini and unitmini=$umini and beginn > $beginn order by beginn limit 1");
			($en,$nid) = DoFn("select beginn,id from tarif where klasse=$tkid and dienst = $dienst and beginn > $beginn order by beginn,mini,unitmini limit 1") unless $en;
			print $Db::pr_fh "Ende       : ".(isotime $en)." (#$nid)\n" if $en;
		}
		print $Db::pr_fh "Info       : $info\n" if defined $info;
		print $Db::pr_fh "Info Festpr: ".join("\n           : ",split(/\|/,$finfo))."\n" if defined $finfo;
		print $Db::pr_fh "Info var.Pr: ".join("\n           : ",split(/\|/,$vinfo))."\n" if defined $vinfo;
		print $Db::pr_fh "Info Freikt: ".join("\n           : ",split(/\|/,$pfrei))."\n" if defined $pfrei;
		print $Db::pr_fh "Auflistung : ".(($dnull eq "j")?"auch wenn Preis = 0":"nur wenn Preis > 0")."\n";
		print $Db::pr_fh "Ausgabe    : ".(($fnull eq "j")?"auch wenn überflüssig":"nur wenn nicht überflüssig")."\n";
		print $Db::pr_fh "minBlock   : $mini\n" if $mini;
		print $Db::pr_fh "minPaket   : $umini\n" if $umini;
		print $Db::pr_fh "Festkonto  : $fkonto\n" if $fkonto;
		print $Db::pr_fh "Varkonto   : $vkonto\n" if $vkonto;
		if ( defined $description && length $description ) {
			chomp $description;
			$description =~ s/\n/\n           : /g;
			print $Db::pr_fh "Beschreibng: $description\n";
		}
		printf$Db::pr_fh "SLA Betrieb: %s%s\n", $betriebszeit,    in_period($betriebszeit   ) ? ' (JETZT!)' : '' if $betriebszeit;
		printf$Db::pr_fh "SLA Service: %s%s\n", $servicezeit,     in_period($servicezeit    ) ? ' (JETZT!)' : '' if $servicezeit;
		printf$Db::pr_fh "WartFenster: %s%s\n", $wartungsfenster, in_period($wartungsfenster) ? ' (JETZT!)' : '' if $wartungsfenster;

		if($kunde) {
			my @kl;
			DoSelect {
				my ($id,$dienst) = @_;
				push @kl, "#$id/".name_dienst($dienst);
			} <<_;
	SELECT   tarif.id, tarif.dienst
	FROM     tarif,tarifklasse
	WHERE    tarifklasse.kunde IS NULL AND tarifklasse.tarifname = $tnid AND tarif.dienst = $dienst
	  AND    tarifklasse.id=tarif.klasse
	ORDER BY tarif.dienst
_
			if(@kl) {
				printf $Db::pr_fh "Achtung    : allgemeine%s Tarif%s:\n           : %s\n",
				                  @kl == 1 ? ('r','') : ('','e'), join ', ', sort @kl;
			}
		} else {
			my @kl;
			DoSelect {
				my ($id,$kunde,$dienst) = @_;
				push @kl, name_kunde($kunde)." (#$id/".name_dienst($dienst).')';
			} <<_;
	SELECT   tarif.id, tarifklasse.kunde, tarif.dienst
	FROM     tarif,tarifklasse
	WHERE    tarifklasse.kunde IS NOT NULL AND tarifklasse.tarifname = $tnid
	  AND    tarifklasse.id=tarif.klasse
	ORDER BY tarifklasse.kunde, tarif.dienst
_
			if(@kl) {
				printf $Db::pr_fh "Achtung    : kundenspezifische%s Tarif%s:\n           : %s\n",
				                  @kl == 1 ? ('r','') : ('','e'), join ', ', sort @kl;
			}
		}

	} "select tarif.timestamp,tarifname.name,tarif.dienst, tarif.beginn,tarif.intval,tarif.frei,tarif.festpreis,tarif.preis,tarif.skala,tarif.unitpreis,tarif.infotext,tarif.festinfo,tarif.varinfo,tarif.dnull,tarif.fnull,tarif.mini,tarif.unitmini,tarif.fkonto,tarif.vkonto,tarif.freiinfo,tarif.nonum,tarifklasse.kunde,tarif.betriebszeit,tarif.servicezeit,tarif.wartungsfenster,tarif.description,tarifklasse.id,tarifname.id from tarif,tarifklasse,tarifname where tarifname.id=tarifklasse.tarifname and tarifklasse.id=tarif.klasse and tarif.id=$tari"
		or problem "Tarif '$tari' unbekannt";
}
1;
