Location: PHPKode > projects > TelDaBase > teldabase-1.4/teldabase/auswertung.php
<?
/***************************************************************/
/*                                                             */
/* TelDaBase                                                   */
/* =========                                                   */
/*                                                             */
/* Copyright (C) 2004 Wolfgang Barthel                         */
/*                                                             */
/*                    http://www.teldabase.de                  */
/*                    hide@address.com */
/*                                                             */
/* see index.php and LICENSE                                   */
/*                                                             */
/***************************************************************/

/***************************************************************/
/* auswertung.php                                              */
/* ==============                                              */
/* Übersicht über die Kosten der einzelne Personen             */
/***************************************************************/


/* Berechnet fuer die entsprechende Rechnung fuer jede Person die Summe der Kosten 
 der angekreuzten Gespraeche und die Gesamtkosten  */

function auswertung($link, $rechnungsid)
{
   /* Rechnungsgesamtbetrag laden */

   $query = "select rech_betrag, rech_aufschlag, rech_mwst
	     from Rechnungen where rechnung_id='$rechnungsid'";
   $result = mysql_query($query, $link) 
      or die ("Query |$query| failed:" . mysql_error());
   $row = mysql_fetch_assoc($result);

   $rech_betrag = $row["rech_betrag"];
   $mwst = $row["rech_mwst"]; 
   $aufschlag = $row["rech_aufschlag"]; 
    
    /* Anteile an der Grundgebühr werden aus der DB geladen */

   $query = "SELECT distinct bewohner_id, ggb_anteil FROM Grundgebuehr 
	     WHERE Grundgebuehr.rechnung_id = '$rechnungsid'
	     and ggb_anteil > 0";
   
   $result = mysql_query($query, $link)
      or die ("Query |$query| failed:" . mysql_error());

   $sum_anteil = 0;

   while($row = mysql_fetch_assoc($result))
   {
       $ggb_anteil[$row["bewohner_id"]] = $row["ggb_anteil"];
       $sum_anteil += $ggb_anteil[$row["bewohner_id"]];
   }
		    
   /* Ermitteln der Gesamtkosten zugeordneter Gespräche für jede Person */
   /* Gespräche mit bew_aktiv = 2 zählen als Grundgebühr */
	     
     
   $query = "select EZV.bewohner_id, sum(ezv_nettogesamtbetrag) as bew_kosten from EZV
	      left join Bewohner using(bewohner_id)
		where rechnung_id='$rechnungsid' 
	      and (bew_aktiv <> 2 or bew_aktiv is null)
		group by bewohner_id";
   $result = mysql_query($query, $link) 
      or die ("Query |$query| failed:" . mysql_error());

   $angekreuzt = 0;
    
   while($row = mysql_fetch_assoc($result))
   {
	/* $gespraechskosten[""] sind die nicht angekreuzten Gespräche */
	
        /* Gespraechskosten werden auf den hundertstel Cent genau als
	 * Integer gespeichert, die Mwst. ebenfalls als Integer, deshalb
	 * muessen wir durch 10000 teilen, um den Cent-Betrag zu erhalten */
       
	if($row["bewohner_id"] != "")
	{
	    $kosten[$row["bewohner_id"]]["gespr"] 
	      = intval(round($row["bew_kosten"] * $mwst / 10000));
	    $angekreuzt += $kosten[$row["bewohner_id"]]["gespr"];
	}
	else
	   $unzugeordnet_10000 = $row["bew_kosten"] * $mwst;
   }

   foreach($ggb_anteil as $bewohnerid => $anteil)
   {
       $kosten["$bewohnerid"]["unzugeordnet"]
	 = intval(round($unzugeordnet_10000 * $anteil /$sum_anteil / 10000));
       $unzugeordnet += $kosten["$bewohnerid"]["unzugeordnet"];
   }

    /* Alle folgenden Rundungen sollten minimal sein, da die Beträge schon selbst
    gerundet sind */
    
   $sum_gespraeche = $angekreuzt + $unzugeordnet;
   $ggebuehr = $rech_betrag - $sum_gespraeche;

   foreach($ggb_anteil as $bewohnerid => $anteil)
   {
       $kosten["$bewohnerid"]["ggebuehr"] = intval($ggebuehr * $anteil/$sum_anteil);
       $kosten["$bewohnerid"]["aufschlag"] 
	 = intval(round($aufschlag * $anteil / 100));
   }

       
    /* hat eine Person Grundgebühr zu bezahlen oder mind. ein Gespräch geführt ?
     Dann hat sie etwas zu bezahlen. */
    
//    $bewohner = array_unique(array_merge(array_keys($gg_anteil), array_keys($gespraechskosten)));

    foreach($kosten as $bewohner_id => $val)
    {
	$kosten["$bewohner_id"]["gesamt"] =
	  $kosten["$bewohner_id"]["ggebuehr"] +
	  $kosten["$bewohner_id"]["unzugeordnet"] +
	  $kosten["$bewohner_id"]["aufschlag"] +
	  $kosten["$bewohner_id"]["gespr"];
    }
   
   return(array("rech_betrag" => $rech_betrag,
		"sum_gespr" => $sum_gespraeche,
		"angekreuzt" => $angekreuzt, 
		"unzugeordnet" => $unzugeordnet,
		"kosten" => $kosten,
		"ggebuehr" => $ggebuehr,
		"ggb_anteil" => $ggb_anteil,
		"sum_anteil" => $sum_anteil));
    
}

