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 "
";
- }
- displayPages($pagesize,$page,$numres,"ajax_searchterm",",$termtyp");
-
+
+ displayPages($pagesize,$page,$numres,"ajax_searchterm",",".$termtyp);
+ if($termtyp == 1)
+ 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}