feat: Full company accounting — SKR04, doppelte Buchführung, GoBD Festschreibung

Haben-cloned features for complete company accounting:

SKR04 Kontenrahmen (21 Konten):
- Bestandskonten (Aktiv/Passiv): Bank, Kasse, EDV-Anlagen, Verbindlichkeiten
- Erlöskonten: Erlöse 19% USt, Fremdleistungen
- Aufwandskonten: Bezogene Leistungen, Bürobedarf, EDV-Kosten, Reisekosten, Löhne
- Steuerkonten: USt 19%/7%, abziehbare Vorsteuer

Doppelte Buchführung (Buchungssatz):
- Soll an Haben booking system
- Journal with lückenlose Nummerierung (BUC-2026-XXXX)
- Saldenliste (account balances per Konto)
- GoBD Festschreibung (immutable via SHA-256 hash)
- Reverse Charge and §19 UStG (Kleinunternehmer) flags

EÜR (Einnahmen-Überschuss-Rechnung):
- Anlage EÜR with AVEÜR line numbers
- § 4 Abs. 3 EStG computation
- Gewinn: €14.506 (2026)

Jahresabschluss (GoBD):
- Immutable year-end archive with SHA-256 hash chain
- Links to previous year (2025 → 2026)
- Festschreibung of all bookings in the year
- Aufbewahrungsfrist: 8 Jahre (GoBD) / 10 Jahre (§ 147 AO)

Jahreserklärungen:
- USt-Erklärung (yearly, more lines than monthly UStVA)
- Anlage EÜR, Einkommensteuer, Gewerbesteuer
- ELSTER submission tracking

Seed: 21 Konten, 7 Buchungssätze, 9 EÜR entries, 2 Jahreserklärungen, 1 Jahresarchiv
This commit is contained in:
Z User committed 2026-10-27 18:13:04 +00:00
1 parent 0d0fa6b5e1
commit 6cbf0b2879
6 files changed
+613

No files matched your search

+82
View File
@@ -671,3 +671,85 @@ model KassenbuchEntry {
createdAt DateTime @default(now())
}
// ---------------------------------------------------------------------------
// SKR03/SKR04 Kontenrahmen + doppelte Buchführung (Haben clone)
// ---------------------------------------------------------------------------
model Konto {
id String @id @default(cuid())
nummer String @unique
name String
rahmen String @default("skr04")
art String // aktiv|passiv|ertrag|aufwand
parentId String?
locked Boolean @default(false)
sollBuchungen Buchungssatz[] @relation("SollKonto")
habenBuchungen Buchungssatz[] @relation("HabenKonto")
createdAt DateTime @default(now())
}
model Buchungssatz {
id String @id @default(cuid())
number String @unique
belegdatum DateTime
buchungsdatum DateTime @default(now())
sollKontoId String
sollKonto Konto @relation("SollKonto", fields: [sollKontoId], references: [id])
habenKontoId String
habenKonto Konto @relation("HabenKonto", fields: [habenKontoId], references: [id])
betragCents Int
buchungstext String
belegNummer String?
steuerBp Int?
steuerKontoId String?
festgeschrieben Boolean @default(false)
festgeschriebenAt DateTime?
festgeschriebenHash String?
belegId String?
invoiceId String?
expenseId String?
reverseCharge Boolean @default(false)
par19UStG Boolean @default(false)
createdAt DateTime @default(now())
}
model EuerEntry {
id String @id @default(cuid())
jahr Int
zeile String
label String
art String
betragCents Int
kontoNummern String?
createdAt DateTime @default(now())
}
model Jahreserklaerung {
id String @id @default(cuid())
jahr Int
art String
status String @default("draft")
kennzahlen String?
elsterRef String?
submittedAt DateTime?
acceptedAt DateTime?
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Jahresarchiv {
id String @id @default(cuid())
jahr Int
prevArchivId String?
archivHash String @unique
buchungenCount Int
belegeCount Int
rechnungenCount Int
zipFileName String
zipSizeBytes Int
createdDate DateTime @default(now())
createdBy String
notes String?
}