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; if (!isset($_POST['value'])) { echo json_encode(['success' => false, 'message' => 'Kein Value angegeben']); exit; } $value = 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 $tableNotenBezeichnungen 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 && $value > $singleNoteConfig['max_value']) { echo json_encode(['success' => false, 'message' => "Wert zu hoch (max " . $singleNoteConfig['max_value'].")"]); exit; } if ($singleNoteConfig['min_value'] !== null && $value < $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`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)"; $stmt = $mysqli->prepare($sql); $stmt->bind_param("siiii", $value, $person_id, $field_type_id, $gereat_id, $jahr); $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; } // 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"); $noten = db_select($mysqli, $tableNoten, "`value`, `note_bezeichnung_id`", "`person_id` = ? AND `geraet_id` = ? AND `jahr` = ?", [$person_id, $gereat_id, $jahr]); $ascArrayDefaultValues = array_column($alleNoten, 'default_value', 'id'); $ascArrayRechnungen = array_column($alleNoten, 'berechnung', 'id'); $existierendeNotenIds = array_column($noten, 'note_bezeichnung_id') ?? []; $alleNotenIds = array_column($alleNoten, 'id') ?? []; $nichtExistierendeNotenIds = array_diff($alleNotenIds, $existierendeNotenIds) ?? []; $noten = array_column($noten, 'value', 'note_bezeichnung_id'); foreach ($nichtExistierendeNotenIds as $neni) { if (!isset($ascArrayDefaultValues[$neni])) { continue; } $noten[$neni] = $ascArrayDefaultValues[$neni]; } // We only want to save the IDs that were actually recalculated $idsToSave = []; foreach ($abhaenigeRechnungen as $sRechnung) { $rechnung = $ascArrayRechnungen[$sRechnung] ?? null; if ($rechnung === null) { echo json_encode(['success' => true, 'message' => "Wert aktualisiert, Fehler: Rechnung $sRechnung nicht gefunden"]); exit; } $calcResult = $notenRechner->berechneString($rechnung, $noten); if ($calcResult['success'] !== true) { echo json_encode(['success' => true, 'message' => "Wert aktualisiert, Rechenfehler: " . ($calcResult['value'] ?? '')]); exit; } // Update the local array so the NEXT calculation in the loop can use this new value $noten[$sRechnung] = $calcResult['value']; // Track that this ID needs to be written to the database $idsToSave[] = $sRechnung; } // Prepare the statement once $sql = "INSERT INTO $tableNoten (`value`, `person_id`, `note_bezeichnung_id`, `geraet_id`, `jahr`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)"; $stmt = $mysqli->prepare($sql); foreach ($idsToSave as $notenId) { $currentValue = $noten[$notenId]; // Get the calculated value from our array // i = integer, s = string (use 's' for decimals/floats to prevent rounding issues in PHP) $stmt->bind_param("siiii", $currentValue, $person_id, $notenId, $gereat_id, $jahr); $stmt->execute(); } $stmt->close(); $mysqli->close(); // 1. Combine the ID the user sent with the IDs we recalculated $changedIds = array_merge([$field_type_id], $idsToSave); // 2. Filter the $noten array to only include these keys // array_flip turns [10, 20] into [10 => 0, 20 => 1] so we can intersect by keys $changedNoten = array_intersect_key($noten, array_flip($changedIds)); $indexedNullstellen = array_column($alleNoten, 'nullstellen', 'id'); foreach ($changedNoten as $key => $scN) { $changedNoten[$key] = number_format($scN ,$indexedNullstellen[$key] ?? 2); } echo json_encode([ 'success' => true, 'message' => "Wert aktualisiert, alle Berechnungen durchgeführt", "noten" => $changedNoten ]);