refactor: change kontonummer to INTEGER, derive sub-account number as parent + suffix (arithmetic)

This commit is contained in:
Matthias Hochmeister
2026-03-30 11:23:07 +02:00
parent 5f25d644f4
commit e4f1d8864a
3 changed files with 26 additions and 22 deletions

View File

@@ -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<KontoFormData>(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({
<DialogContent>
<Stack spacing={2} sx={{ mt: 1 }}>
<TextField
label="Kontonummer"
value={kontonummerSuffix}
label={selectedParent ? 'Kontonummer (Suffix)' : 'Kontonummer'}
type="number"
value={suffixValue || ''}
onChange={e => handleSuffixChange(e.target.value)}
required
inputProps={{ inputMode: 'numeric', pattern: '[0-9]*' }}
InputProps={parentPrefix ? {
startAdornment: <InputAdornment position="start">{parentPrefix}</InputAdornment>,
inputProps={{ min: 1, step: 1 }}
InputProps={selectedParent ? {
startAdornment: <InputAdornment position="start">{selectedParent.kontonummer} +</InputAdornment>,
} : undefined}
helperText={parentPrefix ? `Vollständige Nummer: ${form.kontonummer || parentPrefix + '…'}` : undefined}
helperText={selectedParent ? `Ergibt Kontonummer: ${form.kontonummer}` : undefined}
/>
<TextField label="Bezeichnung" value={form.bezeichnung} onChange={e => setForm(f => ({ ...f, bezeichnung: e.target.value }))} required />
<FormControl fullWidth margin="dense">
@@ -268,7 +269,7 @@ function KontoDialog({
</DialogContent>
<DialogActions>
<Button onClick={onClose}>Abbrechen</Button>
<Button variant="contained" onClick={() => onSave(form)} disabled={!form.bezeichnung || !form.kontonummer || (!!parentPrefix && kontonummerSuffix === '')}>Speichern</Button>
<Button variant="contained" onClick={() => onSave(form)} disabled={!form.bezeichnung || !form.kontonummer || (!!selectedParent && suffixValue <= 0)}>Speichern</Button>
</DialogActions>
</Dialog>
);

View File

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