ftp.nice.ch/pub/next/tools/phone/TEUMAX.1.6.1.NIHS.sda.tar.gz#/TEUMAX.1.6.1.NIHS.sda/teumax.pl

This is teumax.pl in view mode; [Download] [Up]

#!/usr/local/bin/perl
#---------------------------------------------------------------------------
#
# teumax.pl 1.0.0   -   (c) 1998 by NiFiX, Stephan Gelhaus
#
# =====================================================
#
# revisions
# 1.0.0   11.01.1998   erste version
#



$SCRIPT = $ENV{'SCRIPT_NAME'};

$cgi = 1;
$millisek = time();
$datuhr = localtime($millisek);
$datuhr =~ s/  / /g;
@datuhr = split(/ /,$datuhr);

$htag   = $datuhr[2];
$hmonat = &mnam2num($datuhr[1]);
$hjahr  = $datuhr[4];

$btag   = 1;
$bmonat = $hmonat;
$bjahr  = $hjahr;
$etag   = $htag;
$emonat = $hmonat;
$ejahr  = $hjahr;

#$workdir = "/usr/local/lib/isdn/";
#$logdir = "/usr/adm/";

$log = "eumax.log";
$names = "aliases";
$vorwde = "vorwahl-de";



#### Do standard HTTP stuff ####
&cgi_receive;
&cgi_decode;
&cgi_header;

$opt_i = $workdir . $log;

$bemodus = $FORM{'bemodus'};
if (!$bemodus)
{
	$bemodus = "h";
	$first = 1;
}
if ($bemodus eq "h")
{
	$opt_b = $htag . "." . $hmonat . "." . $hjahr;
}
if ($bemodus eq "be")
{
	$btag   = $FORM{'btag'};
	$bmonat = $FORM{'bmonat'};
	$bjahr  = $FORM{'bjahr'};
	$etag   = $FORM{'etag'};
	$emonat = $FORM{'emonat'};
	$ejahr  = $FORM{'ejahr'};
	$opt_b = $btag . "." . $bmonat . "." . $bjahr;
	$opt_e = $etag . "." . $emonat . "." . $ejahr;
}
$opt_a = $FORM{'apparat'};
$gespraeche = $FORM{'gespraeche'};
if (!$gespraeche)
{
	$gespraeche = "a";
}
if ($gespraeche eq "k")
{
	$opt_k = 1;
}
if ($gespraeche eq "g")
{
	$opt_r = 1;
}
if ($gespraeche eq "a")
{
	$opt_k = 1;
	$opt_r = 1;
}
if ($FORM{'summe'} eq "s")
{
	$opt_s = 1;
}
if ($FORM{'topc'})
{
	$opt_c = $FORM{'topc'};
}
if ($FORM{'topg'})
{
	$opt_g = $FORM{'topg'};
}
if ($FORM{'topt'})
{
	$opt_t = $FORM{'topt'};
}


&read_aliases;

&html_header;

&setup_form;

if ($first)
{
	&html_footer;
	exit;
}


#### Prevent HTML output
foreach $key (keys %FORM)
{
    $FORM{$key} =~ s/</\&lt;/g;
    $FORM{$key} =~ s/>/\&gt;/g;
}


#####################################################################
#### SUBROUTINES ####################################################
#####################################################################

sub cgi_header {
	print "Content-type: text/html\n\n";
	#print "\n" unless ($FORM{'next-url'});
}        

sub cgi_receive {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $incoming, $ENV{'CONTENT_LENGTH'});
	}
	else
	{
		$incoming = $ENV{'QUERY_STRING'};
	}
}

sub cgi_decode {
    @pairs = split(/&/, $incoming);

    foreach (@pairs) {
        ($name, $value) = split(/=/, $_);

        $name  =~ tr/+/ /;
        $value =~ tr/+/ /;
        $name  =~ s/%([A-F0-9][A-F0-9])/pack("C", hex($1))/gie;
        $value =~ s/%([A-F0-9][A-F0-9])/pack("C", hex($1))/gie;

        #### Strip out semicolons unless for special character
        $value =~ s/;/$$/g;
        $value =~ s/&(\S{1,6})$$/&\1;/g;
        $value =~ s/$$/ /g;

        $value =~ s/\|/ /g;
        $value =~ s/^!/ /g; ## Allow exclamation points in sentences

        #### Skip blank text entry fields
        next if ($value eq "");

        #### Check for "assign-dynamic" field names
        #### Mainly for on-the-fly input names, especially checkboxes
        if ($name =~ /^assign-dynamic/) {
            $name = $value;
            $value = "on";
        }

	#### Allow for multiple values of a single name
        $FORM{$name} .= ", " if ($FORM{$name});

        $FORM{$name} .= $value;
    }
}

#####################################################################