function auswertung_show($link, $rechnungsid)
{
require('conf.php');

/* Rechnungsdatum laden und anzeigen */

$query = "select date_format(rech_datum,\"%d.%m.%Y\") as rech_date from Rechnungen where rechnung_id='$rechnungsid'";
$result = mysql_query($query, $link) 
     or die ("Query |$query| failed:" . mysql_error());
$row = mysql_fetch_assoc($result);

echo("<h2>Rechnung vom ".$row["rech_date"]."</h2>");


$query = "select bewohner_id,bew_name from Bewohner";

$result = mysql_query($query, $link) 
     or die ("Query |$query| failed:" . mysql_error());
     
while($row = mysql_fetch_assoc($result))
{
   $bewohner[$row["bewohner_id"]] = $row["bew_name"];
}

   echo "<h3>Abrechnung</h3>";
   
   if(!empty($_POST))
      updaterows($link, $_POST,$rechnungsid);
   
   $rdat = auswertung($link, $rechnungsid);

   rechnung_abziehen($link, $rechnungsid, $rdat["kosten"]);
    
   echo "<p>Rechnungsbetrag: ".number_format($rdat["rech_betrag"] / 100,2,",","")
     ." &euro;<br />\n";
   echo "davon Gespräche: ".number_format($rdat["sum_gespr"] / 100 ,2,",","") 
      ." &euro;<br />\n";
   echo "Angekreuzt: ". number_format($rdat["angekreuzt"] /100,2,",","")
      ." &euro;<br />\n";
   echo "Fehlbetrag: ". number_format($rdat["unzugeordnet"] / 100,2,",","") 
      ." &euro; (<a href=\"" . $_SERVER["PHP_SELF"] 
      . "?aktmenu=Auswertung&amp;rechnungsid=" . $_GET["rechnungsid"]
      . "&amp;bewohnerid=fehl&amp;aktion=EZV\">Verbindungen</a>)<br /></p>\n";

   /* tabellarische Auflistung der Kosten für jede Person */

?>
<form action="<?= $_SERVER['PHP_SELF'] 
?>?aktmenu=Auswertung&amp;aktion=email&amp;rechnungsid=<?=$_GET["rechnungsid"] ?>" method="post">
<table class="tblborder">
<tr>
<th>&nbsp;</th>
<th>nur Gespräche</th>
<th>&nbsp;</th>
<th>Gesamt</th>
<th>Kontostand</th>
<th>&nbsp;</th></tr>
<?
   asort($bewohner);
   foreach($bewohner as $bewohner_id=>$bewohner_name)
   {
       /* hat der Bewohner Grundgebühr zu bezahlen oder mind. ein Gespräch geführt ?*/
      
      if(isset($rdat["kosten"][$bewohner_id]))
       {
	   echo "<tr>";
	 echo "<td>
		<input name=\"mail[".$bewohner_id."]\" type=\"checkbox\" checked=\"checked\" />\n";
	 echo "$bewohner_name</td>\n<td width = \"90\" align=\"right\">"
	    . number_format($rdat["kosten"][$bewohner_id]["gespr"] /100,2,",","")
	    . " &euro;</td><td><a href=\"" . $_SERVER["PHP_SELF"] 
	    . "?aktmenu=Auswertung&amp;rechnungsid="
      . $_GET["rechnungsid"] 
	. "&amp;bewohnerid=$bewohner_id&amp;aktion=EZV\">EZV</a> <a href=\"" 
	     . $_SERVER["PHP_SELF"] . "?aktmenu=PDF&amp;was=Rechnung&amp;rechnungsid="
      . $_GET["rechnungsid"] 
	. "&amp;bewohnerid=$bewohner_id\">Rechnung</a></td>"
	. "<td width = \"90\" align=\"right\">"
	    . number_format($rdat["kosten"][$bewohner_id]["gesamt"] / 100 ,2,",","")
	    . " &euro;</td>\n" . "<td width = \"90\" align=\"right\">"
	     . number_format(kontostand($link, $bewohner_id) / 100,2,",","")
	    . " &euro;</td><td><a href=\"" . $_SERVER["PHP_SELF"] . "?aktmenu=Konten&amp;bewohnerid="
	  . $bewohner_id . "&amp;aktion=Einzahlen\">Einzahlen</a></td>\n";
         echo "</tr>\n";
       }
   }
   echo "</table>
	  <input type=\"submit\" action=\"submit\" value=\"Rechnung an Markierte versenden\" />
	  </form>";

   echo "<p>\n<a href=\"" . $_SERVER["PHP_SELF"] . "?aktmenu=Auswertung&amp;rechnungsid="
      . $_GET["rechnungsid"] . "&amp;aktion=EZV\">Einzelverbindungs&uuml;bersicht</a>\n</p>\n";
   echo "<p>\n<a href=\"" . $_SERVER["PHP_SELF"] . "?aktmenu=PDF&amp;was=Rechnung&amp;rechnungsid="
      . $_GET["rechnungsid"] . "\">Alle Rechnungen als eine PDF</a>\n</p>\n";
}

