array("vname", "nname", "vname2", "nname2", "firma", "ort", "str", "plz", "partner.id"), "kdnr" => array("partner.id"), "name" => array("vname", "nname", "vname2", "nname2", "firma"), "str" => array("str"), "plz" => array("plz"), "ort" => array("ort"), "tel" => array("tel.nr"), "kont" => array("kontakt"), ); if(!isset($spalten[$fields])) return ""; $combiner = $combiner == "OR" ? "OR" : "AND"; $bedingung = ""; foreach($src AS $tag) { $teile = array(); foreach($spalten[$fields] as $spalte) { $teile[] = "$spalte LIKE ?"; $params[] = "%".$tag."%"; } $bedingung .= " $combiner (".implode(" OR ", $teile).")"; } return $bedingung; } /* * Kunden- bzw. Lieferantensuche, eine Zeile je Partner. $typ ist 1 fuer * Kunden, 2 fuer Lieferanten. Mit $full kommen auch veraltete Versionen * dazu; ihre Namen, Adressen und Telefonnummern stehen dann untereinander * in einer Zelle (siehe zeilenHtml()). * Rueckgabe: array("all" => sql, "limited" => sql mit LIMIT, "params" => Werte). */ function createPartQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1) { $joins = "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"; if(!$full) $query = "SELECT partner.id AS kdnr,firma,vname,nname,vname2,nname2,ort,plz,str,hnr, tel.nr AS tel $joins WHERE updated_by = 0 AND adresse.typ_id = 1 AND partner.typ_id = ?"; else $query = "SELECT partner.id AS kdnr,firma, GROUP_CONCAT(CONCAT(vname,' ',nname) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS nname, '' AS vname, GROUP_CONCAT(CONCAT(vname2,' ',nname2) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS nname2,'' AS vname2,'' AS ort, GROUP_CONCAT(CONCAT(plz,' ',ort) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS plz, GROUP_CONCAT(CONCAT(str,' ',hnr) ORDER BY adresse.id, tel.id SEPARATOR '\n') AS str,'' AS hnr, GROUP_CONCAT(tel.nr ORDER BY adresse.id, tel.id SEPARATOR '\n') AS tel $joins WHERE partner.typ_id = ?"; $params = array((int)$typ); $query .= partnerSuchbedingung($src, $combiner, $fields, $params); // Ohne feste Reihenfolge kann dieselbe Zeile beim Blaettern zweimal // oder gar nicht auftauchen $query .= " GROUP BY partner.id ORDER BY partner.id"; $ret["all"] = $query; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize; $ret["params"] = $params; return $ret; } /* * Adresssuche: wie createPartQry(), aber eine Zeile je Adresse statt je * Partner. Damit laesst sich fuer ein Dokument eine Nebenadresse auswaehlen. */ function createAdressQry($page,$pagesize,$src,$combiner,$fields,$full=0,$typ=1) { $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 ".($full ? "" : "updated_by = 0 AND ")."partner.typ_id = ?"; $params = array((int)$typ); $query .= partnerSuchbedingung($src, $combiner, $fields, $params); $query .= " GROUP BY adresse.id ORDER BY adresse.id"; $ret["all"] = $query; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize; $ret["params"] = $params; 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 '\n') 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 '\n') 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; } /* Projekte eines Kunden, Rueckgabe wie createKdnRechQry(). */ function createKdnProjectQry($page,$pagesize,$src,$combiner,$id) { $combiner = $combiner == "OR" ? "OR" : "AND"; $params = array($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 = ?"; foreach($src AS $tag) { $tag .= "%"; $query .= " $combiner (work.bezeichn LIKE ? OR project.name LIKE ? OR DATE_FORMAT(project.datetime, '%d.%m.%Y') LIKE ?)"; array_push($params, $tag, $tag, $tag); } $query .= " GROUP BY project.id ORDER BY project.datetime DESC "; $ret["all"] = $query; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize; $ret["params"] = $params; return $ret; } /* Kommissionsadressen (adresstyp 5) eines Kunden, Rueckgabe wie createKdnRechQry(). */ function createKommQry($page,$pagesize,$src,$combiner,$id) { $combiner = $combiner == "OR" ? "OR" : "AND"; $params = array($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 = ? AND adresse.typ_id = 5 "; foreach($src AS $tag) { $tag .= "%"; $query .= " $combiner (ort LIKE ? OR str LIKE ? OR nr LIKE ? OR vname LIKE ? OR nname LIKE ? OR vname2 LIKE ? OR nname2 LIKE ? OR firma LIKE ?)"; for($i = 0; $i < 8; $i++) $params[] = $tag; } $query .= " GROUP BY adresse.id ORDER BY adresse.id DESC "; $ret["all"] = $query; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize; $ret["params"] = $params; 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 '\n') 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 '\n') 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; } /* * Terminliste. $termtyp waehlt die Registerkarte: * 1 offene mit Datum, 2 offene ohne Datum, 3 erledigte, * 4 vorgemerkte (Wiedervorlage in der Zukunft), 5 ganztaegige. * Rueckgabe wie createKdnRechQry(). */ function createTermQry($page,$pagesize,$src,$combiner,$termtyp) { $combiner = $combiner == "OR" ? "OR" : "AND"; $params = array(); $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, main_id, str, ort, ortsteil, plz, hnr, adresse.vname AS vname, adresse.nname AS nname, 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 "; switch((int)$termtyp) { case 2: $query .= "termdauer != '24:00:00' AND termtime = '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()"; break; case 3: $query .= "termdauer != '24:00:00' AND done = 1 AND act_date < NOW()"; break; case 4: $query .= "termdauer != '24:00:00' AND act_date > NOW()"; break; case 5: $query .= "termdauer = '24:00:00'"; break; // 1 ist die uebliche Ansicht und faengt zugleich unbekannte Werte ab default: $query .= "termdauer != '24:00:00' AND termtime != '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()"; break; } foreach($src AS $tag) { $tag = "%".$tag."%"; $query .= " $combiner (termin.head LIKE ? OR termin.text LIKE ? OR adresse.firma LIKE ? OR adresse.vname LIKE ? OR adresse.nname LIKE ? OR ort LIKE ? OR plz LIKE ? OR str LIKE ? OR DATE_FORMAT(termtime, '%d.%m.%Y %H:%i') LIKE ?)"; for($i = 0; $i < 9; $i++) $params[] = $tag; } if((int)$termtyp == 2) $query .= " GROUP BY main_id ORDER BY ort ASC, termtime DESC"; elseif((int)$termtyp != 5 && (int)$termtyp != 3) $query .= " GROUP BY main_id ORDER BY termtime ASC"; else $query .= " GROUP BY main_id ORDER BY termtime DESC"; $ret["all"] = $query; $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize; $ret["params"] = $params; 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; } /* * Zahl der Treffer einer Suche. Die Abfragen aus create*Qry() gruppieren, * deshalb wird die ungekuerzte Abfrage ausgefuehrt und gezaehlt, statt mit * COUNT(*) zu arbeiten. */ function zaehleTreffer($dbconn, $queries) { $res = isset($queries["params"]) ? db_abfrage($dbconn, $queries["all"], $queries["params"]) : mysqli_query($dbconn, $queries["all"]); if(!$res) die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn))); return mysqli_num_rows($res); } /* * Mit \n verbundene Werte aus GROUP_CONCAT als escaptes HTML, eine Zeile * je Wert. Zusammengebaut wird erst hier, damit Daten aus der Datenbank * nicht als HTML durchschlagen. */ function zeilenHtml($text) { return implode("
", array_map("htmlspecialchars", explode("\n", (string)$text))); } function displayPages($pagesize,$currpage,$numentries,$refreshfunc,$ad_params = "") { echo "Seite: "; if($currpage == 0) echo " 1 "; else echo " 1 "; $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 " $i "; } 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 " 1 "; else echo " 1 "; $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 " $i "; else echo " $i "; } else { if(!$gap) echo " ..... "; $gap = 1; } } } function displayList($header,$entries,$speciallines=array(),$colors=array()) { echo ""; if($colors) echo ""; foreach($header AS $head) { echo ""; } echo ""; $i = 0; foreach($entries AS $entry) { if($i%2) echo ""; else echo ""; if(isset($colors[$i])) // die Farbe kommt aus der Benutzerverwaltung, nicht aus dem Code echo ""; foreach($entry AS $element) { echo ""; } echo ""; $i++; } if($speciallines) { foreach($speciallines AS $entry) { $i++; if($i%2) echo ""; else echo ""; foreach($entry AS $element) { echo ""; } echo ""; } } echo "
$head
$element
$element
"; } /* * Bausteine fuer die Trefferlisten. Sie liefern fertiges HTML und escapen * die Werte aus der Datenbank deshalb selbst. */ function makenameline($adresse) { $ret = zeilenHtml(trim($adresse["vname"]." ".$adresse["nname"])); if(!empty($adresse["firma"])) $ret .= "
".zeilenHtml($adresse["firma"]).""; return $ret; } function makeadressline($adresse) { $ret["ort"] = zeilenHtml(trim($adresse["plz"]." ".$adresse["ort"])); $ret["str"] = zeilenHtml(trim($adresse["str"]." ".$adresse["hnr"])); return $ret; } function maketelline($tel) { $nr = isset($tel["tel"]) ? (string)$tel["tel"] : ""; $ret = ""; if(!empty($tel["vwahl"]) && !str_contains($nr, "-") && !str_contains($nr, "/")) $ret = zeilenHtml($tel["vwahl"])."-"; $ret .= zeilenHtml($nr); return $ret; } ?>