From 490c4f12a4213b80b1ca306c8cc010542c5a83f3 Mon Sep 17 00:00:00 2001 From: Moirtz Wagner Date: Tue, 22 Sep 2026 00:04:38 +0200 Subject: [PATCH] Termine auf Prepared Statements umgebaut Kalender, Terminliste, Terminformular und Terminzettel laufen ueber db_abfrage() mit Platzhaltern; das Anlegen einer mehrtaegigen Terminreihe liegt in einer Transaktion. Die Logik steckt jetzt in incs/termin.php, sites/termin*.php rufen sie nur noch auf. Dabei behoben: - SQL-Injektion ueber die Suchbegriffe der Terminliste, ueber die Mehrfachauswahl (Ankreuzfelder del/erl gingen roh in DELETE bzw. UPDATE), ueber die Wiedervorlage-Tage (INTERVAL $folgedays DAY) und ueber ?action=terminshow&id=... in maketerminarray(), maketerminadresse(), maketelnrn() und makegooglestring() - gespeichertes XSS: Beschreibung, Notiz, Termintyp, Ort, Kundenname und Mitarbeiterfarbe im Kalender, in der Terminliste und im Formular - "or $err=error(...)" stand innerhalb des Abfrage-Strings, dadurch wurden die Nebenzeilen einer Terminreihe beim Loeschen nie entfernt - die Abfrage zum Folgetermin las eine Spalte typ_id, die es in termin nicht gibt; Typ und Wiedervorlage fehlten deshalb beim Bearbeiten - ein Folgetermin wurde mit termtime='' und termdauer='' angelegt, ein Termin ohne Folgetermin mit followed_by='' - im strikten Modus Fehler - ein Termin ohne Datum landete auf dem 01.01.1970 und gab dabei "NICHTTERMINIERT!!" mitten in die Seite aus - die Ueberschneidungspruefung verglich ab dem zweiten Tag gegen das Ende des ersten Tages - eine unbekannte Registerkarte der Terminliste ergab ein leeres WHERE und damit einen SQL-Fehler; jetzt gilt die Standardansicht - terminshow.php pruefte den Typ mit = statt == - der Kalender haengt nicht mehr an der Locale de_DE (strftime) Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 11 +- ajax/searchterm.php | 278 ++++++++---------- incs/listfuncs.php | 109 ++++--- incs/makepdf.php | 144 ++++----- incs/termin.php | 554 +++++++++++++++++++++++++++++++++++ sites/termin.php | 151 +--------- sites/terminadd.php | 483 +++++------------------------- sites/terminshow.php | 102 +++---- templates/addtermin.tpl | 6 +- templates/calendar.tpl | 30 +- templates/calendar_month.tpl | 64 ++-- templates/terminshow.tpl | 4 +- 12 files changed, 986 insertions(+), 950 deletions(-) create mode 100644 incs/termin.php diff --git a/CLAUDE.md b/CLAUDE.md index 3677b89..5bcf8a4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -98,12 +98,20 @@ Regeln für den Umbau: - **Suchabfragen** (`create*Qry()` in `incs/listfuncs.php`) liefern `array("all", "limited", "params")`. Aufrufer nutzen `db_abfrage($dbconn, $q["limited"], $q["params"])` und `zaehleTreffer()`. Die Suchbegriffe sind Platzhalterwerte, `%` und `_` darin bleiben absichtlich Jokerzeichen — so ist die Suche dokumentiert. In der Autovervollständigung (`ajax/auto/`) werden sie dagegen über `db_like_praefix()` entwertet. - **Werte aus der Datenbank sind kein HTML.** `GROUP_CONCAT` trennt mit einem Zeilenumbruch; zusammengebaut und escaped wird erst in `zeilenHtml()` bzw. `makenameline()`/`makeadressline()`/`maketelline()`. -Umgebaut: Login/Passkeys, Benutzereinstellungen, Änderungsprotokoll, Rechnungsmodul (`incs/rechnung.php`, `sites/rechnungadd.php`, `sites/umschlagshow.php`, `ajax/autosave.php`, `ajax/preview.php`, Rechnungssuche), Kunden und Lieferanten (`incs/saveNchange.php` samt `sites/kunden*.php`, `sites/liefer*.php`, Kunden-, Lieferanten-, Adress- und Kommissionssuche, `ajax/auto/`). Offen: Termine, Projekte, Zeiten, Benutzerverwaltung, `incs/makepdf.php`, `update/`. +Umgebaut: Login/Passkeys, Benutzereinstellungen, Änderungsprotokoll, Rechnungsmodul (`incs/rechnung.php`, `sites/rechnungadd.php`, `sites/umschlagshow.php`, `ajax/autosave.php`, `ajax/preview.php`, Rechnungssuche), Kunden und Lieferanten (`incs/saveNchange.php` samt `sites/kunden*.php`, `sites/liefer*.php`, Kunden-, Lieferanten-, Adress- und Kommissionssuche, `ajax/auto/`), Termine (`incs/termin.php` samt `sites/termin*.php`, Terminliste, Terminzettel). Offen: Projekte, Zeiten, Benutzerverwaltung, der Rest von `incs/makepdf.php`, `update/`. Prozedurales `mysqli`. `$dbconn` wird zusätzlich in `$_SESSION["dbconn"]` abgelegt, damit `incs/mysql_ecape_wrapper.php` eine globale Funktion `mysql_escape_string()` als Shim über diese Verbindung bereitstellen kann — ein Überbleibsel der `mysql_*`-Ära, das in altem Code noch aufgerufen wird. SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über `mysqli_real_escape_string($dbconn, …)` und muss bei jeder Änderung mitgedacht werden. +## Termine + +Ein Termin über mehrere Tage ist eine **Reihe einzelner Zeilen** in `termin`, die alle dieselbe `main_id` tragen — die id der ersten Zeile. Der Kalender zeigt die Zeilen einzeln, die Terminliste fasst sie über `main_id` zusammen. Wird ein Termin auf mehrere Tage verlängert, wird die alte Reihe verworfen und neu angelegt; er bekommt dabei eine neue id. + +Urlaub und Krankheit sind Termine ohne Kundenadresse. Ihre Typ-ids sind fest verdrahtet — `TERMTYP_URLAUB` = 0 und `TERMTYP_KRANKHEIT` = 5 in `incs/termin.php`; `incs/users.php` rechnet den Urlaubsanspruch über `typ = 0` aus und `templates/addtermin.tpl` blendet danach die Felder um. `termtyp` muss also eine Zeile mit der id 0 enthalten; beim Kopieren einer Datenbank braucht es dafür `NO_AUTO_VALUE_ON_ZERO`, sonst macht MariaDB eine 1 daraus. + +Ganztägige Termine haben die Dauer `24:00:00` — die Terminliste unterscheidet die Registerkarten daran. + ## Fallstricke - **`smarty/` enthält Smarty 4.5.6** — der schlichte Verzeichnisname sagt nichts über die Version. @@ -111,6 +119,7 @@ SQL wird durchgehend per String-Verkettung gebaut. Escaping ist Handarbeit über - **PDF-Schriften nur über `PDF_SCHRIFT_SERIF` / `PDF_SCHRIFT_SANS`** (oben in `incs/makepdf.php`, FreeSerif/FreeSans). Die eingebauten PDF-Schriften Times/Helvetica können nur westeuropäische Zeichen; aus ř, ł, č würde ein „?“. - **`incs/font/` gehört zu pChart, nicht zu TCPDF.** Die TTFs dort werden von `stats.php` für die Diagramme geladen; TCPDF bringt seine Schriften in `incs/tcpdf/fonts/` selbst mit. - **`index.php` setzt `error_reporting(E_ERROR | E_PARSE)`.** Warnungen und Notices sind unterdrückt, und der Code verlässt sich darauf — nicht ohne Not hochdrehen, sonst überflutet es die Ausgabe. +- **`templates/calendar_month.tpl` ist tot.** Kein Code bindet es ein, und unter PHP 8 läuft es in einen Fehler (`{$prevtermin = ""}` und danach `{$prevtermin.termtime}`). - **`templates_c/`, `ajax/templates_c/` und `temp/` müssen für den Webserver schreibbar sein.** Sie sind git-ignoriert und nur über `.gitkeep` im Repo vorhanden. - **`uploads_*/{notes,signs}` enthalten personenbezogene Kundendaten** (Rechnungen, Scans, Unterschriften) und sind bewusst git-ignoriert. Nie committen. - Zeilenenden werden über `.gitattributes` auf LF normalisiert. diff --git a/ajax/searchterm.php b/ajax/searchterm.php index 5f3ebe2..9450403 100644 --- a/ajax/searchterm.php +++ b/ajax/searchterm.php @@ -1,166 +1,132 @@ - 23) { - $combiner = "AND"; + $zeitpunkt = date("d.m.Y", strtotime($termtime)); + if($stunden / 24 > 1) + $zeitpunkt .= " - ".date("d.m", strtotime("+".(($stunden / 24) - 1)." day", strtotime($termtime))); } - $page = $_GET["page"]; - $termtyp = $_GET["termtyp"]; + else + $zeitpunkt = date("d.m.Y H:i ", strtotime($termtime))."Uhr"; + + $dauer = ""; + if($stunden > 23) + $dauer = ($stunden / 24)." Tag".($stunden / 24 > 1 ? "e" : ""); + elseif($stunden > 0) + $dauer = $stunden." Std"; + if($stunden <= 23 && $stunden > 0 && $minuten > 0) + $dauer .= " - "; + if($stunden <= 23 && $minuten > 0) + $dauer .= $minuten." Min"; + return array($zeitpunkt, $dauer); +} + +if(!$err) +{ + // kommt per encodeURIComponent bereits als UTF-8 + $fulltag = isset($_GET["search"]) && is_string($_GET["search"]) ? $_GET["search"] : ""; + $link = isset($_GET["link"]) && is_string($_GET["link"]) ? $_GET["link"] : ""; + $page = isset($_GET["page"]) ? (int)$_GET["page"] : 0; + $termtyp = isset($_GET["termtyp"]) ? (int)$_GET["termtyp"] : 1; $_SESSION["termtyp"] = $termtyp; + + $src = explode(" ", $fulltag); + $combiner = $link == "OR" ? "OR" : "AND"; + $listlines = array(); + $colors = array(); + $queries = createTermQry($page,$pagesize,$src,$combiner,$termtyp); - $qry = mysqli_query($dbconn,$queries["all"]) - or die("Datenbank fehler: ".mysqli_error($dbconn)); - $numres = mysqli_num_rows($qry); + $numres = zaehleTreffer($dbconn, $queries); if($numres) { - $qry = mysqli_query($dbconn,$queries["limited"]) - or die("Datenbank fehler: ".mysqli_error($dbconn)); + $qry = db_abfrage($dbconn,$queries["limited"],$queries["params"]) + or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn))); $counter = 0; while($res=mysqli_fetch_assoc($qry)) { - $counter = $counter+1; - $termdauer = ""; - $termtime =""; - $telqry = mysqli_query($dbconn,"SELECT GROUP_CONCAT(nr SEPARATOR ', ') AS nr from tel WHERE partner_id = '".$res["partner_id"]."' AND RIGHT(nr,1) <> '-' GROUP BY partner_id")or $err=error("Fehler beim Listen der Termine
".mysqli_error($dbconn)); - $telres=mysqli_fetch_assoc($telqry); - //Normale Termine anzeigen - if($res) + $counter++; + $id = (int)$res["id"]; + $kopf = htmlspecialchars((string)$res["head"]); + + $actions = ""; + $actions .= ""; + $actions .= ""; + $actions .= ""; + if(!$res["done"]) + $actions .= ""; + else + $actions .= ""; + + list($termtime, $termdauer) = terminZeitraum($res["termtime"], $res["termdauer"]); + + $adresse = "".htmlspecialchars($res["plz"]." ".$res["ort"]); + if($res["ortsteil"]) + $adresse .= "-".htmlspecialchars((string)$res["ortsteil"]); + $adresse .= "
".htmlspecialchars($res["str"]." ".$res["hnr"]); + // Nummern ohne Durchwahl-Bindestrich am Ende + $nummern = db_wert($dbconn, "SELECT GROUP_CONCAT(nr ORDER BY id SEPARATOR ', ') FROM tel + WHERE partner_id = ? AND RIGHT(nr,1) != '-'", array($res["partner_id"])); + if($nummern) { - $actions = ""; - $actions .= ""; - $actions .= ""; - $actions .= ""; - if(!$res["done"]) - $actions .= ""; - else - $actions .= ""; - $split_termdauer = explode(":",$res["termdauer"]); - - if($res["termtime"] == "0000-00-00 00:00:00") - $termtime = "N/A"; - else if($split_termdauer[0] > 23) - { - if($split_termdauer[0]/24 > 1) - { - $termtime = date("d.m.Y - ",strtotime($res["termtime"])); - $termtime .= date("d.m",strtotime("+".(($split_termdauer[0]/24)-1)." day",strtotime($res["termtime"]))); - } - else - { - $termtime = date("d.m.Y",strtotime($res["termtime"])); - } - } - else - $termtime = date("d.m.Y H:i ",strtotime($res["termtime"]))."Uhr"; - - if($split_termdauer[0] > 23) - { - if($split_termdauer[0]/24 > 1) - $termdauer = ($split_termdauer[0]/24)." Tage"; - else - $termdauer = ($split_termdauer[0]/24)." Tag"; - } - else if($split_termdauer[0] > 0) - $termdauer = ltrim(substr($res["termdauer"],0,2),"0")." Std"; - if($split_termdauer[0] > 0 && $split_termdauer[1] > 0) - $termdauer .= " - "; - if($split_termdauer[1] > 0) - $termdauer .= ltrim(substr($res["termdauer"],3,2),"0")." Min"; - - $adresse = "".$res["plz"]." ".$res["ort"]; - if($res["ortsteil"]) - $adresse .= "-".$res["ortsteil"]; - $adresse .= "
".$res["str"]." ".$res["hnr"]; - if(isset($telres)){ - if($res["vname"]) - $adresse .= "
Tel: ".$telres["nr"]."
(".$res["vname"]." ".$res["nname"].")"; - else if($res["nname"]) - $adresse .= "
Tel: ".$telres["nr"]."
(".$res["nname"].")"; - else if($res["firma"]) - $adresse .= "
Tel: ".$telres["nr"]."
(".$res["firma"].")"; - else - $adresse .= "
Tel: ".$telres["nr"]; - } - $namelist = $res["uservname"]." ".substr($res["usernname"],0,1); - if($res["user2"]) - $namelist .= ", ".$res["uservname2"]." ".substr($res["usernname2"],0,1); - if($res["user3"]) - $namelist .= ", ".$res["uservname3"]." ".substr($res["usernname3"],0,1); - if($res["user4"]) - $namelist .= ", ".$res["uservname4"]." ".substr($res["usernname4"],0,1); - if($termtyp == 1){ - $checkbox = ""; - - $listlines[] = array("".$res["typ"]."
".$namelist, - "".$res["head"]."", - $termtime, - $termdauer, - $adresse, - $actions, - $checkbox - ); - } - else if($termtyp == 3){ - $checkbox = ""; - - $listlines[] = array("".$res["typ"]."
".$namelist, - "".$res["head"]."", - $termtime, - $termdauer, - $adresse, - $actions, - $checkbox - ); - } - else{ - $listlines[] = array("".$res["typ"]."
".$namelist, - "".$res["head"]."", - $termtime, - $termdauer, - $adresse, - $actions - ); - } - if($res["user2"] || $res["user3"] || $res["user4"]) - $colors[] = "#fff"; - else if($res["color"]) - $colors[] = $res["color"]; - else - $colors[] = "#fff"; - + $adresse .= "
Tel: ".htmlspecialchars($nummern); + if($res["vname"] || $res["nname"]) + $adresse .= "
(".htmlspecialchars(trim($res["vname"]." ".$res["nname"])).")"; + elseif($res["firma"]) + $adresse .= "
(".htmlspecialchars((string)$res["firma"]).")"; } + + $namelist = htmlspecialchars($res["uservname"]." ".substr((string)$res["usernname"], 0, 1)); + foreach(array(2, 3, 4) as $n) + if($res["user".$n]) + $namelist .= ", ".htmlspecialchars($res["uservname".$n]." ".substr((string)$res["usernname".$n], 0, 1)); + + $zeile = array("".htmlspecialchars((string)$res["typ"])."
".$namelist, + "".$kopf."", + $termtime, + $termdauer, + $adresse, + $actions); + // Registerkarte 1 hakt ab, Registerkarte 3 löscht - beides mehrfach + if($termtyp == 1 || $termtyp == 3) + { + $feld = $termtyp == 1 ? "erl" : "del"; + $zeile[] = ""; + } + $listlines[] = $zeile; + + if($res["user2"] || $res["user3"] || $res["user4"] || !$res["color"]) + $colors[] = "#fff"; + else + $colors[] = $res["color"]; } - if($termtyp == 1){ - $headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen","  Erledigt "); - } - else if($termtyp == 3){ - $headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen","  Löschen "); - } - else{ - $headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen"); - } + + $headings = array("Typ","Beschreibung","Datum","Dauer","Ort","Aktionen"); + if($termtyp == 1) + $headings[] = "  Erledigt "; + elseif($termtyp == 3) + $headings[] = "  Löschen "; + $lastdisplay = ($page+1)*$pagesize; if($numres < $lastdisplay) $lastdisplay = $numres; @@ -168,27 +134,23 @@ if(!isset($err)) ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab ".$numres." Ergebnisse.
Ergebnis ".($page*$pagesize+1)." bis ".$lastdisplay); else ok($numres." Termine sind insgesamt gespeichert."); - - displayPages($pagesize,$page,$numres,"ajax_searchterm",",$termtyp"); - if($termtyp == 1){ - echo "
"; - } - else if($termtyp == 3){ - echo ""; - } - displayList($headings,$listlines,Array(),$colors); - if($termtyp == 1 || $termtyp == 3){ - echo "

