Files
Kundenverwaltung/incs/listfuncs.php
T
adminandClaude Opus 5 d8fff4aeb6 Rechnungsmodul auf Prepared Statements umgebaut
- incs/rechnung.php: alle Abfragen mit Platzhaltern. saveRechnung() setzte
  $_POST ungeprueft in SQL (Injection; ein Apostroph im Text brach das
  Speichern ab). Speichern, Kopieren und Loeschen laufen in Transaktionen,
  bei Fehlern bleibt nichts Halbes zurueck. Formularwerte ueber
  formularText/-Zahl/-Ganzzahl (strikter Modus).
- copyRech() trug die Rechnungsnummer ohne typ_id ein (Fehler im strikten
  Modus) und zaehlte typuebergreifend; jetzt wie beim Anlegen pro Typ
  (neueRechnungsnummer()). Artikel und Eigenschaften per INSERT ... SELECT.
- Adressblock-Formatierung aus makeadressblock() und
  makeadressblockUmschlag() in formatiereAdressblock() zusammengefuehrt.
- ajax/autosave.php und ajax/preview.php teilen sich saveTmpRechnung();
  ueberzaehlige Entwuerfe werden samt Artikeln entfernt (vorher FK-Fehler).
- sites/rechnungadd.php: Storno ohne SQL-Injection ueber $_GET["id"],
  Auswahllisten ueber db_zuordnung(), tote Kommissions-Abfrage entfernt.
- Rechnungssuche (createRechQry/createKdnRechQry) liefert SQL und Parameter
  getrennt; Suchbegriffe waren ungeprueft im SQL.
- saveLog() mit Platzhaltern, Protokolltext ueber db_sql_text().
- db.php: db_zuordnung(), db_sql_text(); Helfer liefern Strings wie
  mysqli_query(), damit alter Code sich gleich verhaelt.

Getestet: alter und neuer Code lesen dieselbe migrierte Datenbank, 150 von
155 Pruefungen (10.936 Werte) identisch, die uebrigen 5 sind der
Injection-Suchbegriff (alt: SQL-Fehler). Schreibtests fuer Entwurf,
Anlegen, Nummernkreise, Aendern, Rollback, Kopieren, Adresse, Storno und
Loeschen im strikten Modus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 10:41:43 +02:00

605 lines
19 KiB
PHP