function my_number_format($val, $digits)
{
    $ret = round($val);
    $rest = $ret - $val;
}

function tex_to_cmdline($val)
{  
    return str_replace(
		       array("ä", "ö", "ü", "%", "_", "&",
			     ":percent:", ":amp:"),
		       array("\\\"a", "\\\"o", "\\\"u",
			     "\\%", "\\_", "\\&", "%", "&"),
		       $val);
    
}
    

function def_tex_var($key, $val, $nf = true)
{
  $retstr = "\\def\\rech".$key. "{";
    
  $val = tex_to_cmdline($val);
    
  if($nf and is_numeric($val))
    $retstr .= number_format($val , 2,",","") ;
  else
    $retstr .= $val ;
  $retstr .= "}\n";
    return $retstr;
}


function read_template()
{		       
    $templatefilename = "rechnung.tex";
    $templatefile = fopen($templatefilename, "r");
    $templatecontents = fread($templatefile, filesize($templatefilename));
    fclose($templatefile);
    
    $prefix_marker =  "\\begin{document}";
    $end_marker =  "\\end{document}";

    $prefixend = strpos($templatecontents, $prefix_marker);
    $bodybegin = $prefixend + strlen($prefix_marker);
    $bodyend = strpos($templatecontents, $end_marker);

    
    return(array("prefix" =>
		 substr($templatecontents, 0, $prefixend),
		 "body" =>
		 substr($templatecontents,
			$bodybegin, $bodyend-$bodybegin)));
   
}