"; - } - displayPages($pagesize,$page,$numres,"ajax_searchterm",",$termtyp"); - + + displayPages($pagesize,$page,$numres,"ajax_searchterm",",".$termtyp); + if($termtyp == 1) + echo "
"; + elseif($termtyp == 3) + echo ""; + displayList($headings,$listlines,array(),$colors); + if($termtyp == 1 || $termtyp == 3) + echo "

"; + displayPages($pagesize,$page,$numres,"ajax_searchterm",",".$termtyp); } - else + else { if($fulltag) ok("Die Suche nach ".htmlspecialchars($fulltag)." ergab keine Ergebnisse."); - else + else ok("Keine Einträge."); } } -?> \ No newline at end of file +?> diff --git a/incs/listfuncs.php b/incs/listfuncs.php index 4b065f3..5bc0a17 100644 --- a/incs/listfuncs.php +++ b/incs/listfuncs.php @@ -285,60 +285,80 @@ function createRechQry($page,$pagesize,$src,$combiner,$sks=0) +/* + * 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) { - - $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'"; + $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 '$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')"; + $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($termtyp == 2) + if((int)$termtyp == 2) $query .= " GROUP BY main_id ORDER BY ort ASC, termtime DESC"; - elseif($termtyp != 5 && $termtyp != 3) + 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; - $query .= " LIMIT ".$page*$pagesize.", $pagesize"; - $ret["limited"] = $query; + $ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize; + $ret["params"] = $params; return $ret; } @@ -502,7 +522,8 @@ function displayList($header,$entries,$speciallines=array(),$colors=array()) echo ""; if(isset($colors[$i])) - echo ""; + // die Farbe kommt aus der Benutzerverwaltung, nicht aus dem Code + echo ""; foreach($entry AS $element) { diff --git a/incs/makepdf.php b/incs/makepdf.php index e33b859..9f5fd5d 100644 --- a/incs/makepdf.php +++ b/incs/makepdf.php @@ -1,5 +1,6 @@ ".mysqli_error($dbconn)); - $res = mysqli_fetch_assoc($qry); - - $qry = mysqli_query($dbconn,"SELECT anrede - FROM anrede - WHERE id = '".$res["anrede_id"]."'") or $err = error("Fehler beim ermitteln der Anrede
".mysqli_error($dbconn)); - $res2 = mysqli_fetch_assoc($qry); - $res["anrede"] = $res2["anrede"]; - - $qry = mysqli_query($dbconn,"SELECT anrede - FROM anrede - WHERE id = '".$res["anrede2_id"]."'") or $err = error("Fehler beim ermitteln der Anrede2
".mysqli_error($dbconn)); - $res2 = mysqli_fetch_assoc($qry); - $res["anrede2"] = $res2["anrede"]; - - $qry = mysqli_query($dbconn,"SELECT titel - FROM titel - WHERE id = '".$res["titel_id"]."'") or $err = error("Fehler beim ermitteln des Titels
".mysqli_error($dbconn)); - $res2 = mysqli_fetch_assoc($qry); - $res["titel"] = $res2["titel"]; - - $qry = mysqli_query($dbconn,"SELECT titel - FROM titel - WHERE id = '".$res["titel2_id"]."'") or $err = error("Fehler beim ermitteln des Titel2
".mysqli_error($dbconn)); - $res2 = mysqli_fetch_assoc($qry); - $res["titel2"] = $res2["titel"]; - + WHERE termin.id = ?", array($id)); + if(!$res) + { + error("Fehler beim ermitteln der Termindaten
".mysqli_error($dbconn)); + return array(); + } + $anrs = db_zuordnung($dbconn, "SELECT id, anrede FROM anrede") ?: array(); + $titels = db_zuordnung($dbconn, "SELECT id, titel FROM titel") ?: array(); + $res["anrede"] = $anrs[$res["anrede_id"]] ?? ""; + $res["anrede2"] = $anrs[$res["anrede2_id"]] ?? ""; + $res["titel"] = $titels[$res["titel_id"]] ?? ""; + $res["titel2"] = $titels[$res["titel2_id"]] ?? ""; return $res; } function maketerminadresse($dbconn,$termid) { - $qry=mysqli_query($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id, partner_id, adresse_id - FROM termin - JOIN adresse ON termin.adresse_id = adresse.id - JOIN strasse ON strasse.id = str_id + $adresse = db_zeile($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id, partner_id, adresse_id + FROM termin + JOIN adresse ON termin.adresse_id = adresse.id + JOIN strasse ON strasse.id = str_id JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_id - WHERE termin.id = $termid") or $err= error("Fehler beim ermitteln der Adressdaten
".mysqli_error($dbconn)); - - - $adresse = mysqli_fetch_assoc($qry); - - $qry = mysqli_query($dbconn,"SELECT * FROM anrede"); - while($res=mysqli_fetch_assoc($qry)) + WHERE termin.id = ?", array($termid)); + if(!$adresse) { - $anrs[$res["id"]] = $res["anrede"]; + error("Fehler beim ermitteln der Adressdaten
".mysqli_error($dbconn)); + $adresse = array(); } - - $qry = mysqli_query($dbconn,"SELECT * FROM titel"); - while($res=mysqli_fetch_assoc($qry)) - { - $titels[$res["id"]] = $res["titel"]; - } - -define("ADRFIELD_FIRMAANR", 0); -define("ADRFIELD_FIRMA", 1); -define("ADRFIELD_ANR1", 2); -define("ADRFIELD_TITEL1", 3); -define("ADRFIELD_NAME1", 4); -define("ADRFIELD_ANR2", 5); -define("ADRFIELD_TITEL2", 6); -define("ADRFIELD_NAME2", 7); -define("ADRFIELD_STR", 8); -define("ADRFIELD_ORT", 9); -define("ADRFIELD_LAND", 10); + // ADRFIELD_* stehen in incs/constants.php + $anrs = db_zuordnung($dbconn, "SELECT id, anrede FROM anrede") ?: array(); + $titels = db_zuordnung($dbconn, "SELECT id, titel FROM titel") ?: array(); $adressfields = ""; if($adresse["firma"]) @@ -1800,50 +1768,52 @@ define("ADRFIELD_LAND", 10); function maketelnrn($dbconn,$termid) { - $qry=mysqli_query($dbconn,"SELECT partner_id, adresse_id - FROM termin + $telstr = ""; + $adresse = db_zeile($dbconn,"SELECT partner_id, adresse_id + FROM termin JOIN adresse ON termin.adresse_id = adresse.id - WHERE termin.id = $termid") or $err= error("Fehler beim ermitteln der Adressdaten
".mysqli_error($dbconn)); - - - if($adresse = mysqli_fetch_assoc($qry)) + WHERE termin.id = ?", array($termid)); + if($adresse) { - $qry = mysqli_query($dbconn,"SELECT name,typ,tel.id,nr,ort,ortsteil,plz,vwahl FROM tel LEFT JOIN teltyp ON typ_id = teltyp.id LEFT JOIN ort ON ort_id = ort.id WHERE partner_id='".$adresse["partner_id"]."' AND (tel.adresse_id = 0 OR tel.adresse_id = '".$adresse["adresse_id"]."') ORDER BY typ_id ASC"); - while($res=mysqli_fetch_assoc($qry)) - { - $telstr .= trim($res["typ"]).": "." (".$res["vwahl"].") ".$res["nr"]." in ".$res["ort"]."(".$res["name"].")\n"; - } - $qry = mysqli_query($dbconn,"SELECT kontakt,typ FROM kontakt LEFT JOIN kontakttyp ON typ_id = kontakttyp.id WHERE partner_id='".$adresse["partner_id"]."' ORDER BY typ_id ASC"); - while($res=mysqli_fetch_assoc($qry)) - { - $telstr .= trim($res["typ"]).": ".$res["kontakt"]."\n"; - } + $zeilen = db_zeilen($dbconn,"SELECT name, typ, tel.id, nr, ort, ortsteil, plz, vwahl FROM tel + LEFT JOIN teltyp ON tel.typ_id = teltyp.id + LEFT JOIN ort ON tel.ort_id = ort.id + WHERE partner_id = ? AND (tel.adresse_id = 0 OR tel.adresse_id = ?) + ORDER BY tel.typ_id ASC", array($adresse["partner_id"], $adresse["adresse_id"])); + foreach((array)$zeilen as $res) + $telstr .= trim($res["typ"]).": "." (".$res["vwahl"].") ".$res["nr"]." in ".$res["ort"]."(".$res["name"].")\\n"; + $zeilen = db_zeilen($dbconn,"SELECT kontakt, typ FROM kontakt + LEFT JOIN kontakttyp ON kontakt.typ_id = kontakttyp.id + WHERE partner_id = ? ORDER BY kontakt.typ_id ASC", array($adresse["partner_id"])); + foreach((array)$zeilen as $res) + $telstr .= trim($res["typ"]).": ".$res["kontakt"]."\\n"; } return $telstr; } function makeadrtelnrn($dbconn,$partnerid) { - $qry = mysqli_query($dbconn,"SELECT name,typ,tel.id,nr,ort,ortsteil,plz,vwahl FROM tel LEFT JOIN teltyp ON typ_id = teltyp.id LEFT JOIN ort ON ort_id = ort.id WHERE partner_id='".$partnerid."' ORDER BY typ_id ASC"); - while($res=mysqli_fetch_assoc($qry)) - { - $telstr .= trim($res["typ"]).": "."(".$res["vwahl"].")".$res["nr"].",".$res["ort"]."(".$res["name"].")\n"; - } + $telstr = ""; + $zeilen = db_zeilen($dbconn,"SELECT name, typ, tel.id, nr, ort, ortsteil, plz, vwahl FROM tel + LEFT JOIN teltyp ON tel.typ_id = teltyp.id + LEFT JOIN ort ON tel.ort_id = ort.id + WHERE partner_id = ? ORDER BY tel.typ_id ASC", array($partnerid)); + foreach((array)$zeilen as $res) + $telstr .= trim($res["typ"]).": "."(".$res["vwahl"].")".$res["nr"].",".$res["ort"]."(".$res["name"].")\\n"; return $telstr; } function makegooglestring($dbconn,$termid) { - $qry=mysqli_query($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id - FROM termin - JOIN adresse ON termin.adresse_id = adresse.id - JOIN strasse ON strasse.id = str_id + $googlestr = ""; + $adresse = db_zeile($dbconn,"SELECT nname, titel_id, titel2_id, vname, nname2, vname2, str, ort, plz, hnr, land, firma, anrede_id, anrede2_id + FROM termin + JOIN adresse ON termin.adresse_id = adresse.id + JOIN strasse ON strasse.id = str_id JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_id - WHERE termin.id = $termid") or $err= error("Fehler beim ermitteln der Adressdaten
".mysqli_error($dbconn)); - - - if($adresse = mysqli_fetch_assoc($qry)) + WHERE termin.id = ?", array($termid)); + if($adresse) { $googlestr = "http://maps.googleapis.com/maps/api/staticmap"; $googlestr .= "?markers=color:blue|label:A|"; diff --git a/incs/termin.php b/incs/termin.php new file mode 100644 index 0000000..fbf576c --- /dev/null +++ b/incs/termin.php @@ -0,0 +1,554 @@ + formularText("head"), + "text" => formularText("text"), + "typ" => formularGanzzahl("typ"), + "done" => formularGanzzahl("done") ? 1 : 0, + "user" => formularGanzzahl("user"), + "user2" => formularGanzzahl("user2"), + "user3" => formularGanzzahl("user3"), + "user4" => formularGanzzahl("user4"), + "folge" => formularGanzzahl("folge") ? 1 : 0, + "folgetyp" => formularGanzzahl("folgetyp"), + "folgedays" => formularGanzzahl("folgedays"), + "start" => dispdate_to_mysql_date(formularText("datetime_start"), 0), + "ende" => dispdate_to_mysql_date(formularText("datetime_end"), 1), + ); +} + +/* + * Verteilt einen Termin auf Tage. Länger als zwölf Stunden oder Urlaub und + * Krankheit werden zu ganzen Tagen: Rückgabe ist + * array(erster Tag, Dauer je Tag, Anzahl Tage). + */ +function terminTageUndDauer($werte) +{ + $start = $werte["start"]; + $dauer = mysql_dauer($start, $werte["ende"]); + $stunden = (int)strtok($dauer, ":"); + if($stunden <= 12 && !terminIstGanztaegig($werte["typ"])) + return array($start, $dauer, 1); + + // ceil() rechnet mit der Stundenzahl, nicht mit dem ganzen Zeitstring + $tage = max(1, (int)ceil($stunden / 24)); + if($start != TERMIN_KEIN_DATUM) + $start = substr($start, 0, 11)."00:00:00"; + return array($start, TERMIN_GANZTAG, $tage); +} + +/* Der $i-te Tag einer Terminreihe, ohne Datum bleibt es ohne Datum */ +function terminTag($start, $i) +{ + if($start == TERMIN_KEIN_DATUM) + return TERMIN_KEIN_DATUM; + return date("Y-m-d H:i:s", strtotime("+".$i." day", strtotime($start))); +} + +/* --------------------------------------------------------------------- + * Überschneidungen + * ------------------------------------------------------------------ */ + +/* + * Sucht einen Termin, bei dem $benutzer schon zwischen $start und $ende + * eingetragen ist. $ausserMain schließt die gerade bearbeitete Reihe aus. + * Gibt die id des kollidierenden Termins zurück, sonst null (false bei + * Fehlern). + */ +function terminUeberschneidung($dbconn, $benutzer, $start, $ende, $ausserMain) +{ + if(!$benutzer || $start == TERMIN_KEIN_DATUM) + return null; + $params = array(TERMIN_KEIN_DATUM, $benutzer, $benutzer, $benutzer, $benutzer); + // eine main_id von 0 gibt es nur bei Altdaten, dann darf nichts ausgenommen werden + $eigene = ""; + if($ausserMain > 0) + { + $eigene = " AND main_id != ?"; + $params[] = (int)$ausserMain; + } + array_push($params, $start, $start, $ende, $ende, $start, $ende); + $sql = "SELECT id FROM + (SELECT id, main_id, user, user2, user3, user4, termtime, + DATE_ADD(termtime, INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE) AS termend + FROM termin WHERE termtime != ? AND done = 0) AS belegt + WHERE (user = ? OR user2 = ? OR user3 = ? OR user4 = ?)$eigene + AND ((? >= termtime AND ? < termend) + OR (? > termtime AND ? <= termend) + OR (? <= termtime AND ? >= termend)) + LIMIT 1"; + return db_wert($dbconn, $sql, $params); +} + +/* + * Prüft alle vier Mitarbeiter eines Termins für jeden Tag der Reihe. + * Rückgabe 0, wenn nichts kollidiert, sonst die Fehlermeldung. + */ +function pruefeUeberschneidungen($dbconn, $werte, $start, $dauer, $tage, $ausserMain) +{ + foreach(range(0, $tage - 1) as $i) + { + $tagStart = terminTag($start, $i); + $tagEnde = dauer_to_date($tagStart, $dauer); + foreach(array("user", "user2", "user3", "user4") as $feld) + { + $treffer = terminUeberschneidung($dbconn, $werte[$feld], $tagStart, $tagEnde, $ausserMain); + if($treffer === false) + return error("Fehler beim überprüfen von Überlappungen:
".mysqli_error($dbconn)); + if($treffer !== null) + return error("Dieser Mitarbeiter hat zu der Zeit bereits einen Termin, er kann nicht an zwei Orten gleichzeitig sein."); + } + } + return 0; +} + +/* --------------------------------------------------------------------- + * Speichern + * ------------------------------------------------------------------ */ + +/* + * Legt einen Folgetermin an: gleicher Kopf und dieselben Mitarbeiter, aber + * ohne Datum und mit einem Wiedervorlagedatum in $tage Tagen. Gibt dessen + * id zurück oder false. + */ +function legeFolgeterminAn($dbconn, $werte, $adressid) +{ + $sql = "INSERT INTO termin SET head = ?, text = '', adresse_id = ?, typ = ?, + changetime = NOW(), datetime = NOW(), done = 0, + termtime = ?, termdauer = ?, followed_by = 0, + user = ?, user2 = ?, user3 = ?, user4 = ?, changeuser = ?, + act_date = DATE_ADD(CURDATE(), INTERVAL ? DAY)"; + $params = array($werte["head"], $adressid, $werte["folgetyp"], + TERMIN_KEIN_DATUM, TERMIN_KEINE_DAUER, + $werte["user"], $werte["user2"], $werte["user3"], $werte["user4"], + $_SESSION["user"], $werte["folgedays"]); + if(!db_abfrage($dbconn, $sql, $params)) + { + error("Fehler beim anlegen des Folgetermins:
".mysqli_error($dbconn)); + return false; + } + $id = mysqli_insert_id($dbconn); + // Ein Termin ohne eigene Reihe ist sein eigener Hauptsatz + db_abfrage($dbconn, "UPDATE termin SET main_id = ? WHERE id = ?", array($id, $id)); + if(saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [folgetermin, hat ID $id]", + "DELETE FROM termin WHERE id = $id", "anlegen")) + return false; + return $id; +} + +/* + * Legt einen Termin an oder ändert ihn. $terminid ist die id der Reihe + * (0 = neu), $adressid die Kundenadresse (0 bei Urlaub und Krankheit). + * + * Wird aus einem eintägigen Termin ein mehrtägiger, wird die alte Reihe + * verworfen und neu angelegt - anders lässt sich die Reihe nicht umbauen. + */ +function speichereTermin($dbconn, $terminid, $adressid) +{ + $werte = terminFormularwerte(); + list($start, $dauer, $tage) = terminTageUndDauer($werte); + + beginneSpeichern($dbconn); + + $neuAnlegen = !$terminid; + if($terminid && $tage > 1) + { + // aus einem Einzeltermin wird eine Reihe: alte Zeilen verwerfen + $err = loescheTerminreihe($dbconn, $terminid); + if($err) + return beendeSpeichern($dbconn, $err); + $neuAnlegen = true; + $terminid = 0; + } + elseif($terminid) + { + // Zeilen der bisherigen Reihe bis auf die erste entfernen + $sql = "DELETE FROM termin WHERE main_id = ? AND id != ?"; + db_abfrage($dbconn, $sql, array($terminid, $terminid)) + or $err = error("Konnte Nebentermine nicht löschen:
".mysqli_error($dbconn)); + if(!empty($err)) + return beendeSpeichern($dbconn, $err); + } + + if(!$werte["done"]) + { + $err = pruefeUeberschneidungen($dbconn, $werte, $start, $dauer, $tage, $terminid); + if($err) + return beendeSpeichern($dbconn, $err); + } + + $alt = null; + if(!$neuAnlegen) + { + $alt = db_zeile($dbconn, "SELECT * FROM termin WHERE id = ?", array($terminid)); + if($alt === false) + return beendeSpeichern($dbconn, error("Fehler beim ermitteln des Termins:
".mysqli_error($dbconn))); + if(!$alt) + return beendeSpeichern($dbconn, error("Dieser Termin existiert nicht!")); + } + + // Folgetermin nur einmal und nur, wenn der Termin gerade erledigt wird + $folgeId = $alt ? (int)$alt["followed_by"] : 0; + if($werte["done"] && $werte["folge"] && !$folgeId) + { + $folgeId = legeFolgeterminAn($dbconn, $werte, $adressid); + if($folgeId === false) + return beendeSpeichern($dbconn, 1); + } + + $felder = array( + "head" => $werte["head"], + "text" => $werte["text"], + "adresse_id" => $adressid, + "typ" => $werte["typ"], + "done" => $werte["done"], + "termdauer" => $dauer, + "changeuser" => $_SESSION["user"], + "user" => $werte["user"], + "user2" => $werte["user2"], + "user3" => $werte["user3"], + "user4" => $werte["user4"], + "followed_by" => $folgeId, + ); + $zuweisung = array(); + foreach(array_keys($felder) as $spalte) + $zuweisung[] = "`$spalte` = ?"; + $set = implode(", ", $zuweisung); + $err = 0; + + if(!$neuAnlegen) + { + $sql = "UPDATE termin SET $set, termtime = ?, changetime = NOW() WHERE id = ?"; + $params = array_merge(array_values($felder), array(terminTag($start, 0), $terminid)); + if(!db_abfrage($dbconn, $sql, $params)) + return beendeSpeichern($dbconn, error("Fehler beim ändern des Termins:
".mysqli_error($dbconn))); + $altWerte = array(); + foreach(array_keys($felder) as $spalte) + $altWerte[] = $alt[$spalte]; + $err = saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [termin change]", + db_sql_text($dbconn, $sql, array_merge($altWerte, array($alt["termtime"], $terminid))), "ändern"); + } + else + { + $mainId = 0; + foreach(range(0, $tage - 1) as $i) + { + if($err) + break; + $sql = "INSERT INTO termin SET $set, termtime = ?, main_id = ?, changetime = NOW(), datetime = NOW()"; + $params = array_merge(array_values($felder), array(terminTag($start, $i), $mainId)); + if(!db_abfrage($dbconn, $sql, $params)) + { + $err = error("Fehler beim anlegen des Termins:
".mysqli_error($dbconn)); + break; + } + $id = mysqli_insert_id($dbconn); + if(!$mainId) + { + // der erste Tag ist der Hauptsatz der Reihe + $mainId = $id; + db_abfrage($dbconn, "UPDATE termin SET main_id = ? WHERE id = ?", array($id, $id)) + or $err = error("Fehler beim verknüpfen der Terminreihe:
".mysqli_error($dbconn)); + } + if(!$err) + $err = saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [termin add, hat ID $id]", + "DELETE FROM termin WHERE id = $id", "anlegen"); + } + } + return beendeSpeichern($dbconn, $err); +} + +/* Löscht eine Terminreihe samt Nebenzeilen */ +function loescheTerminreihe($dbconn, $id) +{ + beginneSpeichern($dbconn); + $err = 0; + $beschreibung = db_wert($dbconn, "SELECT head FROM termin WHERE id = ?", array($id)); + if($beschreibung === false) + return beendeSpeichern($dbconn, error("Fehler beim ermitteln des Termins:
".mysqli_error($dbconn))); + if($beschreibung === null) + return beendeSpeichern($dbconn, error("Dieser Termin existiert nicht!")); + + // erst die Nebenzeilen, dann der Hauptsatz - sonst verliert main_id den Bezug + $sql = "DELETE FROM termin WHERE main_id = ? AND id != ?"; + db_abfrage($dbconn, $sql, array($id, $id)) + or $err = error("Konnte Nebentermine nicht löschen:
".mysqli_error($dbconn)); + if(!$err) + { + $sql = "DELETE FROM termin WHERE id = ?"; + db_abfrage($dbconn, $sql, array($id)) + or $err = error("Konnte Haupttermin nicht löschen:
".mysqli_error($dbconn)); + } + if(!$err) + $err = saveLog($dbconn, db_sql_text($dbconn, "DELETE FROM termin WHERE main_id = ?", array($id))." [$beschreibung]", "", "löschen"); + return beendeSpeichern($dbconn, $err); +} + +/* Markiert eine Terminreihe als erledigt ($erledigt = 1) oder offen (0) */ +function setzeTerminErledigt($dbconn, $id, $erledigt) +{ + $erledigt = $erledigt ? 1 : 0; + $vorhanden = db_wert($dbconn, "SELECT id FROM termin WHERE id = ?", array($id)); + if($vorhanden === false) + return error("Fehler beim ermitteln des Termins:
".mysqli_error($dbconn)); + if($vorhanden === null) + return error("Dieser Termin existiert nicht!"); + + beginneSpeichern($dbconn); + $err = 0; + $sql = "UPDATE termin SET done = ?, changetime = NOW(), changeuser = ? WHERE main_id = ? OR id = ?"; + $params = array($erledigt, $_SESSION["user"], $id, $id); + db_abfrage($dbconn, $sql, $params) + or $err = error("Konnte den Termin nicht umstellen:
".mysqli_error($dbconn)); + if(!$err) + $err = saveLog($dbconn, db_sql_text($dbconn, $sql, $params)." [termin erledigt]", "", "ändern"); + return beendeSpeichern($dbconn, $err); +} + +/* --------------------------------------------------------------------- + * Lesen + * ------------------------------------------------------------------ */ + +/* + * Der Termin für das Formular: die Reihe zu einer Hauptsatz-id wird zu + * einem Eintrag zusammengefasst, Anfang und Gesamtdauer eingeschlossen. + */ +function terminZumBearbeiten($dbconn, $id) +{ + $res = db_zeile($dbconn, "SELECT MIN(termtime) AS termtime, + SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer, + head, followed_by, MIN(id) AS id, main_id, typ, adresse_id, + done, user, user2, user3, user4, changeuser, act_date, text + FROM termin WHERE main_id = ? GROUP BY main_id", array($id)); + if($res === false) + { + error("Fehler beim ermitteln des Termins:
".mysqli_error($dbconn)); + return null; + } + if(!$res) + return null; + + if($res["followed_by"] > 0) + { + $folge = db_zeile($dbconn, "SELECT DATE_FORMAT(act_date,'%Y-%m-%d') AS act_date, typ FROM termin WHERE id = ?", + array($res["followed_by"])); + if($folge) + { + $res["folgetyp"] = $folge["typ"]; + $tage = (strtotime($folge["act_date"]) - strtotime(date("Y-m-d"))) / 86400; + if($tage > 0) + { + $res["folge"] = 1; + $res["folgedays"] = (int)$tage; + } + } + } + $res["termend"] = dauer_to_date($res["termtime"], $res["termdauer"]); + if(str_contains($res["termend"], "00:00:00")) + $res["termend"] = date("Y-m-d H:i:s", strtotime("-1 minutes", strtotime($res["termend"]))); + return $res; +} + +/* Die Auswahllisten des Terminformulars */ +function terminAuswahllisten($dbconn, $smarty) +{ + list($typids, $typs) = auswahlliste($dbconn, "SELECT id, typ FROM termtyp WHERE id > 0"); + $smarty->assign("typids", $typids); + $smarty->assign("typs", $typs); + + $benutzer = db_zeilen($dbconn, "SELECT id, vname, nname FROM user WHERE blocked = 0 AND id > 0 ORDER BY nname, vname"); + $ids = array(); + $namen = array(); + foreach((array)$benutzer as $b) + { + $ids[] = $b["id"]; + $namen[] = trim($b["vname"]." ".$b["nname"]); + } + $smarty->assign("userids", $ids); + $smarty->assign("users", $namen); + $ids[] = 0; + $namen[] = "Keiner"; + $smarty->assign("optuserids", $ids); + $smarty->assign("optusers", $namen); + + $smarty->assign("days", range(0, 40)); + + list($urlaubIds, $urlaubNamen) = auswahlliste($dbconn, "SELECT id, typ FROM termtyp WHERE typ = 'Urlaub' OR typ = 'Krankheit'"); + $smarty->assign("vac_types_id", $urlaubIds); + $smarty->assign("vac_types_name", $urlaubNamen); +} + +/* Die Adresse, an der ein Termin stattfindet - leer, wenn es keine gibt */ +function terminAdresse($dbconn, $adressid) +{ + $res = db_zeile($dbconn, "SELECT plz, ortsteil, ort, str, hnr, vname, partner_id, nname, vname2, nname2, + firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id + FROM adresse + LEFT JOIN strasse ON str_id = strasse.id + LEFT JOIN ort ON ort_id = ort.id + LEFT JOIN land ON land_id = land.id + WHERE adresse.id = ?", array($adressid)); + if($res === false) + { + error("Fehler beim abrufen der Daten:
".mysqli_error($dbconn)); + return array(); + } + return $res ? $res : array(); +} + +/* --------------------------------------------------------------------- + * Kalender + * ------------------------------------------------------------------ */ + +/* Deutsche Wochentagsnamen - unabhängig davon, ob die Locale vorhanden ist */ +function wochentag($zeitpunkt) +{ + $namen = array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"); + return $namen[(int)date("w", $zeitpunkt)]; +} + +/* + * Die Termine eines Tages. $ganztags trennt die ganztägigen (Dauer über + * zwölf Stunden) von den übrigen. + */ +function kalenderTermine($dbconn, $tag, $ganztags) +{ + $vergleich = $ganztags ? ">" : "<"; + $sql = "SELECT termin.id, termtyp.typ, termin.head, termtime, termdauer, + user, user2, user3, user4, done, partner_id, main_id, + str, ort, ortsteil, plz, hnr, adresse.vname AS vname, adresse.nname AS nname, + user.vname AS uservname, user.nname AS usernname, + 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 DATE(termtime) = ? AND termdauer $vergleich '12:00:00' + ORDER BY termtime ASC"; + return db_zeilen($dbconn, $sql, array($tag)) ?: array(); +} + +/* Die an einem Tag gebuchten Arbeiten aus der Projektverwaltung */ +function kalenderArbeiten($dbconn, $tag) +{ + $sql = "SELECT work.id, project.id AS projectid, work.bezeichn AS head, work.rechn AS done, + project.name AS projectname, work.datetime AS termtime, work.std AS termdauer, + project.changeuser AS user, project.partner_id, + adresse.vname AS vname, adresse.nname AS nname, adresse.firma AS firma + FROM work + LEFT JOIN project ON work.project_id = project.id + LEFT JOIN partner ON project.partner_id = partner.id + LEFT JOIN adresse ON adresse.partner_id = partner.id + LEFT JOIN user ON work.changeuser = user.id + WHERE adresse.typ_id = 1 AND DATE(work.datetime) = ? + ORDER BY work.datetime ASC"; + return db_zeilen($dbconn, $sql, array($tag)) ?: array(); +} + +/* Wer an einem Tag gestempelt hat und ob der Tag abgeschlossen ist */ +function kalenderAnwesenheit($dbconn, $tag) +{ + $sql = "SELECT user.vname, user.nname, user.color, + CASE MAX(zeiten.gehen) WHEN MAX(zeiten.kommen) THEN 0 ELSE 1 END AS complete + FROM user + LEFT JOIN zeiten ON user.id = zeiten.ma_id + WHERE DATE(kommen) = ? + GROUP BY user.id ORDER BY user.nname ASC"; + return db_zeilen($dbconn, $sql, array($tag)) ?: array(); +} + +/* + * Die acht Tage einer Kalenderseite, beginnend einen Tag vor dem + * Seitenanfang (so ist der Vortag immer sichtbar). + */ +function kalenderTage($dbconn, $seite) +{ + $heute = strtotime("today"); + $tage = array(); + for($i = $seite * 8 - 1; $i < $seite * 8 + 7; $i++) + { + $zeitpunkt = strtotime("+".$i." day", $heute); + $datum = date("Y-m-d", $zeitpunkt); + $feiertag = feiertag_bayern((int)date("d", $zeitpunkt), (int)date("m", $zeitpunkt), (int)date("Y", $zeitpunkt)); + $termine = array(); + if(($_SESSION["firma"] ?? "") == "Ingenieurbüro Wagner") + $termine = kalenderArbeiten($dbconn, $datum); + $termine = array_merge($termine, kalenderTermine($dbconn, $datum, false)); + + $tage[] = array( + // am Feiertag steht der Name des Feiertags statt des Wochentags + "weekday" => ($feiertag ? date("d.m.Y", $zeitpunkt)."
" : wochentag($zeitpunkt)."
".date("d.m.Y", $zeitpunkt)), + "date" => date("Ymd", $zeitpunkt), + "termine" => $termine, + "fulldaytermine" => kalenderTermine($dbconn, $datum, true), + "numfulldaytermine" => 0, + "ma_check" => kalenderAnwesenheit($dbconn, $datum), + "feiertag" => $feiertag ? $feiertag : "", + ); + } + return $tage; +} + +/* Die Mitarbeiter der Kalenderspalte samt Resturlaub */ +function kalenderBenutzer($dbconn) +{ + $users = array(); + $zeilen = db_zeilen($dbconn, "SELECT id, vname, nname, color FROM user WHERE blocked = 0 AND nick != 'ALL'"); + foreach((array)$zeilen as $res) + { + $res["openvacation"] = urlaub_remaining($dbconn, $res["id"]); + $users[$res["id"]] = $res; + } + return $users; +} + +?> diff --git a/sites/termin.php b/sites/termin.php index 1dfc6b2..86f2655 100644 --- a/sites/termin.php +++ b/sites/termin.php @@ -1,148 +1,25 @@ assign("heading","Terminliste"); - if($_GET["tabs"]) - $smarty->assign("tabs",$_GET["tabs"]); - else - $smarty->assign("tabs",$_SESSION["termtyp"]); + $smarty->assign("heading", "Terminliste"); + $smarty->assign("tabs", parameterGanzzahl("tabs") ?: ($_SESSION["termtyp"] ?? 1)); $smarty->display("heading.tpl"); $smarty->display("termlist.tpl"); } -else +else { - $smarty->assign("heading","Termine"); + $smarty->assign("heading", "Termine"); $smarty->display("heading.tpl"); - - //$colors = array("#f00","#0c0","#ff0","#90c","#0bb","#066","#09f","#f60","#00f","#f09"); - - //$weather = GetWeather(); - //$smarty->assign("weather",$weather); - $start = $_GET["page"]*8 - 1; - $end = $_GET["page"]*8 + 7; - - for($i=$start; $i<$end; $i++) - { - $qry = mysqli_query($dbconn,"SELECT user.vname,user.nname, user.color, - case MAX(zeiten.gehen) - when MAX(zeiten.kommen) then 0 - else 1 end AS complete - FROM user - LEFT JOIN zeiten ON user.id = zeiten.ma_id - WHERE DATE_FORMAT(kommen,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."' - GROUP BY user.id ORDER BY user.nname ASC") or $err=error("fehler beim ermitteln der anwesenden Mitarbeiter
".mysqli_error($dbconn)); - $ma_check=array(); - while($res=mysqli_fetch_assoc($qry)) - { - $ma_check[] = $res; - } - - - $qry = mysqli_query($dbconn,"SELECT termin.id,termtyp.typ, termin.head, termtime, termdauer, user, user2, user3, user4, done, partner_id, termin.id, main_id, str, ort, ortsteil, plz, hnr, adresse.vname as vname, adresse.nname as nname, - user.vname as uservname, user.nname as usernname, - 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 DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."' AND termdauer > '12:00:00' - ORDER BY termtime ASC") or $err=error("fehler beim ermitteln der termine
".mysqli_error($dbconn)); - $fulldaytermine=array(); - while($res=mysqli_fetch_assoc($qry)) - { - $fulldaytermine[] = $res; - } - - $termine=array(); - if($_SESSION["firma"] == "Ingenieurbüro Wagner"){ - $qry = mysqli_query($dbconn,"SELECT work.id, project.id AS projectid, work.bezeichn AS head, work.rechn AS done, project.name AS projectname, work.datetime AS termtime, work.std AS termdauer, project.changeuser AS user, project.partner_id, - adresse.vname as vname, adresse.nname as nname, adresse.firma AS firma - FROM work - LEFT JOIN project ON work.project_id = project.id - LEFT JOIN partner ON project.partner_id = partner.id - LEFT JOIN adresse ON adresse.partner_id = partner.id - LEFT JOIN user ON work.changeuser = user.id - WHERE adresse.typ_id = 1 AND DATE_FORMAT(work.datetime,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."' - ORDER BY work.datetime ASC") or $err=error("fehler beim ermitteln der termine
".mysqli_error($dbconn)); - while($res=mysqli_fetch_assoc($qry)) - { - $termine[] = $res; - } - } - - $qry = mysqli_query($dbconn,"SELECT termin.id,termtyp.typ, termin.head, termtime, termdauer, user, user2, user3, user4, done, partner_id, termin.id, main_id, str, ort, ortsteil, plz, hnr, adresse.vname as vname, adresse.nname as nname, - user.vname as uservname, user.nname as usernname, - 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 DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."' AND termdauer < '12:00:00' - ORDER BY termtime ASC") or $err=error("fehler beim ermitteln der termine
".mysqli_error($dbconn)); - - while($res=mysqli_fetch_assoc($qry)) - { - $termine[] = $res; - } - - - $feiertag = feiertag_bayern(idate("d",strtotime("+".$i." days")),idate("m",strtotime("+".$i." days")),idate("Y",strtotime("+".$i." days"))); - if($feiertag){ - $weekdays[]=array( "weekday"=>date("d.m.Y",strtotime("+".$i." days"))."
", - "date"=>strftime("%Y%m%d",strtotime("+".$i." days")), - "termine"=>$termine, - "fulldaytermine"=>$fulldaytermine, - "numfulldaytermine" => 0, - "ma_check"=>$ma_check, - "feiertag" => $feiertag - ); - } - else{ - $weekdays[]=array( "weekday"=>strftime("%A",strtotime("+".$i." days"))."
".date("d.m.Y",strtotime("+".$i." days")), - "date"=>strftime("%Y%m%d",strtotime("+".$i." days")), - "termine"=>$termine, - "fulldaytermine"=>$fulldaytermine, - "numfulldaytermine" => 0, - "ma_check"=>$ma_check, - "feiertag" => "" - ); - } - } - $smarty->assign("page",$_GET["page"]); - $smarty->assign("weekdays",$weekdays); - - $qry=mysqli_query($dbconn,"SELECT id, vname, nname, color FROM user WHERE blocked = 0 AND nick != 'ALL'"); - while($res=mysqli_fetch_assoc($qry)) - { - //$res["color"] = $colors[$res["id"]]; - $res["openvacation"] = urlaub_remaining($dbconn, $res["id"]); - $users[$res["id"]] = $res; - } - - $smarty->assign("users",$users); - + + $smarty->assign("page", $seite); + $smarty->assign("weekdays", kalenderTage($dbconn, $seite)); + $smarty->assign("users", kalenderBenutzer($dbconn)); $smarty->display("calendar.tpl"); } ?> diff --git a/sites/terminadd.php b/sites/terminadd.php index 84dc076..96732ab 100644 --- a/sites/terminadd.php +++ b/sites/terminadd.php @@ -1,422 +1,91 @@ - bzw. del. + */ + +/* Die angekreuzten Termine einer Mehrfachauswahl */ +function angekreuzteTermine($praefix) { - if($_GET["id"] == "multi"){ - for( $i=1; $i<=$_POST["pagesize"]; $i++){ - mysqli_query($dbconn,"DELETE FROM termin WHERE id='".$_POST["del".$i]."'") or $err=error("Konnte Haupttermin nicht löschen
".mysqli_error($dbconn)); - mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".$_POST["del".$i]."'" or $err=error("Konnte Nebentermine nicht löschen
".mysqli_error($dbconn))); - } - if(!$err) - doneNreturn("Erfolgreich gelöscht"); - } - else{ - $qry = mysqli_query($dbconn,"SELECT * FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'"); - $res = mysqli_fetch_assoc($qry); - if(!$res) - $err = error("Dieser Termin existiert nicht!"); - - mysqli_query($dbconn,"DELETE FROM termin WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht löschen
".mysqli_error($dbconn)); - mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".$res["id"]."'" or $err=error("Konnte Nebentermine nicht löschen
".mysqli_error($dbconn))); + $ids = array(); + $anzahl = isset($_POST["pagesize"]) ? (int)$_POST["pagesize"] : 0; + for($i = 1; $i <= $anzahl; $i++) + if(!empty($_POST[$praefix.$i])) + $ids[] = (int)$_POST[$praefix.$i]; + return $ids; +} +$mehrfach = isset($_GET["id"]) && $_GET["id"] === "multi"; +$terminid = parameterGanzzahl("id"); +$adressid = parameterGanzzahl("adressid"); +$err = 0; + +if(($mehrfach || $terminid) && parameterGanzzahl("del") == 1) +{ + foreach($mehrfach ? angekreuzteTermine("del") : array($terminid) as $id) if(!$err) - doneNreturn("Erfolgreich gelöscht"); + $err = loescheTerminreihe($dbconn, $id); + if(!$err) + { + doneNreturn("Erfolgreich gelöscht"); + return; } } -elseif($_GET["id"] && $_GET["done"]) +elseif(($mehrfach || $terminid) && !empty($_GET["done"])) { - if($_GET["id"] == "multi"){ - for( $i=1; $i<=$_POST["pagesize"]; $i++){ - mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE id='".$_POST["erl".$i]."'") or $err+=error("Konnte Haupttermin nicht als erledigt markieren
".mysqli_error($dbconn)); - mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE main_id='".$_POST["erl".$i]."'") or $err+=error("Konnte Nebentermine nicht als erledigt markieren
".mysqli_error($dbconn)); - } + $erledigt = $_GET["done"] != "no"; + foreach($mehrfach ? angekreuzteTermine("erl") : array($terminid) as $id) if(!$err) - doneNreturn("Erfolgreich geändert!"); - } - else{ - $qry = mysqli_query($dbconn,"SELECT * FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'"); - $res = mysqli_fetch_assoc($qry); - if(!$res) - $err = error("Dieser Termin existiert nicht!"); - - if($_GET["done"] == "yes") - { - mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht als erledigt markieren
".mysqli_error($dbconn)); - mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE main_id='".$res["id"]."'") or $err=error("Konnte Nebentermine nicht als erledigt markieren
".mysqli_error($dbconn)); - } - elseif($_GET["done"] == "no") - { - mysqli_query($dbconn,"UPDATE termin SET done = 0 WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht als nicht erledigt markieren
".mysqli_error($dbconn)); - mysqli_query($dbconn,"UPDATE termin SET done = 0 WHERE main_id='".$res["id"]."'") or $err=error("Konnte Nebentermine nicht als nicht erledigt markieren
".mysqli_error($dbconn)); - } - if(!$err) - doneNreturn("Erfolgreich geändert!"); + $err = setzeTerminErledigt($dbconn, $id, $erledigt); + if(!$err) + { + doneNreturn("Erfolgreich geändert!"); + return; } } -$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, ort, str, hnr, vname, partner_id, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id - FROM adresse - LEFT JOIN strasse ON str_id = strasse.id - LEFT JOIN ort ON ort_id = ort.id - LEFT JOIN land ON land_id = land.id - WHERE adresse.id='".mysql_escape_string($_GET["adressid"])."' - ORDER BY typ_id ASC") or $err = error("Fehler beim abrufen der Daten ".mysqli_error($dbconn)); -$kdnres=mysqli_fetch_assoc($qry); -if($_GET["user"]) - $smarty->assign("user",$_GET["user"]); - -if(!$kdnres["partner_id"]) +$kunde = terminAdresse($dbconn, $adressid); +if(empty($kunde["partner_id"])) + $adressid = 0; + +if(!$err && parameterGanzzahl("formsent") == 1) { - $_GET["adressid"] = 0; + $err = speichereTermin($dbconn, $terminid, $adressid); + if(!$err) + { + doneNreturn("Erfolgreich eingetragen"); + return; + } + // bei einem Fehler die Eingaben im Formular stehen lassen + $smarty->assign("termin", $_POST); } -if($_GET["formsent"] == 1) - { - $head = mysql_escape_string(trim($_POST["head"])); - $user = mysql_escape_string(trim($_POST["user"])); - $user2 = mysql_escape_string(trim($_POST["user2"])); - $user3 = mysql_escape_string(trim($_POST["user3"])); - $user4 = mysql_escape_string(trim($_POST["user4"])); - $text = mysql_escape_string(trim($_POST["text"])); - $typ = mysql_escape_string(trim($_POST["typ"])); - $done = mysql_escape_string(trim($_POST["done"])); - $folge = mysql_escape_string(trim($_POST["folge"])); - $folgetyp = mysql_escape_string(trim($_POST["folgetyp"])); - $folgedays = mysql_escape_string(trim($_POST["folgedays"])); - $datetime_start = dispdate_to_mysql_date(mysql_escape_string(trim($_POST["datetime_start"])),0); - $datetime_end = dispdate_to_mysql_date(mysql_escape_string(trim($_POST["datetime_end"])),1); - $_POST["termtime"] = $datetime_start; - $_POST["termend"] = $datetime_end; - $dauer = $_POST["termdauer"] = mysql_dauer($datetime_start,$datetime_end); - $days = 1; - $split_dauer = explode(":",$dauer); - if($split_dauer[0]>12 || $typ == 0) - { - $days = ceil($dauer/24); - $dauer = "24:00:00"; - $_POST["termtime"] = $datetime_start = substr($datetime_start,0,11)."00:00:00"; - $_POST["termend"] = $datetime_end = substr($datetime_start,0,11)."23:59:00"; - } - $datetime_start_tmp =$datetime_start; - - if($days > 1 && $_GET["id"]) - { - mysqli_query($dbconn,"DELETE FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'"); - mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".mysqli_escape_string($dbconn,$_GET["id"])."'"); - - $_GET["id"] = ""; - } - else - mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".mysqli_escape_string($dbconn,$_GET["id"])."' AND id != '".mysqli_escape_string($dbconn,$_GET["id"])."'"); - if($done == 0){ - for($i=0;$i<$days;$i++) - { - $datetime_start_tmp = date("Y-m-d H:i:s",strtotime("+".$i." day",strtotime($datetime_start))); - - $qry = mysqli_query($dbconn,"SELECT * FROM - ( SELECT id,user, user2, user3, user4, termtime, - DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend - FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0) - as subselect - WHERE - (user='$user' OR user2='$user' OR user3='$user' OR user4='$user') AND - ( - ('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR - ('$datetime_end' > termtime AND '$datetime_end' <= termend) OR - ('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend) - )") or $err=error("Fehler beim überprüfen von Überlappungen
".mysqli_error($dbconn)); - $res=mysqli_fetch_assoc($qry); - if(!$res && $user2) - { - $qry = mysqli_query($dbconn,"SELECT * FROM - ( SELECT id,user, user2, user3, user4, termtime, - DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend - FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0) - as subselect - WHERE - (user='$user2' OR user2='$user2' OR user3='$user2' OR user4='$user2') AND - ( - ('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR - ('$datetime_end' > termtime AND '$datetime_end' <= termend) OR - ('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend) - )") or $err=error("Fehler beim überprüfen von Überlappungen
".mysqli_error($dbconn)); - $res=mysqli_fetch_assoc($qry); - } - if(!$res && $user3) - { - $qry = mysqli_query($dbconn,"SELECT * FROM - ( SELECT id,user, user2, user3, user4, termtime, - DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend - FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0) - as subselect - WHERE - (user='$user3' OR user2='$user3' OR user3='$user3' OR user4='$user3') AND - ( - ('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR - ('$datetime_end' > termtime AND '$datetime_end' <= termend) OR - ('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend) - )") or $err=error("Fehler beim überprüfen von Überlappungen
".mysqli_error($dbconn)); - $res=mysqli_fetch_assoc($qry); - } - if(!$res && $user4) - { - $qry = mysqli_query($dbconn,"SELECT * FROM - ( SELECT id,user, user2, user3, user4, termtime, - DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend - FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0) - as subselect - WHERE - (user='$user4' OR user2='$user4' OR user3='$user4' OR user4='$user4') AND - ( - ('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR - ('$datetime_end' > termtime AND '$datetime_end' <= termend) OR - ('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend) - )") or $err=error("Fehler beim überprüfen von Überlappungen
".mysqli_error($dbconn)); - $res=mysqli_fetch_assoc($qry); - } - if($res && $res["id"] != $_GET["id"]) - { - $err=error("Dieser Mitarbeiter hat zu der Zeit bereits einen Termin, er kann nicht an zwei Orten gleichzeitig sein."); - break; - } - } - } - - if(!$err) - { - - for($i=0;$i<$days;$i++) - { - $datetime_start_tmp = date("Y-m-d H:i:s",strtotime("+".$i." day",strtotime($datetime_start))); - if(strstr($datetime_start_tmp,"1970")){ - echo "NICHTTERMINIERT!!"; - $datetime_start_tmp = "0000-00-00 00:00:00"; - } - if($_GET["id"]) - { - $qry=mysqli_query($dbconn,"SELECT * FROM termin WHERE id = '".mysqli_escape_string($dbconn,($_GET["id"]))."'"); - if ($res=mysqli_fetch_assoc($qry)) - { - if($done && $folge && !$res["followed_by"] && !$i) - { - mysqli_query($dbconn,"INSERT INTO termin SET head='$head', - text='', - adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."', - typ='$folgetyp', - changetime=NOW(), - datetime=NOW(), - done='0', - termtime='', - termdauer='', - user='$user', - user2='$user2', - user3='$user3', - user4='$user4', - changeuser='".$_SESSION["user"]."', - act_date=DATE_ADD(CURDATE(),INTERVAL $folgedays DAY)") or $err=error("Fehler beim anlegen des Folgetermins
".mysqli_error($dbconn)); - $res["followed_by"] = mysqli_insert_id($dbconn); - mysqli_query($dbconn,"UPDATE termin SET main_id = '".$res["followed_by"]."' WHERE id='".$res["followed_by"]."'"); - } - if(!$i) - { - mysqli_query($dbconn,"UPDATE termin SET head='$head', - text='$text', - adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."', - typ='$typ', - changetime=NOW(), - done='$done', - termtime='$datetime_start_tmp', - termdauer='$dauer', - changeuser='".$_SESSION["user"]."', - user='$user', - user2='$user2', - user3='$user3', - user4='$user4', - followed_by='".$res["followed_by"]."' - WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'") or $err=error("Fehler beim ändern des Termins
".mysqli_error($dbconn)); - - } - } - else - $err=error("dieser Termin existiert nicht!"); - } - else - { - if($done && $folge && !$err && !$i) - { - mysqli_query($dbconn,"INSERT INTO termin SET head='$head', - text='', - adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."', - typ='$folgetyp', - changetime=NOW(), - datetime=NOW(), - done='0', - termtime='', - termdauer='', - changeuser='".$_SESSION["user"]."', - user='$user', - user2='$user2', - user3='$user3', - user4='$user4', - act_date=DATE_ADD(CURDATE(),INTERVAL $folgedays DAY)") or $err=error("Fehler beim anlegen des Folgetermins
".mysqli_error($dbconn)); - $res["followed_by"] = mysqli_insert_id($dbconn); - mysqli_query($dbconn,"UPDATE termin SET main_id = '".$res["followed_by"]."' WHERE id='".$res["followed_by"]."'"); - } - if(!$err) - { - if(!$i) - { - mysqli_query($dbconn,"INSERT INTO termin SET head='$head', - text='$text', - adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."', - typ='$typ', - changetime=NOW(), - datetime=NOW(), - done='$done', - termtime='$datetime_start_tmp', - termdauer='$dauer', - changeuser='".$_SESSION["user"]."', - user='$user', - user2='$user2', - user3='$user3', - user4='$user4', - followed_by='".$res["followed_by"]."'") or $err=error("Fehler beim anlegen des Termins
".mysqli_error($dbconn)); - $main_id = mysqli_insert_id($dbconn); - mysqli_query($dbconn,"UPDATE termin SET main_id = '$main_id' WHERE id='$main_id'"); - } - else - { - mysqli_query($dbconn,"INSERT INTO termin SET head='$head', - text='$text', - adresse_id='".mysqli_escape_string($dbconn,$_GET["adressid"])."', - typ='$typ', - changetime=NOW(), - datetime=NOW(), - done='$done', - termtime='$datetime_start_tmp', - termdauer='$dauer', - changeuser='".$_SESSION["user"]."', - user='$user', - user2='$user2', - user3='$user3', - user4='$user4', - main_id='$main_id', - followed_by='".$res["followed_by"]."'") or $err=error("Fehler beim anlegen des Termins
".mysqli_error($dbconn)); - } - } - } - } - if(!$err) - { - doneNreturn("Erfolgreich eingetragen"); - } - } - if($err){ - $smarty->assign("termin",$_POST); - } - //elseif(!$head) - // $err=error("Bitte geben Sie eine Terminbeschreibung an!"); - } - - - $qry = mysqli_query($dbconn,"SELECT id, typ - FROM termtyp WHERE id > 0") or $err = error("Fehler beim abrufen der Termintypen
".mysqli_error($dbconn)); - while($res = mysqli_fetch_assoc($qry)) - { - $typids[] =$res["id"]; - $typs[] = $res["typ"]; - } - $smarty->assign("typs",$typs); - $smarty->assign("typids",$typids); - - $typids=array(); - $typs=array(); - $qry = mysqli_query($dbconn,"SELECT id, vname, nname - FROM user WHERE blocked = 0 AND id > 0") or $err = error("Fehler beim abrufen der Benutzer
".mysqli_error($dbconn)); - while($res = mysqli_fetch_assoc($qry)) - { - $typids[] =$res["id"]; - $typs[] = $res["vname"]." ".$res["nname"]; - } - $smarty->assign("users",$typs); - $smarty->assign("userids",$typids); - $typs[]="Keiner"; - $typids[]=0; - $smarty->assign("optusers",$typs); - $smarty->assign("optuserids",$typids); - - $smarty->assign("days",array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40)); - $smarty->assign("kunde",$kdnres); - if($_GET["id"]) - { - $qry=mysqli_query($dbconn,"SELECT MIN(termtime) AS termtime, - SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer, - head, - followed_by, - MIN(id) AS id, - main_id, - typ,adresse_id, - done, - user, - user2, - user3, - user4, - changeuser, - act_date, - text - FROM termin WHERE main_id = '".mysqli_escape_string($dbconn,$_GET["id"])."' GROUP BY main_id"); - if ($res=mysqli_fetch_assoc($qry)) - { - - if($res["followed_by"] > 0) - { - $qry2=mysqli_query($dbconn, "SELECT DATE_FORMAT(act_date,'%Y-%m-%d'), typ_id FROM termin WHERE id = '".$res["followed_by"]."'"); - $res2=mysqli_fetch_assoc($qry2); - $days = (strtotime($res2["act_date"]) - strtotime(date("Y-m-d"))) / (60 * 60 * 24); - $res["folgetyp"]= $res2["typ_id"]; - if($days > 0) - $res["folgedays"] = $days; - } - $res["termend"] = dauer_to_date($res["termtime"], $res["termdauer"]); - if(strstr($res["termend"],"00:00:00")){ - $res["termend"] = date("Y-m-d H:i:s",strtotime("-1 minutes",strtotime($res["termend"]))); - } - $smarty->assign("termin",$res); - if($_GET["adressid"]) - $smarty->assign("heading","Termin ändern"); - else - $smarty->assign("heading","Urlaub / Krankheit ändern"); - } - else - { - $err=error("Dieser Termin existiert nicht!"); - } - } - else - { - - $smarty->assign("termin",$_POST); - - if($_GET["adressid"]){ - $smarty->assign("heading","Neuer Termin"); - } - else{ - $smarty->assign("heading","Neuer Urlaub / Krankheitstag"); - $typids=array(); - $typs=array(); - $qry = mysqli_query($dbconn,"SELECT id, typ - FROM termtyp WHERE typ = 'Urlaub' OR typ = 'Krankheit'") or $err = error("Fehler beim abrufen der Termintypen
".mysqli_error($dbconn)); - while($res = mysqli_fetch_assoc($qry)) - { - $typids[] =$res["id"]; - $typs[] = $res["typ"]; - } - $smarty->assign("vac_types_id",$typids); - $smarty->assign("vac_types_name",$typs); - - } - } - $smarty->display("heading.tpl"); - $smarty->display("addtermin.tpl"); +terminAuswahllisten($dbconn, $smarty); +$smarty->assign("kunde", $kunde); +$smarty->assign("user", parameterGanzzahl("user")); -?> \ No newline at end of file +if($terminid && !$err) +{ + $termin = terminZumBearbeiten($dbconn, $terminid); + if(!$termin) + $err = error("Dieser Termin existiert nicht!"); + else + { + $smarty->assign("termin", $termin); + $smarty->assign("heading", $adressid ? "Termin ändern" : "Urlaub / Krankheit ändern"); + } +} +elseif(!$terminid) +{ + if(!$err) + $smarty->assign("termin", $_POST); + $smarty->assign("heading", $adressid ? "Neuer Termin" : "Neuer Urlaub / Krankheitstag"); +} + +$smarty->display("heading.tpl"); +$smarty->display("addtermin.tpl"); +?> diff --git a/sites/terminshow.php b/sites/terminshow.php index 9739905..65110ce 100644 --- a/sites/terminshow.php +++ b/sites/terminshow.php @@ -1,71 +1,45 @@ -addpage(); - $prevpage=1; - $termin=maketerminarray($dbconn, $res["id"]); - $adresse=maketerminadresse($dbconn, $res["id"]); - $telnrn=maketelnrn($dbconn,$res["id"]); - makesingleterminpage($pdf,$termin,$adresse,$telnrn,0); - } - } -} -$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime()); -savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf"); -$smarty->assign("pdffile","./temp/pdftemp/$tmppdfname.pdf"); +$terminid = parameterGanzzahl("id"); +$datum = isset($_GET["date"]) && is_string($_GET["date"]) ? date("Y-m-d", strtotime($_GET["date"])) : ""; -$pdf = makerawPDFanfahrt(0); -if($_GET["id"] && !$_GET["date"]) +$ids = array(); +if($terminid && !$datum) + $ids[] = $terminid; +elseif($datum) { - $termin=maketerminarray($dbconn, $_GET["id"]); - $adresse=maketerminadresse($dbconn, $_GET["id"]); - $googleadresse=makegooglestring($dbconn, $_GET["id"]); - $telnrn=maketelnrn($dbconn,$_GET["id"]); - makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse); + $zeilen = db_zeilen($dbconn, "SELECT id FROM termin WHERE adresse_id != 0 AND DATE(termtime) = ? ORDER BY termtime ASC", array($datum)); + foreach((array)$zeilen as $z) + $ids[] = $z["id"]; } -elseif($_GET["date"]) -{ - $qry=mysqli_query($dbconn,"SELECT id FROM termin WHERE adresse_id AND DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime($_GET["date"]))."' ORDER BY termtime ASC"); - if($_GET["type"]="singlepages") - { - $prevpage=0; - while($res=mysqli_fetch_assoc($qry)) - { - if($prevpage) - $pdf->addpage(); - $prevpage=1; - $termin=maketerminarray($dbconn, $res["id"]); - $adresse=maketerminadresse($dbconn, $res["id"]); - $googleadresse=makegooglestring($dbconn,$res["id"]); - $telnrn=maketelnrn($dbconn,$res["id"]); - makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse); - - } - } -} -$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime()); -savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf"); -$smarty->assign("pdffile2","./temp/pdftemp/$tmppdfname.pdf"); +/* $anfahrt = 0 für den Terminzettel, 1 für die Seite mit der Karte */ +function terminzettel($dbconn, $ids, $anfahrt) +{ + $pdf = $anfahrt ? makerawPDFanfahrt(0) : makerawPDFcopy(0); + $erste = true; + foreach($ids as $id) + { + if(!$erste) + $pdf->addpage(); + $erste = false; + $googleadresse = $anfahrt ? makegooglestring($dbconn, $id) : ""; + makesingleterminpage($pdf, maketerminarray($dbconn, $id), maketerminadresse($dbconn, $id), + maketelnrn($dbconn, $id), $anfahrt, $googleadresse); + } + $name = str_replace(array(" ", "."), array("_", "_"), microtime()); + savePDF($pdf, "./temp/pdftemp/$name.pdf"); + return "./temp/pdftemp/$name.pdf"; +} + +$smarty->assign("pdffile", terminzettel($dbconn, $ids, 0)); +$smarty->assign("pdffile2", terminzettel($dbconn, $ids, 1)); $smarty->display("terminshow.tpl"); - - -?> \ No newline at end of file +?> diff --git a/templates/addtermin.tpl b/templates/addtermin.tpl index 133873c..1fef8e4 100644 --- a/templates/addtermin.tpl +++ b/templates/addtermin.tpl @@ -5,7 +5,7 @@ {/if}

Termin für Kunde Nummer:

{$kunde.partner_id}
- {$kunde.vname} {$kunde.nname} {$kunde.firma}
{$kunde.str} {$kunde.hnr}
{$kunde.plz} {$kunde.ort} + {$kunde.vname|escape} {$kunde.nname|escape} {$kunde.firma|escape}
{$kunde.str|escape} {$kunde.hnr|escape}
{$kunde.plz|escape} {$kunde.ort|escape} {/if} {if $user} {$termin.user = $user} @@ -45,10 +45,10 @@
{/if} - +
-

+


diff --git a/templates/calendar.tpl b/templates/calendar.tpl index b22e52d..a97c65f 100644 --- a/templates/calendar.tpl +++ b/templates/calendar.tpl @@ -50,9 +50,9 @@ {foreach $weekday.fulldaytermine as $key=>$termin}
- {$termin.typ|substr:0:3}. + style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift + $dayXpos}em;background-color: {$users.{$termin.user}.color|escape};' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname|escape} {$termin.usernname|escape}
Ganztags
{if {$termin.ort}}In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'> + {$termin.typ|substr:0:3|escape}.
{$shift = $shift+1.1} @@ -107,19 +107,19 @@ {if {$termin.typ} != 'Arbeitsleistung'}
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
- In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}
- Bei {$termin.vname} {$termin.nname} {$termin.firma}'> + In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
+ Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'> {else}
+ style='width: {$width-0.3}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.1 + $shift}em;background-color: {if $termin.done}#CFC{else}{$users.{$termin.user}.color|escape}{/if};' + title='{$termin.typ|escape} - {$termin.firma|escape} {$termin.vname|escape} {$termin.nname|escape}
{$termin.projectname|escape}
{$termin.head|escape}
Dauer: {$termin.termdauer|string_format:"%.1f"}h'> {/if} - {$termin.typ|substr:0:3}. + {$termin.typ|substr:0:3|escape}.
{/foreach} @@ -133,9 +133,9 @@ {$width = 9} {$start = $ma_nr + 0.5}
- {if {$mitarb.complete} == 0}{else}{/if}{$mitarb.vname} {$mitarb.nname|substr:0:1}. + style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.5}em;background-color: {$mitarb.color|escape};' + title='{$mitarb.vname|escape} {$mitarb.nname|escape} - Anwesend {if {$mitarb.complete} == 0} aber noch nicht ausgestempelt{/if}
'> + {if {$mitarb.complete} == 0}{else}{/if}{$mitarb.vname|escape} {$mitarb.nname|substr:0:1|escape}.
{/foreach} @@ -169,9 +169,9 @@
{foreach $users as $user} {if $user.openvacation < 0} - {$user.vname} {$user.nname} ({$user.openvacation}) + {$user.vname|escape} {$user.nname|escape} ({$user.openvacation|escape}) {else} - {$user.vname} {$user.nname} ({$user.openvacation}) + {$user.vname|escape} {$user.nname|escape} ({$user.openvacation|escape}) {/if} {/foreach}
diff --git a/templates/calendar_month.tpl b/templates/calendar_month.tpl index 9b21f5f..24833d9 100644 --- a/templates/calendar_month.tpl +++ b/templates/calendar_month.tpl @@ -104,9 +104,9 @@ {$start = 4 + ($terminstart - 420)/15}
- {$termin.typ|substr:0:3}. + style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user}.color|escape}' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname|escape} {$termin.usernname|escape}
Ganztags
{if {$termin.ort}}In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'> + {$termin.typ|substr:0:3|escape}.
{else} {$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})} @@ -124,24 +124,24 @@ {$start = 4 + ($terminstart - 420)/15} {if {$termin.typ} != 'Arbeitsleistung'}
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
- In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}
- Bei {$termin.vname} {$termin.nname} {$termin.firma}'> + In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
+ Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'> {else}
{$termin.typ|substr:0:3}. + {$termin.typ|substr:0:3|escape}.
{/if}
@@ -154,9 +154,9 @@ {$height = ($terminlength/15)} {$start = 4 + ($terminstart - 420)/15}
- {$termin.typ|substr:0:3}. + style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color|escape}' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname2|escape} {$termin.usernname2|escape}
Ganztags
{if {$termin.ort}}In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'> + {$termin.typ|substr:0:3|escape}.
{else} {$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})} @@ -164,9 +164,9 @@ {$height = ($terminlength/15)} {$start = 4 + ($terminstart - 420)/15}
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}
Bei {$termin.vname} {$termin.nname} {$termin.firma}'> - {$termin.typ|substr:0:3}. + style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color|escape}' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname2|escape} {$termin.usernname2|escape}
Um {$termin.termtime|date_format:'%k:%M'}Uhr
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'> + {$termin.typ|substr:0:3|escape}.
{/if} @@ -180,9 +180,9 @@ {$height = ($terminlength/15)} {$start = 4 + ($terminstart - 420)/15}
- {$termin.typ|substr:0:3}. + style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color|escape}' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname3|escape} {$termin.usernname3|escape}
Ganztags
{if {$termin.ort}}In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'> + {$termin.typ|substr:0:3|escape}.
{else} {$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})} @@ -190,9 +190,9 @@ {$height = ($terminlength/15)} {$start = 4 + ($terminstart - 420)/15}
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}
Bei {$termin.vname} {$termin.nname} {$termin.firma}'> - {$termin.typ|substr:0:3}. + style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color|escape}' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname3|escape} {$termin.usernname3|escape}
Um {$termin.termtime|date_format:'%k:%M'}Uhr
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'> + {$termin.typ|substr:0:3|escape}.
{/if} @@ -206,9 +206,9 @@ {$height = ($terminlength/15)} {$start = 4 + ($terminstart - 420)/15}
- {$termin.typ|substr:0:3}. + style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color|escape}' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname4|escape} {$termin.usernname4|escape}
Ganztags
{if {$termin.ort}}In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'> + {$termin.typ|substr:0:3|escape}.
{else} {$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})} @@ -216,9 +216,9 @@ {$height = ($terminlength/15)} {$start = 4 + ($terminstart - 420)/15}
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}
Bei {$termin.vname} {$termin.nname} {$termin.firma}'> - {$termin.typ|substr:0:3}. + style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color|escape}' + title='{$termin.typ|escape}
{$termin.head|escape} - {$termin.uservname4|escape} {$termin.usernname4|escape}
Um {$termin.termtime|date_format:'%k:%M'}Uhr
Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if} {if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}
In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}
Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'> + {$termin.typ|substr:0:3|escape}.
{/if} @@ -251,7 +251,7 @@
{foreach $users as $user} - {$user.vname} {$user.nname} + {$user.vname|escape} {$user.nname|escape} {/foreach}
diff --git a/templates/terminshow.tpl b/templates/terminshow.tpl index c45f589..8eaa76c 100644 --- a/templates/terminshow.tpl +++ b/templates/terminshow.tpl @@ -1,4 +1,4 @@ {include file="heading.tpl" heading="Terminanzeige"}

Ohne Anfahrt:
Mit Anfahrt:

- - + +