sub dump_values {
    local($env, $handle) = @_;
    eval "\@keys = keys \%$env";
    eval "\@values = values \%$env";
    ($handle eq "STDOUT") && (print $handle "<PRE>\n");
    while ($#keys >= 0) {
	$key = pop(@keys);
	$value = pop(@values);
	if ($value =~ /[\cM\n]/) {
	    print $handle "($key)\n";
	    print $handle "-" x 70, "\n", $value, "-" x 70, "\n";
	}
	else {
            print $handle "($key)  $value\n";
	}
    }
    ($handle eq "STDOUT") && (print $handle "</PRE>\n");

}


sub setup_form {
	local(@tage)   = (1..31);
	local(@zmonate)= (1..12);
	local(@dmonate)= ('','Januar','Februar','M&auml;rz','April','Mai','Juni',
				'Juli','August','September','Oktober','November','Dezember');
	local(@jahre)  = (1990..$hjahr);
	
	print qq|<h3>Verbindungsdaten</h3>\n|;
	print qq|<FORM ACTION="http://lotus/cgi-bin/teumax.pl" method=post>\n|;
	print qq|<table border=0>\n|;
	print qq|<tr>\n|;
	if ($bemodus eq "ai")
	{
		print qq|<td valign=top><input type=radio CHECKED name=bemodus value=ai>\n|;
	}
	else
	{
		print qq|<td valign=top><input type=radio name=bemodus value=ai>\n|;
	}
	print qq|<td valign=top><h4>im Abrechnungs-Intervall</h4><td></td>\n|;
	print qq|<td colspan=4><SELECT NAME=accint>\n|;
	print qq|<OPTION>kein Intervall verf&uuml;gbar|;
	print qq|</SELECT></TR>\n|;
	print qq|<tr>\n|;
	if ($bemodus eq "be")
	{
		print qq|<td rowspan=2 valign=top><input CHECKED type=radio name=bemodus value=be>\n|;
	}
	else
	{
		print qq|<td rowspan=2 valign=top><input type=radio name=bemodus value=be>\n|;
	}
	print qq|<td rowspan=2 valign=top><h4>im Zeitraum</h4>\n|;
	print qq|<td>vom\n|;
	print qq|<td><SELECT NAME=btag>\n|;
	foreach $t (@tage)
	{
		if ($t == $btag)
		{
			print qq|<OPTION SELECTED>$t|;
		}
		else
		{
			print qq|<OPTION>$t|;
		}
	}
	print qq|</SELECT>\n|;
	print qq|<td><SELECT NAME=bmonat>\n|;
	foreach $m (@zmonate)
	{
		if ($m == $bmonat)
		{
			print qq|<OPTION SELECTED VALUE=$m>@dmonate[$m]|;
		}
		else
		{
			print qq|<OPTION VALUE=$m>@dmonate[$m]|;
		}
	}
	print qq|</SELECT>\n|;
	print qq|<td><SELECT NAME=bjahr>|;
	foreach $j (@jahre)
	{
		if ($j == $bjahr)
		{
			print qq|<OPTION SELECTED>$j|;
		}
		else
		{
			print qq|<OPTION>$j|;
		}
	}
	print qq|</SELECT></TR>\n|;
	print qq|<tr><td>bis\n|;
	print qq|<td><SELECT NAME=etag>\n|;
	foreach $t (@tage)
	{
		if ($t == $etag)
		{
			print qq|<OPTION SELECTED>$t|;
		}
		else
		{
			print qq|<OPTION>$t|;
		}
	}
	print qq|</SELECT>\n|;
	print qq|<td><SELECT NAME=emonat>\n|;
	foreach $m (@zmonate)
	{
		if ($monate[$m] eq $emonat)
		{
			print qq|<OPTION SELECTED VALUE=$m>$dmonate[$m]|;
		}
		else
		{
			print qq|<OPTION VALUE=$m>$dmonate[$m]|;
		}
	}
	print qq|</SELECT>\n|;
	print qq|<td><SELECT NAME=ejahr>|;
	foreach $j (@jahre)
	{
		if ($j == $ejahr)
		{
			print qq|<OPTION SELECTED>$j|;
		}
		else
		{
			print qq|<OPTION>$j|;
		}
	}
	print qq|</SELECT></TR>\n|;
	print qq|<tr>\n|;
	if ($bemodus eq "h")
	{
		print qq|<td valign=top><input type=radio CHECKED name=bemodus value=h>\n|;
	}
	else
	{
		print qq|<td valign=top><input type=radio name=bemodus value=h>\n|;
	}
	print qq|<td valign=top><h4>von heute</h4></td>\n|;
	print qq|<tr><td colspan=3><h4>von folgenden internen Teilnehmer(n)</h4>\n|;
	print qq|<td colspan=2><SELECT NAME=apparat>\n|;
	print qq|<OPTION value=0>alle|;
	@sorted_int = sort {$intName4{$a} ge $intName4{$b}} keys(%intName4);
	foreach (@sorted_int)
	{
		$int = &isostyle($intName4{$_});
		if ($_ == $opt_a)
		{
			print qq|<OPTION SELECTED value=$_>$_ : $int|;
		}
		else
		{
			print qq|<OPTION value=$_>$_ : $int|;
		}
	}
	print qq|</SELECT>\n|;
	print qq|<td><h4>anzeigen.</h4></TR>\n|;
	print qq|<tr><td colspan=6><h3>Anzeige-Optionen:</h3></TR>\n|;
	if ($gespraeche eq "r")
	{
		print qq|<tr><td valign=top><input type=radio name=gespraeche checked value=r>\n|;
	}
	else
	{
		print qq|<tr><td valign=top><input type=radio name=gespraeche value=r>\n|;
	}
	print qq|<td colspan=5><h4>gehende Gespr&auml;che</h4></TR>\n|;
	if ($gespraeche eq "k")
	{
		print qq|<tr><td valign=top><input type=radio name=gespraeche checked value=k>\n|;
	}
	else
	{
		print qq|<tr><td valign=top><input type=radio name=gespraeche value=k>\n|;
	}
	print qq|<td colspan=5><h4>kommende Gespr&auml;che</h4></TR>\n|;
	print qq|</tr>\n|;
	if ($gespraeche eq "a")
	{
		print qq|<tr><td valign=top><input type=radio name=gespraeche checked value=a>\n|;
	}
	else
	{
		print qq|<tr><td valign=top><input type=radio name=gespraeche value=a>\n|;
	}
	print qq|<td colspan=5><h4>alle Gespr&auml;che</h4></TR>\n|;
	print qq|</tr>\n|;
	print qq|<tr>\n|;
	if ($opt_s)
	{
		print qq|<td valign=top><input type=checkbox name=summe checked value=s>\n|;
	}
	else
	{
		print qq|<td valign=top><input type=checkbox name=summe value=s>\n|;
	}
	print qq|<td colspan=5><h4>nur Summen</h4></TR>\n|;
	print qq|<tr>\n|;
	print qq|<td colspan=2><h4>Top-Listen anzeigen</h4>\n|;
	print qq|<td colspan=2 valign=top><input name=topc size=2 maxlength=2|;
	if ($opt_t)
	{
		print qq| value=$opt_t>\n|;
	}
	else
	{
		print qq|>\n|;
	}
	print qq| Einh. Gesamt|;
	print qq|<td valign=top><input name=topg size=2 maxlength=2|;
	if ($opt_c)
	{
		print qq| value=$opt_c>\n|;
	}
	else
	{
		print qq|>\n|;
	}
	print qq| Einh. City|;
	print qq|<td valign=top><input name=topt size=2 maxlength=2|;
	if ($opt_g)
	{
		print qq| value=$opt_g>\n|;
	}
	else
	{
		print qq|>\n|;
	}
	print qq| gehende Gespr&auml;che</TR>\n|;
	print qq|</table>\n|;
	print qq|<p><input type=submit value="Abfrage starten"><input type=reset value="Angaben l&ouml;schen">\n|;
	print qq|</FORM>\n|;
	print qq|<hr>\n|;
}


