diff --git a/Changes.md b/Changes.md index 73d46b2..738e2d1 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,15 @@ --- +## 2026-06-29 – Feature: Lieferant in Belegliste inline bearbeiten (Issue #108) + +- **`src/Views/belege/list.php`:** Lieferant-Spalte ist direkt in der Liste klickbar; zeigt ein Inline-Textfeld zur Eingabe, speichert mit Enter, bricht mit Escape ab; andere Spalten öffnen weiterhin die Vorschau +- **`src/Models/Beleg.php`:** Neue Methode `updateSupplier()` aktualisiert nur die `supplier_id` ohne andere Metadaten zu verändern +- **`src/Controllers/BelegController.php`:** Neue Methode `updateSupplier()` als AJAX-Endpunkt +- **`public/index.php`:** Route `POST /belege/{id}/supplier` registriert + +--- + ## 2026-06-11 – Fix: Undefined-Array-Key-Warning bei Buchungsvorlagen ohne Standard-Lieferant - **`src/Models/Buchungsvorlage.php`:** `create()`/`update()` prüften `$data['standard_lieferant']` direkt ohne Null-Coalescing, was bei fehlendem Schlüssel eine PHP-Warning auslöste diff --git a/public/index.php b/public/index.php index 8a9ef53..5392cb8 100644 --- a/public/index.php +++ b/public/index.php @@ -60,8 +60,9 @@ $router->post('/belege/upload', fn($p) => (new BelegController())->upload($p)); $router->get('/belege/{id}', fn($p) => (new BelegController())->show($p)); $router->get('/belege/{id}/file', fn($p) => (new BelegController())->serveFile($p)); $router->post('/belege/{id}/delete', fn($p) => (new BelegController())->destroy($p)); -$router->post('/belege/{id}/meta', fn($p) => (new BelegController())->updateMeta($p)); -$router->post('/belege/{id}/crop', fn($p) => (new BelegController())->cropImage($p)); +$router->post('/belege/{id}/meta', fn($p) => (new BelegController())->updateMeta($p)); +$router->post('/belege/{id}/supplier', fn($p) => (new BelegController())->updateSupplier($p)); +$router->post('/belege/{id}/crop', fn($p) => (new BelegController())->cropImage($p)); $router->post('/belege/{id}/vorschlag/generate', fn($p) => (new BelegController())->generateVorschlag($p)); $router->post('/belege/{id}/vorschlag/reset', fn($p) => (new BelegController())->resetVorschlag($p)); diff --git a/src/Controllers/BelegController.php b/src/Controllers/BelegController.php index 4d145f9..eb98f58 100644 --- a/src/Controllers/BelegController.php +++ b/src/Controllers/BelegController.php @@ -366,6 +366,30 @@ class BelegController extends BaseController View::redirect("/belege/{$id}", 'Metadaten gespeichert.'); } + public function updateSupplier(array $params): void + { + header('Content-Type: application/json'); + $id = (int)$params['id']; + $beleg = Beleg::find($id); + + if (!$beleg) { + http_response_code(404); + echo json_encode(['error' => 'Nicht gefunden.']); + return; + } + if ($beleg['locked']) { + http_response_code(403); + echo json_encode(['error' => 'GoBD: Gesperrter Beleg.']); + return; + } + + $supplierName = trim($_POST['supplier_name'] ?? ''); + $supplierId = $supplierName !== '' ? Supplier::findOrCreate($supplierName) : null; + Beleg::updateSupplier($id, $supplierId); + + echo json_encode(['ok' => true, 'supplier_name' => $supplierName !== '' ? $supplierName : null]); + } + public function generateVorschlag(array $params): void { header('Content-Type: application/json'); diff --git a/src/Models/Beleg.php b/src/Models/Beleg.php index aea9bc0..56781c7 100644 --- a/src/Models/Beleg.php +++ b/src/Models/Beleg.php @@ -231,6 +231,14 @@ class Beleg ); } + public static function updateSupplier(int $id, ?int $supplierId): void + { + Database::execute( + 'UPDATE belege SET supplier_id=?, updated_at=NOW() WHERE id=? AND locked=0', + [$supplierId, $id] + ); + } + public static function delete(int $id): bool { $beleg = self::find($id); diff --git a/src/Views/belege/list.php b/src/Views/belege/list.php index 3487c6d..b7f1600 100644 --- a/src/Views/belege/list.php +++ b/src/Views/belege/list.php @@ -162,7 +162,13 @@