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=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"])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?
"; } else { $confirm = "Kameraden zum Termin hinzufügen?
"; } $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.= "

" .("add"==$input["action"] ? "" : " Entfernen
") ."
" ."
" .("add"==$input["action"] ? "" : "") ."
"; } 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=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 = "
  • ###NAME###
  • "; $linkLeave = "
  • ###NAME###
  • "; if (intVal($row["naheDienste"])>0) { $replace["###DIENSTE.LIST.ENTRY.ALLOWED###"] = ""; } else { $replace["###DIENSTE.LIST.ENTRY.ALLOWED###"] = ""; } $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###"] = ""; $replace["###DIENSTE.LIST.ENTRY.ACTION###"] = ""; } if ("2" == $row["Status"] || lgnCheckRight($mysqli, $terminPrivileges)) { $replace["###DIENSTE.LIST.ENTRY.ACTION###"].= "" ."
  • Teilnehmer hinzufügen
  • "; } // 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.= ""; } /*if (in_array("CU", $ausb)) { //Corono Unterweisung $feats.= "☣️"; // <- There is a unicode biohazard symbol in between the quotes }*/ if ($feats != "") { $line.= " "./*"(".*/$feats/*.")"*/; } $line = "
  • ".$line."
  • "; switch ($cand["Status"]) { case "2": $responsibles[] = $name; $chosen[] = "".$line.""; 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"]; ?>