#require "teumax";

##!/usr/local/bin/perl
#---------------------------------------------------------------------------
#
# teumax 1.6.0   -   (c) 1996-1998 by NiFiX, Stephan Gelhaus
#
#                    mit Erweiterungen von Hellmuth Michaelis
#
# =====================================================
#
# revisions
# 1.0.0   23.01.96   erste version
# 1.1.0   28.02.96   erweiterung um: aufgelegt-erkennung, prozente
# 1.2.0   09.03.96   erweiterung um: intern-extern, dienst; vereinfachung
# 1.3.0   26.03.96   erweiterung um: nur Nummern-Ausgabe, Datums-Bereich,
#                    ISDN-Router-Abrechnung, Zeitraum-ausgabe
# 1.3.1   09.04.96   bug-fix: $heute-leerzeichen
# 1.4.0   28.02.97   erweiterung von Hellmuth Michaelis: siehe extra Kasten
#                    erweiterung um: nur Summen drucken
# 1.5.0   15.03.97   erweiterung um: Top-Liste Gesamt und im Citytarif-Bereich (Gebuehren)
# 1.5.1   16.03.97   bug-fix: TOP-Listen-Sortierung vereinfacht
# 1.5.2   23.07.97   erweiterung um: Durchwahl-Text frei definierbar
# 1.5.3   06.08.97   erweiterung um: Top-Liste Gesamt (Anzahl der gehenden Gespraeche)
# 1.6.0   30.12.97   erweiterung um: HTML-Ausgabe
#
#---------------------------------------------------------------------------
#
#	modified by Hellmuth Michaelis, hm@kts.org
#
#	last edit-date: [Sun Feb  2 10:15:54 1997]
#
#	-hm	reformatted (sorry!)
#	-hm	Quante/Ackermann Firmware 1.11b
#	-hm	fuehrende Nullen
#	-hm	NoPrint, Unterdrueckung von ISDN IP Verkehr
#	-hm	Wildcards fuer Durchwahlen
#	-hm	unbekannte Nummern nach File schreiben
#	-hm	-i option
#
#---------------------------------------------------------------------------
#	Aufruf-Optionen:
#
#	-b <Datum>	Ausgabe ab Datum
#	-d		debug output der wildcard eintraege
#	-e <Datum>	Ausgabe bis Datum
#	-i <Datei>	Dateiname fuer input, sonst lesen von stdin
#	-n		Ausgabe der gerufenen Nummern, 
#			nicht der dazugehoerigen Namen.
#	-N		Ausgabe von "NoPrint" nicht (!) unterdruecken
#	-u <Datei>	Ausgabe der unbekannten Rufnummern nach Datei
#	-s		Ausgabe nur der Summen aller Gespraeche (hat Vorang
#			vor den Optionen -n und -N)
#	-t <Anzahl>	Ausgabe der ersten <Anzahl> der Topliste (Gebuehren)
#	-c <Anzahl>	Ausgabe der ersten <Anzahl> der Topliste im
#			City-Tarif Bereich (Gebuehren)
#	-g <Anzahl>	Ausgabe der ersten <Anzahl> der Topliste (gehende Gespraeche)
#       -h              Ausgabe im HTML-Format
#
#---------------------------------------------------------------------------