<?php
function createPartQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1)
{
if(!$full)
{
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr, tel.nr AS tel FROM partner
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN kontakt ON kontakt.partner_id = partner.id
WHERE updated_by = 0 and adresse.typ_id = 1 AND partner.typ_id = $typ";
}
else
{
$query = "SELECT partner.id AS kdnr,firma,GROUP_CONCAT(CONCAT(vname,' ',nname) SEPARATOR '<br />') AS nname, '' AS vname,GROUP_CONCAT(CONCAT(vname2,' ',nname2) SEPARATOR '<br />') AS nname2,'' AS vname2,'' AS ort,GROUP_CONCAT(CONCAT(plz,' ',ort) SEPARATOR '<br />') AS plz,GROUP_CONCAT(CONCAT(str,' ',hnr) SEPARATOR '<br />') AS str,'' AS hnr, GROUP_CONCAT(tel.nr SEPARATOR '<br />') AS tel FROM partner
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN kontakt ON kontakt.partner_id = partner.id
WHERE partner.typ_id = $typ";
}
switch($fields)
{
case "all":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag' OR ort LIKE '$tag' OR str LIKE '$tag' OR plz LIKE '$tag' OR partner.id LIKE '$tag')";
}
break;
case "kdnr":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (partner.id LIKE '$tag')";
}
break;
case "name":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag')";
}
break;
case "str":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (str LIKE '$tag')";
}
break;
case "plz":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (plz LIKE '$tag')";
}
break;
case "ort":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (ort LIKE '$tag')";
}
break;
case "tel":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (tel.nr LIKE '$tag')";
}
break;
case "kont":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (kontakt LIKE '$tag')";
}
break;
}
$query .= " GROUP BY partner.id";
$ret["all"] = $query;
$query .= " LIMIT ".(intval($page)*$pagesize).", $pagesize";
$ret["limited"] = $query;
return $ret;
}
function createAdressQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1)
{
if(!$full)
{
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr,adresse.id AS adrid, tel.nr AS tel
FROM partner
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN kontakt ON kontakt.partner_id = partner.id
WHERE updated_by = 0 AND partner.typ_id = $typ";
}
else
{
$query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr,adresse.id AS adrid, tel.nr AS tel
FROM partner
LEFT JOIN adresse ON adresse.partner_id = partner.id
LEFT JOIN strasse ON strasse.id = str_id
LEFT JOIN ort ON ort.id = ort_id
LEFT JOIN tel ON tel.partner_id = partner.id
LEFT JOIN kontakt ON kontakt.partner_id = partner.id
WHERE partner.typ_id = $typ";
}
switch($fields)
{
case "all":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag' OR ort LIKE '$tag' OR str LIKE '$tag' OR plz LIKE '$tag' OR partner.id LIKE '$tag')";
}
break;
case "kdnr":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (partner.id LIKE '$tag')";
}
break;
case "name":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (vname LIKE '$tag' OR nname LIKE '$tag' OR vname2 LIKE '$tag' OR nname2 LIKE '$tag' OR firma LIKE '$tag')";
}
break;
case "str":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (str LIKE '$tag')";
}
break;
case "plz":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (plz LIKE '$tag')";
}
break;
case "ort":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (ort LIKE '$tag')";
}
break;
case "tel":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (tel.nr LIKE '$tag')";
}
break;
case "kont":
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (kontakt LIKE '$tag')";
}
break;
}
$query .= " GROUP BY adresse.id";
$ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
$ret["limited"] = $query;
return $ret;
}
/*
* Suche in den Dokumenten eines Kunden. Liefert array("all" => sql,
* "limited" => sql mit LIMIT, "params" => Platzhalterwerte für beide).
* $combiner muss "AND" oder "OR" sein.
*/
function createKdnRechQry($page,$pagesize,$src,$combiner,$id,$typ,$sks=0)
{
$docnr = "rechnr";
$combiner = $combiner == "OR" ? "OR" : "AND";
$params = array($id, $typ);
if(!$sks)
{
$query = "SELECT rechnung.$docnr AS rechnr,
rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '<br />') AS artikel,
adresse_id,
storno,
rechnung.typ_id
FROM rechnung
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
LEFT JOIN artikel_rechn ON rechnung.id = artikel_rechn.rech_id
LEFT JOIN artikel ON artikel_rechn.art_id = artikel.id
WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 0 ";
foreach($src AS $tag)
{
$tag .= "%";
$query .= " $combiner (artikel.bezeichn LIKE ? OR rechnung.rechnr LIKE ? OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag);
}
}
else
{
$query = "SELECT rechnung.$docnr AS rechnr,
rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '<br />') AS artikel,
adresse_id,
rechnung.typ_id
FROM rechnung
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
RIGHT JOIN artikelsks ON rechnung.rechnr = artikelsks.rechnr
WHERE partner_id = ? AND rechtyp.id = ? AND rechnung.sks = 1 ";
foreach($src AS $tag)
{
$tag .= "%";
$query .= " $combiner (artikelsks.bezeichn1 LIKE ? OR artikelsks.bezeichn2 LIKE ? OR rechnung.rechnr LIKE ? OR DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag, $tag);
}
}
$query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC ";
$ret["all"] = $query;
$query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query;
$ret["params"] = $params;
return $ret;
}
function createKdnProjectQry($page,$pagesize,$src,$combiner,$id)
{
$query = "SELECT project.id, project.name,
DATE_FORMAT(project.datetime, '%d.%m.%Y') AS date,
SUM(CASE WHEN rechn = 0 THEN work.std ELSE 0 END) AS work
FROM project
JOIN work ON project.id = work.project_id
AND partner_id='".$id."'";
foreach($src AS $tag)
{
$tag .= "%";
$query .= " $combiner (work.bezeichn LIKE '$tag' OR project.name LIKE '$tag' OR DATE_FORMAT(project.datetime, '%d.%m.%Y') LIKE '$tag')";
}
$query .= " GROUP BY project.id ORDER BY project.datetime DESC ";
$ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
$ret["limited"] = $query;
return $ret;
}
function createKommQry($page,$pagesize,$src,$combiner,$id)
{
$query = "SELECT adresse.id, adresse.partner_id, firma, vname, nname, vname2, nname2, titel_id, titel2_id, anrede_id, anrede2_id, str, hnr, ort, ortsteil,plz,ort,nr AS tel,vwahl
FROM adresse
LEFT JOIN strasse ON adresse.str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN tel ON adresse.id = tel.adresse_id
WHERE adresse.partner_id='".$id."' AND adresse.typ_id = '5' ";
foreach($src AS $tag)
{
$tag .= "%";
$query .= " $combiner (ort LIKE '$tag'
OR str LIKE '$tag'
OR nr LIKE '$tag'
OR vname LIKE '$tag'
OR nname LIKE '$tag'
OR vname2 LIKE '$tag'
OR nname2 LIKE '$tag'
OR firma LIKE '$tag')";
}
$query .= " GROUP BY adresse.id ORDER BY adresse.id DESC ";
$ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
$ret["limited"] = $query;
return $ret;
}
/*
* Suche über alle Dokumente, Rückgabe wie createKdnRechQry().
*/
function createRechQry($page,$pagesize,$src,$combiner,$sks=0)
{
$docnr = "rechnr";
$combiner = $combiner == "OR" ? "OR" : "AND";
$params = array();
if(!$sks)
{
$query = "SELECT CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) AS drechnr,
rechnung.$docnr AS rechnr,
rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikel.bezeichn, ' (', artikel_rechn.wanr, ')') SEPARATOR '<br />') AS artikel,
adresse_id,
storno,
rechnung.typ_id
FROM rechnung
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
LEFT JOIN artikel_rechn ON rechnung.id = artikel_rechn.rech_id
LEFT JOIN artikel ON artikel_rechn.art_id = artikel.id
WHERE rechnung.sks = 0";
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (artikel.bezeichn LIKE ? OR
CONCAT(ELT(rechnung.typ_id,'R','G','A','B','L','M'),MID(rechnung.$docnr,1,4),'-',MID(rechnung.$docnr,5,2),'-',MID(rechnung.$docnr,7,2),'.',MID(rechnung.$docnr,9,2)) LIKE ? OR
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag);
}
}
else
{
$query = "SELECT rechnung.$docnr AS drechnr,
rechnung.$docnr AS rechnr,
rechnung.id,
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') AS date,
GROUP_CONCAT(CONCAT(artikelsks.bezeichn1, ' ', artikelsks.bezeichn2) SEPARATOR '<br />') AS artikel,
adresse_id,
storno = 0,
rechnung.typ_id
FROM rechnung
LEFT JOIN rechtyp ON rechnung.typ_id = rechtyp.id
RIGHT JOIN artikelsks ON rechnung.rechnr = artikelsks.rechnr
WHERE rechnung.sks = 1 ";
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (artikelsks.bezeichn1 LIKE ? OR
artikelsks.bezeichn2 LIKE ? OR
rechnung.rechnr LIKE ? OR
DATE_FORMAT(rechnung.datetime, '%d.%m.%Y') LIKE ?)";
array_push($params, $tag, $tag, $tag, $tag);
}
}
$query .= " GROUP BY rechnung.rechnr ORDER BY rechnung.datetime DESC ";
$ret["all"] = $query;
$query .= " LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
$ret["limited"] = $query;
$ret["params"] = $params;
return $ret;
}
function createTermQry($page,$pagesize,$src,$combiner,$termtyp)
{
$query = "SELECT termin.id,termtyp.typ, termin.head, MIN(termtime) AS termtime, SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer, user, user2, user3, user4, done, partner_id, adresse_id, termin.id, str, ort, ortsteil, plz, hnr, adresse.vname as vname, adresse.nname as nname,
adresse.firma as firma,
user.vname as uservname, user.nname as usernname, user.color as color,
user2.vname as uservname2, user2.nname as usernname2,
user3.vname as uservname3, user3.nname as usernname3,
user4.vname as uservname4, user4.nname as usernname4,
firma, vname2, nname2
FROM termin
LEFT JOIN termtyp ON termin.typ = termtyp.id
LEFT JOIN adresse ON termin.adresse_id = adresse.id
LEFT JOIN partner ON adresse.partner_id = partner.id
LEFT JOIN strasse ON adresse.str_id = strasse.id
LEFT JOIN ort ON strasse.ort_id = ort.id
LEFT JOIN user ON termin.user = user.id
LEFT JOIN user AS user2 ON termin.user2 = user2.id
LEFT JOIN user AS user3 ON termin.user3 = user3.id
LEFT JOIN user AS user4 ON termin.user4 = user4.id
WHERE ";
if($termtyp == 1)
$query .= "termdauer != '24:00:00' AND termtime != '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
elseif($termtyp == 2)
$query .= "termdauer != '24:00:00' AND termtime = '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
elseif($termtyp == 3)
$query .= "termdauer != '24:00:00' AND done = 1 AND act_date < NOW()";
elseif($termtyp == 4)
$query .= "termdauer != '24:00:00' AND act_date > NOW()";
elseif($termtyp == 5)
$query .= "termdauer = '24:00:00'";
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (termin.head LIKE '$tag' OR
termin.text LIKE '$tag' OR
adresse.firma LIKE '$tag' OR
adresse.vname LIKE '$tag' OR
adresse.nname LIKE '$tag' OR
ort LIKE '$tag' OR
plz LIKE '$tag' OR
str LIKE '$tag' OR
DATE_FORMAT(termtime, '%d.%m.%Y %H:%i') LIKE '$tag')";
}
if($termtyp == 2)
$query .= " GROUP BY main_id ORDER BY ort ASC, termtime DESC";
elseif($termtyp != 5 && $termtyp != 3)
$query .= " GROUP BY main_id ORDER BY termtime ASC";
else
$query .= " GROUP BY main_id ORDER BY termtime DESC";
$ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
$ret["limited"] = $query;
return $ret;
}
function createZeitQry($page,$pagesize,$src,$combiner,$user)
{
$query = "SELECT zeiten.id,DATE_FORMAT(zeiten.kommen,'%d.%m.%y %H:%i') AS kommen, DATE_FORMAT(zeiten.gehen,'%d.%m.%y %H:%i') AS gehen, zeiten.pause_mins,
floor(TIME_TO_SEC(SUBTIME(TIMEDIFF(gehen,kommen),MAKETIME(FLOOR(pause_mins/60), pause_mins % 60, 0)))/60) AS dauer_mins, floor(TIME_TO_SEC(TIMEDIFF(kommen,STR_TO_DATE(CONCAT(DATE(kommen), ' ', MAKETIME(7,30,0)), '%Y-%m-%d %H:%i:%s')))/60) AS early_mins, user.weekhours*60/5 as sollDayMins
FROM zeiten
LEFT JOIN user ON zeiten.ma_id = user.id
WHERE user.id = '".$user."'";
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (DATE_FORMAT(zeiten.gehen,'%d.%m.%Y') LIKE '$tag' OR
DATE_FORMAT(zeiten.kommen,'%d.%m.%Y') LIKE '$tag')";
}
$query .= " ORDER BY zeiten.kommen DESC";
$ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
$ret["limited"] = $query;
//echo $query;
return $ret;
}
function createMsgQry($page,$pagesize,$src,$combiner,$user)
{
$query = "SELECT msg, rd, DATE_FORMAT(datetime,'%d.%m.%Y - %H:%i Uhr') AS datetime, send_id, send.vname AS sendvname, send.nname AS sendnname, rec_id, rec.vname AS recvname, rec.nname AS recnname
FROM message
LEFT JOIN user AS rec ON message.rec_id = rec.id
LEFT JOIN user AS send ON message.send_id = send.id
WHERE ";
$query .= "(rec_id = '".$_SESSION["user"]."' AND send_id = '".$user."') OR (rec_id = '".$user."' AND send_id = '".$_SESSION["user"]."')";
foreach($src AS $tag)
{
$tag = "%".$tag."%";
$query .= " $combiner (message.msg LIKE '$tag' OR
DATE_FORMAT(datetime, '%d.%m.%Y %H:%i') LIKE '$tag')";
}
$query .= " ORDER BY message.id ASC";
$ret["all"] = $query;
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
$ret["limited"] = $query;
return $ret;
}
function displayPages($pagesize,$currpage,$numentries,$refreshfunc,$ad_params = "")
{
echo "Seite: ";
if($currpage == 0)
echo " 1 ";
else
echo "<a href='#' onClick='".$refreshfunc."(0$ad_params)'> 1 </a>";
$i = 1;
while($numentries > $i*$pagesize)
{
$i++;
if($i<9 || $currpage == $i-1 || $currpage == $i-2 || $currpage == $i || $i*$pagesize > $numentries-$pagesize*2)
{
$gap=0;
if($currpage == $i-1)
echo " ".$i." ";
else
echo "<a href='#' class='noloading' onClick='".$refreshfunc."(".($i-1).$ad_params.")'> $i </a>";
}
else
{
if(!$gap)
echo " ..... ";
$gap = 1;
}
}
}
function displaySplitPages($pagesize,$firstcurrpage,$secondcurrpage,$pagesplitNr,$numentries,$refreshfunc,$ad_params = "")
{
if($pagesplitNr == 0)
$currpage=$firstcurrpage;
else
$currpage=$secondcurrpage;
echo "Seite: ";
if($currpage == 0)
echo " 1 ";
else
if($pagesplitNr == 0)
echo "<a href='#' onClick='".$refreshfunc."(0,".$secondcurrpage.$ad_params.")'> 1 </a>";
else
echo "<a href='#' onClick='".$refreshfunc."(".$firstcurrpage.",0".$ad_params.")'> 1 </a>";
$i = 1;
while($numentries > $i*$pagesize)
{
$i++;
if($i<9 || $currpage == $i-1 || $currpage == $i-2 || $currpage == $i || $i*$pagesize > $numentries-$pagesize*2)
{
$gap=0;
if($currpage == $i-1)
echo " ".$i." ";
else
if($pagesplitNr == 0)
echo "<a href='#' onClick='".$refreshfunc."(".($i-1).",$secondcurrpage".$ad_params.")'> $i </a>";
else
echo "<a href='#' onClick='".$refreshfunc."($firstcurrpage,".($i-1).$ad_params.")'> $i </a>";
}
else
{
if(!$gap)
echo " ..... ";
$gap = 1;
}
}
}
function displayList($header,$entries,$speciallines=array(),$colors=array())
{
echo "<table cellspacing='0'><tr>";
if($colors)
echo "<th></th>";
foreach($header AS $head)
{
echo "<th>$head</th>";
}
echo "</tr>";
$i = 0;
foreach($entries AS $entry)
{
if($i%2)
echo "<tr style='background-color: #f0f0f0;'>";
else
echo "<tr style='background-color: #e2e2e2;'>";
if(isset($colors[$i]))
echo "<td bgcolor='".$colors[$i]."' style='box-shadow: inset 0 0 0.7em #000; border: 1px solid black; border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em;'></td>";
foreach($entry AS $element)
{
echo "<td>$element</td>";
}
echo "</tr>";
$i++;
}
if($speciallines)
{
foreach($speciallines AS $entry)
{
$i++;
if($i%2)
echo "<tr bgcolor='#ffdddd'>";
else
echo "<tr bgcolor='#ffcccc'>";
foreach($entry AS $element)
{
echo "<td>$element</td>";
}
echo "</tr>";
}
}
echo "</table>";
}
function makenameline($adresse)
{
$ret = $adresse["vname"]." ".$adresse["nname"];
if($adresse["firma"])
$ret .= "<br /><i><u>".$adresse["firma"]."</u></i>";
return $ret;
}
function makeadressline($adresse)
{
$ret["ort"] = $adresse["plz"]." ".$adresse["ort"];
$ret["str"] = $adresse["str"]." ".$adresse["hnr"];
return $ret;
}
function maketelline($tel)
{
$ret="";
if(isset($tel["vwahl"]) && !stristr($tel["tel"], "-") && !stristr($tel["tel"], "/"))
$ret = $tel["vwahl"]."-";
$ret .= $tel["tel"];
return $ret;
}
?>