154 lines
4.9 KiB
PHP
154 lines
4.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Steuerkram\Controllers;
|
|
|
|
use Steuerkram\Models\Asset;
|
|
use Steuerkram\View;
|
|
|
|
class AssetController
|
|
{
|
|
public function index(array $params): void
|
|
{
|
|
$assets = Asset::all();
|
|
|
|
$view = new View();
|
|
$view->render('layout/base.php', [
|
|
'pageTitle' => 'Anlagevermögen',
|
|
'content' => $this->renderView('assets/list', [
|
|
'assets' => $assets,
|
|
]),
|
|
'topbarActions' => '<a href="/assets/new" class="btn btn-primary">+ Wirtschaftsgut anlegen</a>',
|
|
]);
|
|
}
|
|
|
|
public function create(array $params): void
|
|
{
|
|
$view = new View();
|
|
$view->render('layout/base.php', [
|
|
'pageTitle' => 'Wirtschaftsgut anlegen',
|
|
'content' => $this->renderView('assets/form', [
|
|
'asset' => [],
|
|
'errors' => [],
|
|
'action' => '/assets',
|
|
]),
|
|
]);
|
|
}
|
|
|
|
public function store(array $params): void
|
|
{
|
|
$data = $this->extractPost();
|
|
$errors = $this->validate($data);
|
|
|
|
if ($errors) {
|
|
$view = new View();
|
|
$view->render('layout/base.php', [
|
|
'pageTitle' => 'Wirtschaftsgut anlegen',
|
|
'content' => $this->renderView('assets/form', [
|
|
'asset' => $data,
|
|
'errors' => $errors,
|
|
'action' => '/assets',
|
|
]),
|
|
]);
|
|
return;
|
|
}
|
|
|
|
Asset::create($data);
|
|
View::redirect('/assets', 'Wirtschaftsgut erfolgreich angelegt.');
|
|
}
|
|
|
|
public function edit(array $params): void
|
|
{
|
|
$asset = Asset::find((int)$params['id']);
|
|
if (!$asset) { http_response_code(404); return; }
|
|
|
|
$view = new View();
|
|
$view->render('layout/base.php', [
|
|
'pageTitle' => 'Wirtschaftsgut bearbeiten',
|
|
'content' => $this->renderView('assets/form', [
|
|
'asset' => $asset,
|
|
'errors' => [],
|
|
'action' => '/assets/' . $asset['id'],
|
|
]),
|
|
]);
|
|
}
|
|
|
|
public function update(array $params): void
|
|
{
|
|
$id = (int)$params['id'];
|
|
$asset = Asset::find($id);
|
|
if (!$asset) { http_response_code(404); return; }
|
|
|
|
$data = $this->extractPost();
|
|
$errors = $this->validate($data);
|
|
|
|
if ($errors) {
|
|
$view = new View();
|
|
$view->render('layout/base.php', [
|
|
'pageTitle' => 'Wirtschaftsgut bearbeiten',
|
|
'content' => $this->renderView('assets/form', [
|
|
'asset' => array_merge($asset, $data),
|
|
'errors' => $errors,
|
|
'action' => '/assets/' . $id,
|
|
]),
|
|
]);
|
|
return;
|
|
}
|
|
|
|
Asset::update($id, $data);
|
|
View::redirect('/assets', 'Wirtschaftsgut aktualisiert.');
|
|
}
|
|
|
|
public function destroy(array $params): void
|
|
{
|
|
if (!Asset::delete((int)$params['id'])) {
|
|
View::redirect('/assets', 'Wirtschaftsgut konnte nicht gelöscht werden.', 'error');
|
|
return;
|
|
}
|
|
View::redirect('/assets', 'Wirtschaftsgut gelöscht.');
|
|
}
|
|
|
|
// ── Private helpers ──────────────────────────────────────────
|
|
|
|
private function extractPost(): array
|
|
{
|
|
return [
|
|
'bezeichnung' => trim($_POST['bezeichnung'] ?? ''),
|
|
'anschaffungsdatum' => trim($_POST['anschaffungsdatum'] ?? ''),
|
|
'anschaffungskosten' => $_POST['anschaffungskosten'] ?? '0',
|
|
'zugaenge' => $_POST['zugaenge'] ?? '0',
|
|
'abgaenge' => $_POST['abgaenge'] ?? '0',
|
|
'abschreibung_jahr' => $_POST['abschreibung_jahr'] ?? '0',
|
|
'nutzungsdauer' => trim($_POST['nutzungsdauer'] ?? ''),
|
|
'notizen' => trim($_POST['notizen'] ?? ''),
|
|
];
|
|
}
|
|
|
|
private function validate(array $data): array
|
|
{
|
|
$errors = [];
|
|
|
|
if ($data['bezeichnung'] === '') {
|
|
$errors['bezeichnung'] = 'Pflichtfeld';
|
|
}
|
|
if ($data['anschaffungsdatum'] === '') {
|
|
$errors['anschaffungsdatum'] = 'Pflichtfeld';
|
|
} elseif (!strtotime($data['anschaffungsdatum'])) {
|
|
$errors['anschaffungsdatum'] = 'Ungültiges Datum';
|
|
}
|
|
if (!is_numeric($data['anschaffungskosten']) || (float)$data['anschaffungskosten'] < 0) {
|
|
$errors['anschaffungskosten'] = 'Muss eine positive Zahl sein';
|
|
}
|
|
|
|
return $errors;
|
|
}
|
|
|
|
private function renderView(string $template, array $data): string
|
|
{
|
|
extract($data, EXTR_SKIP);
|
|
ob_start();
|
|
include dirname(__DIR__) . '/Views/' . $template . '.php';
|
|
return ob_get_clean();
|
|
}
|
|
}
|