#$workdir = "/usr/local/lib/isdn/";
#$logdir = "/usr/adm/";

#$log = $logdir . "eumax.log";
#$log = "eumax.log";
#$names = $workdir . "aliases";
#$names = "aliases";
#$vorwde = $workdir . "vorwahl-de";


$maxNameLength = 30;
$maxRNameLength = 11;
$old_year = -1;
$acc1day = "";
$acc2day = "";
$heute = time();
$heute = localtime($heute);
$heute =~  s/  / /g;
@heute = split(/ /,$heute);
$jahr = $heute[4];
$min_date = 0;
$max_date = 99999999;
$all_te = 0;
$durchwahlText = " -";

#---------------------------------------------------------------------------
# suche nach name in der alias liste
# parm1 = telefonnummer
#---------------------------------------------------------------------------
sub searchwild
{
	local($number) = $_[0];
	local($name);

	if($number ne "Rufnr.unbekannt")
	{
		# Alias assoziativ in normaler Liste suchen
		$name = $name4{$number};
		
		if($name =~ /^$/ )	# Alias gefunden ?
		{
			# EVN 000 testen
			$number000 = $number;
            		$number000 =~ s/(.*)000$/$1/;
			$name = $name4{$number000};
		}
		
		if($name =~ /^$/ )	# Alias gefunden ?
		{
			# nein, in der "Wildcard-Liste" normal suchen
	
			for ($[ .. $#wnum)
			{
				if ($number =~ /^$wnum[$_]/)	# gefunden ?
				{
					$number =~ s/$wnum[$_]//; # Durchwahl extrahieren
					return $wnam[$_] . "$durchwahlText" . "$number";
				}
			}
	
			# nicht gefunden
			
			if ($opt_u ne "")	# Nummern merken ?
			{
				print UNKNOWN "$number\n";
			}

			return $number;	# Nummer selbst zurueckgeben
		}
		else	# assoziativ gefunden, Alias zurueckgeben
		{
			return $name;
		}
	}
	return $number;
}

#---------------------------------------------------------------------------
# suche nach vorwahl in der citytarif liste
# parm1 = telefonnummer
#---------------------------------------------------------------------------
sub searchcity
{
	local($number) = $_[0];

	for ($[ .. $#city)
	{
		if ($number =~ /^@city[$_]/)	# gefunden ?
		{
			return "1";
		}
	}
	
	return "0";
}


#---------------------------------------------------------------------------
# convert umlaute into html-style
#---------------------------------------------------------------------------
sub isostyle
{
	local ($name) = $_[0];
	
	$name =~ s/&/&amp;/g;
	$name =~ s/Ù/&auml;/g;
	$name =~ s/ö/&ouml;/g;
	$name =~ s/ö/&uuml;/g;
	$name =~ s/…/&Auml;/g;
	$name =~ s/–/&Ouml;/g;
	$name =~ s/š/&Uuml;/g;
	$name =~ s/û/&szlig;/g;
	$name =~ s/</&lt;/g;
	$name =~ s/>/&gt;/g;
	
	return $name;
}


#---------------------------------------------------------------------------
# convert date to number
#---------------------------------------------------------------------------
sub date2num
{
	local ($tag, $monat, $jahr, @rest) = @_;
	
	if ($jahr < 1900)
	{
		$jahr += 1900;
	}
	
	# jahrtausendwechsel
	if ($jahr < 1990)
	{
		$jahr += 100;
	}
	
	return ($tag + $monat * 100 + $jahr *10000);
}

#---------------------------------------------------------------------------
# convert 2 to 4 ziffer year
#---------------------------------------------------------------------------
sub year2to4
{
	local(@aDate) = split(/\./,$_[0]);
	
	if ($aDate[2] < 1900)
	{
		$aDate[2] += 1900;
	}
	if ($aDate[2] < 1990)
	{
		$aDate[2] += 100;
	}
	
	return join(".",@aDate);
}

#---------------------------------------------------------------------------
# convert month short name to number
#---------------------------------------------------------------------------
sub mnam2num
{
	local($aMonth) = $_[0];
	
	$aMonth =~ s/Jan/01/;
	$aMonth =~ s/Feb/02/;
	$aMonth =~ s/Mar/03/;
	$aMonth =~ s/Apr/04/;
	$aMonth =~ s/May/05/;
	$aMonth =~ s/Jun/06/;
	$aMonth =~ s/Jul/07/;
	$aMonth =~ s/Aug/08/;
	$aMonth =~ s/Sep/09/;
	$aMonth =~ s/Oct/10/;
	$aMonth =~ s/Nov/11/;
	$aMonth =~ s/Dec/12/;
	
	return $aMonth;
}

sub html_header {
	print "<HTML><HEAD><TITLE>TEUMAX Verbindungen</TITLE></HEAD><BODY>\n";
}        

sub html_footer {
	print "</BODY></HTML>\n";
	print "<center><address>&copy;1998 by NiFiX dental develop, Stephan Gelhaus<br>\n";
	print qq|Anregungen, Fragen und Kommentare an <a href="mailto:gelhaus\@nifix.com">gelhaus\@nifix.com</a></address></center>\n|;
	print "</HTML>\n";
}        

#---------------------------------------------------------------------------
# Start
#---------------------------------------------------------------------------

if (!$cgi)
{
	&Getopts("b:c:dDe:g:hi:nNsu:t:");
}

if ((!$opt_r) && (!$opt_k))
{
	$opt_r = 1;
	$opt_k = 1;
}

if ($opt_u ne "")
{
	local($filename) = $opt_u . ".new";

	open(UNKNOWN, ">$filename") || die "cannot open $opt_u for writing";
}

#---------------------------------------------------------------------------
# ausgabe ab Datum ?
#---------------------------------------------------------------------------
if ($opt_b ne "")
{
	@datum = split(/\./,$opt_b);

	if ($datum[2]eq "") 
	{
		$datum[2] = $jahr;
	}

	$b_date = &date2num($datum[0],$datum[1],$datum[2]);
}
else 
{
	$b_date = $min_date;
}

#---------------------------------------------------------------------------
# Ausgabe bis Datum ?
#---------------------------------------------------------------------------
if ($opt_e ne "") 
{
	@datum = split(/\./,$opt_e);
	
	if ($datum[2]eq "") 
	{
		$datum[2] = $jahr;
	}

	$e_date = &date2num($datum[0],$datum[1],$datum[2]);
} 
else 
{
	$e_date = $max_date;
}

#---------------------------------------------------------------------------
# Files oeffnen
#---------------------------------------------------------------------------

#open(VORWDE,$vorwde) || die "cannot open $vorwde for reading";

#---------------------------------------------------------------------------
# Alias File handling
# <tel-nr>\t<name>\t<dienst>
#---------------------------------------------------------------------------
sub read_aliases
{
	open(NAMES,$names) || die "cannot open $names for reading";

	while (<NAMES>)
	{
		if (!/^#/)	# kommentare ueberlesen
		{
			while (/\t\t/)		# multiple TAB's weghauen
			{
				s/\t\t/\t/g;
			}
	
			$alias = $_;
			chop($alias);
	
			@n2name = split(/\t/,$alias);
	
	      		# filtern von "+", "-", "(" & ")"
	     		$n2name[0] =~ s/\+/00/;
	     		$n2name[0] =~ s/-//g;
	      		$n2name[0] =~ s/\(//g;
	      		$n2name[0] =~ s/\)//g;
			
			if((index($n2name[0], "*")) != -1)
			{
				# numbers containing a wildcard
				$n2name[0] =~ s/\*//g;
				push(@wnum, $n2name[0]);
				push(@wnam, $n2name[1]);
				push(@wrem, $n2name[2]);
			}
			elsif((index($n2name[0], "@")) != -1)
			{
				# nummer eine Vorwahl aus dem Citytarif-Bereich
				$n2name[0] =~ s/\@//g;
				push(@city, $n2name[0]);
			}
			else
			{
				# numbers without wildcards
				$name4{$n2name[0]} = $n2name[1];
				$dienst4{$n2name[0]} = $n2name[2];
				
				# extra liste fuer interne Teilnehmer
				if ((10 <= $n2name[0]) && ($n2name[0] <= 99))
				{
					$intName4{$n2name[0]} = $n2name[1];
				}
			}
		}
	}
	
	close(NAMES);
}


#---------------------------------------------------------------------------
# nationales vorwahl handling
# vorwahl ort
#---------------------------------------------------------------------------

#while (<VORWDE>)
#{
#	if (!/^#/)	# kommentare ueberlesen
#	{
#		while (/   /)		# multiple leerzeichen weghauen
#		{
#			s/   /  /g;
#		}
#
#		while (/  /)		# doppelte leerzeichen durch TAB ersetzen
#		{
#			s/  /\t/g;
#		}
#
#		$alias = $_;
#		chop($alias);
#
#		@vw2ort = split(/\t/,$alias);
#		$ort4{@vw2ort[0]} = @vw2ort[1];
#	}
#}


#close(VORWDE);

#---------------------------------------------------------------------------
# datensaetze von der MAXIMA
#   Tln   Datum   Uhrzeit     Amtsrufnummer  Einheiten  Betrag
# G  13 | 17.01.96, 18:26 |           65897 |    20   |   2,40 DM
# G  51 | 21.01.96, 11:37 |     03379353318 |    18   |   2,16 DM
# K AVA | 15.01.96, 16:22 |      7119494166
# V  12 | 19.01.96, 10:51 |         4047171
#
#01   2          3      4                 5       6          7
# $field[n]
#
# Tln: G=gehend, K=kommend, V=verbunden, AVA=Anrufer vorher aufgelegt
#---------------------------------------------------------------------------

print "<TABLE BORDER=0>\n";

if (!$opt_s)
{
	print "<TR><TH>Datum<TH>Uhrzeit<TH align=right>Einh.<TH align=right>Betrag<TH align=right>intern<TH>VA<TH align=left>externer Teilnehmer<TH>Dienst</TR>\n";
	print "<TR><TD COLSPAN=8><HR></TR>\n";
}

open(STDIN, $log) || die "cannot open $log for reading";

while (<STDIN>)
{
	if (/\|/)
	{
		s/\|//g;
		s/, / /g;

		# alle vielfachen leerzeichen loeschen

		while (/  /) { s/  / /g; } 

		$line = $_;

		# zeilenende loeschen
		chop($line);
 
		# zeile in tokens zerteilen
		@field = split(/ /,$line);

		# komma hinter datum loeschen
		$field[2] =~ s/,.*//;
		@logDate = split(/\./,$field[3]);

		if ($logDate[2] < 90)
		{
			$logDate[2] += 2000;
		}
		else
		{
			$logDate[2] += 1900;
		}
		
		$logDate = &date2num($logDate[0],$logDate[1],$logDate[2]);

		if ($b_date > $logDate || $logDate > $e_date)
		{
			next;
		}

		if ($acc1day eq "")
		{
			$acc1day = $field[3];
		}
		$acc2day = $field[3];
			
#---------------------------------------------------------------------------
#	kommende & vermittelte Gespraeche
#---------------------------------------------------------------------------

		if ($field[1] eq "K" || $field[1] eq "V")
		{
			# 0 vor ortnetz-kennzahl einfuegen, macht die Telekom nicht
			$field[5] =~ s/(^[1-9].*)/0$1/;
		}

#---------------------------------------------------------------------------
#	Gehende Gespraeche
#---------------------------------------------------------------------------

		if ($field[1] eq "G")
		{
			# wenn es ein ortsgespraech war, dann ortnetz-kennzahl vorsetzen
			$field[5] =~ s/(^[1-9].*)/$name4{"Ortsnetz"}$1/;
		}

#---------------------------------------------------------------------------
#	alle anderen Gespraeche
#---------------------------------------------------------------------------

		# gebuehrenfreies gespraech
		$field[6] =~ s/.*frei.*//;
		$field[7] =~ s/.*Gesp.*/frei/;

		# komma in punkt umwandeln
		$field[7] =~ s/(.*),(.*)/$1.$2/;

		# name1 suchen
		$theExtName = &searchwild( $field[5] );

		# name2 suchen
		$theIntName = &searchwild( $field[2] );

		# check if printout nicht unterdrueckt werden soll
		if(!$opt_s)
		{
			$detailedPrint = ($name4{$theIntName} ne "NoPrint") && ($name4{$theExtName} ne "NoPrint") && (!$opt_a || ($opt_a eq $field[2])) && (($opt_r && ($field[1] eq "G")) || ($opt_k && $field[1] ne "G"));
			
			if($detailedPrint)
			{
				# ausgabe
				
				
				printf "<TR><TD ALIGN=CENTER>%s<TD ALIGN=CENTER>%s<TD ALIGN=RIGHT>%s<TD ALIGN=RIGHT>%s<TD ALIGN=RIGHT>%s",
					&year2to4($field[3]), $field[4], $field[6], $field[7], &isostyle($theIntName);
				
				print "<TD ALIGN=CENTER>";
				
				if ($field[1] eq "G")
				{
					print "-&gt;";
				} 
				elsif ($field[1] eq "K")
				{
					print ":(";
				}
				elsif ($field[1] eq "V")
				{
					print "&lt;-";
				}
				else
				{
					print "??";
				}
	
				# -n, ausgabe der gerufenen nummern, nicht der dazugehoerigen namen.
	
				if ($opt_n)
				{
						print	"<TD>$field[5]";
				}
				else
				{
					printf "<TD>%s", &isostyle($theExtName);
				}
				
				# Daten, Sprache, Fax
					
				if ($field[5] eq "Rufnr.unbekannt")
				# wenn "Rufnr.unbekannt", dann wird der Dienst des internen Teilnehmers genommen
				{
					$rem = $dienst4{$field[2]};
				}
				# andernfalls, der Dienst des externen Teilnehmers
				else
				{
					$rem = $dienst4{$field[5]};
				}
				
				$voice = 1;
				
				print "<TD ALIGN=CENTER>";
				
				if (index($rem,"D") != -1) 
				{
					print "D";
					$voice = 0;
				} 
				
				if (index($rem,"F") != -1)
				{
					print "F";
					$voice = 0;
				} 
		
				if ((index($rem,"S") != -1) || $voice) 
				{
					print "S";
				}
				
				print "</TR>\n";
			}
		}

		# einheiten und geldbetraege pro teilnehmer merken, sowie anzahl der gespraeche
	
		if ($opt_r && ($field[1] eq "G") && (!$opt_a || ($opt_a eq $field[2])))
		{
			$sum_te{$field[2]} += $field[6];
			$sum_dm{$field[2]} += $field[7];
			
			$top_gg{$theExtName}++;
			
			if ($field[6] != 0) {	# kostenlose gespraeche interessieren nicht
				$top_te{$theExtName} += $field[6];
				$top_dm{$theExtName} += $field[7];
				
				if (&searchcity( $field[5] ) ) {
					$top_city_te{$theExtName} += $field[6];
					$top_city_dm{$theExtName} += $field[7];
				}
			}
			
			$all_te += $field[6];
			$all_dm += $field[7];
		}
	}
}

if ($opt_D ne "")	# soll die summe der Router Einheiten berechnet werden?
{
	if ($opt_b ne "")	# mit beginn datum
	{
		@sum_is = `trouter -b $opt_b -s < /usr/adm/isdn.log`;
	}
	else
	{
		@sum_is = `trouter -s < /usr/adm/isdn.log`;
	}
	
	$sum_te{"IP"} = $sum_is[0];
	$sum_dm{"IP"} = $sum_is[1];

	$top_te{"IP"} = $sum_is[0];
	$top_dm{"IP"} = $sum_is[1];
	
	if ($sum_is[0] != 0 && &searchcity( "IP" ))	# ist IP traffic im citytarif-bereich
	{
		$top_city_te{"IP"} = $sum_is[0];
		$top_city_dm{"IP"} = $sum_is[1];
	}
	
	$all_te += $sum_is[0];
	$all_dm += $sum_is[1];
}

if(!$opt_s)
{
	print "<TR><TD COLSPAN=8><HR></TR>\n";
	print "<TR><TD colspan=4><TD ALIGN=RIGHT>Verbindungsart<TD ALIGN=CENTER>-&gt;<TD>gehend<TD align=center><B>D</B>aten</TR>\n";
	print "<TR><TD colspan=4><TD ALIGN=RIGHT>(VA)<TD ALIGN=CENTER>&lt;-<TD>kommend<TD align=center><B>F</B>ax</TR>\n";
	print "<TR><TD colspan=7><TD align=center><B>S</B>prache</TR>\n";
}

if ($all_te > 0 && $opt_r)	# wurden kostenpflichtige Gespraeche gefuehrt ?
{
	print "<TR><TD COLSPAN=8><HR></TR>\n";
	
	if ($opt_a)
	{
		print "<TR><Td><Td><Td align=right><B>Einh.</B><Td align=right><B>Betrag</B><Td colspan=3 align=left><B>interner Teilnehmer</B></TR>\n";
		
		printf "<TR><TD><B>Gesamt</B><TD COLSPAN=2 ALIGN=RIGHT>%d<TD ALIGN=RIGHT>%7.2f<TD colspan=3>%s</TR>\n",
			$sum_te{$opt_a}, $sum_dm{$opt_a}, &isostyle($name4{$opt_a});
	}
	else
	{
		$te_sum = $all_te ? $all_te : 1;
	
		print "<TR><Td><Td align=right><B>Anteil</B><Td align=right><B>Einh.</B><Td align=right><B>Betrag</B><Td colspan=3 align=left><B>interner Teilnehmer</B></TR>\n";
		
		foreach $number (sort(keys %sum_te))
		{
			printf "<TR><TD COLSPAN=2 ALIGN=RIGHT>%5.1f %%<TD ALIGN=RIGHT>%d<TD ALIGN=RIGHT>%7.2f<TD colspan=3>%s</TR>\n",
			$sum_te{$number} / $te_sum * 100, $sum_te{$number}, $sum_dm{$number}, &isostyle($name4{$number});
		}
		
		print "<tr><td><td colspan=3><hr>\n";
		printf "<TR><TD><B>Gesamt</B><TD ALIGN=RIGHT>100.0 %%<TD ALIGN=RIGHT>%5d<TD ALIGN=RIGHT>%7.2f<TD>\n", $all_te, $all_dm;
	}
}

if ($opt_t && $opt_r)	# topliste ausgeben
{
	print "<tr><td colspan=8><hr></TR>\n";
	print "<tr><td colspan=2 align=left><B>TOP-Gesamt</B><td align=right><B>Einh.</B><td align=right><B>Betrag</B><td colspan=3 align=left><B>externer Teilnehmer</B></TR>\n";

	@sorted_top = sort {$top_te{$a} < $top_te{$b}} keys(%top_te);
	
	$top_printed = $opt_t;
	
	foreach (@sorted_top)
	{
		printf "<tr><td colspan=2><td ALIGN=RIGHT>%d<td ALIGN=RIGHT>%7.2f<td colspan=3>%s</TR>\n",
			$top_te{$_}, $top_dm{$_}, &isostyle($_);
			
		$top_printed--;
		
		if ($top_printed == 0)
		{
			last;
		}
	}

}

if ($opt_c && $opt_r)	# topliste im citytarif bereich ausgeben
{
	print "<tr><td colspan=8><hr></TR>\n";
	print "<tr><td colspan=2 align=left><B>TOP-Citytarif</B><td align=right><B>Einh.</B><td align=right><B>Betrag</B><td colspan=3 align=left><B>externer Teilnehmer</B></TR>\n";

	@sorted_city_top = sort {$top_city_te{$a} < $top_city_te{$b}} keys(%top_city_te);
	
	$top_city_printed = $opt_c;
	
	foreach (@sorted_city_top)
	{
		printf "<tr><td colspan=2><td ALIGN=RIGHT>%d<td ALIGN=RIGHT>%7.2f<td colspan=3>%s</TR>\n",
			$top_city_te{$_}, $top_city_dm{$_}, &isostyle($_);
		
		$top_city_printed--;
		
		if ($top_city_printed == 0)
		{
			last;
		}
	}

}

if ($opt_g && $opt_r)	# topliste gesamt
{
	print "<tr><td colspan=8><hr></TR>\n";
	print "<tr><td colspan=2 align=left><B>TOP-Gespr&auml;che</B><td align=right><B>Anzahl</B><td><td  colspan=3 align=left><B>externer Teilnehmer</B></TR>\n";

	@sorted_top_gg = sort {$top_gg{$a} < $top_gg{$b}} keys(%top_gg);
	
	$top_gg_printed = $opt_c;
	
	foreach (@sorted_top_gg)
	{
		printf "<tr><td colspan=2><td ALIGN=RIGHT>%d<td><td colspan=3>%s</TR>\n",
			$top_gg{$_}, &isostyle($_);
		
		$top_gg_printed--;
		
		if ($top_gg_printed == 0)
		{
			last;
		}
	}
}




if ($opt_b ne "")
{
	$acc1day = $opt_b;
}
if ($opt_e ne "")
{
	$acc2day = $opt_e;
}

print "<tr><td colspan=8><hr></TR>\n";
printf "<TR><Td><B>Zeitraum</B><TD COLSPAN=4>vom <B>%s</B> bis <B>%s</B></TR>\n", $acc1day, $acc2day;

print "</TABLE><hr>\n";

if ($opt_u ne "")	# Nummern merken ?
{
	close(UNKNOWN);
	$filename = $opt_u . ".new";

	if ( -e $opt_u )
	{
		$filenamet = $opt_u . ".tmp";
		system("cat $opt_u $filename | sort -u > $filenamet;mv $filenamet $opt_u;rm -f $filename $filenamet"); 
	}
	else
	{
		system("cat $filename | sort -u > $opt_u;rm -f $filename"); 
	}
}


&html_footer;

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.