Fix #52: Kunden-Nummernpräfix in den Einstellungen konfigurierbar (Default: K-)

This commit is contained in:
fds2610-bot 2026-04-26 11:04:58 +02:00
parent 063962f2e3
commit 672c657bbe
5 changed files with 65 additions and 3 deletions

View file

@ -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;

View file

@ -108,8 +108,16 @@ class Customer
public static function generateKundennummer(): string 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; $next = (int)($result['max_nr'] ?? 0) + 1;
return sprintf('KD%04d', $next); return $prefix . sprintf('%04d', $next);
} }
} }

View file

@ -32,7 +32,7 @@ class Setting
ust_id=?, steuernummer=?, finanzamt=?, ust_id=?, steuernummer=?, finanzamt=?,
iban=?, bic=?, bank_name=?, iban=?, bic=?, bank_name=?,
ustva_steuernummer=?, ustva_bundesland=?, 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=?, payment_days_default=?, test_mode=?, ki_vorschlag_aktiv=?,
nextcloud_url=?, nextcloud_user=?, nextcloud_pass=?, nextcloud_url=?, nextcloud_user=?, nextcloud_pass=?,
nextcloud_folder=?, nextcloud_done=?, nextcloud_folder=?, nextcloud_done=?,
@ -59,6 +59,7 @@ class Setting
$data['invoice_nr_prefix'] ?? 'AR', $data['invoice_nr_prefix'] ?? 'AR',
$data['beleg_nr_prefix'] ?? 'BLG', $data['beleg_nr_prefix'] ?? 'BLG',
$data['anlage_nr_prefix'] ?? 'ANL', $data['anlage_nr_prefix'] ?? 'ANL',
$data['customer_nr_prefix'] ?? 'K-',
(int)($data['payment_days_default'] ?? 14), (int)($data['payment_days_default'] ?? 14),
isset($data['test_mode']) ? 1 : 0, isset($data['test_mode']) ? 1 : 0,
isset($data['ki_vorschlag_aktiv']) ? 1 : 0, isset($data['ki_vorschlag_aktiv']) ? 1 : 0,

View file

@ -236,6 +236,10 @@
<label>Anlagen-Präfix</label> <label>Anlagen-Präfix</label>
<input type="text" name="anlage_nr_prefix" value="<?= $h($settings['anlage_nr_prefix'] ?? 'ANL') ?>" maxlength="10"> <input type="text" name="anlage_nr_prefix" value="<?= $h($settings['anlage_nr_prefix'] ?? 'ANL') ?>" maxlength="10">
</div> </div>
<div class="form-group">
<label>Kunden-Präfix</label>
<input type="text" name="customer_nr_prefix" value="<?= $h($settings['customer_nr_prefix'] ?? 'K-') ?>" maxlength="10">
</div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label>Standard-Zahlungsziel (Tage)</label> <label>Standard-Zahlungsziel (Tage)</label>

View file

@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
use Steuerkram\Models\Customer;
use Steuerkram\Models\Setting;
use Steuerkram\Database;
class KundenNummernkreisTest extends TestCase
{
protected string $testName = 'Test 23: Kunden-Nummernkreis konfigurierbar';
public function run(): void
{
$settings = Setting::get();
$this->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]));
}
}