function make_rechnung($link, $rechnungsid, $bewohner_id, $show = true)
{
    $template = read_template();
    $query = "select rechnung_id, date_format(rech_datum,\"%d.%m.%Y\") as rech_date, rech_mwst, rech_aufschlag from Rechnungen
	       where rechnung_id='$rechnungsid'";
    $result = my_mysql_query($query, $link);
    
    $daterow = mysql_fetch_assoc($result);

    $rdat = auswertung($link, $rechnungsid);

    rechnung_abziehen($link, $rechnungsid, $rdat["kosten"]);
    
    $rdat = auswertung($link, $rechnungsid);
    
    rechnung_abziehen($link, $rechnungsid, $rdat["kosten"]);

    $cmd = "\\nonstopmode";
    $cmd .= $template["prefix"];
    $cmd .= "\\begin{document}\n";

    $bewohner = array();
    
    if(empty($bewohner_id)) /* Rechnungen aller Bewohner anzeigen */
    {
	$query = "select bewohner_id from Konto where
		   rechnung_id = $rechnungsid";
	$result = mysql_query($query, $link)
	  or die ("Query |$query| failed:" . mysql_error());
	
	while($row = mysql_fetch_assoc($result))
	    array_push($bewohner, $row["bewohner_id"]);
    }
    else
      $bewohner = array($bewohner_id);

    $trenner ="";
    
    asort($bewohner);
    
    foreach($bewohner as $bewohner_id)
    {
    $cmd .= $trenner;
    $trenner = " \\newpage";	

    $vardef = def_tex_var("date",  $daterow["rech_date"]);
    $vardef .= def_tex_var("aufschlag", $daterow["rech_aufschlag"] / 100);

    
    $query = "select bew_name, bew_vorname, bew_nachname from Bewohner where
	       bewohner_id = '$bewohner_id'";
    $result = my_mysql_query($query, $link);

    if(mysql_numrows($result) != 1)
    {
	htmlheader();
	echo "<p>Diese Person existiert gar nicht...!</p>";
	die();
    }
    
    $row = mysql_fetch_assoc($result);
    if(isset($row["bew_vorname"]) || isset($row["bew_nachname"]))
      $name = $row["bew_vorname"] . " " . $row["bew_nachname"];
    else
      $name = $row["bew_name"];
        
    $vardef .= def_tex_var("name", $name);

    $vardef .= def_tex_var("kontostand", kontostand($link, $bewohner_id) / 100);
    $vardef .= def_tex_var("zahlbetrag", -kontostand($link, $bewohner_id) / 100);

    if(kontostand($link, $bewohner_id) < 0)
          $vardef .= def_tex_var("guth", "false");
    elseif(kontostand($link, $bewohner_id) == 0)
          $vardef .= def_tex_var("guth", "");
    else
          $vardef .= def_tex_var("guth", "true");

    $anteilstr = round($rdat["ggb_anteil"][$bewohner_id] / 100, 2) .
      "/" . round($rdat["sum_anteil"] / 100, 2);
    $anteilstr = str_replace(".", ",", $anteilstr);
    
    $vardef .= def_tex_var("ggebuehr", $rdat["ggebuehr"] / 100);
    $vardef .= def_tex_var("anteil", $anteilstr, false);

    if($rdat["kosten"][$bewohner_id]["ggebuehr"] != 0)
      $vardef .= def_tex_var("ggebuehranteil", $rdat["kosten"][$bewohner_id]["ggebuehr"] / 100);
    else
      $vardef .= def_tex_var("ggebuehranteil", "");
    
    $vardef .= def_tex_var("gespraechskosten", $rdat["kosten"][$bewohner_id]["gespr"] / 100);
    
    if($rdat["kosten"][$bewohner_id]["unzugeordnet"] == 0)
      $vardef .= def_tex_var("unzugeordnet", "");
    else
    {
	$vardef .= def_tex_var("unzugeordnet", $rdat["unzugeordnet"] / 100);
	$vardef .= def_tex_var("unzugeordnetanteil", 
			$rdat["kosten"][$bewohner_id]["unzugeordnet"] / 100);
    }
    
    $vardef .= def_tex_var("aufschlagfaktor", 
			str_replace(".", ",",
				    round($rdat["ggb_anteil"][$bewohner_id] / 100, 2))
				    , false);

    if($rdat["kosten"][$bewohner_id]["aufschlag"] != 0)
      $vardef .= def_tex_var("aufschlaganteil", 
			  $rdat["kosten"][$bewohner_id]["aufschlag"] / 100);
    else
      $vardef .= def_tex_var("aufschlaganteil","");
    
    $vardef .= def_tex_var("summe", $rdat["kosten"][$bewohner_id]["gesamt"] / 100);
    
    $query = "select ezv_id, EZV.telefonbuch_id,tel_nummer, tel_ortsnetz, 
ezv_nettogesamtbetrag, date_format(ezv_datum,\"%d.%m.%y\") as ezv_tag, 
date_format(ezv_datum,\"%H:%i\") as ezv_uhrzeit, ezv_dauer, anb_name from EZV left 
join Telefonbuch using(telefonbuch_id) left join Anbieter on(EZV.anbieter_id = 
Anbieter.anbieter_id) where rechnung_id = '$rechnungsid' and EZV.bewohner_id = 
'$bewohner_id' order by ezv_datum";    

   $result = mysql_query($query, $link) 
      or die ("Query |$query| failed:" . mysql_error());

   $ezv = "";
	
   while($row = mysql_fetch_assoc($result))
     {
       $ezv .= $row["tel_nummer"] . ":amp:" 
	 . substr($row["tel_ortsnetz"], 0, 14) . ":amp:"
	 . $row["ezv_tag"] ." ". $row["ezv_uhrzeit"]. ":amp:"
	 . substr($row["anb_name"],0, 19) 
	 .":amp:" . $row["ezv_dauer"] .":amp:" . 
	   number_format($row["ezv_nettogesamtbetrag"] / 10000, 4, ",", "")
	 ." \\EUR" ."\\\\ \n";
     }

    $vardef .= def_tex_var("ezv", $ezv);

    $cmd .= $vardef;
    $cmd .= $template["body"];
	
}
    $cmd .= "\\end{document}";
//    $cmd .= "\\\\input{../rechnung.tex} ";


    $texfilename = "tmp/rechnung.tex";
    $texfile = @fopen($texfilename, "w") or die("<p>Fehler: Keine Rechte zum Schreiben der PDF-Datei.<br /> Bitte im TelDaBase-Verzeichnis <i>chmod 733 tmp</i> aufrufen.</p>");
    fwrite($texfile, $cmd);
    fclose($texfile);
    
    $cmd = "cd tmp && pdflatex rechnung.tex && pdflatex rechnung.tex && pdflatex rechnung.tmp";
    
    //    print($cmd);
    //        system($cmd);
    //    exit();
    exec($cmd);
    
    if($show)
    {
	$pdffilename = "tmp/rechnung.pdf";
	$pdffile = fopen($pdffilename, "r");
	$pdfcontents = fread($pdffile, filesize($pdffilename));
	fclose($pdffile);
	header('Content-type: application/pdf');
	header('Content-Disposition: inline; filename="rechnung.pdf"');
	echo "$pdfcontents";
    }
    return($rdat["kosten"][$bewohner_id]["gesamt"]);
}

function mailsenden($link, $rechnungsid)
{
    require('conf.php');
    $query = "select unix_timestamp(rech_datum) as rech_datum from Rechnungen
	       where rechnung_id =$rechnungsid";
    
    $result = mysql_query($query, $link)
	  or die ("Query |$query| failed:" . mysql_error());

    if(mysql_numrows($result) !=1)
    {
	echo("<h3>Diese Rechnung existiert nicht!</h3>\n");
	return;
    }
    
    $row = mysql_fetch_assoc($result);
    $rechdatum = date("d.m.y", $row["rech_datum"]);
    
    echo("<h3>Rechnung wurde versandt an:</h3>\n");

    $bewohner_id = implode(",", array_keys($_POST["mail"]));

    $query = "select * from Bewohner where bewohner_id in (".
      $bewohner_id. ") and bew_aktiv <> 2";
	$result = mysql_query($query, $link)
	  or die ("Query |$query| failed:" . mysql_error());

    $mail_file = "mail.txt";
    $mail_template = fread(fopen($mail_file,"r"),filesize($mail_file));
    
    while($row = mysql_fetch_assoc($result))
    {
	print($row["bew_vorname"]. " " . $row["bew_nachname"]." (" .
	      $row["bew_email"]. ")<br />\n");
	$ges_kosten = 
	  make_rechnung($link, $rechnungsid, $row["bewohner_id"], false);
	$betreff = "Neue Telefonrechnung";
	
	$email = $row["bew_email"];
	
	$kontostand = kontostand($link, $row["bewohner_id"]);
	
	/* TAGS ersetzen */
	
	$message = str_replace(array("<VORNAME>", "<NAME>",
	      "<GES_BETRAG>", "<AKT_BETRAG>", "<RECH_DATUM>"),
	      array($row["bew_vorname"], $row["bew_name"], 
  	      number_format($kontostand / 100, 2, ",",""),
  	      number_format($ges_kosten / 100, 2, ",",""),
	      $rechdatum),
		 $mail_template);
	
	if($kontostand < 0)
	{
	    $message = preg_replace("/<PLUS>.*<\/PLUS>/s","", $message);
	}
	if($kontostand > 0)
	{
	    $message = preg_replace("/<MINUS>.*<\/MINUS>/s","", $message);
	}

	$message = preg_replace("/<.*?>/", "", $message);
	
	$pdffilename = "tmp/rechnung.pdf";
	$file_name = "rechnung.pdf";
	$from = $sales;
	$to = $beMail;
	$boundary = strtoupper(md5(uniqid(time())));
	$mail_header = "From: ".$conf["abs_name"]." <".$conf["abs_email"].">\r\n";
	$mail_header .= "MIME-Version: 1.0";
	$mail_header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
	$mail_header .= "\n\nThis is a multi-part message in MIME format  --  Dies ist eine mehrteilige Nachricht im MIME-Format";
	$mail_header .= "\n--$boundary"; 
	$mail_header .= "\nContent-Type: text/plain";
	$mail_header .= "\nContent-Transfer-Encoding: 8bit";
	$mail_header .= "\n\n$message";
	$pdffile = fopen($pdffilename,"r");
	$pdf_content = fread($pdffile, filesize($pdffilename));
	fclose($pdffile);
	$pdf_content = chunk_split(base64_encode($pdf_content));
	$mail_header .= "\n--$boundary";
	$mail_header .= "\nContent-Type: application/pdf; name=\"$file_name\"";
	$mail_header .= "\nContent-Transfer-Encoding: base64";
	$mail_header .= "\nContent-Disposition: attachment; filename=\"$file_name\"";
	$mail_header .= "\n\n$pdf_content";
	$mail_header .= "\n--$boundary--";
	$success = mail($email, $betreff, $message, $mail_header);
	usleep(100);
    }
    
}
?>
Return current item: TelDaBase