Bestellungen - Teil 1

This commit is contained in:
kknobloch 2025-11-09 16:13:06 +01:00
parent 1d7253f903
commit a8c1cc8948
7 changed files with 209 additions and 2 deletions

View File

@ -1,5 +1,7 @@
<?php
/*
return [
'host' => '127.0.0.1',
'dbname' => 'vwl',
@ -7,7 +9,7 @@ return [
'password' => '',
'charset' => 'utf8mb4'
];
/*
*/
return [
'host' => '148.251.96.181',
'dbname' => 'c1vwl',
@ -15,4 +17,3 @@ return [
'password' => 'SommerNacht!2025',
'charset' => 'utf8mb4'
];
*/

View File

@ -22,4 +22,19 @@ class MainController {
require '../src/view/hotel_edit.php';
require '../src/view/templates/footer.php';
}
public function bestellungen() {
$pageTitle = "Bestellungen";
require '../src/view/templates/header.php';
require '../src/view/bestellungen.php';
require '../src/view/templates/footer.php';
}
public function bestellung_edit() {
$pageTitle = "Bestellungen";
require '../src/view/templates/header.php';
require '../src/view/bestellung_edit.php';
require '../src/view/templates/footer.php';
}
}

View File

@ -0,0 +1,46 @@
<?php
require_once __DIR__ . '/../../core/Database.php';
class BestellungModel {
private PDO $db;
private $allowedFields = [
'ordernumber', 'bestellung_status', 'zahlung_status', 'lieferung_status', 'datum',
'region', 'land', 'plz', 'ort', 'strasse',
'anrede', 'vorname', 'nachname', 'email', 'telefon',
'versandkosten', 'steuersatz', 'synckey', 'versandart', 'gutschein_status'
];
public function __construct() {
$this->db = Database::connect();
}
public function getBestellungById($id) {
$stmt = $this->db->prepare("SELECT * FROM vwl_bestellung WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch();
}
public function updateBestellung($data) {
$fieldsToUpdate = array_intersect_key($data, array_flip($this->allowedFields));
if (empty($fieldsToUpdate)) {
return false;
}
// Baue SQL-Statement
$setParts = [];
foreach ($fieldsToUpdate as $field => $value) {
$setParts[] = "`$field` = :$field";
}
$sql = "UPDATE vwl_hotel SET " . implode(', ', $setParts) . " WHERE id = :id";
$stmt = $this->db->prepare($sql);
// Bind-Werte
$fieldsToUpdate['id'] = $data['id'];
return $stmt->execute($fieldsToUpdate);
}
}

View File

@ -0,0 +1,66 @@
<?php
require_once '../core/Request.php';
require_once '../src/model/BestellungModel.php';
$bestellungId = Request::get('id');
$message = '';
$bestellungModel = new BestellungModel();
// POST-Verarbeitung
if (Request::isPost()) {
$data = Request::allPost();
$success = $bestellungModel->updateBestellung($data);
if ($success) {
$message = '<div class="alert alert-success">✅ Daten erfolgreich gespeichert.</div>';
} else {
$message = '<div class="alert alert-danger">❌ Fehler beim Speichern der Daten.</div>';
}
}
// Daten neu laden nach dem Speichern (oder beim ersten Aufruf)
$bestellung = $bestellungModel->getBestellungById($bestellungId);
?>
<h2>Bestellung: <?= htmlspecialchars($bestellung['ordernumber']) ?></h2>
<?= $message ?>
<form method="POST">
<div class="container">
<div class="row mb-4">
<div class="col-auto">
<label for="ordernumber" class="form-label">Bestellnummer</label>
<input class="form-control w-auto" id="ordernumber" name="ordernumber"
value="<?= htmlspecialchars($bestellung['ordernumber'] ?? '') ?>" required readonly>
</div>
<div class="col-auto">
<label for="bestellung_status" class="form-label">Status</label>
<input class="form-control w-auto" id="bestellung_status" name="bestellung_status"
value="<?= htmlspecialchars($bestellung['bestellung_status'] ?? '') ?>" required readonly>
</div>
<div class="col-auto">
<label for="zahlung_status" class="form-label">Zahlung</label>
<input class="form-control w-auto" id="zahlung_status" name="zahlung_status"
value="<?= htmlspecialchars($bestellung['zahlung_status'] ?? '') ?>" required readonly>
</div>
<div class="col-auto">
<label for="gutschein_status" class="form-label">Gutschein</label>
<input class="form-control w-auto" id="gutschein_status" name="gutschein_status"
value="<?= htmlspecialchars($bestellung['gutschein_status'] ?? '') ?>" required readonly>
</div>
</div>
<h5>Kunde</h5>
<div class="row mb-3">
</div>
<h5>Gutschein</h5>
<div class="row mb-3">
<h5>Positionen</h5>
<div class="row mb-3">
</div>
</div>
<button type="submit" class="btn btn-primary">Speichern</button>
</form>

73
src/view/bestellungen.php Normal file
View File

@ -0,0 +1,73 @@
<?php
require_once '../core/Database.php';
$pdo = Database::connect();
$stmt = $pdo->query("SELECT id, ordernumber, bestellung_status, zahlung_status, gutschein_status, datum FROM vwl_bestellung ORDER BY ordernumber");
$bestellungen = $stmt->fetchAll();
?>
<h4>Bestellungen</h4>
<div class="table-responsive">
<table id="bestellungTable" class="table table-striped table-hover align-middle">
<thead>
<tr>
<th data-column="ordernumber">
Bestellnummer
<input type="text" id="bestellungFilter" class="form-control form-control-sm d-inline-block ms-2" placeholder="Filtern..." style="width: 200px;">
</th>
<th data-column="datum">Datum</th>
<th data-column="bestellung_status">Status</th>
<th data-column="zahlung_status">Zahlung</th>
<th data-column="gutschein_status">Gutschein</th>
<th></th>
</tr>
</thead>
<tbody>
<?php foreach ($bestellungen as $bestellung): ?>
<tr ondblclick="openBestellungForm(<?= $bestellung['id'] ?>)">
<td><?= htmlspecialchars($bestellung['ordernumber']) ?></td>
<td><?= isset($bestellung['datum']) && ($d = DateTime::createFromFormat('Y-m-d', $bestellung['datum'])) ? $d->format('d.m.Y') : '' ?></td>
<td><?= htmlspecialchars($bestellung['bestellung_status']) ?></td>
<td><?= htmlspecialchars($bestellung['zahlung_status']) ?></td>
<td><?= htmlspecialchars($bestellung['gutschein_status']) ?></td>
<td><i class='bi bi-cloud-download' title="Bestellung aktualisieren"></i></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<script>
function openBestellungForm(id) {
window.open('index.php?page=bestellung_edit&id=' + id, '_blank');
}
// Sortierung bei Klick auf Überschriften
document.querySelectorAll("#bestellungTable th").forEach(th => {
th.addEventListener("click", () => {
const table = th.closest("table");
const column = th.cellIndex;
const order = th.dataset.order = -(th.dataset.order || -1);
const rows = Array.from(table.tBodies[0].rows);
rows.sort((a, b) => {
const cellA = a.cells[column].innerText.trim();
const cellB = b.cells[column].innerText.trim();
return cellA.localeCompare(cellB, undefined, { numeric: true }) * order;
});
rows.forEach(row => table.tBodies[0].appendChild(row));
});
});
// Live-Filter für Bestellnummer
document.getElementById('bestellungFilter').addEventListener('input', function () {
const filter = this.value.toLowerCase();
const rows = document.querySelectorAll("#bestellungTable tbody tr");
rows.forEach(row => {
const bestellnummer = row.cells[0].innerText.toLowerCase();
row.style.display = bestellnummer.includes(filter) ? '' : 'none';
});
});
</script>

View File

@ -55,6 +55,7 @@ $username = $_SESSION['user'] ?? 'Gast';
'home' => 'Home',
'gutscheinsuche' => 'Gutscheinsuche',
'hotels' => 'Hotels',
'bestellungen' => 'Bestellungen',
'rechnungen' => 'Rechnungen',
'partner' => 'Partner',
'auswertungen' => 'Auswertungen',
@ -67,6 +68,7 @@ $username = $_SESSION['user'] ?? 'Gast';
'home' => 'bi-house',
'gutscheinsuche' => 'bi-search',
'hotels' => 'bi-building',
'bestellungen' => 'bi-cart4',
'rechnungen' => 'bi-file-earmark-text',
'partner' => 'bi-people',
'auswertungen' => 'bi-graph-up',

4
web/phpinfo.php Normal file
View File

@ -0,0 +1,4 @@
<?php
phpinfo();
?>