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:
2026-09-22 00:04:38 +02:00
co-authored by Claude Opus 5
parent 3dfbf1c9c7
commit 490c4f12a4
12 changed files with 986 additions and 950 deletions
+14 -137
View File
@@ -1,148 +1,25 @@
<?php
require_once("incs/users.php");
$_SESSION["camefrom"] = "termin&show=".$_GET["show"]."&page=".$_GET["page"];
require_once "incs/termin.php";
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");
if($_GET["tabs"])
$smarty->assign("tabs",$_GET["tabs"]);
else
$smarty->assign("tabs",$_SESSION["termtyp"]);
$smarty->assign("heading", "Terminliste");
$smarty->assign("tabs", parameterGanzzahl("tabs") ?: ($_SESSION["termtyp"] ?? 1));
$smarty->display("heading.tpl");
$smarty->display("termlist.tpl");
}
else
else
{
$smarty->assign("heading","Termine");
$smarty->assign("heading", "Termine");
$smarty->display("heading.tpl");
//$colors = array("#f00","#0c0","#ff0","#90c","#0bb","#066","#09f","#f60","#00f","#f09");
//$weather = GetWeather();
//$smarty->assign("weather",$weather);
$start = $_GET["page"]*8 - 1;
$end = $_GET["page"]*8 + 7;
for($i=$start; $i<$end; $i++)
{
$qry = mysqli_query($dbconn,"SELECT user.vname,user.nname, user.color,
case MAX(zeiten.gehen)
when MAX(zeiten.kommen) then 0
else 1 end AS complete
FROM user
LEFT JOIN zeiten ON user.id = zeiten.ma_id
WHERE DATE_FORMAT(kommen,'%Y%m%d') = '".date("Ymd",strtotime("+".$i." days"))."'
GROUP BY user.id ORDER BY user.nname ASC") or $err=error("fehler beim ermitteln der anwesenden Mitarbeiter<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->assign("page", $seite);
$smarty->assign("weekdays", kalenderTage($dbconn, $seite));
$smarty->assign("users", kalenderBenutzer($dbconn));
$smarty->display("calendar.tpl");
}
?>
+76 -407
View File
@@ -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"){
for( $i=1; $i<=$_POST["pagesize"]; $i++){
mysqli_query($dbconn,"DELETE FROM termin WHERE id='".$_POST["del".$i]."'") or $err=error("Konnte Haupttermin nicht löschen<br />".mysqli_error($dbconn));
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(!$err)
doneNreturn("Erfolgreich gelöscht");
}
else{
$qry = mysqli_query($dbconn,"SELECT * FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'");
$res = mysqli_fetch_assoc($qry);
if(!$res)
$err = error("Dieser Termin existiert nicht!");
mysqli_query($dbconn,"DELETE FROM termin WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht löschen<br />".mysqli_error($dbconn));
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".$res["id"]."'" or $err=error("Konnte Nebentermine nicht löschen<br />".mysqli_error($dbconn)));
$ids = array();
$anzahl = isset($_POST["pagesize"]) ? (int)$_POST["pagesize"] : 0;
for($i = 1; $i <= $anzahl; $i++)
if(!empty($_POST[$praefix.$i]))
$ids[] = (int)$_POST[$praefix.$i];
return $ids;
}
$mehrfach = isset($_GET["id"]) && $_GET["id"] === "multi";
$terminid = parameterGanzzahl("id");
$adressid = parameterGanzzahl("adressid");
$err = 0;
if(($mehrfach || $terminid) && parameterGanzzahl("del") == 1)
{
foreach($mehrfach ? angekreuzteTermine("del") : array($terminid) as $id)
if(!$err)
doneNreturn("Erfolgreich gelöscht");
$err = loescheTerminreihe($dbconn, $id);
if(!$err)
{
doneNreturn("Erfolgreich gelöscht");
return;
}
}
elseif($_GET["id"] && $_GET["done"])
elseif(($mehrfach || $terminid) && !empty($_GET["done"]))
{
if($_GET["id"] == "multi"){
for( $i=1; $i<=$_POST["pagesize"]; $i++){
mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE id='".$_POST["erl".$i]."'") or $err+=error("Konnte Haupttermin nicht als erledigt markieren<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));
}
$erledigt = $_GET["done"] != "no";
foreach($mehrfach ? angekreuzteTermine("erl") : array($terminid) as $id)
if(!$err)
doneNreturn("Erfolgreich geändert!");
}
else{
$qry = mysqli_query($dbconn,"SELECT * FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'");
$res = mysqli_fetch_assoc($qry);
if(!$res)
$err = error("Dieser Termin existiert nicht!");
if($_GET["done"] == "yes")
{
mysqli_query($dbconn,"UPDATE termin SET done = 1 WHERE id='".$res["id"]."'") or $err=error("Konnte Haupttermin nicht als erledigt markieren<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)
doneNreturn("Erfolgreich geändert!");
$err = setzeTerminErledigt($dbconn, $id, $erledigt);
if(!$err)
{
doneNreturn("Erfolgreich geändert!");
return;
}
}
$qry = mysqli_query($dbconn,"SELECT plz, ortsteil, ort, str, hnr, vname, partner_id, nname, vname2, nname2, firma, adresse.id, land, anrede_id, titel_id, anrede2_id, titel2_id
FROM adresse
LEFT JOIN strasse ON str_id = strasse.id
LEFT JOIN ort ON ort_id = ort.id
LEFT JOIN land ON land_id = land.id
WHERE adresse.id='".mysql_escape_string($_GET["adressid"])."'
ORDER BY typ_id ASC") or $err = error("Fehler beim abrufen der Daten ".mysqli_error($dbconn));
$kdnres=mysqli_fetch_assoc($qry);
if($_GET["user"])
$smarty->assign("user",$_GET["user"]);
if(!$kdnres["partner_id"])
$kunde = terminAdresse($dbconn, $adressid);
if(empty($kunde["partner_id"]))
$adressid = 0;
if(!$err && parameterGanzzahl("formsent") == 1)
{
$_GET["adressid"] = 0;
$err = speichereTermin($dbconn, $terminid, $adressid);
if(!$err)
{
doneNreturn("Erfolgreich eingetragen");
return;
}
// bei einem Fehler die Eingaben im Formular stehen lassen
$smarty->assign("termin", $_POST);
}
if($_GET["formsent"] == 1)
{
$head = mysql_escape_string(trim($_POST["head"]));
$user = mysql_escape_string(trim($_POST["user"]));
$user2 = mysql_escape_string(trim($_POST["user2"]));
$user3 = mysql_escape_string(trim($_POST["user3"]));
$user4 = mysql_escape_string(trim($_POST["user4"]));
$text = mysql_escape_string(trim($_POST["text"]));
$typ = mysql_escape_string(trim($_POST["typ"]));
$done = mysql_escape_string(trim($_POST["done"]));
$folge = mysql_escape_string(trim($_POST["folge"]));
$folgetyp = mysql_escape_string(trim($_POST["folgetyp"]));
$folgedays = mysql_escape_string(trim($_POST["folgedays"]));
$datetime_start = dispdate_to_mysql_date(mysql_escape_string(trim($_POST["datetime_start"])),0);
$datetime_end = dispdate_to_mysql_date(mysql_escape_string(trim($_POST["datetime_end"])),1);
$_POST["termtime"] = $datetime_start;
$_POST["termend"] = $datetime_end;
$dauer = $_POST["termdauer"] = mysql_dauer($datetime_start,$datetime_end);
$days = 1;
$split_dauer = explode(":",$dauer);
if($split_dauer[0]>12 || $typ == 0)
{
$days = ceil($dauer/24);
$dauer = "24:00:00";
$_POST["termtime"] = $datetime_start = substr($datetime_start,0,11)."00:00:00";
$_POST["termend"] = $datetime_end = substr($datetime_start,0,11)."23:59:00";
}
$datetime_start_tmp =$datetime_start;
if($days > 1 && $_GET["id"])
{
mysqli_query($dbconn,"DELETE FROM termin WHERE id='".mysqli_escape_string($dbconn,$_GET["id"])."'");
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".mysqli_escape_string($dbconn,$_GET["id"])."'");
$_GET["id"] = "";
}
else
mysqli_query($dbconn,"DELETE FROM termin WHERE main_id='".mysqli_escape_string($dbconn,$_GET["id"])."' AND id != '".mysqli_escape_string($dbconn,$_GET["id"])."'");
if($done == 0){
for($i=0;$i<$days;$i++)
{
$datetime_start_tmp = date("Y-m-d H:i:s",strtotime("+".$i." day",strtotime($datetime_start)));
$qry = mysqli_query($dbconn,"SELECT * FROM
( SELECT id,user, user2, user3, user4, termtime,
DATE_ADD(termtime,INTERVAL CONCAT(HOUR(termdauer),' ',MINUTE(termdauer)) HOUR_MINUTE)as termend
FROM termin WHERE termtime != '0000-00-00 00:00:00' AND done = 0)
as subselect
WHERE
(user='$user' OR user2='$user' OR user3='$user' OR user4='$user') AND
(
('$datetime_start_tmp' >= termtime AND '$datetime_start_tmp' < termend) OR
('$datetime_end' > termtime AND '$datetime_end' <= termend) OR
('$datetime_start_tmp' <= termtime AND '$datetime_end' >= termend)
)") or $err=error("Fehler beim überprüfen von Überlappungen<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)
{
doneNreturn("Erfolgreich eingetragen");
}
}
if($err){
$smarty->assign("termin",$_POST);
}
//elseif(!$head)
// $err=error("Bitte geben Sie eine Terminbeschreibung an!");
}
$qry = mysqli_query($dbconn,"SELECT id, typ
FROM termtyp WHERE id > 0") or $err = error("Fehler beim abrufen der Termintypen<br />".mysqli_error($dbconn));
while($res = mysqli_fetch_assoc($qry))
{
$typids[] =$res["id"];
$typs[] = $res["typ"];
}
$smarty->assign("typs",$typs);
$smarty->assign("typids",$typids);
$typids=array();
$typs=array();
$qry = mysqli_query($dbconn,"SELECT id, vname, nname
FROM user WHERE blocked = 0 AND id > 0") or $err = error("Fehler beim abrufen der Benutzer<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
{
$err=error("Dieser Termin existiert nicht!");
}
}
else
{
$smarty->assign("termin",$_POST);
if($_GET["adressid"]){
$smarty->assign("heading","Neuer Termin");
}
else{
$smarty->assign("heading","Neuer Urlaub / Krankheitstag");
$typids=array();
$typs=array();
$qry = mysqli_query($dbconn,"SELECT id, typ
FROM termtyp WHERE typ = 'Urlaub' OR typ = 'Krankheit'") or $err = error("Fehler beim abrufen der Termintypen<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");
terminAuswahllisten($dbconn, $smarty);
$smarty->assign("kunde", $kunde);
$smarty->assign("user", parameterGanzzahl("user"));
?>
if($terminid && !$err)
{
$termin = terminZumBearbeiten($dbconn, $terminid);
if(!$termin)
$err = error("Dieser Termin existiert nicht!");
else
{
$smarty->assign("termin", $termin);
$smarty->assign("heading", $adressid ? "Termin ändern" : "Urlaub / Krankheit ändern");
}
}
elseif(!$terminid)
{
if(!$err)
$smarty->assign("termin", $_POST);
$smarty->assign("heading", $adressid ? "Neuer Termin" : "Neuer Urlaub / Krankheitstag");
}
$smarty->display("heading.tpl");
$smarty->display("addtermin.tpl");
?>
+38 -64
View File
@@ -1,71 +1,45 @@
<?php
// GET: id OR date;type
<?php
/*
* 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");
$pdf = makerawPDFcopy(0);
if($_GET["id"] && !$_GET["date"])
{
$termin=maketerminarray($dbconn, $_GET["id"]);
$adresse=maketerminadresse($dbconn, $_GET["id"]);
$telnrn=maketelnrn($dbconn,$_GET["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
}
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"]);
$telnrn=maketelnrn($dbconn,$res["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
}
}
}
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf");
$smarty->assign("pdffile","./temp/pdftemp/$tmppdfname.pdf");
$terminid = parameterGanzzahl("id");
$datum = isset($_GET["date"]) && is_string($_GET["date"]) ? date("Y-m-d", strtotime($_GET["date"])) : "";
$pdf = makerawPDFanfahrt(0);
if($_GET["id"] && !$_GET["date"])
$ids = array();
if($terminid && !$datum)
$ids[] = $terminid;
elseif($datum)
{
$termin=maketerminarray($dbconn, $_GET["id"]);
$adresse=maketerminadresse($dbconn, $_GET["id"]);
$googleadresse=makegooglestring($dbconn, $_GET["id"]);
$telnrn=maketelnrn($dbconn,$_GET["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse);
$zeilen = db_zeilen($dbconn, "SELECT id FROM termin WHERE adresse_id != 0 AND DATE(termtime) = ? ORDER BY termtime ASC", array($datum));
foreach((array)$zeilen as $z)
$ids[] = $z["id"];
}
elseif($_GET["date"])
{
$qry=mysqli_query($dbconn,"SELECT id FROM termin WHERE adresse_id AND DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime($_GET["date"]))."' ORDER BY termtime ASC");
if($_GET["type"]="singlepages")
{
$prevpage=0;
while($res=mysqli_fetch_assoc($qry))
{
if($prevpage)
$pdf->addpage();
$prevpage=1;
$termin=maketerminarray($dbconn, $res["id"]);
$adresse=maketerminadresse($dbconn, $res["id"]);
$googleadresse=makegooglestring($dbconn,$res["id"]);
$telnrn=maketelnrn($dbconn,$res["id"]);
makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse);
}
}
}
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf");
$smarty->assign("pdffile2","./temp/pdftemp/$tmppdfname.pdf");
/* $anfahrt = 0 für den Terminzettel, 1 für die Seite mit der Karte */
function terminzettel($dbconn, $ids, $anfahrt)
{
$pdf = $anfahrt ? makerawPDFanfahrt(0) : makerawPDFcopy(0);
$erste = true;
foreach($ids as $id)
{
if(!$erste)
$pdf->addpage();
$erste = false;
$googleadresse = $anfahrt ? makegooglestring($dbconn, $id) : "";
makesingleterminpage($pdf, maketerminarray($dbconn, $id), maketerminadresse($dbconn, $id),
maketelnrn($dbconn, $id), $anfahrt, $googleadresse);
}
$name = str_replace(array(" ", "."), array("_", "_"), microtime());
savePDF($pdf, "./temp/pdftemp/$name.pdf");
return "./temp/pdftemp/$name.pdf";
}
$smarty->assign("pdffile", terminzettel($dbconn, $ids, 0));
$smarty->assign("pdffile2", terminzettel($dbconn, $ids, 1));
$smarty->display("terminshow.tpl");
?>
?>