fix BelegteSchichtenCount bei Ueberbelegung *AlleSchichten.php. Andere Files noch mit altem Count

This commit is contained in:
root 2025-07-10 15:46:09 +02:00
parent d582440ae3
commit 022387d1f6
3 changed files with 87 additions and 64 deletions

View File

@ -65,25 +65,32 @@ echo "<button type='button' onclick='expand_all_table_rows();'>Alles Ausklappen<
function ZeigeHelferLevelTabelle($db_link,$HelferLevel,$HelferLevelAnzeige){ function ZeigeHelferLevelTabelle($db_link,$HelferLevel,$HelferLevelAnzeige){
// fuer Anzahlanzeige in Ueberschrift // fuer Anzahlanzeige in Ueberschrift
$iAlleSchichtenCount = AlleSchichtenCount($db_link); $iAlleSchichtenCount = AlleSchichtenCount($db_link);
$iBelegteSchichtenCount = AlleBelegteSchichtenCount($db_link); $Belegung = AlleBelegteSchichtenCountMitSurplus($db_link);
$iBelegteSchichtenCount = $Belegung['besetzt'];
$iueberBelegteSchichtenCount = $Belegung['ueberbelegt'];
// "Alle Schichten der Con" (Gesamtstatistik besetzt/gewollt) // "Alle Schichten der Con" (Gesamtstatistik besetzt/gewollt)
echo '<table class="commontable">'; echo '<table class="commontable">';
echo "<tr class='infoheader'>"; echo "<tr class='infoheader'>";
echo "<th colspan='5'>Alle Schichten der Con (Besetzt/Gesamt) " . $iBelegteSchichtenCount . "/" . $iAlleSchichtenCount . "</th></tr>"; echo "<th colspan='5'>Alles: ";
echo "Besetzt (+Überbelegt) / Gesamt&nbsp;&nbsp;&nbsp; ";
echo "${iBelegteSchichtenCount}(+${iueberBelegteSchichtenCount})/$iAlleSchichtenCount </th></tr>";
$alleHelferLevel = alleHelferLevel($db_link); $alleHelferLevel = alleHelferLevel($db_link);
// Summe Ausgabe alle Dienste pro Helferlevel // Summe Ausgabe alle Dienste pro Helferlevel
foreach ($alleHelferLevel as $HelferLevelIteration => $HelferLevelBeschreibung) { foreach ($alleHelferLevel as $HelferLevelIteration => $HelferLevelBeschreibung) {
$meine = ""; $meine = "";
if ($HelferLevelIteration == $HelferLevel) { if ($HelferLevelIteration == $HelferLevel) {
$meine = "&leftarrow; Schichten für mich zum eintragen"; $meine = "<div style='float:right'>&leftarrow; Schichten für mich zum eintragen</div>";
} else { $meine = "Eintragen hier nur nach Rücksprache mit Orga";} } else { $meine = "<div style='float:right'>Eintragen hier nur nach Rücksprache mit Orga</div>";}
if ($HelferLevelIteration == $HelferLevelAnzeige) { if ($HelferLevelIteration == $HelferLevelAnzeige) {
$meine = "$meine - Schichten werden gerade unten angezeigt"; $meine = "$meine Schichten werden gerade unten angezeigt";
} }
$iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelIteration); $iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelIteration);
$iBelegteSchichtenCount = AlleBelegteSchichtenCount($db_link, $HelferLevelIteration); $Belegung = AlleBelegteSchichtenCountMitSurplus($db_link,$HelferLevelIteration);
echo "<tr class='infoheader'><th colspan='5' >&nbsp;&nbsp; &rightarrow; Schichten $HelferLevelBeschreibung (Besetzt/Gesamt) (" . $iBelegteSchichtenCount . "/" . $iAlleSchichtenCount . ") $meine</th></tr>"; $iBelegteSchichtenCount = $Belegung['besetzt'];
$iueberBelegteSchichtenCount = $Belegung['ueberbelegt'];
echo "<tr class='infoheader'><th colspan='5' >&nbsp;&nbsp; &rightarrow; Schichten $HelferLevelBeschreibung ";
echo "${iBelegteSchichtenCount}(+$iueberBelegteSchichtenCount)/$iAlleSchichtenCount $meine</th></tr>";
} }
echo '</table>'; echo '</table>';
} }
@ -95,7 +102,6 @@ $OldWas = "";
$MeineDienste = SchichtIdArrayEinesHelfers($db_link, $HelferID); $MeineDienste = SchichtIdArrayEinesHelfers($db_link, $HelferID);
//print_r($MeineDienste); //print_r($MeineDienste);
echo '</table>';
// Tabelle mit allen Diensten und Schichten // Tabelle mit allen Diensten und Schichten
echo '<table class="commontable collapsible">'; echo '<table class="commontable collapsible">';
while ($zeile = mysqli_fetch_array($db_erg, MYSQLI_ASSOC)) { while ($zeile = mysqli_fetch_array($db_erg, MYSQLI_ASSOC)) {
@ -106,8 +112,11 @@ while ($zeile = mysqli_fetch_array($db_erg, MYSQLI_ASSOC)) {
$SchichtID = $zeile['SchichtID']; $SchichtID = $zeile['SchichtID'];
$DienstID = $zeile['DienstID']; $DienstID = $zeile['DienstID'];
$iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelAnzeige, $DienstID); $iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelAnzeige, $DienstID);
$iBelegteSchichtenCount = AlleBelegteSchichtenCount($db_link, $HelferLevelAnzeige, $DienstID); $Belegung = AlleBelegteSchichtenCountMitSurplus($db_link, $HelferLevelAnzeige, $DienstID);
echo "$Was ($iBelegteSchichtenCount/$iAlleSchichtenCount) <!-- Abfrage $HelferLevel, $DienstID -->"; $iBelegteSchichtenCount = $Belegung['besetzt'];
$iueberBelegteSchichtenCount = $Belegung['ueberbelegt'];
$ueberBelegteSchichten = ($iueberBelegteSchichtenCount >0) ? "[+$iueberBelegteSchichtenCount]" : "";
echo "$Was ($iBelegteSchichtenCount/$iAlleSchichtenCount) $ueberBelegteSchichten <!-- Abfrage $HelferLevel, $DienstID -->";
echo "</th>"; echo "</th>";
echo "</tr>"; echo "</tr>";
SchichtInfo($SchichtID, $InfoWas, $InfoWo, $InfoDauer, $Leiter, $LeiterHandy, $LeiterEmail, $Info); SchichtInfo($SchichtID, $InfoWas, $InfoWo, $InfoDauer, $Leiter, $LeiterHandy, $LeiterEmail, $Info);

View File

@ -66,25 +66,32 @@ echo "<button type='button' onclick='expand_all_table_rows();'>Alles Ausklappen<
function ZeigeHelferLevelTabelle($db_link,$HelferLevel,$HelferLevelAnzeige){ function ZeigeHelferLevelTabelle($db_link,$HelferLevel,$HelferLevelAnzeige){
// fuer Anzahlanzeige in Ueberschrift // fuer Anzahlanzeige in Ueberschrift
$iAlleSchichtenCount = AlleSchichtenCount($db_link); $iAlleSchichtenCount = AlleSchichtenCount($db_link);
$iBelegteSchichtenCount = AlleBelegteSchichtenCount($db_link); $Belegung = AlleBelegteSchichtenCountMitSurplus($db_link);
$iBelegteSchichtenCount = $Belegung['besetzt'];
$iueberBelegteSchichtenCount = $Belegung['ueberbelegt'];
// "Alle Schichten der Con" (Gesamtstatistik besetzt/gewollt) // "Alle Schichten der Con" (Gesamtstatistik besetzt/gewollt)
echo '<table class="commontable">'; echo '<table class="commontable">';
echo "<tr class='infoheader'>"; echo "<tr class='infoheader'>";
echo "<th colspan='5'>Alle Schichten der Con (Besetzt/Gesamt) " . $iBelegteSchichtenCount . "/" . $iAlleSchichtenCount . "</th></tr>"; echo "<th colspan='5'>Alles: ";
echo "Besetzt (+Überbelegt) / Gesamt&nbsp;&nbsp;&nbsp; ";
echo "${iBelegteSchichtenCount}(+${iueberBelegteSchichtenCount})/$iAlleSchichtenCount </th></tr>";
$alleHelferLevel = alleHelferLevel($db_link); $alleHelferLevel = alleHelferLevel($db_link);
// Summe Ausgabe alle Dienste pro Helferlevel // Summe Ausgabe alle Dienste pro Helferlevel
foreach ($alleHelferLevel as $HelferLevelIteration => $HelferLevelBeschreibung) { foreach ($alleHelferLevel as $HelferLevelIteration => $HelferLevelBeschreibung) {
$meine = ""; $meine = "";
if ($HelferLevelIteration == $HelferLevel) { if ($HelferLevelIteration == $HelferLevel) {
$meine = "&leftarrow; Schichten für mich zum eintragen"; $meine = "<div style='float:right'>&leftarrow; Schichten für mich zum eintragen</div>";
} else { $meine = "Eintragen hier nur nach Rücksprache mit Orga";} } else { $meine = "<div style='float:right'>Eintragen hier nur nach Rücksprache mit Orga</div>";}
if ($HelferLevelIteration == $HelferLevelAnzeige) { if ($HelferLevelIteration == $HelferLevelAnzeige) {
$meine = "$meine - Schichten werden gerade unten angezeigt"; $meine = "$meine Schichten werden gerade unten angezeigt";
} }
$iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelIteration); $iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelIteration);
$iBelegteSchichtenCount = AlleBelegteSchichtenCount($db_link, $HelferLevelIteration); $Belegung = AlleBelegteSchichtenCountMitSurplus($db_link,$HelferLevelIteration);
echo "<tr class='infoheader'><th colspan='5' >&nbsp;&nbsp; &rightarrow; Schichten $HelferLevelBeschreibung (Besetzt/Gesamt) (" . $iBelegteSchichtenCount . "/" . $iAlleSchichtenCount . ") $meine</th></tr>"; $iBelegteSchichtenCount = $Belegung['besetzt'];
$iueberBelegteSchichtenCount = $Belegung['ueberbelegt'];
echo "<tr class='infoheader'><th colspan='5' >&nbsp;&nbsp; &rightarrow; Schichten $HelferLevelBeschreibung ";
echo "${iBelegteSchichtenCount}(+$iueberBelegteSchichtenCount)/$iAlleSchichtenCount $meine</th></tr>";
} }
echo '</table>'; echo '</table>';
} }
@ -106,8 +113,11 @@ while ($zeile = mysqli_fetch_array($db_erg, MYSQLI_ASSOC)) {
$SchichtID = $zeile['SchichtID']; $SchichtID = $zeile['SchichtID'];
$DienstID = $zeile['DienstID']; $DienstID = $zeile['DienstID'];
$iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelAnzeige, $DienstID); $iAlleSchichtenCount = AlleSchichtenCount($db_link, $HelferLevelAnzeige, $DienstID);
$iBelegteSchichtenCount = AlleBelegteSchichtenCount($db_link, $HelferLevelAnzeige, $DienstID); $Belegung = AlleBelegteSchichtenCountMitSurplus($db_link, $HelferLevelAnzeige, $DienstID);
echo "$Was ($iBelegteSchichtenCount/$iAlleSchichtenCount) <!-- Abfrage $HelferLevel, $DienstID -->"; $iBelegteSchichtenCount = $Belegung['besetzt'];
$iueberBelegteSchichtenCount = $Belegung['ueberbelegt'];
$ueberBelegteSchichten = ($iueberBelegteSchichtenCount >0) ? "[+$iueberBelegteSchichtenCount]" : "";
echo "$Was ($iBelegteSchichtenCount/$iAlleSchichtenCount) $ueberBelegteSchichten <!-- Abfrage $HelferLevel, $DienstID -->";
echo "</th>"; echo "</th>";
echo "</tr>"; echo "</tr>";
SchichtInfo($SchichtID, $InfoWas, $InfoWo, $InfoDauer, $Leiter, $LeiterHandy, $LeiterEmail, $Info); SchichtInfo($SchichtID, $InfoWas, $InfoWo, $InfoDauer, $Leiter, $LeiterHandy, $LeiterEmail, $Info);

