Initial Commit
This commit is contained in:
63
api/anmeldung/create.php
Normal file
63
api/anmeldung/create.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
global $db;
|
||||
try {
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
if (!$data) { http_response_code(400); echo json_encode(['message'=>'Ungültige Daten']); exit; }
|
||||
|
||||
if (empty($data['vorname']) || empty($data['nachname']) || empty($data['email']) ||
|
||||
empty($data['betrieb_id']) || empty($data['kurs_ids']) || !is_array($data['kurs_ids'])) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['message' => 'Pflichtfelder fehlen']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$db->beginTransaction();
|
||||
|
||||
$stmt = $db->prepare("INSERT INTO schueler (vorname, nachname, email, geburtsdatum, betrieb_id)
|
||||
VALUES (:vorname, :nachname, :email, :geburtsdatum, :betrieb_id)");
|
||||
$stmt->execute([
|
||||
':vorname' => $data['vorname'],
|
||||
':nachname' => $data['nachname'],
|
||||
':email' => $data['email'],
|
||||
':geburtsdatum' => $data['geburtsdatum'] ?? null,
|
||||
':betrieb_id' => $data['betrieb_id']
|
||||
]);
|
||||
$schueler_id = (int)$db->lastInsertId();
|
||||
|
||||
$angemeldete_kurse = [];
|
||||
foreach ($data['kurs_ids'] as $kurs_id) {
|
||||
$check = $db->prepare("SELECT k.name, k.max_teilnehmer, COUNT(a.id) as belegt
|
||||
FROM kurse k
|
||||
LEFT JOIN anmeldungen a ON k.id = a.kurs_id
|
||||
WHERE k.id = :kurs_id
|
||||
GROUP BY k.id");
|
||||
$check->execute([':kurs_id' => $kurs_id]);
|
||||
$kurs = $check->fetch();
|
||||
|
||||
if (!$kurs) { $db->rollBack(); http_response_code(400); echo json_encode(['message'=>'Kurs nicht gefunden']); exit; }
|
||||
if ((int)$kurs['belegt'] >= (int)$kurs['max_teilnehmer']) {
|
||||
$db->rollBack(); http_response_code(400);
|
||||
echo json_encode(['message' => "Kurs '{$kurs['name']}' ist bereits voll"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$insert = $db->prepare("INSERT INTO anmeldungen (schueler_id, kurs_id, anmeldedatum)
|
||||
VALUES (:schueler_id, :kurs_id, NOW())");
|
||||
$insert->execute([':schueler_id' => $schueler_id, ':kurs_id' => $kurs_id]);
|
||||
|
||||
$angemeldete_kurse[] = $kurs['name'];
|
||||
}
|
||||
|
||||
$db->commit();
|
||||
http_response_code(201);
|
||||
echo json_encode([
|
||||
'message' => 'Anmeldung erfolgreich',
|
||||
'schueler_id' => $schueler_id,
|
||||
'angemeldete_kurse' => $angemeldete_kurse
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
if ($db->inTransaction()) { $db->rollBack(); }
|
||||
error_log("Error in anmeldung/create.php: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['message' => 'Fehler bei der Anmeldung']);
|
||||
}
|
||||
33
api/auth/login.php
Normal file
33
api/auth/login.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
global $db;
|
||||
|
||||
try {
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
if (!$data || empty($data['email']) || empty($data['password'])) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['message' => 'E-Mail und Passwort erforderlich']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$stmt = $db->prepare("SELECT id, email, password_hash, role FROM users WHERE email = :email LIMIT 1");
|
||||
$stmt->execute([':email' => $data['email']]);
|
||||
$user = $stmt->fetch();
|
||||
|
||||
if (!$user || !password_verify($data['password'], $user['password_hash'])) {
|
||||
http_response_code(401);
|
||||
echo json_encode(['message' => 'Ungültige Anmeldedaten']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$_SESSION['user'] = [
|
||||
'id' => (int)$user['id'],
|
||||
'email' => $user['email'],
|
||||
'role' => $user['role'],
|
||||
];
|
||||
|
||||
echo json_encode(['message' => 'Login erfolgreich', 'user' => $_SESSION['user']]);
|
||||
} catch (Exception $e) {
|
||||
error_log("Login error: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['message' => 'Login fehlgeschlagen']);
|
||||
}
|
||||
3
api/auth/logout.php
Normal file
3
api/auth/logout.php
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
session_destroy();
|
||||
echo json_encode(['message' => 'Logout erfolgreich']);
|
||||
6
api/auth/me.php
Normal file
6
api/auth/me.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
$auth = isset($_SESSION['user']);
|
||||
echo json_encode([
|
||||
'authenticated' => $auth,
|
||||
'user' => $auth ? $_SESSION['user'] : null
|
||||
]);
|
||||
56
api/berichte/teilnehmer_betrieb.php
Normal file
56
api/berichte/teilnehmer_betrieb.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
global $db;
|
||||
try {
|
||||
$query = "SELECT
|
||||
b.id as betrieb_id,
|
||||
b.name as betrieb_name,
|
||||
b.adresse,
|
||||
COUNT(DISTINCT s.id) as anzahl_schueler,
|
||||
COUNT(a.id) as anzahl_anmeldungen
|
||||
FROM betriebe b
|
||||
LEFT JOIN schueler s ON b.id = s.betrieb_id
|
||||
LEFT JOIN anmeldungen a ON s.id = a.schueler_id
|
||||
GROUP BY b.id
|
||||
ORDER BY b.name";
|
||||
$stmt = $db->prepare($query);
|
||||
$stmt->execute();
|
||||
|
||||
$bericht = [];
|
||||
while ($row = $stmt->fetch()) {
|
||||
$detail_query = "SELECT
|
||||
s.vorname,
|
||||
s.nachname,
|
||||
GROUP_CONCAT(k.name SEPARATOR ', ') as angemeldete_kurse
|
||||
FROM schueler s
|
||||
LEFT JOIN anmeldungen a ON s.id = a.schueler_id
|
||||
LEFT JOIN kurse k ON a.kurs_id = k.id
|
||||
WHERE s.betrieb_id = :betrieb_id
|
||||
GROUP BY s.id";
|
||||
$detail_stmt = $db->prepare($detail_query);
|
||||
$detail_stmt->execute([':betrieb_id' => $row['betrieb_id']]);
|
||||
|
||||
$schueler = [];
|
||||
while ($detail = $detail_stmt->fetch()) {
|
||||
$schueler[] = [
|
||||
'vorname' => $detail['vorname'],
|
||||
'nachname' => $detail['nachname'],
|
||||
'angemeldete_kurse' => $detail['angemeldete_kurse'] ?? 'Keine Kurse'
|
||||
];
|
||||
}
|
||||
|
||||
$bericht[] = [
|
||||
'betrieb_id' => (int)$row['betrieb_id'],
|
||||
'betrieb_name' => $row['betrieb_name'],
|
||||
'adresse' => $row['adresse'],
|
||||
'anzahl_schueler' => (int)$row['anzahl_schueler'],
|
||||
'anzahl_anmeldungen' => (int)$row['anzahl_anmeldungen'],
|
||||
'schueler' => $schueler
|
||||
];
|
||||
}
|
||||
|
||||
echo json_encode($bericht);
|
||||
} catch (Exception $e) {
|
||||
error_log("Error in berichte/teilnehmer_betrieb.php: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['message' => 'Fehler beim Erstellen des Berichts']);
|
||||
}
|
||||
55
api/berichte/teilnehmer_kurs.php
Normal file
55
api/berichte/teilnehmer_kurs.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
global $db;
|
||||
try {
|
||||
$query = "SELECT
|
||||
k.id as kurs_id,
|
||||
k.name as kurs_name,
|
||||
k.max_teilnehmer,
|
||||
COUNT(a.id) as anzahl_teilnehmer,
|
||||
ROUND((COUNT(a.id) / k.max_teilnehmer) * 100, 2) as auslastung_prozent
|
||||
FROM kurse k
|
||||
LEFT JOIN anmeldungen a ON k.id = a.kurs_id
|
||||
GROUP BY k.id
|
||||
ORDER BY k.name";
|
||||
$stmt = $db->prepare($query);
|
||||
$stmt->execute();
|
||||
|
||||
$bericht = [];
|
||||
while ($row = $stmt->fetch()) {
|
||||
$detail_query = "SELECT
|
||||
s.vorname,
|
||||
s.nachname,
|
||||
b.name as betrieb_name
|
||||
FROM anmeldungen a
|
||||
JOIN schueler s ON a.schueler_id = s.id
|
||||
JOIN betriebe b ON s.betrieb_id = b.id
|
||||
WHERE a.kurs_id = :kurs_id
|
||||
ORDER BY s.nachname, s.vorname";
|
||||
$detail_stmt = $db->prepare($detail_query);
|
||||
$detail_stmt->execute([':kurs_id' => $row['kurs_id']]);
|
||||
|
||||
$teilnehmer = [];
|
||||
while ($detail = $detail_stmt->fetch()) {
|
||||
$teilnehmer[] = [
|
||||
'vorname' => $detail['vorname'],
|
||||
'nachname' => $detail['nachname'],
|
||||
'betrieb_name' => $detail['betrieb_name']
|
||||
];
|
||||
}
|
||||
|
||||
$bericht[] = [
|
||||
'kurs_id' => (int)$row['kurs_id'],
|
||||
'kurs_name' => $row['kurs_name'],
|
||||
'max_teilnehmer' => (int)$row['max_teilnehmer'],
|
||||
'anzahl_teilnehmer' => (int)$row['anzahl_teilnehmer'],
|
||||
'auslastung_prozent' => (float)$row['auslastung_prozent'],
|
||||
'teilnehmer' => $teilnehmer
|
||||
];
|
||||
}
|
||||
|
||||
echo json_encode($bericht);
|
||||
} catch (Exception $e) {
|
||||
error_log("Error in berichte/teilnehmer_kurs.php: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['message' => 'Fehler beim Erstellen des Berichts']);
|
||||
}
|
||||
23
api/betriebe/get.php
Normal file
23
api/betriebe/get.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
global $db;
|
||||
try {
|
||||
$query = "SELECT id, name, adresse, email FROM betriebe ORDER BY name";
|
||||
$stmt = $db->prepare($query);
|
||||
$stmt->execute();
|
||||
|
||||
$betriebe = [];
|
||||
while ($row = $stmt->fetch()) {
|
||||
$betriebe[] = [
|
||||
'id' => (int)$row['id'],
|
||||
'name' => $row['name'],
|
||||
'adresse' => $row['adresse'] ?? '',
|
||||
'telefon' => '',
|
||||
'email' => $row['email'] ?? ''
|
||||
];
|
||||
}
|
||||
echo json_encode($betriebe);
|
||||
} catch (Exception $e) {
|
||||
error_log("Error in betriebe/get.php: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['message' => 'Fehler beim Laden der Betriebe']);
|
||||
}
|
||||
38
api/kurse/get.php
Normal file
38
api/kurse/get.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
global $db;
|
||||
try {
|
||||
$query = "SELECT
|
||||
k.id,
|
||||
k.name,
|
||||
k.beschreibung,
|
||||
k.gebuehr,
|
||||
k.max_teilnehmer,
|
||||
COUNT(a.id) as belegte_plaetze,
|
||||
(k.max_teilnehmer - COUNT(a.id)) as freie_plaetze,
|
||||
CASE WHEN COUNT(a.id) >= k.max_teilnehmer THEN 0 ELSE 1 END as verfuegbar
|
||||
FROM kurse k
|
||||
LEFT JOIN anmeldungen a ON k.id = a.kurs_id
|
||||
GROUP BY k.id
|
||||
ORDER BY k.name";
|
||||
$stmt = $db->prepare($query);
|
||||
$stmt->execute();
|
||||
|
||||
$kurse = [];
|
||||
while ($row = $stmt->fetch()) {
|
||||
$kurse[] = [
|
||||
'id' => (int)$row['id'],
|
||||
'name' => $row['name'],
|
||||
'beschreibung' => $row['beschreibung'],
|
||||
'gebuehr' => (float)$row['gebuehr'],
|
||||
'max_teilnehmer' => (int)$row['max_teilnehmer'],
|
||||
'belegte_plaetze' => (int)$row['belegte_plaetze'],
|
||||
'freie_plaetze' => (int)$row['freie_plaetze'],
|
||||
'verfuegbar' => (bool)$row['verfuegbar']
|
||||
];
|
||||
}
|
||||
echo json_encode($kurse);
|
||||
} catch (Exception $e) {
|
||||
error_log("Error in kurse/get.php: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['message' => 'Fehler beim Laden der Kurse']);
|
||||
}
|
||||
65
api/rechnungen/generate.php
Normal file
65
api/rechnungen/generate.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
global $db;
|
||||
try {
|
||||
$betrieb_id = $_GET['betrieb_id'] ?? null;
|
||||
if (!$betrieb_id) { http_response_code(400); echo json_encode(['message'=>'Betrieb-ID fehlt']); exit; }
|
||||
|
||||
$betrieb_query = "SELECT id, name, adresse, email FROM betriebe WHERE id = :betrieb_id";
|
||||
$betrieb_stmt = $db->prepare($betrieb_query);
|
||||
$betrieb_stmt->execute([':betrieb_id' => $betrieb_id]);
|
||||
$betrieb = $betrieb_stmt->fetch();
|
||||
if (!$betrieb) { http_response_code(404); echo json_encode(['message'=>'Betrieb nicht gefunden']); exit; }
|
||||
|
||||
$query = "SELECT
|
||||
k.name as kurs_name,
|
||||
k.gebuehr,
|
||||
COUNT(a.id) as anzahl_teilnehmer,
|
||||
(k.gebuehr * COUNT(a.id)) as gesamt_kurs
|
||||
FROM kurse k
|
||||
JOIN anmeldungen a ON k.id = a.kurs_id
|
||||
JOIN schueler s ON a.schueler_id = s.id
|
||||
WHERE s.betrieb_id = :betrieb_id
|
||||
GROUP BY k.id";
|
||||
$stmt = $db->prepare($query);
|
||||
$stmt->execute([':betrieb_id' => $betrieb_id]);
|
||||
|
||||
$zusammenfassung = [];
|
||||
$netto = 0.0;
|
||||
while ($row = $stmt->fetch()) {
|
||||
$zusammenfassung[] = [
|
||||
'kurs_name' => $row['kurs_name'],
|
||||
'anzahl_teilnehmer' => (int)$row['anzahl_teilnehmer'],
|
||||
'gebuehr' => (float)$row['gebuehr'],
|
||||
'gesamt_kurs' => (float)$row['gesamt_kurs']
|
||||
];
|
||||
$netto += (float)$row['gesamt_kurs'];
|
||||
}
|
||||
|
||||
if (empty($zusammenfassung)) { http_response_code(404); echo json_encode(['message'=>'Keine Anmeldungen für diesen Betrieb gefunden']); exit; }
|
||||
|
||||
$mwst_satz = 19;
|
||||
$mwst_betrag = $netto * ($mwst_satz / 100);
|
||||
$gesamtsumme = $netto + $mwst_betrag;
|
||||
|
||||
$rechnung = [
|
||||
'rechnungsnummer' => 'RE-' . date('Y') . '-' . str_pad((string)$betrieb_id, 4, '0', STR_PAD_LEFT),
|
||||
'datum' => date('Y-m-d'),
|
||||
'betrieb' => [
|
||||
'id' => (int)$betrieb['id'],
|
||||
'name' => $betrieb['name'],
|
||||
'adresse' => $betrieb['adresse'],
|
||||
'telefon' => '',
|
||||
'email' => $betrieb['email']
|
||||
],
|
||||
'zusammenfassung' => $zusammenfassung,
|
||||
'netto' => round($netto, 2),
|
||||
'mwst_satz' => $mwst_satz,
|
||||
'mwst_betrag' => round($mwst_betrag, 2),
|
||||
'gesamtsumme' => round($gesamtsumme, 2)
|
||||
];
|
||||
echo json_encode($rechnung);
|
||||
} catch (Exception $e) {
|
||||
error_log("Error in rechnungen/generate.php: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(['message' => 'Fehler beim Erstellen der Rechnung']);
|
||||
}
|
||||
Reference in New Issue
Block a user