Fix #52: Kunden-Nummernpräfix in den Einstellungen konfigurierbar (Default: K-)
This commit is contained in:
parent
063962f2e3
commit
672c657bbe
5 changed files with 65 additions and 3 deletions
5
migrations/033_customer_nr_prefix.sql
Normal file
5
migrations/033_customer_nr_prefix.sql
Normal 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;
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
44
tests/23_KundenNummernkreisTest.php
Normal file
44
tests/23_KundenNummernkreisTest.php
Normal 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]));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue