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<N>/erl<N> 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 <noreply@anthropic.com>
This commit is contained in:
@@ -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.
|
- **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()`.
|
- **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.
|
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.
|
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
|
## Fallstricke
|
||||||
|
|
||||||
- **`smarty/` enthält Smarty 4.5.6** — der schlichte Verzeichnisname sagt nichts über die Version.
|
- **`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 „?“.
|
- **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.
|
- **`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.
|
- **`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.
|
- **`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.
|
- **`uploads_*/{notes,signs}` enthalten personenbezogene Kundendaten** (Rechnungen, Scans, Unterschriften) und sind bewusst git-ignoriert. Nie committen.
|
||||||
- Zeilenenden werden über `.gitattributes` auf LF normalisiert.
|
- Zeilenenden werden über `.gitattributes` auf LF normalisiert.
|
||||||
|
|||||||
+102
-140
@@ -4,163 +4,129 @@ require_once("../incs/funcs.php");
|
|||||||
require_once("../incs/listfuncs.php");
|
require_once("../incs/listfuncs.php");
|
||||||
require('../smarty/libs/Smarty.class.php');
|
require('../smarty/libs/Smarty.class.php');
|
||||||
|
|
||||||
|
|
||||||
$smarty = new Smarty;
|
$smarty = new Smarty;
|
||||||
|
|
||||||
|
|
||||||
$pagesize = 25;
|
$pagesize = 25;
|
||||||
|
|
||||||
|
|
||||||
if(!isset($err))
|
if(!isset($err))
|
||||||
{
|
$err = "";
|
||||||
$usercolors = array("#f00","#0c0","#ff0","#90c","#0bb","#066","#09f","#f60","#00f","#f09");
|
|
||||||
|
|
||||||
$fulltag = utf8_encode($_GET["search"]);
|
/*
|
||||||
$src = explode(" ",$fulltag);
|
* Datum und Dauer eines Termins für die Liste. Ab 24 Stunden zählt der
|
||||||
if(isset($_GET["link"])){
|
* Termin in Tagen, sonst in Stunden und Minuten.
|
||||||
$combiner = mysql_escape_string($_GET["link"]);
|
*/
|
||||||
}else{
|
function terminZeitraum($termtime, $termdauer)
|
||||||
$combiner = "";
|
{
|
||||||
}
|
$stunden = (int)strtok((string)$termdauer, ":");
|
||||||
if($combiner != "AND" && $combiner != "OR")
|
$minuten = (int)substr((string)$termdauer, 3, 2);
|
||||||
|
|
||||||
|
if($termtime == "0000-00-00 00:00:00")
|
||||||
|
$zeitpunkt = "N/A";
|
||||||
|
elseif($stunden > 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"];
|
else
|
||||||
$termtyp = $_GET["termtyp"];
|
$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;
|
$_SESSION["termtyp"] = $termtyp;
|
||||||
|
|
||||||
|
$src = explode(" ", $fulltag);
|
||||||
|
$combiner = $link == "OR" ? "OR" : "AND";
|
||||||
|
$listlines = array();
|
||||||
|
$colors = array();
|
||||||
|
|
||||||
$queries = createTermQry($page,$pagesize,$src,$combiner,$termtyp);
|
$queries = createTermQry($page,$pagesize,$src,$combiner,$termtyp);
|
||||||
$qry = mysqli_query($dbconn,$queries["all"])
|
$numres = zaehleTreffer($dbconn, $queries);
|
||||||
or die("Datenbank fehler: ".mysqli_error($dbconn));
|
|
||||||
$numres = mysqli_num_rows($qry);
|
|
||||||
if($numres)
|
if($numres)
|
||||||
{
|
{
|
||||||
$qry = mysqli_query($dbconn,$queries["limited"])
|
$qry = db_abfrage($dbconn,$queries["limited"],$queries["params"])
|
||||||
or die("Datenbank fehler: ".mysqli_error($dbconn));
|
or die("Datenbank fehler: ".htmlspecialchars(mysqli_error($dbconn)));
|
||||||
$counter = 0;
|
$counter = 0;
|
||||||
while($res=mysqli_fetch_assoc($qry))
|
while($res=mysqli_fetch_assoc($qry))
|
||||||
{
|
{
|
||||||
$counter = $counter+1;
|
$counter++;
|
||||||
$termdauer = "";
|
$id = (int)$res["id"];
|
||||||
$termtime ="";
|
$kopf = htmlspecialchars((string)$res["head"]);
|
||||||
$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 <br />".mysqli_error($dbconn));
|
|
||||||
$telres=mysqli_fetch_assoc($telqry);
|
$actions = "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie den Termin ".$kopf."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=terminadd&id=".$id."&del=1\")'></span>";
|
||||||
//Normale Termine anzeigen
|
$actions .= "<a href='?action=terminadd&id=".$id."&adressid=".(int)$res["adresse_id"]."'><span class='edit' title='Termin ändern'></span></a>";
|
||||||
if($res)
|
$actions .= "<a href='?action=kundenshow&id=".(int)$res["partner_id"]."'><span class='partner' title='Kunden anzeigen'></span></a>";
|
||||||
{
|
$actions .= "<a href='?action=terminshow&id=".$id."'><span class='print' title='Termin drucken'></span></a>";
|
||||||
$actions = "<span class='del' title='löschen' onClick='askdel(\"Möchten Sie den Termiiin ".htmlspecialchars($res["head"],ENT_QUOTES)."<br />wirklich <b>unwiederruflich</b> löschen?\",\"?action=terminadd&id=".$res["id"]."&del=1\")'></span>";
|
|
||||||
$actions .= "<a href='?action=terminadd&id=".$res["id"]."&adressid=".$res["adresse_id"]."'><span class='edit' title='Termin ändern'></span></a>";
|
|
||||||
$actions .= "<a href='?action=kundenshow&id=".$res["partner_id"]."'><span class='partner' title='Kunden anzeigen'></span></a>";
|
|
||||||
$actions .= "<a href='?action=terminshow&id=".$res["id"]."'><span class='print' title='Termin drucken'></span></a>";
|
|
||||||
if(!$res["done"])
|
if(!$res["done"])
|
||||||
$actions .= "<span class='check' title='Termin als erledigt markieren' onClick='askbranch(\"Möchten Sie einen Folgetermin vormerken?\",\"?action=terminadd&id=".$res["id"]."\",\"?action=terminadd&id=".$res["id"]."&done=yes\")'></span>";
|
$actions .= "<span class='check' title='Termin als erledigt markieren' onClick='askbranch(\"Möchten Sie einen Folgetermin vormerken?\",\"?action=terminadd&id=".$id."\",\"?action=terminadd&id=".$id."&done=yes\")'></span>";
|
||||||
else
|
else
|
||||||
$actions .= "<a href='?action=terminadd&id=".$res["id"]."&done=no'><span class='cross' title='Termin als nicht erledigt markieren'></span></a>";
|
$actions .= "<a href='?action=terminadd&id=".$id."&done=no'><span class='cross' title='Termin als nicht erledigt markieren'></span></a>";
|
||||||
$split_termdauer = explode(":",$res["termdauer"]);
|
|
||||||
|
|
||||||
if($res["termtime"] == "0000-00-00 00:00:00")
|
list($termtime, $termdauer) = terminZeitraum($res["termtime"], $res["termdauer"]);
|
||||||
$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)
|
$adresse = "<b>".htmlspecialchars($res["plz"]." ".$res["ort"]);
|
||||||
{
|
|
||||||
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 = "<b>".$res["plz"]." ".$res["ort"];
|
|
||||||
if($res["ortsteil"])
|
if($res["ortsteil"])
|
||||||
$adresse .= "-".$res["ortsteil"];
|
$adresse .= "-".htmlspecialchars((string)$res["ortsteil"]);
|
||||||
$adresse .= "</b><br />".$res["str"]." ".$res["hnr"];
|
$adresse .= "</b><br />".htmlspecialchars($res["str"]." ".$res["hnr"]);
|
||||||
if(isset($telres)){
|
// Nummern ohne Durchwahl-Bindestrich am Ende
|
||||||
if($res["vname"])
|
$nummern = db_wert($dbconn, "SELECT GROUP_CONCAT(nr ORDER BY id SEPARATOR ', ') FROM tel
|
||||||
$adresse .= "<br />Tel: ".$telres["nr"]."<br />(".$res["vname"]." ".$res["nname"].")";
|
WHERE partner_id = ? AND RIGHT(nr,1) != '-'", array($res["partner_id"]));
|
||||||
else if($res["nname"])
|
if($nummern)
|
||||||
$adresse .= "<br />Tel: ".$telres["nr"]."<br />(".$res["nname"].")";
|
{
|
||||||
else if($res["firma"])
|
$adresse .= "<br />Tel: ".htmlspecialchars($nummern);
|
||||||
$adresse .= "<br />Tel: ".$telres["nr"]."<br />(".$res["firma"].")";
|
if($res["vname"] || $res["nname"])
|
||||||
else
|
$adresse .= "<br />(".htmlspecialchars(trim($res["vname"]." ".$res["nname"])).")";
|
||||||
$adresse .= "<br />Tel: ".$telres["nr"];
|
elseif($res["firma"])
|
||||||
|
$adresse .= "<br />(".htmlspecialchars((string)$res["firma"]).")";
|
||||||
}
|
}
|
||||||
$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 = "<input type='checkbox' value='".$res["id"]."' id='erl".$counter."' name='erl".$counter."'></input>";
|
|
||||||
|
|
||||||
$listlines[] = array("<a href='?action=terminshow&id=".$res["id"]."'><b>".$res["typ"]."</b></a><br />".$namelist,
|
$namelist = htmlspecialchars($res["uservname"]." ".substr((string)$res["usernname"], 0, 1));
|
||||||
"<a href='?action=terminshow&id=".$res["id"]."'>".$res["head"]."</a>",
|
foreach(array(2, 3, 4) as $n)
|
||||||
$termtime,
|
if($res["user".$n])
|
||||||
$termdauer,
|
$namelist .= ", ".htmlspecialchars($res["uservname".$n]." ".substr((string)$res["usernname".$n], 0, 1));
|
||||||
$adresse,
|
|
||||||
$actions,
|
|
||||||
$checkbox
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if($termtyp == 3){
|
|
||||||
$checkbox = "<input type='checkbox' value='".$res["id"]."' id='del".$counter."' name='del".$counter."'></input>";
|
|
||||||
|
|
||||||
$listlines[] = array("<a href='?action=terminshow&id=".$res["id"]."'><b>".$res["typ"]."</b></a><br />".$namelist,
|
$zeile = array("<a href='?action=terminshow&id=".$id."'><b>".htmlspecialchars((string)$res["typ"])."</b></a><br />".$namelist,
|
||||||
"<a href='?action=terminshow&id=".$res["id"]."'>".$res["head"]."</a>",
|
"<a href='?action=terminshow&id=".$id."'>".$kopf."</a>",
|
||||||
$termtime,
|
$termtime,
|
||||||
$termdauer,
|
$termdauer,
|
||||||
$adresse,
|
$adresse,
|
||||||
$actions,
|
$actions);
|
||||||
$checkbox
|
// Registerkarte 1 hakt ab, Registerkarte 3 löscht - beides mehrfach
|
||||||
);
|
if($termtyp == 1 || $termtyp == 3)
|
||||||
|
{
|
||||||
|
$feld = $termtyp == 1 ? "erl" : "del";
|
||||||
|
$zeile[] = "<input type='checkbox' value='".$id."' id='".$feld.$counter."' name='".$feld.$counter."' />";
|
||||||
}
|
}
|
||||||
else{
|
$listlines[] = $zeile;
|
||||||
$listlines[] = array("<a href='?action=terminshow&id=".$res["id"]."'><b>".$res["typ"]."</b></a><br />".$namelist,
|
|
||||||
"<a href='?action=terminshow&id=".$res["id"]."'>".$res["head"]."</a>",
|
if($res["user2"] || $res["user3"] || $res["user4"] || !$res["color"])
|
||||||
$termtime,
|
|
||||||
$termdauer,
|
|
||||||
$adresse,
|
|
||||||
$actions
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if($res["user2"] || $res["user3"] || $res["user4"])
|
|
||||||
$colors[] = "#fff";
|
$colors[] = "#fff";
|
||||||
else if($res["color"])
|
else
|
||||||
$colors[] = $res["color"];
|
$colors[] = $res["color"];
|
||||||
else
|
}
|
||||||
$colors[] = "#fff";
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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;
|
$lastdisplay = ($page+1)*$pagesize;
|
||||||
if($numres < $lastdisplay)
|
if($numres < $lastdisplay)
|
||||||
$lastdisplay = $numres;
|
$lastdisplay = $numres;
|
||||||
@@ -169,19 +135,15 @@ if(!isset($err))
|
|||||||
else
|
else
|
||||||
ok($numres." Termine sind insgesamt gespeichert.");
|
ok($numres." Termine sind insgesamt gespeichert.");
|
||||||
|
|
||||||
displayPages($pagesize,$page,$numres,"ajax_searchterm",",$termtyp");
|
displayPages($pagesize,$page,$numres,"ajax_searchterm",",".$termtyp);
|
||||||
if($termtyp == 1){
|
if($termtyp == 1)
|
||||||
echo "<form action='?action=terminadd&id=multi&done=yes' method='post'><input type='hidden' name='pagesize' value='".$pagesize."'></input>";
|
echo "<form action='?action=terminadd&id=multi&done=yes' method='post'><input type='hidden' name='pagesize' value='".$pagesize."' />";
|
||||||
}
|
elseif($termtyp == 3)
|
||||||
else if($termtyp == 3){
|
echo "<form action='?action=terminadd&id=multi&del=1' method='post'><input type='hidden' name='pagesize' value='".$pagesize."' />";
|
||||||
echo "<form action='?action=terminadd&id=multi&del=1' method='post'><input type='hidden' name='pagesize' value='".$pagesize."'></input>";
|
displayList($headings,$listlines,array(),$colors);
|
||||||
}
|
if($termtyp == 1 || $termtyp == 3)
|
||||||
displayList($headings,$listlines,Array(),$colors);
|
echo "<input type='submit' value='Mehrfachänderung ausführen' /></form><br />";
|
||||||
if($termtyp == 1 || $termtyp == 3){
|
displayPages($pagesize,$page,$numres,"ajax_searchterm",",".$termtyp);
|
||||||
echo "<input type='submit' value='Mehrfachänderung ausführen'></input></form><br />";
|
|
||||||
}
|
|
||||||
displayPages($pagesize,$page,$numres,"ajax_searchterm",",$termtyp");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
+48
-27
@@ -285,15 +285,24 @@ 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)
|
function createTermQry($page,$pagesize,$src,$combiner,$termtyp)
|
||||||
{
|
{
|
||||||
|
$combiner = $combiner == "OR" ? "OR" : "AND";
|
||||||
$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,
|
$params = array();
|
||||||
adresse.firma as firma,
|
$query = "SELECT termin.id, termtyp.typ, termin.head, MIN(termtime) AS termtime,
|
||||||
user.vname as uservname, user.nname as usernname, user.color as color,
|
SEC_TO_TIME(SUM(TIME_TO_SEC(termdauer))) AS termdauer,
|
||||||
user2.vname as uservname2, user2.nname as usernname2,
|
user, user2, user3, user4, done, partner_id, adresse_id, main_id,
|
||||||
user3.vname as uservname3, user3.nname as usernname3,
|
str, ort, ortsteil, plz, hnr, adresse.vname AS vname, adresse.nname AS nname,
|
||||||
user4.vname as uservname4, user4.nname as usernname4,
|
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
|
firma, vname2, nname2
|
||||||
FROM termin
|
FROM termin
|
||||||
LEFT JOIN termtyp ON termin.typ = termtyp.id
|
LEFT JOIN termtyp ON termin.typ = termtyp.id
|
||||||
@@ -306,39 +315,50 @@ function createTermQry($page,$pagesize,$src,$combiner,$termtyp)
|
|||||||
LEFT JOIN user AS user3 ON termin.user3 = user3.id
|
LEFT JOIN user AS user3 ON termin.user3 = user3.id
|
||||||
LEFT JOIN user AS user4 ON termin.user4 = user4.id
|
LEFT JOIN user AS user4 ON termin.user4 = user4.id
|
||||||
WHERE ";
|
WHERE ";
|
||||||
if($termtyp == 1)
|
switch((int)$termtyp)
|
||||||
$query .= "termdauer != '24:00:00' AND termtime != '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
|
{
|
||||||
elseif($termtyp == 2)
|
case 2:
|
||||||
$query .= "termdauer != '24:00:00' AND termtime = '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
|
$query .= "termdauer != '24:00:00' AND termtime = '0000-00-00 00:00:00' AND done = 0 AND act_date < NOW()";
|
||||||
elseif($termtyp == 3)
|
break;
|
||||||
|
case 3:
|
||||||
$query .= "termdauer != '24:00:00' AND done = 1 AND act_date < NOW()";
|
$query .= "termdauer != '24:00:00' AND done = 1 AND act_date < NOW()";
|
||||||
elseif($termtyp == 4)
|
break;
|
||||||
|
case 4:
|
||||||
$query .= "termdauer != '24:00:00' AND act_date > NOW()";
|
$query .= "termdauer != '24:00:00' AND act_date > NOW()";
|
||||||
elseif($termtyp == 5)
|
break;
|
||||||
|
case 5:
|
||||||
$query .= "termdauer = '24:00:00'";
|
$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)
|
foreach($src AS $tag)
|
||||||
{
|
{
|
||||||
$tag = "%".$tag."%";
|
$tag = "%".$tag."%";
|
||||||
$query .= " $combiner (termin.head LIKE '$tag' OR
|
$query .= " $combiner (termin.head LIKE ? OR
|
||||||
termin.text LIKE '$tag' OR
|
termin.text LIKE ? OR
|
||||||
adresse.firma LIKE '$tag' OR
|
adresse.firma LIKE ? OR
|
||||||
adresse.vname LIKE '$tag' OR
|
adresse.vname LIKE ? OR
|
||||||
adresse.nname LIKE '$tag' OR
|
adresse.nname LIKE ? OR
|
||||||
ort LIKE '$tag' OR
|
ort LIKE ? OR
|
||||||
plz LIKE '$tag' OR
|
plz LIKE ? OR
|
||||||
str LIKE '$tag' OR
|
str LIKE ? OR
|
||||||
DATE_FORMAT(termtime, '%d.%m.%Y %H:%i') LIKE '$tag')";
|
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";
|
$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";
|
$query .= " GROUP BY main_id ORDER BY termtime ASC";
|
||||||
else
|
else
|
||||||
$query .= " GROUP BY main_id ORDER BY termtime DESC";
|
$query .= " GROUP BY main_id ORDER BY termtime DESC";
|
||||||
|
|
||||||
$ret["all"] = $query;
|
$ret["all"] = $query;
|
||||||
$query .= " LIMIT ".$page*$pagesize.", $pagesize";
|
$ret["limited"] = $query." LIMIT ".((int)$page*(int)$pagesize).", ".(int)$pagesize;
|
||||||
$ret["limited"] = $query;
|
$ret["params"] = $params;
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -502,7 +522,8 @@ function displayList($header,$entries,$speciallines=array(),$colors=array())
|
|||||||
echo "<tr style='background-color: #e2e2e2;'>";
|
echo "<tr style='background-color: #e2e2e2;'>";
|
||||||
|
|
||||||
if(isset($colors[$i]))
|
if(isset($colors[$i]))
|
||||||
echo "<td bgcolor='".$colors[$i]."' style='box-shadow: inset 0 0 0.7em #000; border: 1px solid black; border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em;'></td>";
|
// die Farbe kommt aus der Benutzerverwaltung, nicht aus dem Code
|
||||||
|
echo "<td bgcolor='".htmlspecialchars((string)$colors[$i])."' style='box-shadow: inset 0 0 0.7em #000; border: 1px solid black; border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em;'></td>";
|
||||||
|
|
||||||
foreach($entry AS $element)
|
foreach($entry AS $element)
|
||||||
{
|
{
|
||||||
|
|||||||
+50
-80
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
require_once(__DIR__."/db.php");
|
||||||
require_once('tcpdf/tcpdf.php');
|
require_once('tcpdf/tcpdf.php');
|
||||||
|
|
||||||
// Unicode-Schriften statt der eingebauten PDF-Schriften Times/Helvetica: Die kennen
|
// Unicode-Schriften statt der eingebauten PDF-Schriften Times/Helvetica: Die kennen
|
||||||
@@ -1332,9 +1333,10 @@ function makesingleterminpage($pdf,$termin,$adresse,$telnrn,$anfahrt,$googleadre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Die Daten eines Termins fuer den Terminzettel */
|
||||||
function maketerminarray($dbconn,$id)
|
function maketerminarray($dbconn,$id)
|
||||||
{
|
{
|
||||||
$qry = mysqli_query($dbconn,"SELECT head, user, text, termin.id, termtime, termtyp.typ AS typ, termdauer, str, ort, hnr, plz, partner_id, land,
|
$res = db_zeile($dbconn,"SELECT head, user, text, termin.id, termtime, termtyp.typ AS typ, termdauer, str, ort, hnr, plz, partner_id, land,
|
||||||
adresse.vname AS vname, adresse.nname AS nname, titel_id, titel2_id, anrede_id, anrede2_id, vname2, nname2, zusatz,
|
adresse.vname AS vname, adresse.nname AS nname, titel_id, titel2_id, anrede_id, anrede2_id, vname2, nname2, zusatz,
|
||||||
user.vname as uservname, user.nname as usernname,
|
user.vname as uservname, user.nname as usernname,
|
||||||
user2.vname as uservname2, user2.nname as usernname2,
|
user2.vname as uservname2, user2.nname as usernname2,
|
||||||
@@ -1350,72 +1352,38 @@ function maketerminarray($dbconn,$id)
|
|||||||
LEFT JOIN user AS user2 ON termin.user2 = user2.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 user3 ON termin.user3 = user3.id
|
||||||
LEFT JOIN user AS user4 ON termin.user4 = user4.id
|
LEFT JOIN user AS user4 ON termin.user4 = user4.id
|
||||||
WHERE termin.id = $id") or $err = error("Fehler beim ermitteln der Termindaten<br />".mysqli_error($dbconn));
|
WHERE termin.id = ?", array($id));
|
||||||
$res = mysqli_fetch_assoc($qry);
|
if(!$res)
|
||||||
|
{
|
||||||
$qry = mysqli_query($dbconn,"SELECT anrede
|
error("Fehler beim ermitteln der Termindaten<br />".mysqli_error($dbconn));
|
||||||
FROM anrede
|
return array();
|
||||||
WHERE id = '".$res["anrede_id"]."'") or $err = error("Fehler beim ermitteln der Anrede<br />".mysqli_error($dbconn));
|
}
|
||||||
$res2 = mysqli_fetch_assoc($qry);
|
$anrs = db_zuordnung($dbconn, "SELECT id, anrede FROM anrede") ?: array();
|
||||||
$res["anrede"] = $res2["anrede"];
|
$titels = db_zuordnung($dbconn, "SELECT id, titel FROM titel") ?: array();
|
||||||
|
$res["anrede"] = $anrs[$res["anrede_id"]] ?? "";
|
||||||
$qry = mysqli_query($dbconn,"SELECT anrede
|
$res["anrede2"] = $anrs[$res["anrede2_id"]] ?? "";
|
||||||
FROM anrede
|
$res["titel"] = $titels[$res["titel_id"]] ?? "";
|
||||||
WHERE id = '".$res["anrede2_id"]."'") or $err = error("Fehler beim ermitteln der Anrede2<br />".mysqli_error($dbconn));
|
$res["titel2"] = $titels[$res["titel2_id"]] ?? "";
|
||||||
$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<br />".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<br />".mysqli_error($dbconn));
|
|
||||||
$res2 = mysqli_fetch_assoc($qry);
|
|
||||||
$res["titel2"] = $res2["titel"];
|
|
||||||
|
|
||||||
return $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
function maketerminadresse($dbconn,$termid)
|
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
|
$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
|
FROM termin
|
||||||
JOIN adresse ON termin.adresse_id = adresse.id
|
JOIN adresse ON termin.adresse_id = adresse.id
|
||||||
JOIN strasse ON strasse.id = str_id
|
JOIN strasse ON strasse.id = str_id
|
||||||
JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_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<br />".mysqli_error($dbconn));
|
WHERE termin.id = ?", array($termid));
|
||||||
|
if(!$adresse)
|
||||||
|
|
||||||
$adresse = mysqli_fetch_assoc($qry);
|
|
||||||
|
|
||||||
$qry = mysqli_query($dbconn,"SELECT * FROM anrede");
|
|
||||||
while($res=mysqli_fetch_assoc($qry))
|
|
||||||
{
|
{
|
||||||
$anrs[$res["id"]] = $res["anrede"];
|
error("Fehler beim ermitteln der Adressdaten<br />".mysqli_error($dbconn));
|
||||||
|
$adresse = array();
|
||||||
}
|
}
|
||||||
|
// ADRFIELD_* stehen in incs/constants.php
|
||||||
$qry = mysqli_query($dbconn,"SELECT * FROM titel");
|
$anrs = db_zuordnung($dbconn, "SELECT id, anrede FROM anrede") ?: array();
|
||||||
while($res=mysqli_fetch_assoc($qry))
|
$titels = db_zuordnung($dbconn, "SELECT id, titel FROM titel") ?: array();
|
||||||
{
|
|
||||||
$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);
|
|
||||||
|
|
||||||
$adressfields = "";
|
$adressfields = "";
|
||||||
if($adresse["firma"])
|
if($adresse["firma"])
|
||||||
@@ -1800,50 +1768,52 @@ define("ADRFIELD_LAND", 10);
|
|||||||
|
|
||||||
function maketelnrn($dbconn,$termid)
|
function maketelnrn($dbconn,$termid)
|
||||||
{
|
{
|
||||||
$qry=mysqli_query($dbconn,"SELECT partner_id, adresse_id
|
$telstr = "";
|
||||||
|
$adresse = db_zeile($dbconn,"SELECT partner_id, adresse_id
|
||||||
FROM termin
|
FROM termin
|
||||||
JOIN adresse ON termin.adresse_id = adresse.id
|
JOIN adresse ON termin.adresse_id = adresse.id
|
||||||
WHERE termin.id = $termid") or $err= error("Fehler beim ermitteln der Adressdaten<br />".mysqli_error($dbconn));
|
WHERE termin.id = ?", array($termid));
|
||||||
|
if($adresse)
|
||||||
|
|
||||||
if($adresse = mysqli_fetch_assoc($qry))
|
|
||||||
{
|
{
|
||||||
$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");
|
$zeilen = db_zeilen($dbconn,"SELECT name, typ, tel.id, nr, ort, ortsteil, plz, vwahl FROM tel
|
||||||
while($res=mysqli_fetch_assoc($qry))
|
LEFT JOIN teltyp ON tel.typ_id = teltyp.id
|
||||||
{
|
LEFT JOIN ort ON tel.ort_id = ort.id
|
||||||
$telstr .= trim($res["typ"]).": "." (".$res["vwahl"].") ".$res["nr"]." in ".$res["ort"]."(".$res["name"].")\n";
|
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"]));
|
||||||
$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");
|
foreach((array)$zeilen as $res)
|
||||||
while($res=mysqli_fetch_assoc($qry))
|
$telstr .= trim($res["typ"]).": "." (".$res["vwahl"].") ".$res["nr"]." in ".$res["ort"]."(".$res["name"].")\\n";
|
||||||
{
|
$zeilen = db_zeilen($dbconn,"SELECT kontakt, typ FROM kontakt
|
||||||
$telstr .= trim($res["typ"]).": ".$res["kontakt"]."\n";
|
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;
|
return $telstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeadrtelnrn($dbconn,$partnerid)
|
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");
|
$telstr = "";
|
||||||
while($res=mysqli_fetch_assoc($qry))
|
$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
|
||||||
$telstr .= trim($res["typ"]).": "."(".$res["vwahl"].")".$res["nr"].",".$res["ort"]."(".$res["name"].")\n";
|
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;
|
return $telstr;
|
||||||
}
|
}
|
||||||
|
|
||||||
function makegooglestring($dbconn,$termid)
|
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
|
$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
|
FROM termin
|
||||||
JOIN adresse ON termin.adresse_id = adresse.id
|
JOIN adresse ON termin.adresse_id = adresse.id
|
||||||
JOIN strasse ON strasse.id = str_id
|
JOIN strasse ON strasse.id = str_id
|
||||||
JOIN ort ON ort.id = ort_id JOIN land ON land.id = land_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<br />".mysqli_error($dbconn));
|
WHERE termin.id = ?", array($termid));
|
||||||
|
if($adresse)
|
||||||
|
|
||||||
if($adresse = mysqli_fetch_assoc($qry))
|
|
||||||
{
|
{
|
||||||
$googlestr = "http://maps.googleapis.com/maps/api/staticmap";
|
$googlestr = "http://maps.googleapis.com/maps/api/staticmap";
|
||||||
$googlestr .= "?markers=color:blue|label:A|";
|
$googlestr .= "?markers=color:blue|label:A|";
|
||||||
|
|||||||
+554
@@ -0,0 +1,554 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Termine: Kalenderansicht, Terminliste, Anlegen, Ändern und Löschen.
|
||||||
|
*
|
||||||
|
* Ein Termin über mehrere Tage wird als Reihe einzelner Zeilen gespeichert,
|
||||||
|
* die alle dasselbe `main_id` tragen - die id der ersten Zeile. Der Kalender
|
||||||
|
* zeigt die Zeilen einzeln, die Liste fasst sie über `main_id` zusammen.
|
||||||
|
*
|
||||||
|
* Urlaub und Krankheit sind Termine ohne Kunden. Ihre Typ-ids stehen seit
|
||||||
|
* jeher fest im Code (auch in `incs/users.php` bei der Urlaubsberechnung und
|
||||||
|
* in `templates/addtermin.tpl`).
|
||||||
|
*/
|
||||||
|
require_once(__DIR__."/db.php");
|
||||||
|
require_once(__DIR__."/saveNchange.php");
|
||||||
|
|
||||||
|
define("TERMTYP_URLAUB", 0);
|
||||||
|
define("TERMTYP_KRANKHEIT", 5);
|
||||||
|
|
||||||
|
/* Ganztägige Termine bekommen diese Dauer; die Terminliste filtert darauf */
|
||||||
|
define("TERMIN_GANZTAG", "24:00:00");
|
||||||
|
|
||||||
|
/* Leerwerte der NOT-NULL-Spalten - der strikte Modus lehnt '' dort ab */
|
||||||
|
define("TERMIN_KEIN_DATUM", "0000-00-00 00:00:00");
|
||||||
|
define("TERMIN_KEINE_DAUER", "00:00:00");
|
||||||
|
|
||||||
|
/* Urlaub und Krankheit laufen immer über ganze Tage */
|
||||||
|
function terminIstGanztaegig($typ)
|
||||||
|
{
|
||||||
|
return $typ == TERMTYP_URLAUB || $typ == TERMTYP_KRANKHEIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
* Formularwerte
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Die Felder aus addtermin.tpl. `datetime_start` und `datetime_end` kommen
|
||||||
|
* in deutscher Schreibweise ("24.12.2026 um 09:30") und werden hier schon
|
||||||
|
* in das Datenbankformat gebracht.
|
||||||
|
*/
|
||||||
|
function terminFormularwerte()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
"head" => 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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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:<br />".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)."<br/>" : wochentag($zeitpunkt)."<br/>".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;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
+12
-135
@@ -1,148 +1,25 @@
|
|||||||
<?php
|
<?php
|
||||||
require_once("incs/users.php");
|
require_once "incs/termin.php";
|
||||||
$_SESSION["camefrom"] = "termin&show=".$_GET["show"]."&page=".$_GET["page"];
|
require_once "incs/users.php";
|
||||||
|
|
||||||
if($_GET["show"] == "list")
|
$seite = parameterGanzzahl("page");
|
||||||
|
$_SESSION["camefrom"] = "termin&show=".(isset($_GET["show"]) && $_GET["show"] == "list" ? "list" : "")."&page=".$seite;
|
||||||
|
|
||||||
|
if(isset($_GET["show"]) && $_GET["show"] == "list")
|
||||||
{
|
{
|
||||||
|
$smarty->assign("heading", "Terminliste");
|
||||||
$smarty->assign("heading","Terminliste");
|
$smarty->assign("tabs", parameterGanzzahl("tabs") ?: ($_SESSION["termtyp"] ?? 1));
|
||||||
if($_GET["tabs"])
|
|
||||||
$smarty->assign("tabs",$_GET["tabs"]);
|
|
||||||
else
|
|
||||||
$smarty->assign("tabs",$_SESSION["termtyp"]);
|
|
||||||
$smarty->display("heading.tpl");
|
$smarty->display("heading.tpl");
|
||||||
$smarty->display("termlist.tpl");
|
$smarty->display("termlist.tpl");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$smarty->assign("heading","Termine");
|
$smarty->assign("heading", "Termine");
|
||||||
$smarty->display("heading.tpl");
|
$smarty->display("heading.tpl");
|
||||||
|
|
||||||
//$colors = array("#f00","#0c0","#ff0","#90c","#0bb","#066","#09f","#f60","#00f","#f09");
|
$smarty->assign("page", $seite);
|
||||||
|
$smarty->assign("weekdays", kalenderTage($dbconn, $seite));
|
||||||
//$weather = GetWeather();
|
$smarty->assign("users", kalenderBenutzer($dbconn));
|
||||||
//$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<br />".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<br />".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<br />".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<br />".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"))."<br/>",
|
|
||||||
"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"))."<br/>".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->display("calendar.tpl");
|
$smarty->display("calendar.tpl");
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|||||||
+62
-393
@@ -1,422 +1,91 @@
|
|||||||
<?php
|
<?php
|
||||||
|
require_once "incs/termin.php";
|
||||||
|
|
||||||
if($_GET["id"] && $_GET["del"] == 1)
|
/*
|
||||||
|
* Termin anlegen, ändern, löschen oder als erledigt markieren.
|
||||||
|
*
|
||||||
|
* Die Terminliste kann mehrere Termine auf einmal abhaken oder löschen;
|
||||||
|
* dafür kommt id=multi und je Zeile ein Ankreuzfeld erl<N> bzw. del<N>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Die angekreuzten Termine einer Mehrfachauswahl */
|
||||||
|
function angekreuzteTermine($praefix)
|
||||||
{
|
{
|
||||||
if($_GET["id"] == "multi"){
|
$ids = array();
|
||||||
for( $i=1; $i<=$_POST["pagesize"]; $i++){
|
$anzahl = isset($_POST["pagesize"]) ? (int)$_POST["pagesize"] : 0;
|
||||||
mysqli_query($dbconn,"DELETE FROM termin WHERE id='".$_POST["del".$i]."'") or $err=error("Konnte Haupttermin nicht löschen<br />".mysqli_error($dbconn));
|
for($i = 1; $i <= $anzahl; $i++)
|
||||||
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".$_POST["del".$i]."'" or $err=error("Konnte Nebentermine nicht löschen<br />".mysqli_error($dbconn)));
|
if(!empty($_POST[$praefix.$i]))
|
||||||
}
|
$ids[] = (int)$_POST[$praefix.$i];
|
||||||
if(!$err)
|
return $ids;
|
||||||
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<br />".mysqli_error($dbconn));
|
$mehrfach = isset($_GET["id"]) && $_GET["id"] === "multi";
|
||||||
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".$res["id"]."'" or $err=error("Konnte Nebentermine nicht löschen<br />".mysqli_error($dbconn)));
|
$terminid = parameterGanzzahl("id");
|
||||||
|
$adressid = parameterGanzzahl("adressid");
|
||||||
|
$err = 0;
|
||||||
|
|
||||||
|
if(($mehrfach || $terminid) && parameterGanzzahl("del") == 1)
|
||||||
|
{
|
||||||
|
foreach($mehrfach ? angekreuzteTermine("del") : array($terminid) as $id)
|
||||||
if(!$err)
|
if(!$err)
|
||||||
|
$err = loescheTerminreihe($dbconn, $id);
|
||||||
|
if(!$err)
|
||||||
|
{
|
||||||
doneNreturn("Erfolgreich gelöscht");
|
doneNreturn("Erfolgreich gelöscht");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif($_GET["id"] && $_GET["done"])
|
elseif(($mehrfach || $terminid) && !empty($_GET["done"]))
|
||||||
{
|
{
|
||||||
if($_GET["id"] == "multi"){
|
$erledigt = $_GET["done"] != "no";
|
||||||
for( $i=1; $i<=$_POST["pagesize"]; $i++){
|
foreach($mehrfach ? angekreuzteTermine("erl") : array($terminid) as $id)
|
||||||
mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE id='".$_POST["erl".$i]."'") or $err+=error("Konnte Haupttermin nicht als erledigt markieren<br />".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<br />".mysqli_error($dbconn));
|
|
||||||
}
|
|
||||||
if(!$err)
|
if(!$err)
|
||||||
doneNreturn("Erfolgreich geändert!");
|
$err = setzeTerminErledigt($dbconn, $id, $erledigt);
|
||||||
}
|
|
||||||
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<br />".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<br />".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<br />".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<br />".mysqli_error($dbconn));
|
|
||||||
}
|
|
||||||
if(!$err)
|
if(!$err)
|
||||||
|
{
|
||||||
doneNreturn("Erfolgreich geändert!");
|
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
|
$kunde = terminAdresse($dbconn, $adressid);
|
||||||
FROM adresse
|
if(empty($kunde["partner_id"]))
|
||||||
LEFT JOIN strasse ON str_id = strasse.id
|
$adressid = 0;
|
||||||
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"])
|
if(!$err && parameterGanzzahl("formsent") == 1)
|
||||||
{
|
{
|
||||||
$_GET["adressid"] = 0;
|
$err = speichereTermin($dbconn, $terminid, $adressid);
|
||||||
}
|
|
||||||
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<br />".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<br />".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<br />".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<br />".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<br />".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<br />".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<br />".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<br />".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<br />".mysqli_error($dbconn));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!$err)
|
if(!$err)
|
||||||
{
|
{
|
||||||
doneNreturn("Erfolgreich eingetragen");
|
doneNreturn("Erfolgreich eingetragen");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
// bei einem Fehler die Eingaben im Formular stehen lassen
|
||||||
if($err){
|
$smarty->assign("termin", $_POST);
|
||||||
$smarty->assign("termin",$_POST);
|
}
|
||||||
}
|
|
||||||
//elseif(!$head)
|
|
||||||
// $err=error("Bitte geben Sie eine Terminbeschreibung an!");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
terminAuswahllisten($dbconn, $smarty);
|
||||||
|
$smarty->assign("kunde", $kunde);
|
||||||
|
$smarty->assign("user", parameterGanzzahl("user"));
|
||||||
|
|
||||||
$qry = mysqli_query($dbconn,"SELECT id, typ
|
if($terminid && !$err)
|
||||||
FROM termtyp WHERE id > 0") or $err = error("Fehler beim abrufen der Termintypen<br />".mysqli_error($dbconn));
|
{
|
||||||
while($res = mysqli_fetch_assoc($qry))
|
$termin = terminZumBearbeiten($dbconn, $terminid);
|
||||||
{
|
if(!$termin)
|
||||||
$typids[] =$res["id"];
|
$err = error("Dieser Termin existiert nicht!");
|
||||||
$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<br />".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
|
else
|
||||||
{
|
{
|
||||||
$err=error("Dieser Termin existiert nicht!");
|
$smarty->assign("termin", $termin);
|
||||||
|
$smarty->assign("heading", $adressid ? "Termin ändern" : "Urlaub / Krankheit ändern");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
elseif(!$terminid)
|
||||||
{
|
{
|
||||||
|
if(!$err)
|
||||||
$smarty->assign("termin",$_POST);
|
$smarty->assign("termin", $_POST);
|
||||||
|
$smarty->assign("heading", $adressid ? "Neuer Termin" : "Neuer Urlaub / Krankheitstag");
|
||||||
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<br />".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");
|
|
||||||
|
|
||||||
|
|
||||||
|
$smarty->display("heading.tpl");
|
||||||
|
$smarty->display("addtermin.tpl");
|
||||||
?>
|
?>
|
||||||
+32
-58
@@ -1,71 +1,45 @@
|
|||||||
<?php
|
<?php
|
||||||
// GET: id OR date;type
|
/*
|
||||||
|
* Terminzettel als PDF: eine Seite je Termin, einmal zum Abheften und
|
||||||
|
* einmal mit Anfahrtsskizze. Aufruf entweder mit id (ein Termin) oder mit
|
||||||
|
* date (alle Termine eines Tages).
|
||||||
|
*/
|
||||||
|
require_once "incs/termin.php";
|
||||||
include("incs/makepdf.php");
|
include("incs/makepdf.php");
|
||||||
|
|
||||||
$pdf = makerawPDFcopy(0);
|
$terminid = parameterGanzzahl("id");
|
||||||
if($_GET["id"] && !$_GET["date"])
|
$datum = isset($_GET["date"]) && is_string($_GET["date"]) ? date("Y-m-d", strtotime($_GET["date"])) : "";
|
||||||
|
|
||||||
|
$ids = array();
|
||||||
|
if($terminid && !$datum)
|
||||||
|
$ids[] = $terminid;
|
||||||
|
elseif($datum)
|
||||||
{
|
{
|
||||||
$termin=maketerminarray($dbconn, $_GET["id"]);
|
$zeilen = db_zeilen($dbconn, "SELECT id FROM termin WHERE adresse_id != 0 AND DATE(termtime) = ? ORDER BY termtime ASC", array($datum));
|
||||||
$adresse=maketerminadresse($dbconn, $_GET["id"]);
|
foreach((array)$zeilen as $z)
|
||||||
$telnrn=maketelnrn($dbconn,$_GET["id"]);
|
$ids[] = $z["id"];
|
||||||
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
|
|
||||||
}
|
}
|
||||||
elseif($_GET["date"])
|
|
||||||
|
/* $anfahrt = 0 für den Terminzettel, 1 für die Seite mit der Karte */
|
||||||
|
function terminzettel($dbconn, $ids, $anfahrt)
|
||||||
{
|
{
|
||||||
$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");
|
$pdf = $anfahrt ? makerawPDFanfahrt(0) : makerawPDFcopy(0);
|
||||||
if($_GET["type"]="singlepages")
|
$erste = true;
|
||||||
|
foreach($ids as $id)
|
||||||
{
|
{
|
||||||
$prevpage=0;
|
if(!$erste)
|
||||||
while($res=mysqli_fetch_assoc($qry))
|
|
||||||
{
|
|
||||||
if($prevpage)
|
|
||||||
$pdf->addpage();
|
$pdf->addpage();
|
||||||
$prevpage=1;
|
$erste = false;
|
||||||
$termin=maketerminarray($dbconn, $res["id"]);
|
$googleadresse = $anfahrt ? makegooglestring($dbconn, $id) : "";
|
||||||
$adresse=maketerminadresse($dbconn, $res["id"]);
|
makesingleterminpage($pdf, maketerminarray($dbconn, $id), maketerminadresse($dbconn, $id),
|
||||||
$telnrn=maketelnrn($dbconn,$res["id"]);
|
maketelnrn($dbconn, $id), $anfahrt, $googleadresse);
|
||||||
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
$name = str_replace(array(" ", "."), array("_", "_"), microtime());
|
||||||
|
savePDF($pdf, "./temp/pdftemp/$name.pdf");
|
||||||
|
return "./temp/pdftemp/$name.pdf";
|
||||||
}
|
}
|
||||||
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
|
|
||||||
savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf");
|
|
||||||
$smarty->assign("pdffile","./temp/pdftemp/$tmppdfname.pdf");
|
|
||||||
|
|
||||||
$pdf = makerawPDFanfahrt(0);
|
|
||||||
if($_GET["id"] && !$_GET["date"])
|
|
||||||
{
|
|
||||||
$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);
|
|
||||||
}
|
|
||||||
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");
|
|
||||||
|
|
||||||
|
$smarty->assign("pdffile", terminzettel($dbconn, $ids, 0));
|
||||||
|
$smarty->assign("pdffile2", terminzettel($dbconn, $ids, 1));
|
||||||
$smarty->display("terminshow.tpl");
|
$smarty->display("terminshow.tpl");
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
<h2>Termin für Kunde Nummer:</h2>
|
<h2>Termin für Kunde Nummer:</h2>
|
||||||
<span class='big'>{$kunde.partner_id}</span><br />
|
<span class='big'>{$kunde.partner_id}</span><br />
|
||||||
{$kunde.vname} {$kunde.nname} {$kunde.firma}<br />{$kunde.str} {$kunde.hnr}<br />{$kunde.plz} {$kunde.ort}
|
{$kunde.vname|escape} {$kunde.nname|escape} {$kunde.firma|escape}<br />{$kunde.str|escape} {$kunde.hnr|escape}<br />{$kunde.plz|escape} {$kunde.ort|escape}
|
||||||
{/if}
|
{/if}
|
||||||
{if $user}
|
{if $user}
|
||||||
{$termin.user = $user}
|
{$termin.user = $user}
|
||||||
@@ -45,10 +45,10 @@
|
|||||||
</select><br />
|
</select><br />
|
||||||
{/if}
|
{/if}
|
||||||
<label>Beschreibung:</label>
|
<label>Beschreibung:</label>
|
||||||
<input name='head' id='head' maxlength='100' value='{$termin.head}' />
|
<input name='head' id='head' maxlength='100' value='{$termin.head|escape}' />
|
||||||
<br />
|
<br />
|
||||||
<label kundeclass='artlabel'>Notizen:</label>
|
<label kundeclass='artlabel'>Notizen:</label>
|
||||||
<textarea class='bigtextarea' id='text' name='text'>{$termin.text}</textarea><p>
|
<textarea class='bigtextarea' id='text' name='text'>{$termin.text|escape}</textarea><p>
|
||||||
<label class='checktext'><input type="checkbox" id='done' name="done" value="1" {if $termin.done == 1}checked="checked"{/if} />Termin ist erledigt</label>
|
<label class='checktext'><input type="checkbox" id='done' name="done" value="1" {if $termin.done == 1}checked="checked"{/if} />Termin ist erledigt</label>
|
||||||
</p>
|
</p>
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
+15
-15
@@ -50,9 +50,9 @@
|
|||||||
{foreach $weekday.fulldaytermine as $key=>$termin}
|
{foreach $weekday.fulldaytermine as $key=>$termin}
|
||||||
<a href='?action=terminshow&id={$termin.main_id}'>
|
<a href='?action=terminshow&id={$termin.main_id}'>
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift + $dayXpos}em;background-color: {$users.{$termin.user}.color};'
|
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift + $dayXpos}em;background-color: {$users.{$termin.user}.color|escape};'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname|escape} {$termin.usernname|escape}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'>
|
||||||
<span class='rotate' style='padding-top: {$shift}em;'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate' style='padding-top: {$shift}em;'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{$shift = $shift+1.1}
|
{$shift = $shift+1.1}
|
||||||
@@ -107,19 +107,19 @@
|
|||||||
|
|
||||||
{if {$termin.typ} != 'Arbeitsleistung'}
|
{if {$termin.typ} != 'Arbeitsleistung'}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: {$width-0.3}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.1 + $shift}em;background-color: {$users.{$termin.user}.color}'
|
style='width: {$width-0.3}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.1 + $shift}em;background-color: {$users.{$termin.user}.color|escape}'
|
||||||
title='
|
title='
|
||||||
{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br />
|
{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname|escape} {$termin.usernname|escape}</b><br />
|
||||||
Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if}
|
Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br />
|
{if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br />
|
||||||
<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />
|
<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />
|
||||||
Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
|
Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'>
|
||||||
{else}
|
{else}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
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}{/if};'
|
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} - {$termin.firma} {$termin.vname} {$termin.nname}<br /> <b>{$termin.projectname}</b> <br /> {$termin.head}<br /> <b>Dauer: </b>{$termin.termdauer|string_format:"%.1f"}h'>
|
title='{$termin.typ|escape} - {$termin.firma|escape} {$termin.vname|escape} {$termin.nname|escape}<br /> <b>{$termin.projectname|escape}</b> <br /> {$termin.head|escape}<br /> <b>Dauer: </b>{$termin.termdauer|string_format:"%.1f"}h'>
|
||||||
{/if}
|
{/if}
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
@@ -133,9 +133,9 @@
|
|||||||
{$width = 9}
|
{$width = 9}
|
||||||
{$start = $ma_nr + 0.5}
|
{$start = $ma_nr + 0.5}
|
||||||
<div class='mabox'
|
<div class='mabox'
|
||||||
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.5}em;background-color: {$mitarb.color};'
|
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$dayXpos+ 0.5}em;background-color: {$mitarb.color|escape};'
|
||||||
title='{$mitarb.vname} {$mitarb.nname} - Anwesend {if {$mitarb.complete} == 0} aber noch nicht ausgestempelt{/if}<br />'>
|
title='{$mitarb.vname|escape} {$mitarb.nname|escape} - Anwesend {if {$mitarb.complete} == 0} aber noch nicht ausgestempelt{/if}<br />'>
|
||||||
{if {$mitarb.complete} == 0}<font color='#aa0000'>{else}<font color='#000000'>{/if}{$mitarb.vname} {$mitarb.nname|substr:0:1}.</font>
|
{if {$mitarb.complete} == 0}<font color='#aa0000'>{else}<font color='#000000'>{/if}{$mitarb.vname|escape} {$mitarb.nname|substr:0:1|escape}.</font>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
@@ -169,9 +169,9 @@
|
|||||||
</div>
|
</div>
|
||||||
{foreach $users as $user}
|
{foreach $users as $user}
|
||||||
{if $user.openvacation < 0}
|
{if $user.openvacation < 0}
|
||||||
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color}'>{$user.vname} {$user.nname} <font color='#cc0000'><b>({$user.openvacation})</b></font></span></a>
|
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color|escape}'>{$user.vname|escape} {$user.nname|escape} <font color='#cc0000'><b>({$user.openvacation|escape})</b></font></span></a>
|
||||||
{else}
|
{else}
|
||||||
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color}'>{$user.vname} {$user.nname} <b>({$user.openvacation})</b></span></a>
|
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color|escape}'>{$user.vname|escape} {$user.nname|escape} <b>({$user.openvacation|escape})</b></span></a>
|
||||||
{/if}
|
{/if}
|
||||||
{/foreach}
|
{/foreach}
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -104,9 +104,9 @@
|
|||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
<a href='?action=terminshow&id={$termin.main_id}'>
|
<a href='?action=terminshow&id={$termin.main_id}'>
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user}.color}'
|
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user}.color|escape}'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname|escape} {$termin.usernname|escape}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'>
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{else}
|
{else}
|
||||||
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
||||||
@@ -124,24 +124,24 @@
|
|||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
{if {$termin.typ} != 'Arbeitsleistung'}
|
{if {$termin.typ} != 'Arbeitsleistung'}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user}.color}'
|
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user}.color|escape}'
|
||||||
title='
|
title='
|
||||||
{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname} {$termin.usernname}</b><br />
|
{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname|escape} {$termin.usernname|escape}</b><br />
|
||||||
Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />Dauer {if {$termin.termdauer|date_format:'%k'} > 0} {$termin.termdauer|date_format:'%k'}h{/if}
|
Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br />
|
{if {$termin.termdauer|date_format:'%M'} > 0}{$termin.termdauer|date_format:'%M'}min{/if}<br />
|
||||||
<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />
|
<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />
|
||||||
Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
|
Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'>
|
||||||
{else}
|
{else}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: {$width/3}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {if $termin.done}#CFC{else}{$users.{$termin.user}.color}{/if}'
|
style='width: {$width/3}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {if $termin.done}#CFC{else}{$users.{$termin.user}.color|escape}{/if}'
|
||||||
title='
|
title='
|
||||||
{$termin.typ} -
|
{$termin.typ|escape} -
|
||||||
{$termin.firma} {$termin.vname} {$termin.nname}<br />
|
{$termin.firma|escape} {$termin.vname|escape} {$termin.nname|escape}<br />
|
||||||
<b>{$termin.projectname}</b> <br />
|
<b>{$termin.projectname|escape}</b> <br />
|
||||||
{$termin.head}<br />
|
{$termin.head|escape}<br />
|
||||||
<b>Dauer: </b>{if {$termin.termdauer} > 1} {$termin.termdauer|string_format:"%.1f"}h{/if}<br />
|
<b>Dauer: </b>{if {$termin.termdauer} > 1} {$termin.termdauer|string_format:"%.1f"}h{/if}<br />
|
||||||
{/if}
|
{/if}
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</a>
|
</a>
|
||||||
@@ -154,9 +154,9 @@
|
|||||||
{$height = ($terminlength/15)}
|
{$height = ($terminlength/15)}
|
||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color}'
|
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color|escape}'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname2} {$termin.usernname2}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname2|escape} {$termin.usernname2|escape}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'>
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{else}
|
{else}
|
||||||
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
||||||
@@ -164,9 +164,9 @@
|
|||||||
{$height = ($terminlength/15)}
|
{$height = ($terminlength/15)}
|
||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color}'
|
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user2}.color|escape}'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname2} {$termin.usernname2}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br /> <b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname2|escape} {$termin.usernname2|escape}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br /> <b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'>
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</a>
|
</a>
|
||||||
@@ -180,9 +180,9 @@
|
|||||||
{$height = ($terminlength/15)}
|
{$height = ($terminlength/15)}
|
||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color}'
|
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color|escape}'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname3} {$termin.usernname3}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname3|escape} {$termin.usernname3|escape}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'>
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{else}
|
{else}
|
||||||
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
||||||
@@ -190,9 +190,9 @@
|
|||||||
{$height = ($terminlength/15)}
|
{$height = ($terminlength/15)}
|
||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color}'
|
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user3}.color|escape}'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname3} {$termin.usernname3}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br /> <b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname3|escape} {$termin.usernname3|escape}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br /> <b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'>
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</a>
|
</a>
|
||||||
@@ -206,9 +206,9 @@
|
|||||||
{$height = ($terminlength/15)}
|
{$height = ($terminlength/15)}
|
||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color}'
|
style='width: 1em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color|escape}'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname4} {$termin.usernname4}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname} {$termin.nname} {$termin.firma}{/if}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname4|escape} {$termin.usernname4|escape}</b><br /> Ganztags<br />{if {$termin.ort}}<b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />{/if}{if {$termin.vname} || {$termin.nname} || {$termin.firma}}Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}{/if}'>
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{else}
|
{else}
|
||||||
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
{$terminlength = ({$termin.termdauer|date_format:"%H"}*60 + {$termin.termdauer|date_format:"%M"})}
|
||||||
@@ -216,9 +216,9 @@
|
|||||||
{$height = ($terminlength/15)}
|
{$height = ($terminlength/15)}
|
||||||
{$start = 4 + ($terminstart - 420)/15}
|
{$start = 4 + ($terminstart - 420)/15}
|
||||||
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
<div class='{if $termin.done == 1}doneterminbox{else}terminbox{/if}'
|
||||||
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color}'
|
style='width: {$width}em;height: {$height}em;top: {$start}em;left: {$shift}em;background-color: {$users.{$termin.user4}.color|escape}'
|
||||||
title='{$termin.typ}<br />{$termin.head} - <b>{$termin.uservname4} {$termin.usernname4}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br /> <b>In {$termin.ort}{if $termin.ortsteil}-{$termin.ortsteil}{/if}</b><br />Bei {$termin.vname} {$termin.nname} {$termin.firma}'>
|
title='{$termin.typ|escape}<br />{$termin.head|escape} - <b>{$termin.uservname4|escape} {$termin.usernname4|escape}</b><br /> Um {$termin.termtime|date_format:'%k:%M'}Uhr<br />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}<br /> <b>In {$termin.ort|escape}{if $termin.ortsteil}-{$termin.ortsteil|escape}{/if}</b><br />Bei {$termin.vname|escape} {$termin.nname|escape} {$termin.firma|escape}'>
|
||||||
<span class='rotate'>{$termin.typ|substr:0:3}.</span>
|
<span class='rotate'>{$termin.typ|substr:0:3|escape}.</span>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</a>
|
</a>
|
||||||
@@ -251,7 +251,7 @@
|
|||||||
<br />
|
<br />
|
||||||
|
|
||||||
{foreach $users as $user}
|
{foreach $users as $user}
|
||||||
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color}'>{$user.vname} {$user.nname}</span></a>
|
<a href='?action=terminadd&user={$user.id}' style="color: #000;" title='Urlaub eintragen'><span class='legendcolbox' style='background-color: {$user.color|escape}'>{$user.vname|escape} {$user.nname|escape}</span></a>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{include file="heading.tpl" heading="Terminanzeige"}
|
{include file="heading.tpl" heading="Terminanzeige"}
|
||||||
<h2><div class='fifty'>Ohne Anfahrt:</div><div class='fifty'>Mit Anfahrt:</div></h2>
|
<h2><div class='fifty'>Ohne Anfahrt:</div><div class='fifty'>Mit Anfahrt:</div></h2>
|
||||||
<iframe src='{$pdffile}' width='40%' height='600px'></iframe>
|
<iframe src='{$pdffile|escape}' width='40%' height='600px'></iframe>
|
||||||
<iframe src='{$pdffile2}' width='40%' height='600px'></iframe>
|
<iframe src='{$pdffile2|escape}' width='40%' height='600px'></iframe>
|
||||||
|
|||||||
Reference in New Issue
Block a user