false, 'message' => $data['message']]); exit; } require $baseDir . '/../scripts/db/db-functions.php'; require $baseDir . '/../scripts/db/db-tables.php'; $person_id = isset($_POST['personId']) ? intval($_POST['personId']) : 0; $field_type_id = intval($_POST['fieldTypeId'] ?? 0); $gereat_id = intval($_POST['gereatId'] ?? 0); $jahr = isset($_POST['jahr']) ? intval($_POST['jahr']) : 0; $run_number = isset($_POST['run']) ? intval($_POST['run']) : 1; if (!isset($_POST['value'])) { echo json_encode(['success' => false, 'message' => 'Kein Value angegeben']); exit; } $valueNoteUpdate = floatval($_POST['value']); if ($person_id < 1) { echo json_encode(['success' => false, 'message' => 'Invalide Personen-ID']); exit; } if ($jahr < 1) { echo json_encode(['success' => false, 'message' => 'Invalides Jahr']); exit; } if ($gereat_id < 1) { echo json_encode(['success' => false, 'message' => 'Invalide Geraet-ID']); exit; } $geratExistiert = db_get_var($mysqli, "SELECT 1 FROM $tableGeraete WHERE id = ? LIMIT 1", [$gereat_id]); if (!$geratExistiert) { echo json_encode(['success' => false, 'message' => 'Invalide Geraet-ID']); exit; } if ($field_type_id < 1) { echo json_encode(['success' => false, 'message' => 'Invalide Notentyp-ID']); exit; } $noteConfig = db_select($mysqli, $tableNotenBezeichnungen, "*", "id = ?", [$field_type_id]); if (count($noteConfig) !== 1) { echo json_encode(['success' => false, 'message' => 'Invalide Notentyp-ID']); exit; } $singleNoteConfig = $noteConfig[0]; if ($singleNoteConfig['max_value'] !== null && $valueNoteUpdate > $singleNoteConfig['max_value']) { echo json_encode(['success' => false, 'message' => "Wert zu hoch (max " . $singleNoteConfig['max_value'].")"]); exit; } if ($singleNoteConfig['min_value'] !== null && $valueNoteUpdate < $singleNoteConfig['min_value']){ echo json_encode(['success' => false, 'message' => "Wert zu niedrig (min " . $singleNoteConfig['min_value'].")"]); exit; } $sql = "INSERT INTO $tableNoten (`value`, `person_id`, `note_bezeichnung_id`, `geraet_id`, `jahr`, `run_number`) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param("siiiii", $valueNoteUpdate, $person_id, $field_type_id, $gereat_id, $jahr, $run_number); $stmt->execute(); $stmt->close(); if ($singleNoteConfig['berechnung_json'] === null) { echo json_encode(['success' => true, 'message' => "Wert aktualisiert"]); exit; } require $baseDir . "/../scripts/string-calculator/string-calculator-functions.php"; $updateNoten = []; $notenRechner = new NotenRechner(); try { $abhaenigeRechnungen = json_decode($singleNoteConfig['berechnung_json']); } catch (Exception $e) { echo json_encode(['success' => true, 'message' => "Wert aktualisiert, fehler bei der Berechnung der weiteren Werte"]); exit; } $geraete = db_select($mysqli, $tableGeraete, "id"); // Alle Werte werden von der Datenbank geholt und werden, wenn nicht vorhanden, durch den Standartwert ersetzt. $alleNoten = db_select($mysqli, $tableNotenBezeichnungen, "id, berechnung, default_value, nullstellen, pro_geraet, geraete_json, anzahl_laeufe_json"); $noten = db_select($mysqli, $tableNoten, "`value`, `note_bezeichnung_id`, `geraet_id`, `run_number`", "`person_id` = ? AND `jahr` = ?", [$person_id, $jahr]); $ascArrayDefaultValues = array_column($alleNoten, 'default_value', 'id'); $ascArrayProGeraet = array_column($alleNoten, 'pro_geraet', 'id'); $ascArrayGeraeteJSON = array_column($alleNoten, 'geraete_json', 'id'); $ascArrayAnzahlLaeufeJSON = array_column($alleNoten, 'anzahl_laeufe_json', 'id'); $ascArrayRechnungen = array_column($alleNoten, 'berechnung', 'id'); // $proGeraet = intval($calc['pro_geraet']) !== 1; $indexedNotenArray = []; foreach ($ascArrayGeraeteJSON as $key => $saagj) { $ascArrayGeraeteJSON[$key] = json_decode($saagj, true); } foreach ($ascArrayAnzahlLaeufeJSON as $key => $saalj) { $ascArrayAnzahlLaeufeJSON[$key] = json_decode($saalj, true) ?? []; } foreach ($geraete as $g) { $indexedNotenArray[$g['id']] = []; } $indexedNotenArray[0] = []; foreach ($noten as $sn) { $indexedNotenArray[$sn['geraet_id']][$sn['note_bezeichnung_id']][$sn['run_number']] = $sn['value']; } $alleNotenIds = array_column($alleNoten, 'id') ?? []; foreach ($indexedNotenArray as $sG => $siNA) { $existierendeNotenIds = array_keys($siNA) ?? []; $nichtExistierendeNotenIds = array_diff($alleNotenIds, $existierendeNotenIds) ?? []; foreach ($nichtExistierendeNotenIds as $neni) { if (!isset($ascArrayDefaultValues[$neni])) { continue; } if (intval($ascArrayProGeraet[$neni]) === 1 && intval($sG) === 0) { continue; } if (intval($ascArrayProGeraet[$neni]) !== 1 && (!is_array($ascArrayGeraeteJSON[$neni]) || !in_array($sG, $ascArrayGeraeteJSON[$neni]))) { continue; } // For non-existent notes, we fill all runs with default value // We set Run 1 by default, and if more are configured, also those $indexedNotenArray[$sG][$neni][1] = $ascArrayDefaultValues[$neni]; // Check for more runs in config? (Actually, this might be overkill for defaults, // but the calculator might need them) } } // We only want to save the IDs that were actually recalculated $idsToSave = []; foreach ($abhaenigeRechnungen as $sRechnung) { if ($sRechnung[1] !== "A" && intval($sRechnung[1]) !== $gereat_id) { continue; } $rechnung = $ascArrayRechnungen[$sRechnung[0]] ?? null; $gereadIdArrays = ($sRechnung[1] === "A") ? $gereat_id : $sRechnung[1]; $targetNoteId = $sRechnung[0]; $isProGeraet = (intval($ascArrayProGeraet[$targetNoteId]) === 1); $allowedGeraete = $ascArrayGeraeteJSON[$targetNoteId] ?? []; if ($isProGeraet) { $gereadIdArrays = $gereat_id; } elseif (in_array($gereat_id, $allowedGeraete)) { $gereadIdArrays = $gereat_id; } else { $gereadIdArrays = 0; } if ($rechnung === null) { echo json_encode(['success' => true, 'message' => "Wert aktualisiert, Fehler: Rechnung" . $sRechnung[0] . "nicht gefunden"]); exit; } $calcResult = $notenRechner->berechneStringComplex($rechnung, $indexedNotenArray, $gereat_id); if ($calcResult['success'] !== true) { echo json_encode(['success' => true, 'message' => "Wert aktualisiert, Rechenfehler: " . ($calcResult['value'] ?? '')]); exit; } // Update the local array (Always Run 1 for calculations for now, UNLESS we want calculated runs?) // Most calculations are "Total" points which have run_number = 1 $indexedNotenArray[$gereadIdArrays][$sRechnung[0]][1] = $calcResult['value']; // Track that this ID needs to be written to the database (Target run is 1) $updatedValues[$gereadIdArrays][$sRechnung[0]][1] = $calcResult['value']; } // Prepare the statement once $sql = "INSERT INTO $tableNoten (`value`, `person_id`, `note_bezeichnung_id`, `geraet_id`, `jahr`, `run_number`) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)"; $stmt = $mysqli->prepare($sql); $indexedNullstellen = array_column($alleNoten, 'nullstellen', 'id'); $formatedNoten = []; foreach ($updatedValues as $gereat => $notenArray) { foreach ($notenArray as $note => $runArray) { foreach ($runArray as $run => $value) { $stmt->bind_param("siiiii", $value, $person_id, $note, $gereat, $jahr, $run); $stmt->execute(); $formatedNoten[$gereat][$note][$run] = number_format($value ,$indexedNullstellen[$note] ?? 2); } } } $formatedNoten[$gereat_id][$field_type_id][$run_number] = number_format($valueNoteUpdate ,$indexedNullstellen[$field_type_id] ?? 2); $stmt->close(); $mysqli->close(); echo json_encode([ 'success' => true, 'message' => "Wert aktualisiert, alle Berechnungen durchgeführt", "noten" => $formatedNoten ]);