252 lines
8.4 KiB
PHP
252 lines
8.4 KiB
PHP
<?php
|
|
|
|
ini_set('display_errors', 1);
|
|
ini_set('display_startup_errors', 1);
|
|
|
|
session_start();
|
|
|
|
if (empty($_SESSION['access_granted_kampfrichter']) || $_SESSION['access_granted_kampfrichter'] !== true || empty($_SESSION['passcodekampfrichter_id']) || $_SESSION['passcodekampfrichter_id'] < 1) {
|
|
http_response_code(403);
|
|
exit;
|
|
}
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
if (!isset($baseDir)) {
|
|
$baseDir = $_SERVER['DOCUMENT_ROOT'];
|
|
}
|
|
|
|
$type = 'kr';
|
|
|
|
$data = require $baseDir . '/../scripts/db/db-verbindung-script.php';
|
|
|
|
if ($data['success'] === false){
|
|
echo json_encode(['success' => 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
|
|
]); |