New Filestructure for Docker

This commit is contained in:
2026-07-31 23:53:14 +02:00
parent 1e10ed4de8
commit 5bcf2a3546
239 changed files with 710 additions and 2000 deletions
@@ -0,0 +1,188 @@
<?php
use Shuchkin\SimpleXLSX;
header('Content-Type: application/json');
if (!isset($baseDir))
$baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
require $baseDir . '/../scripts/db/db-functions.php';
require $baseDir . '/../scripts/db/db-tables.php';
require $baseDir . '/../composer/vendor/autoload.php';
$type = 'tr';
$dbconnection = require $baseDir . '/../scripts/db/db-verbindung-script.php';
if ($dbconnection['success'] !== true) {
echo 'Critical DB Error.';
exit;
}
if ($_FILES['xlsx_file']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['success' => false, 'message' => 'Fehler beim Datei-Upload']);
http_response_code(400);
exit;
}
$tmpName = $_FILES['xlsx_file']['tmp_name'];
if (!class_exists('Shuchkin\\SimpleXLSX')) {
echo json_encode(['success' => false, 'message' => 'Fehler beim Laden des Plugins']);
http_response_code(400);
exit;
}
$xlsx = SimpleXLSX::parse($tmpName);
$rows = $xlsx->rows();
$vereine_rows = db_select($mysqli, $db_tabelle_vereine, 'verein', '', [], 'verein ASC');
$vereine = array_column($vereine_rows, 'verein');
if (count($rows) < 2) {
echo json_encode(['success' => false, 'message' => 'Die Excel-Datei muss mindestens einen Eintrag enthalten']);
http_response_code(400);
exit;
}
$selectedverein = $_SESSION['selectedFreigabeTrainer'] ?? '';
$isAdmin = $selectedverein === "admin";
$columnMap = [
'Nachname' => 'name',
'Vorname' => 'vorname',
'Geburtsdatum' => 'geburtsdatum',
'Programm' => 'programm'
];
if ($isAdmin) {
$columnMap['Verein'] = 'verein';
}
$header_row = false;
foreach ($rows as $row_index => $row) {
$formated_row = array_map('trim', $row);
$columnIndexes = [];
$column_not_found = false;
foreach ($columnMap as $excelHeader => $dbColumn) {
$index = array_search($excelHeader, $formated_row);
if ($index === false) {
$column_not_found = true;
break;
}
$columnIndexes[$dbColumn] = $index;
}
if ($column_not_found) {
continue;
} else {
$header_row = $row_index;
break;
}
}
if (!$header_row) {
echo json_encode(['success' => false, 'message' => 'Es wurde keine vollständige Header-Zeile gefunden']);
http_response_code(400);
exit;
}
for ($i = 0; $i <= (max($header_row, 1)); $i++) {
unset($rows[$i]);
}
$programme_db = db_select($mysqli, $db_tabelle_kategorien, 'programm', 'aktiv = ?', [1], 'programm ASC');
$programme = array_column($programme_db, 'programm');
$mysqli->begin_transaction();
$columns = ['name', 'vorname', 'geburtsdatum', 'programm', 'verein'];
$set = implode(', ', array_map(fn($col) => "$col = ?", $columns));
$sql = "INSERT INTO $db_tabelle_teilnehmende SET $set";
$stmt = $mysqli->prepare($sql);
$types = str_repeat('s', count($columns));
try {
foreach ($rows as $row) {
if (!array_filter($row))
continue;
$data = [];
foreach ($columnIndexes as $dbCol => $excel_column_index) {
$data[$dbCol] = isset($row[$excel_column_index]) ? trim($row[$excel_column_index]) : null;
}
if (!$isAdmin) {
$data['verein'] = $selectedverein;
} else {
if (!in_array($data['verein'], $vereine)) {
echo json_encode(['success' => false, 'message' => $data['verein'] . " existiert nicht im System"]);
http_response_code(400);
exit;
}
}
$raw = trim($data['geburtsdatum']);
$temp = DateTime::createFromFormat('d.m.Y', $raw);
if ($temp && $temp->format('d.m.Y') === $raw) {
$data['geburtsdatum'] = $temp->format('Y-m-d');
} else {
$data['geburtsdatum'] = substr($raw, 0, 10);
}
if (is_array($programme) && !(in_array($data['programm'], $programme))) {
echo json_encode(['success' => false, 'message' => "Programm '{$data['programm']}' nicht valide bei " . $personEinzahl . " " . $data['name'] . " " . $data['vorname']]);
http_response_code(400);
exit;
}
$values = array_values($data);
$stmt->bind_param($types, ...$values);
if (!$stmt->execute()) {
echo json_encode(['success' => false, 'message' => "Fehler beim Einfügen eines Datensatzes"]);
http_response_code(400);
exit;
}
}
$stmt->close();
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
echo json_encode(['success' => false, 'message' => "Fehler beim Einfügen der Datensätze"]);
http_response_code(400);
exit;
}
echo json_encode(['success' => true, 'message' => count($rows) . " Datensätze importiert"]);
http_response_code(200);
exit;
@@ -0,0 +1,201 @@
<?php
if (!isset($baseDir)) $baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
ini_set('display_errors', 1);
$type = 'tr';
$data = include $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-tables.php';
require $baseDir . '/../scripts/db/db-functions.php';
$ids = isset($_POST['ids']) ? htmlspecialchars(strip_tags(trim($_POST['ids'])), ENT_QUOTES) : '';
$user = intval($_SESSION['user_id_trainer']);
$arrayids = array_filter(array_map('trim', explode(',', $ids)));
if (!$arrayids || !is_array($arrayids) || count($arrayids) === 0) {
http_response_code(422);
exit;
}
if ($user <= 0) {
http_response_code(422);
exit;
}
$placeholders = [];
$values = [];
$types = '';
foreach ($arrayids as $id) {
if ($id <= 0) {
http_response_code(422);
exit;
}
$sql = "SELECT bezahlt FROM $db_tabelle_teilnehmende WHERE id = ?";
$checkstmt = $mysqli->prepare($sql);
$checkstmt->bind_param("i", $id);
if (!$checkstmt->execute()) {
http_response_code(500);
exit;
}
$checkstmt->bind_result($bezahlt);
$checkstmt->fetch();
$checkstmt->close();
$sql2 = "SELECT COUNT(*) FROM $db_tabelle_warenkorb_startgebueren WHERE user_id = ? AND item_id = ?";
$checkstmt2 = $mysqli->prepare($sql2);
$checkstmt2->bind_param("ii", $user, $id);
if (!$checkstmt2->execute()) {
http_response_code(500);
exit;
}
// Bind the result
$checkstmt2->bind_result($countProd);
$checkstmt2->fetch(); // fetch into $countProd
$checkstmt2->close();
if (isset($bezahlt) && in_array($bezahlt, [1,2]) && $countProd === 0) {
$placeholders[] = '(?, ?)';
$types .= 'ii';
$values[] = $user;
$values[] = $id;
}
}
if ($values === [] || $placeholders === [] || $types === '') {
http_response_code(406);
exit;
}
$sql = "INSERT INTO `$db_tabelle_warenkorb_startgebueren` (user_id, item_id) VALUES " . implode(',', $placeholders);
$stmt = $mysqli->prepare($sql);
$stmt->bind_param($types, ...$values);
$success = $stmt->execute();
$stmt->close();
if (!$success) {
http_response_code(500);
exit;
}
// Prepare statements once
$sSql = "SELECT `name`, `vorname`, `programm`, `betrag_bezahlt`, `verein`
FROM $db_tabelle_teilnehmende
WHERE id = ?";
$kats = db_select($mysqli, $db_tabelle_kategorien, '`preis`, `programm`');
$indexed_kat_preise = array_column($kats, 'preis', 'programm');
$vereine = db_select($mysqli, $db_tabelle_vereine, '`verein`, `konto`, `id`');
$indexed_vereine_kontos = array_column($vereine, 'konto', 'verein');
$indexed_vereine = array_column($vereine, 'id', 'verein');
$sStmt = $mysqli->prepare($sSql);
$id = null;
$sStmt->bind_param("i", $id);
$array_response_gebueren = [];
$array_response_abzuege = [];
$array_vereine = [];
foreach ($arrayids as $id) {
// --- Turnerinnen ---
if (!$sStmt->execute()) {
http_response_code(500);
exit;
}
$row = $sStmt->get_result()->fetch_assoc();
if (!$row || !isset($row['programm'])) {
http_response_code(500);
exit;
}
$kat = $row['programm'];
if (!isset($indexed_kat_preise[$kat])) {
echo json_encode(['success' => false, 'message' => 'Der Preis einer Kat ist nicht definiert. Kat: '. $kat ]);
http_response_code(500);
exit;
}
$betrag_bezahlt = (float) $row['betrag_bezahlt'] ?? 0;
$preis = ((float) $indexed_kat_preise[$kat]) - $betrag_bezahlt;
$array_vereine[$row['verein']] ??= 0.00;
$array_vereine[$row['verein']] += $preis;
$formated_preis = number_format($preis, 2, '.', "'");
// --- Build response ---
$array_response_gebueren[$id] = [
'turnerinName' => $row['name'],
'turnerinVorname' => $row['vorname'],
'programm' => $row['programm'],
'preis' => $preis,
'verein' => $row['verein'],
'formated_preis' => $formated_preis,
'appendix' => ($betrag_bezahlt !== 0.00) ? ' (Red.)' : ''
];
}
foreach ($array_vereine as $verein => $betrag) {
$array_response_abzuege[$verein]['betrag'] = $betrag;
$array_response_abzuege[$verein]['max'] = $indexed_vereine_kontos[$verein] ?? 0;
$array_response_abzuege[$verein]['vereinId'] = $indexed_vereine[$verein];
}
// Close statements once
$sStmt->close();
http_response_code(200);
echo json_encode([
'success' => true,
'message' => 'Zum Warenkorb hinzugefügt',
'arrayGebueren' => $array_response_gebueren,
'arrayAbzuege' => $array_response_abzuege
]);
exit;
@@ -0,0 +1,91 @@
<?php
header('Content-Type: application/json');
if (!isset($baseDir))
$baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
require $baseDir . '/../scripts/db/db-functions.php';
require $baseDir . '/../scripts/db/db-tables.php';
$type = 'tr';
$dbconnection = require $baseDir . '/../scripts/db/db-verbindung-script.php';
if ($dbconnection['success'] !== true) {
echo 'Critical DB Error.';
exit;
}
$personen_ids_json = $_POST['personen_ids'] ?? '';
$personen_ids = json_decode($personen_ids_json) ?? [];
$personen_ids = !is_array($personen_ids) ? array(intval($personen_ids)) : array_map('intval', $personen_ids);
if (count($personen_ids) < 1) {
echo json_encode(['success' => false, 'message' => "Keine Personen angegeben"]);
http_response_code(422);
exit;
}
$userid = intval($_SESSION['user_id_trainer'] ?? 0);
$arrayfreigaben = [];
if ($userid > 0) {
$freigabe_json = db_get_var($mysqli, "SELECT freigabe FROM $db_tabelle_intern_benutzende WHERE id = ?", [$userid]);
if (is_string($freigabe_json) && $freigabe_json !== '') {
$arrayfreigaben = json_decode($freigabe_json, true) ?: [];
$arrayfreigaben = $arrayfreigaben['freigabenTrainer'] ?? [];
}
}
if (!empty($arrayfreigaben)) {
$selectedverein = $_SESSION['selectedFreigabeTrainer'] ?? '';
if (!in_array($selectedverein, $arrayfreigaben)) {
$selectedverein = $arrayfreigaben[0];
$_SESSION['selectedFreigabeTrainer'] = $selectedverein;
}
}
$isAdmin = $selectedverein === "admin";
$mysqli->begin_transaction();
try {
if (!$isAdmin) {
$stmt = $mysqli->prepare("DELETE FROM $db_tabelle_teilnehmende WHERE `id` = ? AND `verein` = ?");
foreach ($personen_ids as $s_id) {
$stmt->bind_param("is", $s_id, $selectedverein);
$stmt->execute();
}
} else {
$stmt = $mysqli->prepare("DELETE FROM $db_tabelle_teilnehmende WHERE `id` = ?");
foreach ($personen_ids as $s_id) {
$stmt->bind_param("i", $s_id);
$stmt->execute();
}
}
$stmt->close();
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
echo json_encode(['success' => false, 'message' => "Datenbankfehler beim Löschen"]);
http_response_code(500);
exit;
}
echo json_encode(['success' => true, 'message' => count($personen_ids) . " Datensätze gelöscht"]);
http_response_code(200);
exit;
@@ -0,0 +1,670 @@
<?php
use Sprain\SwissQrBill\PaymentPart\Output\DisplayOptions;
use Sprain\SwissQrBill\PaymentPart\Output\TcPdfOutput\TcPdfOutput;
use TCPDF;
use Sprain\SwissQrBill as QrBill;
header('Content-Type: application/json');
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (!isset($baseDir)) $baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
if (!isset($_POST['name']) || !isset($_POST['vorname']) || !isset($_POST['strasse']) || !isset($_POST['plz']) || !isset($_POST['ort'])) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Daten für die Rechnungserstellung fehlen.']);
exit;
}
function generateInvoiceNumber() : int {
return random_int(10000000, 99999999);
}
$orderType = 'Startgebühr';
function createInvoice(mysqli $conn, $db_tabelle_verbuchte_startgebueren, $orderType, $userId, $jsonIds, $used_verein_konten, $order_status): int
{
$maxRetries = 25;
for ($i = 0; $i < $maxRetries; $i++) {
$invoiceNumber = generateInvoiceNumber();
$stmt = $conn->prepare(
"INSERT INTO `$db_tabelle_verbuchte_startgebueren` (order_id, order_type, user_id, item_ids, used_verein_konten, order_status)
VALUES (?, ?, ?, ?, ?, ?)"
);
$stmt->bind_param(
"isissi",
$invoiceNumber, $orderType, $userId, $jsonIds, $used_verein_konten, $order_status
);
if ($stmt->execute()) {
return $invoiceNumber;
}
// Duplicate key error → retry
if ($conn->errno !== 1062) {
throw new RuntimeException(
"Database error ({$conn->errno}): {$conn->error}"
);
}
}
throw new RuntimeException('Failed to generate unique invoice number');
}
$userId = $_SESSION['user_id_trainer'];
$type = 'tr';
$data = include $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-tables.php';
require $baseDir . '/../scripts/db/db-functions.php';
require $baseDir . '/../composer/vendor/autoload.php';
$sql = "SELECT
bi.id AS basket_id,
bi.item_id,
p.programm AS programm_name,
p.preis,
bi.id,
t.betrag_bezahlt
FROM $db_tabelle_warenkorb_startgebueren bi
LEFT JOIN $db_tabelle_teilnehmende t ON bi.item_id = t.id
LEFT JOIN $db_tabelle_kategorien p ON p.programm = t.programm
WHERE bi.user_id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);
if (!$rows || count($rows) < 1) {
http_response_code(422);
exit;
}
$used_konten_json = $_POST['usedKonten'] ?? '{}';
$used_konten = json_decode($used_konten_json, true) ?? [];
$konten_save = [];
if (count($used_konten) > 0) {
$db_konten = db_select($mysqli, $db_tabelle_vereine, '`verein`, `konto`');
$indexed_konten = array_column($db_konten, 'konto', 'verein');
$db_user_permissions = db_get_var($mysqli, "SELECT `freigabe` FROM $db_tabelle_intern_benutzende WHERE `id` = ?", [$userId]);
$array_permissions = json_decode($db_user_permissions ?? '', true) ?? [];
$trainer_permissions = $array_permissions['freigabenTrainer'] ?? [];
foreach ($used_konten as $verein => $betrag) {
if (!isset($indexed_konten[$verein])) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Invalider Verein ' . htmlspecialchars($verein)]);
exit;
} elseif (!isset($trainer_permissions[$verein]) && !in_array('admin', $trainer_permissions)) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Keine Berechtigung auf den Zugriff des Kontos des Vereins ' . htmlspecialchars($verein)]);
exit;
} elseif ((float) $indexed_konten[$verein] < (float) $betrag) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'Der Abzug des Vereins ' . htmlspecialchars($verein) . ' übersteigt das Guthaben dieses Vereins.']);
exit;
}
$konten_save[$verein] = (float) $betrag;
}
}
$used_verein_konten = json_encode($konten_save);
$preis = 0;
$ids = [];
foreach ($rows as $r) {
$r_preis = max(floatval($r['preis']) - floatval($r['betrag_bezahlt']), 0);
$preis += $r_preis;
$ids[$r['item_id']] = $r_preis;
}
$preis = min($preis - array_sum($konten_save), 0);
$jsonIds = json_encode($ids);
$all_teilnehmende_ids = array_keys($ids);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Invalid JSON']);
exit;
}
// --- Check for existing open order ---
$order_id = db_get_var($mysqli, "SELECT order_id FROM `$db_tabelle_verbuchte_startgebueren` WHERE user_id = ? AND order_status = 0 LIMIT 1", [$userId]);
$orderId = null;
if ($order_id === null) {
// --- INSERT new order ---
$stmt->close();
$order_status = 0;
$new_id = createInvoice($mysqli, $db_tabelle_verbuchte_startgebueren, $orderType, $userId, $jsonIds, $used_verein_konten, $order_status);
$orderId = $new_id;
} else {
// --- UPDATE existing order ---
$stmt->close();
$orderId = $order_id;
$sql = "
UPDATE `$db_tabelle_verbuchte_startgebueren`
SET item_ids = ?, used_verein_konten = ?
WHERE order_id = ?
";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("ssi", $jsonIds, $used_verein_konten, $order_id);
$stmt->execute();
}
$keys = [
'wkName', 'rechnungenName', 'rechnungenVorname', 'rechnungenStrasse',
'rechnungenHausnummer', 'rechnungenPostleitzahl', 'rechnungenOrt',
'rechnungenIBAN', 'linkWebseite', 'rechnungenPostversand', 'rechnungenPostversandKosten'
];
$placeholders = implode(',', array_fill(0, count($keys), '?'));
$stmt = $mysqli->prepare("SELECT `name`, `value` FROM $db_tabelle_var WHERE `name` IN ($placeholders)");
$stmt->bind_param(str_repeat('s', count($keys)), ...$keys);
$stmt->execute();
$variables = array_column($stmt->get_result()->fetch_all(MYSQLI_ASSOC), 'value', 'name');
$kats = db_select($mysqli, $db_tabelle_kategorien, '`programm`, `preis`');
$indexed_kats_preis = array_column($kats, 'preis', 'programm');
$current_wk_id = (int) db_get_variable($mysqli, $db_tabelle_var, ['current_wk_id']) ?: 0;
$current_wk_name = db_get_var($mysqli, "SELECT `name` FROM $db_tabelle_wettkaempfe WHERE `id` = ? LIMIT 1", [$current_wk_id]) ?: ($wkName . ' ' . $current_year);
class MYPDF extends TCPDF
{
public $columns;
public $headerBottomY = 0;
public $firstPageDone = false; // track first page
public $abzuegeHeader = false; // track first page
public $printfooter;
public function Header()
{
// Logo always
$image_file = $_SERVER['DOCUMENT_ROOT'] . '/intern/img/logo-normal.png';
$this->Image($image_file, 180, 15, 15);
// Table header only for subsequent pages
if ($this->abzuegeHeader) {
// Use same top margin as table
$this->SetY(35); // or another fixed Y
$this->SetX(15);
$this->SetFont('GoogleSansFlex-Regular', '', 11);
$this->setCellPaddings(2, 0, 2, 0);
$this->Cell($this->columns['name']['max_width'] + $this->columns['programm']['max_width'] + $this->columns['verein']['max_width'], 10, 'Beschreibung', 0, 0, 'L');
$this->Cell($this->columns['preis']['max_width'], 10, 'Abzug', 0, 0, 'C');
$this->Ln();
$this->headerBottomY = $this->GetY();
$this->SetLineWidth(0.6);
$this->Line(15, $this->GetY(), 210 - 15, $this->GetY());
$this->SetLineWidth(0.2);
} elseif ($this->firstPageDone && !empty($this->columns)) {
// Use same top margin as table
$this->SetY(35); // or another fixed Y
$this->SetX(15);
$this->SetFont('GoogleSansFlex-Regular', '', 11);
$this->setCellPaddings(2, 0, 2, 0);
foreach ($this->columns as $c) {
$this->Cell($c['max_width'], 10, $c['header'], 0, 0, 'L');
}
$this->Ln();
$this->headerBottomY = $this->GetY();
$this->SetLineWidth(0.6);
$this->Line(15, $this->GetY(), 210 - 15, $this->GetY());
$this->SetLineWidth(0.2);
}
}
public function Footer()
{
}
}
// --- Create PDF ---
$pdf = new MYPDF('P', 'mm', 'A4', true, 'UTF-8', false);
$pdf->current_year = (date('n') > 6) ? date('Y') + 1 : date('Y');
$pdf->wkp_name = trim(($variables['rechnungenVorname'] ?? '') . ' ' . ($variables['rechnungenName'] ?? ''));
$pdf->wkp_adresse = trim(($variables['rechnungenStrasse'] ?? '') . ' ' . ($variables['rechnungenHausnummer'] ?? ''));
$pdf->wkp_plz_ort = trim(($variables['rechnungenPostleitzahl'] ?? '') . ' ' . ($variables['rechnungenOrt'] ?? ''));
$pdf->wkp_url = $variables['linkWebseite'] ?? '';
$pdf->wk_name = $variables['wkName'] ?? '';
$pdf->pers_name = trim(($_POST['vorname'] ?? '') . ' ' . ($_POST['name'] ?? ''));
$pdf->pers_adresse = trim(($_POST['strasse'] ?? '') . ' ' . ($_POST['hausnummer'] ?? ''));
$pdf->pers_plz_ort = trim(($_POST['plz'] ?? '') . ' ' . ($_POST['ort'] ?? ''));
$pdf->printfooter = true;
$pdf->current_wk_name = $current_wk_name;
// Mark first page done so Header() prints table headers on subsequent pages
$pdf->firstPageDone = false;
$pdf->setCellPaddings(2, 0, 2, 0);
$pdf->SetMargins(15, 35, 15);
// Fonts
$pdf->AddFont('GoogleSansFlex9pt-Bold', '', $_SERVER['DOCUMENT_ROOT'] . '/../private-files/tcpdf-fonts/googlesansflex_9ptb.php');
$pdf->AddFont('GoogleSansFlex-Regular', '', $_SERVER['DOCUMENT_ROOT'] . '/../private-files/tcpdf-fonts/gsf.php');
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('WKVS');
$pdf->SetAutoPageBreak(TRUE, 10);
$pdf->SetFont('GoogleSansFlex-Regular', '', 11);
// --- Add a page ---
$pdf->AddPage();
// --- Sender block (left) ---
$pdf->SetX(15);
$pdf->Cell(0, 0, $pdf->wkp_name, 0, 1);
$pdf->Cell(0, 0, $pdf->wkp_adresse, 0, 1);
$pdf->Cell(0, 0, $pdf->wkp_plz_ort, 0, 1);
$pdf->Ln(7);
$pdf->Cell(0, 0, $pdf->wkp_url, 0, 1);
// --- Recipient block (right / window) ---
$x = 110; // X coordinate for right window
$y = 50; // Y coordinate
$w = 80; // Width of recipient block
$address = implode("\n", [
$pdf->pers_name,
$pdf->pers_adresse,
$pdf->pers_plz_ort
]);
$pdf->MultiCell($w, 5, $address, 0, 'L', false, 1, $x, $y, true);
date_default_timezone_set('UTC');
// --- Invoice title ---
$pdf->Ln(20); // space below recipient
$pdf->SetFont('GoogleSansFlex9pt-Bold', '', 15);
$pdf->Cell(0, 10, 'Startgebührenrechnung ' . $pdf->current_wk_name, 0, 1, 'L');
$pdf->SetFont('GoogleSansFlex-Regular', '', 10);
$pdf->Cell(0, 9, "Rechnungsnummer: " . $orderId, 0, 1, 'L');
$pdf->SetFont('GoogleSansFlex-Regular', '', 7);
$pdf->Cell(0, 0, "Ausstellungsdatum: " . date("d.m.y"), 0, 1, 'L');
$pdf->Ln(10); // space below title
$pdf->SetFont('GoogleSansFlex9pt-Bold', '', 13);
//$turnerinnnenIds = [];
$placeholders = implode(', ', array_fill(0, count($all_teilnehmende_ids), '?'));
$all_teilnehmende = db_select($mysqli, $db_tabelle_teilnehmende, '`id`, name, vorname, programm, verein, `betrag_bezahlt`', "id IN ($placeholders)", $all_teilnehmende_ids);
$all_teilnehmende_indexed = array_column($all_teilnehmende, null, 'id');
$columns = ['name' => ['header' => 'Name'],
'programm' => ['header' => 'Programm'],
'verein' => ['header' => 'Verein'],
'preis' => ['header' => 'Startgebühr']];
foreach ($columns as $key => $column){
$columns[$key]['max_width'] = $pdf->GetStringWidth($column['header']);
}
$totalPreis = 0.00;
$dbdata = [];
foreach ($ids as $singleid => $s_preis){
if (!isset($all_teilnehmende_indexed[$singleid])) continue;
$row = &$all_teilnehmende_indexed[$singleid];
if (count($row) !== 6) continue;
$float_preis = (float) $s_preis;
$formated_preis = number_format($float_preis, 2, '.', "'");
$totalPreis += $float_preis;
$row['formated_preis'] = $formated_preis;
$programm = $row['programm'] ?? '';
$kosten_kat_normal = (float) ($indexed_kats_preis[$programm] ?? 0.00);
$preis_text = $float_preis !== $kosten_kat_normal ? 'Die Startgebühren dieser Person wurden reduziert, da diese Person bereits CHF ' . number_format($row['betrag_bezahlt'], 2, '.', "'") . ' an Startgebühren zahlte' : '';
$row['preis_text'] = $preis_text;
$pdf->SetFont('', '', 10);
$text = 'Startgebühr '. ($row['name'] ?? '') .' '. ($row['vorname'] ?? '');
$text_width = $pdf->GetStringWidth($text);
$kat_width = $pdf->GetStringWidth($row['programm'] ?? '');
$verein_width = $pdf->GetStringWidth($row['verein'] ?? '');
$preis_width = $pdf->GetStringWidth('CHF '. $formated_preis);
$columns['name']['max_width'] = max($columns['name']['max_width'] ?? 0, $text_width);
$columns['programm']['max_width'] = max($columns['programm']['max_width'] ?? 0, $kat_width);
$columns['verein']['max_width'] = max($columns['verein']['max_width'] ?? 0, $verein_width);
$columns['preis']['max_width'] = max($columns['preis']['max_width'] ?? 0, $preis_width);
}
unset($row);
foreach ($columns as $key => $column){
$columns[$key]['max_width'] += 2; // Add some padding
}
$maxWidth = 210 - 30; // A4 width minus margins
$totalColumnWidth = 0;
foreach ($columns as $column){
$totalColumnWidth += $column['max_width'];
}
if ($totalColumnWidth < $maxWidth){
$scalingFactor = $maxWidth / $totalColumnWidth;
foreach ($columns as $key => $column){
$columns[$key]['max_width'] = $column['max_width'] * $scalingFactor;
}
}
foreach ($columns as $c) {
$pdf->Cell($c['max_width'], 10, $c['header'], 0, 0, 'L');
}
$pdf->Ln();
$pdf->SetLineWidth(0.6);
$pdf->Line(15, $pdf->GetY(), 210 - 15, $pdf->GetY());
$pdf->SetLineWidth(0.2);
$pdf->headerBottomY = $pdf->GetY();
// --- Set top margin for table below title ---
// Mark first page done so Header() prints table headers on subsequent pages
$pdf->firstPageDone = true;
$pdf->SetFont('GoogleSansFlex-Regular', '', 11);
$pdf->columns = $columns;
$margin_top = $pdf->headerBottomY;
$pdf->SetMargins(15, 45, 15); // +5 mm padding below header
$pdf->SetY($margin_top); // Move cursor below header manually
foreach ($all_teilnehmende_indexed as $s_id => $row){
$pdf->SetFont('', '', 10);
$text = 'Startgebühr '. ($row['name'] ?? '') .' '. ($row['vorname'] ?? '');
$pdf->Cell($columns['name']['max_width'], 10, $text, 0, 0, 'L');
$pdf->Cell($columns['programm']['max_width'], 10, $row['programm'] ?? '', 0, 0, 'L');
$pdf->Cell($columns['verein']['max_width'], 10, $row['verein'] ?? '', 0, 0, 'L');
$pdf->SetFillColor(100, 100, 100);
$formated_preis = $row['formated_preis'] ?? '';
$pdf->Cell($columns['preis']['max_width'], 10, 'CHF ' . $formated_preis, 0, 1, 'C');
if ($row['preis_text'] !== '') {
$pdf->SetY($pdf->getY() - 3);
$pdf->SetFont('', '', 6);
$pdf->Cell(195, 6, $row['preis_text'], 0, 1, 'L');
$pdf->SetFont('', '', 10);
}
$pdf->SetDrawColor(100, 100, 100);
$pdf->Line(15, $pdf->getY(), 210 - 15, $pdf->getY());
$pdf->SetDrawColor(0, 0, 0);
}
if ($variables['rechnungenPostversand'] && isset($_POST['postversand'])) {
$pdf->SetFont('', '', 10);
$text = 'Postversand der Rechnung';
$pdf->Cell($columns['name']['max_width'], 10, $text, 0, 0, 'L');
$pdf->Cell($columns['programm']['max_width'], 10, '', 0, 0, 'L');
$pdf->Cell($columns['verein']['max_width'], 10, '', 0, 0, 'L');
$pdf->SetFillColor(100, 100, 100);
$pdf->Cell($columns['preis']['max_width'], 10, 'CHF '. number_format(floatval($variables['rechnungenPostversandKosten'] ?? 0), 2, ".", "'"), 0, 1, 'C');
$pdf->SetDrawColor(100, 100, 100);
$pdf->Line(15, $pdf->getY(), 210 - 15, $pdf->getY());
$pdf->SetDrawColor(0, 0, 0);
$totalPreis += floatval($variables['rechnungenPostversandKosten'] ?? 0);
}
if (count($konten_save) > 0) {
$pdf->Ln(8);
$pdf->SetFont('GoogleSansFlex9pt-Bold', '', 10);
$pdf->Cell(0, 10, 'Abzüge (Vereinsguthaben)', 0, 1, 'L');
$pdf->SetFont('GoogleSansFlex-Regular', '', 10);
$pdf->SetFont('GoogleSansFlex9pt-Bold', '', 11);
$pdf->Cell($columns['name']['max_width'] + $columns['programm']['max_width'] + $columns['verein']['max_width'], 10, 'Beschreibung', 0, 0, 'L');
$pdf->Cell($columns['preis']['max_width'], 10, 'Abzug', 0, 0, 'C');
$pdf->Ln();
$pdf->SetLineWidth(0.6);
$pdf->Line(15, $pdf->GetY(), 210 - 15, $pdf->GetY());
$pdf->SetLineWidth(0.2);
$pdf->abzuegeHeader = true;
foreach ($konten_save as $verein => $betrag) {
$pdf->SetFont('', '', 10);
$text = 'Guthaben '. $verein;
$pdf->Cell($columns['name']['max_width'] + $columns['programm']['max_width'] + $columns['verein']['max_width'], 10, $text, 0, 0, 'L');
$pdf->SetFillColor(100, 100, 100);
$formated_preis = number_format(floatval($betrag ?? 0), 2, ".", "'");
$pdf->Cell($columns['preis']['max_width'], 10, '- CHF ' . $formated_preis, 0, 1, 'C');
$pdf->SetDrawColor(100, 100, 100);
$pdf->Line(15, $pdf->getY(), 210 - 15, $pdf->getY());
$pdf->SetDrawColor(0, 0, 0);
$totalPreis -= (float) $betrag;
}
$pdf->abzuegeHeader = false;
}
$pdf->Ln(3);
$pdf->SetFont('GoogleSansFlex9pt-Bold', '', 10);
$pdf->Cell(100, 10, "Gesamt:", 0, 0, 'L');
$pdf->SetX($columns['name']['max_width'] + $columns['programm']['max_width'] + $columns['verein']['max_width'] + 15);
$pdf->Cell($columns['preis']['max_width'], 10, 'CHF ' . number_format($totalPreis, 2, ".", "'"), 0, 1, 'C');
$pdf->SetFont('GoogleSansFlex-Regular', '', 10);
$cent_total_preis = (int) round($totalPreis * 100);
$rechnung_is_null = $cent_total_preis === 0;
if ($rechnung_is_null) {
$pdf->Ln(10);
$pdf->SetTextColor(90, 103, 39);
$pdf->MultiCell(0, 8, 'Diese Rechnung wurde als bezahlt eingetragen, da der Betrag CHF 0.00 beträgt', 0, 'L');
$pdf->SetTextColor(0, 0, 0);
} else {
$qrBill = QrBill\QrBill::create();
$qrBill->setCreditor(
QrBill\DataGroup\Element\StructuredAddress::createWithStreet(
$pdf->wkp_name,
trim($variables['rechnungenStrasse'] ?? ''),
trim($variables['rechnungenHausnummer'] ?? ''),
trim($variables['rechnungenPostleitzahl'] ?? ''),
trim($variables['rechnungenOrt'] ?? ''),
'CH'
)
);
$iban = strtoupper(str_replace(' ', '', (string)($variables['rechnungenIBAN'] ?? '')));
$qrBill->setCreditorInformation(
QrBill\DataGroup\Element\CreditorInformation::create($iban)
);
// Add debtor information
// Who has to pay the invoice? This part is optional.
$qrBill->setUltimateDebtor(
QrBill\DataGroup\Element\StructuredAddress::createWithStreet(
$_POST['vorname'] . ' ' . $_POST['name'],
$_POST['strasse'],
$_POST['hausnummer'],
$_POST['plz'],
$_POST['ort'],
'CH'
)
);
// Add payment amount information
// What amount is to be paid?
$qrBill->setPaymentAmountInformation(
QrBill\DataGroup\Element\PaymentAmountInformation::create(
'CHF',
$totalPreis
)
);
// Add payment reference
// This is what you will need to identify incoming payments.
$qrBill->setPaymentReference(
QrBill\DataGroup\Element\PaymentReference::create(
QrBill\DataGroup\Element\PaymentReference::TYPE_SCOR,
QrBill\Reference\RfCreditorReferenceGenerator::generate($orderId)
)
);
$referenz = "Startgebührenrechnung ". $pdf->wkp_name;
// Optionally, add some human-readable information about what the bill is for.
$qrBill->setAdditionalInformation(
QrBill\DataGroup\Element\AdditionalInformation::create(
$referenz
)
);
// 3. Create a full payment part for TcPDF
$output = new TcPdfOutput($qrBill, 'de', $pdf);
// 4. Optional, set layout options
if (class_exists(DisplayOptions::class)) {
$displayOptions = new DisplayOptions();
$displayOptions
->setPrintable(false) // true to remove lines for printing on a perforated stationery
->setDisplayTextDownArrows(false) // true to show arrows next to separation text, if shown
->setDisplayScissors(false) // true to show scissors instead of separation text
->setPositionScissorsAtBottom(false) // true to place scissors at the bottom, if shown
;
// 5. Generate the output, applying display options when supported
if (method_exists($output, 'setDisplayOptions')) {
$output->setDisplayOptions($displayOptions);
}
}
if ($pdf->getY() > 297 - 120) {
$pdf->firstPageDone = false;
$pdf->printfooter = false;
$pdf->addPage();
}
$output->getPaymentPart();
}
$filename = 'Rechnung Startgebuehren '.$current_wk_name.' '.date('YmdHis').'.pdf';
$pdf->SetTitle($filename);
$savePath = $baseDir . '/../private-files/rechnungen/' . $orderId . '.pdf';
// Save PDF to disk
$pdf->Output($savePath, 'F');
$orderStatus = $rechnung_is_null ? 2 : 1 ;
$sql = "UPDATE $db_tabelle_verbuchte_startgebueren SET order_status = ?, `preis` = ? WHERE order_id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("idi", $orderStatus, $totalPreis, $orderId);
$stmt->execute();
$stmt->close();
require $baseDir . '/../scripts/rechnungen/rechnungs-functions.php';
update_teilnehmende($ids, 0, $orderStatus, true);
update_konten_vereine($konten_save, 0, $orderStatus, true);
// 2. DELETE basket items
db_delete($mysqli, $db_tabelle_warenkorb_startgebueren, ['user_id' => intval($userId)]);
$mysqli->close();
// Send headers manually
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . $dirFileName . '"');
header('Content-Length: ' . filesize($savePath));
// Send file contents
readfile($savePath);
exit;
@@ -0,0 +1,61 @@
<?php
header('Content-Type: application/json');
if (!isset($baseDir)) $baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
$type = 'tr';
$data = include $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-tables.php';
require $baseDir . '/../scripts/db/db-functions.php';
// --- Get input ---
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
$userId = intval($_SESSION['user_id_trainer']);
// --- Validate inputs ---
if ($id < 1) {
http_response_code(422);
echo json_encode(["success" => false, "message" => "Nicht valide id"]);
exit;
}
$verein = db_get_var($mysqli, "SELECT `verein` FROM $db_tabelle_teilnehmende WHERE `id` = ?", [$id]);
if ($verein === null) {
http_response_code(400);
echo json_encode(["success" => false, "message" => "Person hat keinen Verein"]);
exit;
}
$verein_konto = db_get_var($mysqli, "SELECT `konto` FROM $db_tabelle_vereine WHERE `verein` = ?", [$verein]) ?: 0.00;
// --- Check for existing open order ---
$sql = "DELETE FROM $db_tabelle_warenkorb_startgebueren WHERE user_id = ? AND item_id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("ii", $userId, $id);
if (!$stmt->execute()) {
http_response_code(500);
exit;
}
http_response_code(200);
echo json_encode(["success" => true, "message" => "Startgebühr entfernt", "verein" => $verein, "vereinKonto" => $verein_konto]);
exit;
?>
@@ -0,0 +1,202 @@
<?php
header('Content-Type: application/json');
if (!isset($baseDir))
$baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
$personen_ids_json = $_POST['personen_ids'] ?? '';
$personen_ids = json_decode($personen_ids_json) ?? [];
$personen_ids = !is_array($personen_ids) ? array(intval($personen_ids)) : array_map('intval', $personen_ids);
if (count($personen_ids) < 1) {
echo json_encode(['success' => false, 'message' => "Keine Personen angegeben"]);
http_response_code(400);
exit;
}
$neu_kat_id = (int) $_POST['kat_id'] ?? 0;
if ($neu_kat_id < 1) {
echo json_encode(['success' => false, 'message' => "Keine neue Kategorie angegeben"]);
http_response_code(400);
exit;
}
require $baseDir . '/../scripts/db/db-functions.php';
require $baseDir . '/../scripts/db/db-tables.php';
$type = 'tr';
$dbconnection = require $baseDir . '/../scripts/db/db-verbindung-script.php';
if ($dbconnection['success'] !== true) {
echo 'Critical DB Error.';
exit;
}
$all_kats = db_select($mysqli, $db_tabelle_kategorien, "`id`, `programm`, `preis`");
$all_kats_id_indexed = array_column($all_kats, null, 'id');
$preise_kats = array_column($all_kats, 'preis', 'programm');
if (!isset($all_kats_id_indexed[$neu_kat_id])) {
echo json_encode(['success' => false, 'message' => "Nicht valide Kategorie"]);
http_response_code(400);
exit;
}
$new_kat_name = $all_kats_id_indexed[$neu_kat_id]['programm'];
$new_kat_preis = $all_kats_id_indexed[$neu_kat_id]['preis'];
$vereine_plus_array = [];
function get_kat_price_diff(array $old_data, string $new_kat): array {
global $preise_kats;
global $vereine_plus_array;
$return_array = [];
$old_kat = $old_data['programm'] ?? '';
$verein = $old_data['verein'] ?? '';
$bezahlt = (int) ($old_data['bezahlt'] ?? 1);
var_dump(!isset($preise_kats[$new_kat]), !in_array($bezahlt, [2, 4], true), $old_kat === $new_kat, $old_kat === '', $old_kat, $new_kat);
if ($old_kat === '' || $old_kat === $new_kat || !in_array($bezahlt, [2, 4], true) || !isset($preise_kats[$new_kat])) {
return $return_array;
}
$betrag_bezahlt = (float) ($old_data['betrag_bezahlt'] ?? 0.00);
$new_kat_preis = (float) $preise_kats[$new_kat];
if ($new_kat_preis > $betrag_bezahlt) {
$return_array['bezahlt'] = ($betrag_bezahlt === 0.00) ? 1 : 2;
} elseif ($new_kat_preis < $betrag_bezahlt) {
$return_array['bezahlt'] = 4;
$return_array['betrag_bezahlt'] = $betrag_bezahlt - $new_kat_preis;
$vereine_plus_array[$verein] = ((float) ($vereine_plus_array[$verein] ?? 0.00)) + $betrag_bezahlt - $new_kat_preis;
} else {
$return_array['bezahlt'] = 4;
}
return $return_array;
}
function update_verein_balances(array $vereine_plus_array_funct) {
global $mysqli;
global $db_tabelle_vereine;
if (empty($vereine_plus_array_funct)) {
return;
}
$stmt = $mysqli->prepare("UPDATE $db_tabelle_vereine SET `konto` = `konto` + ? WHERE `verein` = ?");
if ($stmt) {
foreach ($vereine_plus_array_funct as $verein => $betrag) {
if ($betrag <= 0.00) {
continue;
}
$stmt->bind_param("ds", $betrag, $verein);
$stmt->execute();
}
$stmt->close();
}
}
function remove_from_basket(array $ids_array = []) : bool {
global $mysqli;
global $db_tabelle_warenkorb_startgebueren;
if (empty($ids_array)) return true;
$tplaceholders = implode(", ", array_fill(0, count($ids_array), "?"));
$stmt = $mysqli->prepare("DELETE FROM $db_tabelle_warenkorb_startgebueren WHERE `item_id` IN ($tplaceholders)");
$stmt->bind_param(str_repeat('i', count($ids_array)), ...$ids_array);
$ret = $stmt->execute();
$stmt->close();
return $ret;
}
// 4. Data Processing & Transaction Block
$placeholders = implode(", ", array_fill(0, count($personen_ids), "?"));
$entries = db_select($mysqli, $db_tabelle_teilnehmende, "`id`, `programm`, `bezahlt`, `betrag_bezahlt`, `verein`", "`id` IN ($placeholders)", $personen_ids);
$mysqli->begin_transaction();
try {
$stmtbez = $mysqli->prepare("UPDATE $db_tabelle_teilnehmende SET `bezahlt` = ?, `programm` = ? WHERE `id` = ?");
$stmtbezbet = $mysqli->prepare("UPDATE $db_tabelle_teilnehmende SET `bezahlt` = ?, `programm` = ?, `betrag_bezahlt` = ? WHERE `id` = ?");
$stmtnorm = $mysqli->prepare("UPDATE $db_tabelle_teilnehmende SET `programm` = ? WHERE `id` = ?");
$status_update_bez = null;
$current_id_bez = null;
$stmtbez->bind_param("isi", $status_update_bez, $new_kat_name, $current_id_bez);
$status_update_bet_bez = null;
$current_id_bet_bez = null;
$betrag_bezahlt = null;
$stmtbezbet->bind_param("isdi", $status_update_bet_bez, $new_kat_name, $betrag_bezahlt, $current_id_bet_bez);
$current_id_norm = null;
$stmtnorm->bind_param("si", $new_kat_name, $current_id_norm);
foreach ($entries as $s_entry) {
$res = get_kat_price_diff($s_entry, $new_kat_name);
if (count($res) < 1) {
$current_id_norm = $s_entry['id'];
$stmtnorm->execute();
} elseif (isset($res['betrag_bezahlt'])){
$status_update_bet_bez = $res['bezahlt'];
$current_id_bet_bez = $s_entry['id'];
$betrag_bezahlt = $res['betrag_bezahlt'];
$stmtbezbet->execute();
} else {
$status_update_bez = $res['bezahlt'];
$current_id_bez = $s_entry['id'];
$stmtbez->execute();
}
}
$stmtnorm->close();
$stmtbez->close();
remove_from_basket($personen_ids);
var_dump($vereine_plus_array);
update_verein_balances($vereine_plus_array);
$mysqli->commit();
// Fix #1: Added explicit echo for output tracking
http_response_code(200);
echo json_encode(['success' => true, 'message' => "Kategorie erfolgreich geändert"]);
exit;
} catch (Exception $e) {
// Rollback instantly if anything fails
$mysqli->rollback();
// Fix #1 & #3: Proper error output formatting
http_response_code(500);
echo json_encode(['success' => false, 'message' => "Datenbankfehler"]);
exit;
}
@@ -0,0 +1,79 @@
<?php
header('Content-Type: application/json');
if (!isset($baseDir)) $baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
$audiofileId = intval($_POST['musicId'] ?? 0);
$personId = intval($_POST['turnerinId'] ?? 0);
$geraetId = intval($_POST['geraetId'] ?? 0);
if ($audiofileId < 1 || $personId < 1 || $geraetId < 1) {
echo json_encode(['success' => false, 'message' => 'Ungültige Eingabe.']);
http_response_code(400);
exit;
}
$type = 'tr';
$data = include $baseDir . '/../scripts/db/db-verbindung-script.php';
if ($data['success'] === false){
echo json_encode(['success' => false, 'message' => $data['message']]);
http_response_code(500);
exit;
}
require $baseDir . '/../scripts/db/db-tables.php';
$sql = "INSERT INTO $db_tabelle_teilnehmende_audiofiles (`person_id`, `geraet_id`, `audiofile_id`) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `audiofile_id` = VALUES(`audiofile_id`)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("iii", $personId, $geraetId, $audiofileId);
if (!$stmt->execute()) {
http_response_code(500);
exit;
}
$stmt->close();
$sql = "SELECT name, vorname FROM $db_tabelle_teilnehmende WHERE id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $turnerinId);
if (!$stmt->execute()) {
http_response_code(500);
exit;
}
$result = $stmt->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
$_SESSION['form_message_type'] = 1;
if (!isset($rows) || !is_array($rows) || count($rows) !== 1) {
$_SESSION['form_message'] = 'Musik aktualisiert';
} else {
$_SESSION['form_message'] = 'Musik für '.$rows[0]['name'].' '.$rows[0]['vorname'].' aktualisiert';
}
$mysqli->close();
echo json_encode(['success' => true]);
@@ -0,0 +1,54 @@
<?php
if (!isset($baseDir)) $baseDir = $_SERVER['DOCUMENT_ROOT'];
require_once $baseDir . '/../scripts/session_functions.php';
ini_wkvs_session();
check_user_permission('trainer');
verify_csrf();
if (!isset($_POST['oldMusicId'])) {
echo json_encode(['success' => false]);
http_response_code(422);
exit;
}
$oldMusicId = intval($_POST['oldMusicId']);
if ($oldMusicId < 1) {
echo json_encode(['success' => true]);
http_response_code(202);
exit;
}
$type = 'tr';
$data = include $baseDir . '/../scripts/db/db-verbindung-script.php';
if ($data['success'] === false){
echo json_encode(['success' => false, 'message' => $data['message']]);
http_response_code(500);
exit;
}
require $baseDir . '/../scripts/db/db-tables.php';
$sql = "DELETE $db_tabelle_audiofiles WHERE id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $oldMusicId);
if (!$stmt->execute()) {
http_response_code(500);
exit;
}
$stmt->close();
$mysqli->close();
echo json_encode(['success' => true]);
http_response_code(200);
exit;