feat: add Buchhaltung module with fiscal years, budget accounts, transactions, and approval workflow

This commit is contained in:
Matthias Hochmeister
2026-03-28 19:48:32 +01:00
parent 4349de9bc9
commit 18b1300de8
14 changed files with 2791 additions and 1 deletions

View File

@@ -0,0 +1,229 @@
// Lookup types
export type KontoArt = 'einnahme' | 'ausgabe' | 'vermoegen' | 'verbindlichkeit';
export type TransaktionTyp = 'einnahme' | 'ausgabe';
export type TransaktionStatus = 'entwurf' | 'gebucht' | 'freigegeben' | 'storniert';
export type FreigabeStatus = 'ausstehend' | 'genehmigt' | 'abgelehnt';
export type WiederkehrendIntervall = 'monatlich' | 'quartalsweise' | 'halbjaehrlich' | 'jaehrlich';
export type PlanungStatus = 'entwurf' | 'aktiv' | 'abgeschlossen';
// Label maps
export const TRANSAKTION_STATUS_LABELS: Record<TransaktionStatus, string> = {
entwurf: 'Entwurf',
gebucht: 'Gebucht',
freigegeben: 'Freigegeben',
storniert: 'Storniert',
};
export const TRANSAKTION_STATUS_COLORS: Record<TransaktionStatus, 'default' | 'warning' | 'success' | 'error'> = {
entwurf: 'default',
gebucht: 'warning',
freigegeben: 'success',
storniert: 'error',
};
export const TRANSAKTION_TYP_LABELS: Record<TransaktionTyp, string> = {
einnahme: 'Einnahme',
ausgabe: 'Ausgabe',
};
export const KONTO_ART_LABELS: Record<KontoArt, string> = {
einnahme: 'Einnahmen',
ausgabe: 'Ausgaben',
vermoegen: 'Vermögen',
verbindlichkeit: 'Verbindlichkeiten',
};
export const INTERVALL_LABELS: Record<WiederkehrendIntervall, string> = {
monatlich: 'Monatlich',
quartalsweise: 'Quartalsweise',
halbjaehrlich: 'Halbjährlich',
jaehrlich: 'Jährlich',
};
// Entities
export interface KontoTyp {
id: number;
bezeichnung: string;
art: KontoArt;
sort_order: number;
}
export interface Bankkonto {
id: number;
bezeichnung: string;
iban: string | null;
bic: string | null;
institut: string | null;
ist_standard: boolean;
aktiv: boolean;
erstellt_von: string | null;
erstellt_am: string;
aktualisiert_am: string;
}
export interface Haushaltsjahr {
id: number;
jahr: number;
bezeichnung: string;
beginn: string;
ende: string;
abgeschlossen: boolean;
erstellt_von: string | null;
erstellt_am: string;
aktualisiert_am: string;
}
export interface Konto {
id: number;
haushaltsjahr_id: number;
konto_typ_id: number | null;
kontonummer: string;
bezeichnung: string;
budget_betrag: number;
notizen: string | null;
aktiv: boolean;
erstellt_von: string | null;
erstellt_am: string;
aktualisiert_am: string;
// Joined fields
konto_typ_bezeichnung?: string;
konto_typ_art?: KontoArt;
}
export interface KontoBudgetInfo extends Konto {
gebucht_betrag: number;
ausstehend_betrag: number;
verfuegbar_betrag: number;
auslastung_prozent: number;
}
export interface Transaktion {
id: number;
haushaltsjahr_id: number;
konto_id: number | null;
bankkonto_id: number | null;
laufende_nummer: number | null;
typ: TransaktionTyp;
betrag: number;
datum: string;
buchungsdatum: string | null;
beschreibung: string | null;
empfaenger_auftraggeber: string | null;
verwendungszweck: string | null;
beleg_nr: string | null;
status: TransaktionStatus;
bestellung_id: number | null;
erstellt_von: string | null;
gebucht_von: string | null;
erstellt_am: string;
aktualisiert_am: string;
// Joined fields
konto_bezeichnung?: string;
konto_kontonummer?: string;
bankkonto_bezeichnung?: string;
belege?: Beleg[];
}
export interface Beleg {
id: number;
transaktion_id: number;
dateiname: string;
original_name: string;
dateityp: string;
dateigroesse: number;
erstellt_von: string | null;
erstellt_am: string;
}
export interface Freigabe {
id: number;
transaktion_id: number;
status: FreigabeStatus;
kommentar: string | null;
freigegeben_von: string | null;
freigegeben_am: string | null;
erstellt_am: string;
}
export interface WiederkehrendBuchung {
id: number;
bezeichnung: string;
konto_id: number | null;
bankkonto_id: number | null;
typ: TransaktionTyp;
betrag: number;
beschreibung: string | null;
empfaenger_auftraggeber: string | null;
intervall: WiederkehrendIntervall;
naechste_ausfuehrung: string;
aktiv: boolean;
erstellt_von: string | null;
erstellt_am: string;
aktualisiert_am: string;
}
export interface BuchhaltungAudit {
id: number;
transaktion_id: number | null;
aktion: string;
details: Record<string, unknown> | null;
erstellt_von: string | null;
erstellt_am: string;
}
export interface BuchhaltungStats {
haushaltsjahr_id: number;
total_einnahmen: number;
total_ausgaben: number;
saldo: number;
konten_budget: KontoBudgetInfo[];
}
// Form data types
export interface HaushaltsjahrFormData {
jahr: number;
bezeichnung: string;
beginn: string;
ende: string;
}
export interface BankkontoFormData {
bezeichnung: string;
iban?: string;
bic?: string;
institut?: string;
ist_standard?: boolean;
}
export interface KontoFormData {
haushaltsjahr_id: number;
konto_typ_id?: number;
kontonummer: string;
bezeichnung: string;
budget_betrag?: number;
notizen?: string;
}
export interface TransaktionFormData {
haushaltsjahr_id: number;
konto_id?: number | null;
bankkonto_id?: number | null;
typ: TransaktionTyp;
betrag: number;
datum: string;
beschreibung?: string;
empfaenger_auftraggeber?: string;
verwendungszweck?: string;
beleg_nr?: string;
}
// Filter type for transaction list
export interface TransaktionFilters {
haushaltsjahr_id?: number;
konto_id?: number;
status?: TransaktionStatus;
typ?: TransaktionTyp;
datum_von?: string;
datum_bis?: string;
search?: string;
}