From 672c657bbed20e3fcd7034546a427bc5aa342597 Mon Sep 17 00:00:00 2001 From: fds2610-bot Date: Sun, 26 Apr 2026 11:04:58 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20#52:=20Kunden-Nummernpr=C3=A4fix=20in=20d?= =?UTF-8?q?en=20Einstellungen=20konfigurierbar=20(Default:=20K-)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrations/033_customer_nr_prefix.sql | 5 +++ src/Models/Customer.php | 12 ++++++-- src/Models/Setting.php | 3 +- src/Views/settings/form.php | 4 +++ tests/23_KundenNummernkreisTest.php | 44 +++++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 migrations/033_customer_nr_prefix.sql create mode 100644 tests/23_KundenNummernkreisTest.php diff --git a/migrations/033_customer_nr_prefix.sql b/migrations/033_customer_nr_prefix.sql new file mode 100644 index 0000000..dc1012c --- /dev/null +++ b/migrations/033_customer_nr_prefix.sql @@ -0,0 +1,5 @@ +-- Migration 033: Kunden-Nummernpräfix konfigurierbar machen +ALTER TABLE company_settings + ADD COLUMN IF NOT EXISTS customer_nr_prefix VARCHAR(10) NOT NULL DEFAULT 'K-' + COMMENT 'Präfix für Kundennummern (z.B. K-)' + AFTER anlage_nr_prefix; diff --git a/src/Models/Customer.php b/src/Models/Customer.php index 255bab5..1d6f027 100644 --- a/src/Models/Customer.php +++ b/src/Models/Customer.php @@ -108,8 +108,16 @@ class Customer public static function generateKundennummer(): string { - $result = Database::fetchOne('SELECT MAX(CAST(SUBSTRING(kundennummer, 3) AS UNSIGNED)) as max_nr FROM customers WHERE kundennummer REGEXP \'^KD[0-9]+$\''); + $settings = \Steuerkram\Models\Setting::get(); + $prefix = $settings['customer_nr_prefix'] ?? 'K-'; + $prefixLen = strlen($prefix) + 1; + $escaped = preg_quote($prefix, '/'); + $result = Database::fetchOne( + "SELECT MAX(CAST(SUBSTRING(kundennummer, {$prefixLen}) AS UNSIGNED)) as max_nr + FROM customers WHERE kundennummer REGEXP ?", + ['^' . $escaped . '[0-9]+$'] + ); $next = (int)($result['max_nr'] ?? 0) + 1; - return sprintf('KD%04d', $next); + return $prefix . sprintf('%04d', $next); } } diff --git a/src/Models/Setting.php b/src/Models/Setting.php index e610d29..85339a4 100644 --- a/src/Models/Setting.php +++ b/src/Models/Setting.php @@ -32,7 +32,7 @@ class Setting ust_id=?, steuernummer=?, finanzamt=?, iban=?, bic=?, bank_name=?, ustva_steuernummer=?, ustva_bundesland=?, - invoice_nr_prefix=?, beleg_nr_prefix=?, anlage_nr_prefix=?, + invoice_nr_prefix=?, beleg_nr_prefix=?, anlage_nr_prefix=?, customer_nr_prefix=?, payment_days_default=?, test_mode=?, ki_vorschlag_aktiv=?, nextcloud_url=?, nextcloud_user=?, nextcloud_pass=?, nextcloud_folder=?, nextcloud_done=?, @@ -59,6 +59,7 @@ class Setting $data['invoice_nr_prefix'] ?? 'AR', $data['beleg_nr_prefix'] ?? 'BLG', $data['anlage_nr_prefix'] ?? 'ANL', + $data['customer_nr_prefix'] ?? 'K-', (int)($data['payment_days_default'] ?? 14), isset($data['test_mode']) ? 1 : 0, isset($data['ki_vorschlag_aktiv']) ? 1 : 0, diff --git a/src/Views/settings/form.php b/src/Views/settings/form.php index 35d474d..96b5e3b 100644 --- a/src/Views/settings/form.php +++ b/src/Views/settings/form.php @@ -236,6 +236,10 @@ +
+ + +
diff --git a/tests/23_KundenNummernkreisTest.php b/tests/23_KundenNummernkreisTest.php new file mode 100644 index 0000000..48d920f --- /dev/null +++ b/tests/23_KundenNummernkreisTest.php @@ -0,0 +1,44 @@ +assert(array_key_exists('customer_nr_prefix', $settings), 'customer_nr_prefix-Spalte existiert in company_settings'); + + // Präfix in den Einstellungen speichern und lesen + $originalPrefix = $settings['customer_nr_prefix'] ?? 'K-'; + $testPrefix = 'TEST-'; + Setting::update(array_merge($settings, ['customer_nr_prefix' => $testPrefix])); + $updated = Setting::get(); + $this->assertEquals($testPrefix, $updated['customer_nr_prefix'], 'customer_nr_prefix wird korrekt gespeichert'); + + // Kundennummer mit neuem Präfix generieren + $nr = Customer::generateKundennummer(); + $this->assert(str_starts_with($nr, $testPrefix), 'Generierte Kundennummer beginnt mit neuem Präfix'); + $numericPart = substr($nr, strlen($testPrefix)); + $this->assert(ctype_digit($numericPart), 'Numerischer Teil der Kundennummer enthält nur Ziffern'); + $this->assert((int)$numericPart > 0, 'Numerischer Teil > 0'); + + // Zurücksetzen auf Standard-Präfix + Setting::update(array_merge($updated, ['customer_nr_prefix' => 'K-'])); + $reset = Setting::get(); + $this->assertEquals('K-', $reset['customer_nr_prefix'], 'Präfix auf K- zurückgesetzt'); + + // Kundennummer mit Default-Präfix K- + $nrDefault = Customer::generateKundennummer(); + $this->assert(str_starts_with($nrDefault, 'K-'), 'Generierte Kundennummer beginnt mit K-'); + + // Originalwert wiederherstellen + Setting::update(array_merge($reset, ['customer_nr_prefix' => $originalPrefix])); + } +}