diff --git a/backend/src/database/migrations/078_buchhaltung_kontonummer_integer.sql b/backend/src/database/migrations/078_buchhaltung_kontonummer_integer.sql new file mode 100644 index 0000000..8416e13 --- /dev/null +++ b/backend/src/database/migrations/078_buchhaltung_kontonummer_integer.sql @@ -0,0 +1,3 @@ +-- Convert kontonummer from TEXT to INTEGER +ALTER TABLE buchhaltung_konten + ALTER COLUMN kontonummer TYPE INTEGER USING kontonummer::INTEGER; diff --git a/frontend/src/pages/Buchhaltung.tsx b/frontend/src/pages/Buchhaltung.tsx index 7393ba6..3bc4c40 100644 --- a/frontend/src/pages/Buchhaltung.tsx +++ b/frontend/src/pages/Buchhaltung.tsx @@ -196,26 +196,26 @@ function KontoDialog({ konten: Konto[]; onSave: (data: KontoFormData) => void; }) { - const empty: KontoFormData = { haushaltsjahr_id: haushaltsjahrId, kontonummer: '', bezeichnung: '', budget_gwg: 0, budget_anlagen: 0, budget_instandhaltung: 0, parent_id: null, notizen: '' }; + const empty: KontoFormData = { haushaltsjahr_id: haushaltsjahrId, kontonummer: 0, bezeichnung: '', budget_gwg: 0, budget_anlagen: 0, budget_instandhaltung: 0, parent_id: null, notizen: '' }; const [form, setForm] = useState(empty); const selectedParent = konten.find(k => k.id === form.parent_id); - const parentPrefix = selectedParent ? selectedParent.kontonummer : ''; - // suffix = part of kontonummer after parent prefix - const kontonummerSuffix = form.kontonummer.startsWith(parentPrefix) ? form.kontonummer.slice(parentPrefix.length) : form.kontonummer; + + // suffix = form.kontonummer - parent.kontonummer (arithmetic) + const suffixValue = selectedParent ? form.kontonummer - selectedParent.kontonummer : form.kontonummer; const handleParentChange = (parentId: number | null) => { const parent = konten.find(k => k.id === parentId); - const prefix = parent ? parent.kontonummer : ''; - // strip old prefix, re-apply new one - const oldPrefix = selectedParent ? selectedParent.kontonummer : ''; - const suffix = form.kontonummer.startsWith(oldPrefix) ? form.kontonummer.slice(oldPrefix.length) : form.kontonummer; - setForm(f => ({ ...f, parent_id: parentId, kontonummer: prefix + suffix })); + const oldBase = selectedParent ? selectedParent.kontonummer : 0; + const currentSuffix = form.kontonummer - oldBase; + const newBase = parent ? parent.kontonummer : 0; + setForm(f => ({ ...f, parent_id: parentId, kontonummer: newBase + Math.max(0, currentSuffix) })); }; - const handleSuffixChange = (suffix: string) => { - const digits = suffix.replace(/\D/g, ''); - setForm(f => ({ ...f, kontonummer: parentPrefix + digits })); + const handleSuffixChange = (value: string) => { + const suffix = parseInt(value, 10); + const base = selectedParent ? selectedParent.kontonummer : 0; + setForm(f => ({ ...f, kontonummer: base + (isNaN(suffix) ? 0 : suffix) })); }; useEffect(() => { @@ -233,15 +233,16 @@ function KontoDialog({ handleSuffixChange(e.target.value)} required - inputProps={{ inputMode: 'numeric', pattern: '[0-9]*' }} - InputProps={parentPrefix ? { - startAdornment: {parentPrefix}, + inputProps={{ min: 1, step: 1 }} + InputProps={selectedParent ? { + startAdornment: {selectedParent.kontonummer} +, } : undefined} - helperText={parentPrefix ? `Vollständige Nummer: ${form.kontonummer || parentPrefix + '…'}` : undefined} + helperText={selectedParent ? `Ergibt Kontonummer: ${form.kontonummer}` : undefined} /> setForm(f => ({ ...f, bezeichnung: e.target.value }))} required /> @@ -268,7 +269,7 @@ function KontoDialog({ - + ); diff --git a/frontend/src/types/buchhaltung.types.ts b/frontend/src/types/buchhaltung.types.ts index ab6f5c9..9944b92 100644 --- a/frontend/src/types/buchhaltung.types.ts +++ b/frontend/src/types/buchhaltung.types.ts @@ -84,7 +84,7 @@ export interface Konto { id: number; haushaltsjahr_id: number; konto_typ_id: number | null; - kontonummer: string; + kontonummer: number; bezeichnung: string; parent_id: number | null; budget_gwg: number; @@ -140,7 +140,7 @@ export interface Transaktion { aktualisiert_am: string; // Joined fields konto_bezeichnung?: string; - konto_kontonummer?: string; + konto_kontonummer?: number; bankkonto_bezeichnung?: string; belege?: Beleg[]; } @@ -219,7 +219,7 @@ export interface BankkontoFormData { export interface KontoFormData { haushaltsjahr_id: number; konto_typ_id?: number; - kontonummer: string; + kontonummer: number; bezeichnung: string; budget_gwg: number; budget_anlagen: number;