diff --git a/Changes.md b/Changes.md index b13f9e7..46b3527 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,18 @@ --- +## 2026-04-26 – Leistungszeitraum als freies Textfeld + +### Geändert +- `migrations/034_leistungszeitraum_text.sql`: Spalten `leistungszeitraum_von` (DATE) und `leistungszeitraum_bis` (DATE) wurden durch eine einzige Textspalte `leistungszeitraum` (VARCHAR 255) ersetzt; bestehende Datumswerte werden automatisch migriert +- `src/Views/invoices/form.php`: Zwei Datumsfelder durch ein Freitextfeld „Leistungszeitraum" ersetzt, Grid von 4 auf 3 Spalten angepasst +- `src/Models/Invoice.php`: INSERT/UPDATE verwenden jetzt `leistungszeitraum` statt `leistungszeitraum_von`/`leistungszeitraum_bis` +- `src/Controllers/InvoiceController.php`: Datums-Defaults für `leistungszeitraum_von`/`leistungszeitraum_bis` entfernt +- `src/Views/invoices/show.php`: Leistungszeitraum-Anzeige vereinfacht (kein Datumsformat, direkter Textausgabe) +- `src/Services/PdfInvoiceService.php`: Leistungszeitraum-Ausgabe vereinfacht + +--- + ## 2026-04-15 – KI-Erkennung: automatischer Aufruf aus Belegansicht entfernt ### Geändert diff --git a/migrations/034_leistungszeitraum_text.sql b/migrations/034_leistungszeitraum_text.sql new file mode 100644 index 0000000..776a351 --- /dev/null +++ b/migrations/034_leistungszeitraum_text.sql @@ -0,0 +1,23 @@ +-- Leistungszeitraum: von zwei DATE-Feldern zu einem freien Textfeld +ALTER TABLE invoices + ADD COLUMN leistungszeitraum VARCHAR(255) NULL AFTER leistungszeitraum_bis; + +-- Bestehende Daten migrieren: Datumsfelder als lesbaren Text zusammenführen +UPDATE invoices +SET leistungszeitraum = CASE + WHEN leistungszeitraum_von IS NOT NULL AND leistungszeitraum_bis IS NOT NULL + AND leistungszeitraum_von != leistungszeitraum_bis + THEN CONCAT( + DATE_FORMAT(leistungszeitraum_von, '%d.%m.%Y'), + ' – ', + DATE_FORMAT(leistungszeitraum_bis, '%d.%m.%Y') + ) + WHEN leistungszeitraum_von IS NOT NULL + THEN DATE_FORMAT(leistungszeitraum_von, '%d.%m.%Y') + ELSE NULL +END +WHERE leistungszeitraum_von IS NOT NULL OR leistungszeitraum_bis IS NOT NULL; + +ALTER TABLE invoices + DROP COLUMN leistungszeitraum_von, + DROP COLUMN leistungszeitraum_bis; diff --git a/src/Controllers/InvoiceController.php b/src/Controllers/InvoiceController.php index 686209e..2eab9b9 100644 --- a/src/Controllers/InvoiceController.php +++ b/src/Controllers/InvoiceController.php @@ -43,9 +43,7 @@ class InvoiceController $settings = Setting::get(); $invoiceDefaults = [ - 'rechnungs_datum' => date('Y-m-d'), - 'leistungszeitraum_von' => date('Y-m-01'), - 'leistungszeitraum_bis' => date('Y-m-t'), + 'rechnungs_datum' => date('Y-m-d'), ]; $preCustomerId = (int)($_GET['customer_id'] ?? 0); diff --git a/src/Models/Invoice.php b/src/Models/Invoice.php index 20741e0..0fd90d7 100644 --- a/src/Models/Invoice.php +++ b/src/Models/Invoice.php @@ -78,14 +78,13 @@ class Invoice $faellig = date('Y-m-d', strtotime($datum . " +{$payDays} days")); Database::execute( - 'INSERT INTO invoices (customer_id, betreff, leistungszeitraum_von, leistungszeitraum_bis, + 'INSERT INTO invoices (customer_id, betreff, leistungszeitraum, rechnungs_datum, faellig_datum, status, notes) - VALUES (?, ?, ?, ?, ?, ?, \'Entwurf\', ?)', + VALUES (?, ?, ?, ?, ?, \'Entwurf\', ?)', [ (int)$data['customer_id'], $data['betreff'], - $data['leistungszeitraum_von'] ?: null, - $data['leistungszeitraum_bis'] ?: null, + ($data['leistungszeitraum'] ?? '') !== '' ? $data['leistungszeitraum'] : null, $datum, $faellig, $data['notes'] ?? null, @@ -116,14 +115,13 @@ class Invoice $faellig = date('Y-m-d', strtotime($datum . " +{$payDays} days")); Database::execute( - 'UPDATE invoices SET customer_id=?, betreff=?, leistungszeitraum_von=?, leistungszeitraum_bis=?, + 'UPDATE invoices SET customer_id=?, betreff=?, leistungszeitraum=?, rechnungs_datum=?, faellig_datum=?, notes=?, updated_at=NOW() WHERE id=? AND status=\'Entwurf\'', [ (int)$data['customer_id'], $data['betreff'], - $data['leistungszeitraum_von'] ?: null, - $data['leistungszeitraum_bis'] ?: null, + ($data['leistungszeitraum'] ?? '') !== '' ? $data['leistungszeitraum'] : null, $datum, $faellig, $data['notes'] ?? null, diff --git a/src/Services/PdfInvoiceService.php b/src/Services/PdfInvoiceService.php index 718c311..1b02913 100644 --- a/src/Services/PdfInvoiceService.php +++ b/src/Services/PdfInvoiceService.php @@ -68,14 +68,7 @@ class PdfInvoiceService $logoWrapStyle = 'text-align:center'; } - // Leistungszeitraum - $lz = ''; - if (!empty($inv['leistungszeitraum_von'])) { - $lz = $fmtDate($inv['leistungszeitraum_von']); - if (!empty($inv['leistungszeitraum_bis']) && $inv['leistungszeitraum_bis'] !== $inv['leistungszeitraum_von']) { - $lz .= ' – ' . $fmtDate($inv['leistungszeitraum_bis']); - } - } + $lz = $inv['leistungszeitraum'] ?? ''; // Fälligkeitsdatum $fälligText = !empty($inv['faellig_datum']) diff --git a/src/Views/invoices/form.php b/src/Views/invoices/form.php index ee88763..f30a8a4 100644 --- a/src/Views/invoices/form.php +++ b/src/Views/invoices/form.php @@ -37,21 +37,16 @@ $preCustomer = (int)($_GET['customer_id'] ?? 0); -
+
- - -
-
- - + +
diff --git a/src/Views/invoices/show.php b/src/Views/invoices/show.php index 046ca38..eb7a876 100644 --- a/src/Views/invoices/show.php +++ b/src/Views/invoices/show.php @@ -7,22 +7,7 @@ $customerName = !empty($invoice['firma']) ? $invoice['firma'] : trim(($invoice['anrede'] ?? '') . ' ' . ($invoice['vorname'] ?? '') . ' ' . $invoice['nachname']); -$lz = ''; -if (!empty($invoice['leistungszeitraum_von'])) { - $lz = View::formatDate($invoice['leistungszeitraum_von']); - if (!empty($invoice['leistungszeitraum_bis'])) { - $lz .= ' – ' . View::formatDate($invoice['leistungszeitraum_bis']); - } -} - -// Leistungszeitraum mit
für die Vorschau-Tabelle (Datumsangaben untereinander) -$lzHtml = ''; -if (!empty($invoice['leistungszeitraum_von'])) { - $lzHtml = $h(View::formatDate($invoice['leistungszeitraum_von'])); - if (!empty($invoice['leistungszeitraum_bis']) && $invoice['leistungszeitraum_bis'] !== $invoice['leistungszeitraum_von']) { - $lzHtml .= '
' . $h(View::formatDate($invoice['leistungszeitraum_bis'])); - } -} +$lzHtml = $h($invoice['leistungszeitraum'] ?? ''); $badgeClass = match($invoice['status']) { 'Bezahlt' => 'badge-green',