refactor: change kontonummer to INTEGER, derive sub-account number as parent + suffix (arithmetic)
This commit is contained in:
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user