View File

@ -278,24 +278,7 @@ function AlleSchichtenCount($db_link, $HelferLevel = -1, $DienstID = -1)#stmt
$params[] = $DienstID; $params[] = $DienstID;
$types .= "i"; $types .= "i";
} }
$stmt = stmt_prepare_and_execute($db_link, $sql, $types, ...$params);
$stmt = mysqli_prepare($db_link, $sql);
if (!$stmt) {
error_log("AlleSchichtenCount prepare failed: " . mysqli_error($db_link));
echo "Fehler bei Datenbankabfrage.<br>";
return false;
}
if ($params) {
mysqli_stmt_bind_param($stmt, $types, ...$params);
}
if (!mysqli_stmt_execute($stmt)) {
error_log("AlleSchichtenCount execute failed: " . mysqli_stmt_error($stmt));
echo "Fehler bei Ausführung der Abfrage.<br>";
return false;
}
$result = mysqli_stmt_get_result($stmt); $result = mysqli_stmt_get_result($stmt);
mysqli_stmt_close($stmt); mysqli_stmt_close($stmt);
$zeile = mysqli_fetch_array($result, MYSQLI_ASSOC); $zeile = mysqli_fetch_array($result, MYSQLI_ASSOC);
@ -305,15 +288,11 @@ function AlleSchichtenCount($db_link, $HelferLevel = -1, $DienstID = -1)#stmt
function AlleBelegteSchichtenCount($db_link, $HelferLevel = -1, $DienstID = -1)#stmt function AlleBelegteSchichtenCount($db_link, $HelferLevel = -1, $DienstID = -1)#stmt
{ {
$sql = "SELECT Count(HelferID) AS Anzahl $sql = "SELECT COUNT(HelferID) AS Anzahl
FROM EinzelSchicht, Schicht, Dienst FROM EinzelSchicht
WHERE EinzelSchicht.SchichtID=Schicht.SchichtID JOIN Schicht ON EinzelSchicht.SchichtID = Schicht.SchichtID
AND Schicht.DienstID=Dienst.DienstID "; JOIN Dienst ON Schicht.DienstID = Dienst.DienstID
// $sql = "SELECT COUNT(HelferID) AS Anzahl WHERE 1=1";
// FROM EinzelSchicht
// JOIN Schicht ON EinzelSchicht.SchichtID = Schicht.SchichtID
// JOIN Dienst ON Schicht.DienstID = Dienst.DienstID
// WHERE 1=1";
$params = []; $params = [];
$types = ''; $types = '';
@ -329,24 +308,7 @@ function AlleBelegteSchichtenCount($db_link, $HelferLevel = -1, $DienstID = -1)#
$params[] = $DienstID; $params[] = $DienstID;
$types .= 'i'; $types .= 'i';
} }
$stmt = stmt_prepare_and_execute($db_link, $sql, $types, ...$params);
$stmt = mysqli_prepare($db_link, $sql);
if (!$stmt) {
error_log("Prepare failed: " . mysqli_error($db_link));
echo "Abfrage konnte nicht vorbereitet werden.";
return false;
}
if (!empty($params)) {
mysqli_stmt_bind_param($stmt, $types, ...$params);
}
if (!mysqli_stmt_execute($stmt)) {
error_log("AlleBelegteSchichtenCount Execute failed: " . mysqli_stmt_error($stmt));
echo "Abfrage konnte nicht ausgeführt werden.";
return false;
}
$result = mysqli_stmt_get_result($stmt); $result = mysqli_stmt_get_result($stmt);
mysqli_stmt_close($stmt); mysqli_stmt_close($stmt);
$zeile = mysqli_fetch_array($result, MYSQLI_ASSOC); $zeile = mysqli_fetch_array($result, MYSQLI_ASSOC);
@ -354,6 +316,48 @@ function AlleBelegteSchichtenCount($db_link, $HelferLevel = -1, $DienstID = -1)#
return $zeile['Anzahl']; return $zeile['Anzahl'];
} }
function AlleBelegteSchichtenCountMitSurplus($db_link, $HelferLevel = -1, $DienstID = -1) {
$sql = "SELECT
SUM(LEAST(Soll, Belegt)) AS Besetzt,
SUM(GREATEST(0, Belegt - Soll)) AS Ueberbelegt
FROM (
SELECT
Schicht.SchichtID,
COUNT(EinzelSchicht.HelferID) AS Belegt,
Schicht.Soll
FROM Schicht
LEFT JOIN EinzelSchicht ON EinzelSchicht.SchichtID = Schicht.SchichtID
JOIN Dienst ON Schicht.DienstID = Dienst.DienstID
WHERE 1=1";
$params = [];
$types = "";
if ($HelferLevel != -1) {
$sql .= " AND Dienst.HelferLevel = ?";
$params[] = $HelferLevel;
$types .= "i";
}
if ($DienstID != -1) {
$sql .= " AND Dienst.DienstID = ?";
$params[] = $DienstID;
$types .= "i";
}
$sql .= " GROUP BY Schicht.SchichtID, Schicht.Soll
) AS Belegung";
$stmt = stmt_prepare_and_execute($db_link, $sql, $types, ...$params);
$result = mysqli_stmt_get_result($stmt);
mysqli_stmt_close($stmt);
$zeile = mysqli_fetch_array($result, MYSQLI_ASSOC);
return [
'besetzt' => (int)($zeile['Besetzt'] ?? 0),
'ueberbelegt' => (int)($zeile['Ueberbelegt'] ?? 0)
];
}
function AlleSchichtenImZeitbereich($db_link, $Von, $Bis, $HelferLevel = -1)#stmt function AlleSchichtenImZeitbereich($db_link, $Von, $Bis, $HelferLevel = -1)#stmt