App/pgs/dienste/index.php
2020-11-25 17:28:45 +01:00

362 lines
20 KiB
PHP

<?php #pgs/dienste/index.php
$tpl = array(
"main" => tplExtrSection(tplLoadFile("pgs/dienste/main.html"), "DIENSTE"),
"show" => "",
"list" => ""
);
//die("Wartung");
addStyle("pgs/dienste/main.css");
// Anleitung zeigen
$tpl["show"] = tplExtrSection($tpl["main"], "###DIENSTE.SHOW###");
if ($userID = lgnCheckLogin($mysqli)) {
// Abteilungen und Gruppen abrufen
$res = $mysqli->query("SELECT l.Abteilungen, a.Name FROM link_Abteilungen_Personal l LEFT JOIN Abteilungen a ON a.ID=l.Abteilungen WHERE l.Personal='".$userID."'");
$abteilungen = array();
$abteilungenIDs = array();
while ($row = $res->fetch_assoc()) {
$abteilungen[] = $row["Name"];
$abteilungenIDs[] = $row["Abteilungen"];
}
$res = $mysqli->query("SELECT l.Personalgruppen, p.Name FROM link_Personal_Personalgruppen l LEFT JOIN Personalgruppen p ON p.ID=l.Personalgruppen WHERE l.Personal='".$userID."'");
$gruppenIDs = array(null);
while ($row = $res->fetch_assoc()) {
$gruppen[] = $row["Name"];
$gruppenIDs[] = $row["Personalgruppen"];
}
// Terminaktion abarbeiten
$confirm = "";
if (isset($input["termin"], $input["action"], $input["secToken"]) && $input["secToken"]==$_SESSION["secTokenVerify"]) {
$qry = "SELECT t.ID tID, t.Beginn, t.Ausgelost, IF(t.Beginn<NOW(), 1, 0) vorbei, tpv.MaxTeilnehmer, d.Abteilung, t.Personalgruppe, b.Name privName, "
."(SELECT COUNT(*) FROM Terminteilnahmen tln WHERE Termin=t.ID AND Status>=1) num, "
."(SELECT Status FROM Terminteilnahmen tln WHERE Termin=t.ID AND Personal = ?) Status "
.", (SELECT COUNT(*) FROM Terminteilnahmen t4 LEFT JOIN Termine t5 ON t5.ID=t4.Termin "
." WHERE t4.Personal=? AND t5.ID!=t.ID AND t5.Terminart=t.Terminart "
." AND t5.Beginn BETWEEN t.Beginn - INTERVAL 7 DAY AND t.Beginn + INTERVAL 7 DAY) naheDienste "
."FROM Termine t "
."LEFT JOIN Dienstpläne d ON d.ID=t.Dienstplan "
."LEFT JOIN Terminplatzvergabe tpv ON tpv.ID=t.Platzvergabe "
."LEFT JOIN Terminarten ta ON ta.ID = t.Terminart "
."LEFT JOIN Berechtigungen b ON ta.Verwaltungsrecht = b.ID "
."WHERE t.ID = ?";
if ($stmt = $mysqli->prepare($qry)) {
$stmt->bind_param("iii", $userID, $userID, $input["termin"]);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
$stmt->close();
// Mögliche Rechte zum Bearbeiten
$possiblePrivileges = array("DARF_DIENSTE_VERWALTEN");
if (null!==$row["privName"]) {
$possiblePrivileges[] = $row["privName"];
}
// Unprivilegierte Aktionen
if ("join"==$input["action"] && "0"==$row["vorbei"] &&
((in_array($row["Abteilung"], $abteilungenIDs) && in_array($row["Personalgruppe"], $gruppenIDs) && intVal($row["naheDienste"])==0) || lgnCheckRight($mysqli, $possiblePrivileges, $userID))) {
// Möchte beitreten
if ($row["Ausgelost"]=="1" && (intVal($row["num"])<intVal($row["MaxTeilnehmer"]) || "0"==$row["MaxTeilnehmer"])) {
$mysqli->query("REPLACE INTO Terminteilnahmen (Termin, Personal, Status) VALUES ('".$row["tID"]."', '".$userID."', 1)");
informParticipantFromID($mysqli, $row["tID"], $userID, true);
markOrSendParticipantsList($mysqli, $row["tID"]);
} else {
$mysqli->query("REPLACE INTO Terminteilnahmen (Termin, Personal, Status) VALUES ('".$row["tID"]."', '".$userID."', 0)");
}
} else if ("leave"==$input["action"] && "0"==$row["vorbei"]) {
// Möchte verlassen
$mysqli->query("DELETE FROM Terminteilnahmen WHERE Termin = ".$row["tID"]." AND Personal = ".$userID);
if (1==$mysqli->affected_rows && "1"==$row["Ausgelost"]) {
markOrSendParticipantsList($mysqli, $row["tID"]);
}
} else if (lgnCheckRight($mysqli, $possiblePrivileges) || "2"==$row["Status"]) {
// Privilegierte Aktionen
if ("remove"==$input["action"]) {
// Teilnehmer soll entfernt werden
if (isset($input["target"], $input["confirm"])) {
// Entferne Teilnehmer
$qry = "DELETE FROM Terminteilnahmen WHERE Termin = ? AND Personal = ?";
if ($stmt = $mysqli->prepare($qry)) {
$stmt->bind_param("ii", $row["tID"], $input["target"]);
$stmt->execute();
if (1==$stmt->affected_rows && "1"==$row["Ausgelost"]) {
informParticipantFromID($mysqli, $row["tID"], $input["target"], false);
markOrSendParticipantsList($mysqli, $row["tID"]);
}
}
}
} else if ("add"==$input["action"] && isset($input["target"], $input["stage"], $input["confirm"])) {
// Teilnehmer soll hinzugefügt werden
$qry = "REPLACE INTO Terminteilnahmen VALUES (?, ?, ?)";
if ($stmt = $mysqli->prepare($qry)) {
$stmt->bind_param("iii", $row["tID"], $input["target"], $input["stage"]);
$stmt->execute();
if (1==$stmt->affected_rows && "1"==$row["Ausgelost"]) {
informParticipantFromID($mysqli, $row["tID"], $input["target"], true);
markOrSendParticipantsList($mysqli, $row["tID"]);
}
}
}
if (("edit"==$input["action"] || "add"==$input["action"]) && (!isset($input["confirm"]) || "addmore"==$input["confirm"])) {
// Bestätigung abfragen
$addqry = "SELECT p.ID,Vornamen,Nachnamen,tln.Status FROM Personal p LEFT JOIN Terminteilnahmen tln ON tln.Personal=p.ID AND tln.Termin = ".$row["tID"]." ";
if (isset($input["target"]) && !isset($input["confirm"])) {
$addqry.= "WHERE p.ID = ? ";
$confirm = "Teilnahmestatus des Kameraden ändern zu?<br />";
} else {
$confirm = "Kameraden zum Termin hinzufügen?<br />";
}
$addqry.= "ORDER BY Nachnamen ASC, Vornamen ASC";
if ($stmt = $mysqli->prepare($addqry)) {
if (isset($input["target"]) && !isset($input["confirm"])) {
$stmt->bind_param("i", $input["target"]);
}
$stmt->execute();
$addres = $stmt->get_result();
//$stmt->close();
$confirm.= "<form method='get' action='?page=###PAGEMAIN###'><select name='target'>";
$status = 1;
while ($addrow = $addres->fetch_assoc()) {
$confirm.= "<option value='".$addrow["ID"]."'>".$addrow["Nachnamen"].", ".$addrow["Vornamen"]."</option>\n";
if ("edit"==$input["action"]) {
$status = $addrow["Status"];
}
}
$confirm.= "</select><br /><input type=hidden name='termin' value='".$row["tID"]."' />"
.("add"==$input["action"]
? "<input type=hidden name='action' value='add' />"
: "<input type=radio name='action' value='remove' /> Entfernen<br /><input type=radio name='action' value='add' checked />")
."<select name='stage'><option value='0'".($status=="0" ? " selected" : "").">Warteliste</option>"
.("1"==$row["Ausgelost"] ? "<option value='1'".($status=="1" || $status===null ? " selected" : "").">Teilnehmer</option>" : "")
."<option value='2'".($status=="2" ? " selected" : "").">Leitend</option></select><br />"
."<button type=submit name='confirm' value='addone'>Bestätigen</button><br />"
.("add"==$input["action"] ? "<button type=submit name='confirm' value='addmore'>Bestätigen und mehr hinzufügen</button>" : "")
."<input type=hidden name='secToken' value='###SECTOKEN###' /></form>";
} else {
addError("Mysql", $mysqli->error);
}
}
} // /Privilegierte Aktionen
} // /Termin existiert
// TODO: Corona-Unterweisung
// INSERT IGNORE INTO link_Ausbildungen_Personal SELECT DISTINCT 9, Personal FROM Terminteilnahmen t WHERE Status=1
} // /Terminaktion
// Termine auflisten und Anmeldestatus anzeigen
$tpl["list"] = tplExtrSection($tpl["main"], "###DIENSTE.LIST###");
// Bestätigungen anzeigen oder verstecken
if ($confirm!="") {
$confirm_tpl = tplExtrSection($tpl["list"], "###DIENSTE.LIST.CONFIRM###");
$confirm = tplReplMarker($confirm_tpl, "###DIENSTE.LIST.CONFIRM.TEXT###", $confirm);
}
$tpl["list"] = tplReplSection($tpl["list"], "###DIENSTE.LIST.CONFIRM###", $confirm);
$monthsback = $input["monthsback"] ?? 0;
$tpl["list"] = tplReplMarker($tpl["list"], "###DIENSTE.LIST.DEPARTMENTS###", implode(", ", $abteilungen));
$tpl["list"] = tplReplMarker($tpl["list"], "###DIENSTE.LIST.GROUPS###", implode(", ", $gruppen));
$tpl["list"] = tplReplMarker($tpl["list"], "###DIENSTE.LIST.NEWMONTHSBACK###", $monthsback+2);
$dnst_list_entry_tpl = tplExtrSection($tpl["list"], "###DIENSTE.LIST.ENTRY###");
$dnst_list_entry = "";
$qry = "SELECT t.ID, t.Beginn, t.Ende, t.Ort, t.Thema, t.Verantwortliche, t.Ausgelost, t.Personalgruppe, IF(t.Beginn<NOW(), 1, 0) vorbei, pv.MaxTeilnehmer, "
."ta.Name taName, tln.Status, ab.ID abID, ab.Name abName, pg.Name pgName, b.Name privName "
.", (SELECT COUNT(*) FROM Terminteilnahmen t2 WHERE t2.Termin=t.ID AND t2.Status>=1) numDabei "
.", (SELECT COUNT(*) FROM Terminteilnahmen t3 WHERE t3.Termin=t.ID AND t3.Status=0) numWill "
.", (SELECT COUNT(*) FROM Terminteilnahmen t4 LEFT JOIN Termine t5 ON t5.ID=t4.Termin "
." WHERE t4.Personal=? AND t5.ID!=t.ID AND t5.Terminart=t.Terminart "
." AND t5.Beginn BETWEEN t.Beginn - INTERVAL 7 DAY AND t.Beginn + INTERVAL 7 DAY) naheDienste "
."FROM Termine t "
."LEFT JOIN Terminplatzvergabe pv ON pv.ID=t.Platzvergabe "
."LEFT JOIN Terminarten ta ON ta.ID=t.Terminart "
."LEFT JOIN Berechtigungen b ON b.ID=ta.Verwaltungsrecht "
."LEFT JOIN Dienstpläne d ON d.ID=t.Dienstplan "
."LEFT JOIN Abteilungen ab ON ab.ID=d.Abteilung "
."LEFT JOIN Personalgruppen pg ON pg.ID=t.Personalgruppe "
."LEFT JOIN Terminteilnahmen tln ON t.ID=tln.Termin AND tln.Personal = ? "
."WHERE t.Ende > NOW() - INTERVAL ? MONTH "
."ORDER BY t.Beginn ASC ";
if ($stmt = $mysqli->prepare($qry)) {
$stmt->bind_param("iii", $userID, $userID, $monthsback);
$stmt->execute();
$res = $stmt->get_result();
while ($row = $res->fetch_assoc()) {
$entry = $dnst_list_entry_tpl;
$restrictions = $row["MaxTeilnehmer"]!==null && $row["MaxTeilnehmer"]>0 ? "Auf ".$row["MaxTeilnehmer"]." Plätze begrenzt!" : "Keine Platzbegrenzung.";
$terminPrivileges = $row["privName"]!==null ? array("DARF_DIENSTE_VERWALTEN", $row["privName"]) : "DARF_DIENSTE_VERWALTEN";
$replace = array(
"###DIENSTE.LIST.ENTRY.ID###" => $row["ID"],
"###DIENSTE.LIST.ENTRY.BEGIN###" => $row["Beginn"],
"###DIENSTE.LIST.ENTRY.BEGIN.DATE###" => strftime("%a, %d.%m.%Y", strtotime($row["Beginn"])),
"###DIENSTE.LIST.ENTRY.BEGIN.TIME###" => strftime("%H:%M", strtotime($row["Beginn"])),
"###DIENSTE.LIST.ENTRY.END###" => $row["Ende"],
"###DIENSTE.LIST.ENTRY.END.DATE###" => strftime("%d.%m.%Y", strtotime($row["Ende"])),
"###DIENSTE.LIST.ENTRY.END.TIME###" => strftime("%H:%M", strtotime($row["Ende"])),
"###DIENSTE.LIST.ENTRY.TYPE###" => $row["taName"],
"###DIENSTE.LIST.ENTRY.DEPARTMENT###" => $row["abName"],
"###DIENSTE.LIST.ENTRY.TOPIC###" => $row["Thema"],
"###DIENSTE.LIST.ENTRY.RESTRICTIONS###" => $restrictions
);
if ((in_array($row["abID"], $abteilungenIDs) && in_array($row["Personalgruppe"], $gruppenIDs)) || lgnCheckRight($mysqli, $terminPrivileges)) {
$linkJoin = "<a href='?main=###PAGEMAIN###&termin=".$row["ID"]."&action=join&secToken=###SECTOKEN###'><li class='dienste_button'>###NAME### <img src='res/add.png' /></li></a>";
$linkLeave = "<a href='?main=###PAGEMAIN###&termin=".$row["ID"]."&action=leave&secToken=###SECTOKEN###'><li class='dienste_button'>###NAME### <img src='res/cancel.png' /></li></a>";
if (intVal($row["naheDienste"])>0) {
$replace["###DIENSTE.LIST.ENTRY.ALLOWED###"] = "<img src='res/warn.png' />";
} else {
$replace["###DIENSTE.LIST.ENTRY.ALLOWED###"] = "<img src='res/check.png' />";
}
$replace["###DIENSTE.LIST.ENTRY.ACTION###"] = "";
$replace["###DIENSTE.LIST.ENTRY.ACTIONNAME###"] = "";
if ($row["vorbei"]=="0" && $row["Ausgelost"]=="0") {
// Noch nicht ausgelost
if ("1"==$row["Status"] || "2"==$row["Status"]) {
// Abmeldung
$replace["###DIENSTE.LIST.ENTRY.ACTION###"] = tplReplMarker($linkLeave, "###NAME###", "Abmelden");
} else if (intVal($row["naheDienste"])==0 || lgnCheckRight($mysqli, $terminPrivileges)) {
// Anmeldung
$replace["###DIENSTE.LIST.ENTRY.ACTION###"] = tplReplMarker($linkJoin, "###NAME###", "Anmelden");
}
} else if ($row["vorbei"]=="0") {
// Auslosung bereits geschehen, Dienst aber noch nicht gestartet
if ("1"==$row["Status"] || "2"==$row["Status"]) {
// Dabei: Abmeldung möglich
$replace["###DIENSTE.LIST.ENTRY.ACTION###"] = tplReplMarker($linkLeave, "###NAME###", "Abmelden");
} else if (("0"==$row["MaxTeilnehmer"] || $row["numDabei"]<$row["MaxTeilnehmer"]) && (intVal($row["naheDienste"])==0 || lgnCheckRight($mysqli, $terminPrivileges))) {
// Nicht dabei und Plätze frei: Mitmachen möglich
$replace["###DIENSTE.LIST.ENTRY.ACTION###"] = tplReplMarker($linkJoin, "###NAME###", "Mitmachen");
} else if ($row["Status"]==null && (intVal($row["naheDienste"])==0 || lgnCheckRight($mysqli, $terminPrivileges))) {
// Nicht auf Warteliste und keine Plätze frei: Warteliste möglich
$replace["###DIENSTE.LIST.ENTRY.ACTION###"] = tplReplMarker($linkJoin, "###NAME###", "Warteliste eintragen");
}
}
} else {
$reason = in_array($row["abID"], $abteilungenIDs) ? "Kein Mitglied der Gruppe: ".$row["pgName"] : "Falsche Abteilung: ".$row["abName"];
$replace["###DIENSTE.LIST.ENTRY.ALLOWED###"] = "<img src='res/uncheck.png' title='".$reason."' />";
$replace["###DIENSTE.LIST.ENTRY.ACTION###"] = "";
}
if ("2" == $row["Status"] || lgnCheckRight($mysqli, $terminPrivileges)) {
$replace["###DIENSTE.LIST.ENTRY.ACTION###"].= "<a href='?main=###PAGEMAIN###&termin=".$row["ID"]."&action=add&secToken=###SECTOKEN###'>"
."<li class='dienste_button'>Teilnehmer hinzufügen <img src='res/add.png' /></li></a> ";
}
// Kandidatenliste
$cqry = "SELECT p.*,GROUP_CONCAT(a.Kürzel) ausb, tln.Status "
."FROM Terminteilnahmen tln "
."LEFT JOIN Personal p ON p.ID=tln.Personal "
."LEFT JOIN link_Ausbildungen_Personal l ON l.Personal=p.ID LEFT JOIN Ausbildungen a ON a.ID=l.Ausbildungen "
."WHERE tln.Termin = '".$row["ID"]."' GROUP BY p.ID ORDER BY tln.Status DESC, p.Pool DESC, p.Nachnamen ASC, a.ID ASC";
$cres = $mysqli->query($cqry);
$chosen = array();
$want = array();
$responsibles = array();
if ($cres) {
while ($cand = $cres->fetch_assoc()) {
$name = substr($cand["Vornamen"],0,1).". ".$cand["Nachnamen"];
$line = $name;
$ausb = explode(",", $cand["ausb"]);
$feats = "";
if (in_array("KF", $ausb)) { //Kraftfahrer
//$feats.= "🚒"; // <- There is a unicode fire engine in between the quotes
$feats.= "<img src='res/truck.png' />";
}
/*if (in_array("CU", $ausb)) { //Corono Unterweisung
$feats.= "☣️"; // <- There is a unicode biohazard symbol in between the quotes
}*/
if ($feats != "") {
$line.= " "./*"(".*/$feats/*.")"*/;
}
$line = "<a href='?main=###PAGEMAIN###&termin=".$row["ID"]."&action=edit&target=".$cand["ID"]."&secToken=###SECTOKEN###'><li>".$line." <img src='res/edit.png' /></li></a>";
switch ($cand["Status"]) {
case "2":
$responsibles[] = $name;
$chosen[] = "<b>".$line."</b>";
break;
case "1":
$chosen[] = $line;
break;
case "0":
$want[] = $line;
break;
}
}
$cres->close();
} else {
addError("mysql", $mysqli->error);
}
$replace["###DIENSTE.LIST.ENTRY.RESPONSIBLES###"] = implode(" / ", $responsibles);
$candidates = "";
if (lgnCheckRight($mysqli, $terminPrivileges) || 2 == $row["Status"]) {
$candidates = tplExtrSection($entry, "###DIENSTE.LIST.ENTRY.CANDIDATES###");
if (count($want)>0) {
$candidates = tplReplMarker($candidates, "###DIENSTE.LIST.ENTRY.CANDIDATES.WANT###", implode("", $want));
} else {
$candidates = tplReplSection($candidates, "###DIENSTE.LIST.ENTRY.CANDIDATES.HASJOIN###", "");
}
if (count($chosen)>0) {
$candidates = tplReplMarker($candidates, "###DIENSTE.LIST.ENTRY.CANDIDATES.CHOSEN###", implode("", $chosen));
} else {
$candidates = tplReplSection($candidates, "###DIENSTE.LIST.ENTRY.CANDIDATES.HASREST###", "");
}
}
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.CANDIDATES###", $candidates);
//Anmeldung
if ((!in_array($row["abID"], $abteilungenIDs) || !in_array($row["Personalgruppe"], $gruppenIDs)) && !lgnCheckRight($mysqli, $terminPrivileges)) {
// Keine Anmeldung zugelassen, da falsche Gruppe
$answer = "FOREIGN";
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.REGISTRATION###", "");
} else if ($row["MaxTeilnehmer"]===null) {
// Es gibt gar keine Anmeldung, der Dienst ist für alle offen
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.CANDIDATES.HASREST###", "");
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.CANDIDATES.HASJOIN###", "");
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.REGISTRATION###", "");
$answer = "NOLOTTERY";
} else {
// Anmeldung ist möglich bzw. erwünscht
if ($row["MaxTeilnehmer"]=="0") {
// Gibt aber keine Beschränkung, daher Warteliste ausblenden
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.CANDIDATES.HASJOIN###", "");
}
$freePlaces = intVal($row["MaxTeilnehmer"]) - intVal($row["numDabei"]);
if ("1"==$row["Ausgelost"] && $freePlaces>0) {
$entry = tplReplMarker($entry, "###DIENSTE.LIST.ENTRY.FREE.NUM###", $freePlaces);
} else {
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.FREE###", "");
}
if (2 == $row["Status"]) {
$answer = "LEAD";
} else if (1 === $row["Status"] || (0 === $row["Status"] && 0 === $row["MaxTeilnehmer"])) {
// TODO: Teilnehmer bei Diensten ohne Begrenzung auf Dabei setzen, nicht auf Will
$answer = "CAN";
} else if (0 === $row["Status"] && 1 === $row["Ausgelost"]) {
$answer = "WAIT";
} else if (0 === $row["Status"] && 0 === $row["Ausgelost"]) {
$answer = "WANTS";
} else {
$answer = "ADD";
}
}
$entry = tplReplSection($entry, "###DIENSTE.LIST.ENTRY.COMES", tplExtrSection($entry, "###DIENSTE.LIST.ENTRY.COMES.".$answer."###"));
$dnst_list_entry.= tplReplMarkerArray($entry, $replace);
}
$stmt->close();
} else {
$dnst_list_entry = $mysqli->error;
}
$tpl["list"] = tplReplSection($tpl["list"], "###DIENSTE.LIST.ENTRY###", $dnst_list_entry);
}
$tpl["main"] = tplReplSection($tpl["main"], "###DIENSTE.SHOW###", $tpl["show"]);
$tpl["main"] = tplReplSection($tpl["main"], "###DIENSTE.LIST###", $tpl["list"]);
$tpl["main"] = tplReplSection($tpl["main"], "###DIENSTE.LIST###", $tpl["list"]);
$output["main"] = $tpl["main"];
?>