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:
1 parent
0d0fa6b5e1
commit
6cbf0b2879
6 files changed
+613
No files matched your search
@@ -732,6 +732,104 @@ async function main() {
|
||||
await db.kassenbuchEntry.create({ data: k })
|
||||
}
|
||||
|
||||
// --- SKR04 Kontenrahmen + Buchungssätze (doppelte Buchführung) -----------
|
||||
const konten = [
|
||||
// Bestandskonten (Aktiv)
|
||||
{ nummer: '0040', name: 'EDV-Anlagen', rahmen: 'skr04', art: 'aktiv' },
|
||||
{ nummer: '0140', name: 'Betriebsausstattung', rahmen: 'skr04', art: 'aktiv' },
|
||||
{ nummer: '1200', name: 'Bank', rahmen: 'skr04', art: 'aktiv' },
|
||||
{ nummer: '1600', name: 'Kassenbestand', rahmen: 'skr04', art: 'aktiv' },
|
||||
{ nummer: '1700', name: 'Verbindlichkeiten a. LL', rahmen: 'skr04', art: 'passiv' },
|
||||
// Erlöskonten (Ertrag)
|
||||
{ nummer: '8400', name: 'Erlöse 19% USt', rahmen: 'skr04', art: 'ertrag' },
|
||||
{ nummer: '8600', name: 'Fremdleistungen', rahmen: 'skr04', art: 'ertrag' },
|
||||
// Aufwandskonten (Aufwand)
|
||||
{ nummer: '4400', name: 'Bezogene Leistungen', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '4910', name: 'Bürobedarf', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '4920', name: 'Telekommunikation', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '4930', name: 'EDV-Kosten / Software', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '4940', name: 'Fremdarbeiten', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '4950', name: 'Reisekosten', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '4960', name: 'Bewirtung', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '6100', name: 'Löhne/Gehälter', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '6300', name: 'Gesetzl. sozial Aufwand', rahmen: 'skr04', art: 'aufwand' },
|
||||
{ nummer: '6520', name: 'Pauschale Steuer', rahmen: 'skr04', art: 'aufwand' },
|
||||
// Steuerkonten
|
||||
{ nummer: '1773', name: 'USt 19%', rahmen: 'skr04', art: 'passiv' },
|
||||
{ nummer: '1776', name: 'USt 7%', rahmen: 'skr04', art: 'passiv' },
|
||||
{ nummer: '3804', name: 'Abziehbare Vorsteuer 19%', rahmen: 'skr04', art: 'aktiv' },
|
||||
{ nummer: '3806', name: 'Abziehbare Vorsteuer 7%', rahmen: 'skr04', art: 'aktiv' },
|
||||
]
|
||||
const kontoMap: Record<string, string> = {}
|
||||
for (const k of konten) {
|
||||
const created = await db.konto.create({ data: k })
|
||||
kontoMap[k.nummer] = created.id
|
||||
}
|
||||
|
||||
// Buchungssätze (sample — doppelte Buchführung Soll an Haben)
|
||||
const buchungen = [
|
||||
{ belegdatum: daysFromNow(-8), sollKontoId: kontoMap['3804'], habenKontoId: kontoMap['1200'], betragCents: CENTS(899), buchungstext: 'JetBrains All Products Pack (Rechnung JB-2026-APPPACK)', belegNummer: 'BEL-2026-0001' },
|
||||
{ belegdatum: daysFromNow(-4), sollKontoId: kontoMap['4950'], habenKontoId: kontoMap['1200'], betragCents: CENTS(142), buchungstext: 'Reise Hamburg → Berlin (Deutsche Bahn)', belegNummer: 'BEL-2026-0003' },
|
||||
{ belegdatum: daysFromNow(-10), sollKontoId: kontoMap['4930'], habenKontoId: kontoMap['1200'], betragCents: CENTS(348), buchungstext: 'Hosting Strato Q4', belegNummer: 'BEL-2026-0002' },
|
||||
{ belegdatum: daysFromNow(-2), sollKontoId: kontoMap['4930'], habenKontoId: kontoMap['1200'], betragCents: CENTS(89), buchungstext: 'Cloudflare Pro Abonnement', belegNummer: 'BEL-2026-0005' },
|
||||
{ belegdatum: daysFromNow(-5), sollKontoId: kontoMap['4910'], habenKontoId: kontoMap['1600'], betragCents: CENTS(12.90), buchungstext: 'Kaffee für Büro (Kassenbeleg)', belegNummer: 'KAS-2026-0003' },
|
||||
{ belegdatum: daysFromNow(-3), sollKontoId: kontoMap['1600'], habenKontoId: kontoMap['8400'], betragCents: CENTS(250), buchungstext: 'Workshop-Teilnahmegebühr (bar)', steuerBp: 1900 },
|
||||
{ belegdatum: daysFromNow(-25), sollKontoId: kontoMap['1200'], habenKontoId: kontoMap['8400'], betragCents: CENTS(1500), buchungstext: 'Rechnung RE-2026-0035 Nordwind Logistik', belegNummer: 'RE-2026-0035' },
|
||||
]
|
||||
let bucCount = 0
|
||||
for (const b of buchungen) {
|
||||
bucCount++
|
||||
await db.buchungssatz.create({
|
||||
data: {
|
||||
...b,
|
||||
number: `BUC-2026-${String(bucCount).padStart(4, '0')}`,
|
||||
buchungsdatum: b.belegdatum,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// EÜR entries (Anlage EÜR — AVEÜR line numbers)
|
||||
const euerEntries = [
|
||||
{ jahr: 2026, zeile: '4', label: 'Betriebseinnahmen (§ 4 Abs. 3 EStG)', art: 'einnahme', betragCents: CENTS(48500), kontoNummern: '8400,8600' },
|
||||
{ jahr: 2026, zeile: '12', label: 'Waren/Rohstoffe (Bezogene Leistungen)', art: 'ausgabe', betragCents: CENTS(2860), kontoNummern: '4400' },
|
||||
{ jahr: 2026, zeile: '20', label: 'EDV-Kosten / Software', art: 'ausgabe', betragCents: CENTS(1836), kontoNummern: '4930' },
|
||||
{ jahr: 2026, zeile: '24', label: 'Reisekosten', art: 'ausgabe', betragCents: CENTS(295), kontoNummern: '4950' },
|
||||
{ jahr: 2026, zeile: '25', label: 'Bewirtung', art: 'ausgabe', betragCents: CENTS(0), kontoNummern: '4960' },
|
||||
{ jahr: 2026, zeile: '30', label: 'Bürobedarf', art: 'ausgabe', betragCents: CENTS(67), kontoNummern: '4910' },
|
||||
{ jahr: 2026, zeile: '40', label: 'Löhne/Gehälter', art: 'ausgabe', betragCents: CENTS(24000), kontoNummern: '6100' },
|
||||
{ jahr: 2026, zeile: '41', label: 'Sozialabgaben', art: 'ausgabe', betragCents: CENTS(4800), kontoNummern: '6300' },
|
||||
{ jahr: 2026, zeile: '65', label: 'Pauschale Steuer (Homeoffice/KM/Verpflegung)', art: 'ausgabe', betragCents: CENTS(136), kontoNummern: '6520' },
|
||||
]
|
||||
for (const e of euerEntries) {
|
||||
await db.euerEntry.create({ data: e })
|
||||
}
|
||||
|
||||
// Jahreserklärung (USt-Erklärung 2026 — draft)
|
||||
await db.jahreserklaerung.create({
|
||||
data: {
|
||||
jahr: 2026, art: 'ust-erklaerung', status: 'draft',
|
||||
kennzahlen: JSON.stringify({ k81: 48500, k86: 0, k66: 0, k83: 9215, k65: 0, k37: 2860, k42: 1836 }),
|
||||
},
|
||||
})
|
||||
await db.jahreserklaerung.create({
|
||||
data: {
|
||||
jahr: 2025, art: 'ust-erklaerung', status: 'accepted',
|
||||
kennzahlen: JSON.stringify({ k81: 52000, k86: 0, k66: 0, k83: 9880, k65: 0, k37: 3100 }),
|
||||
elsterRef: 'ERiC-2025-UST-NORDLICHT-0007', submittedAt: daysFromNow(-280), acceptedAt: daysFromNow(-278),
|
||||
},
|
||||
})
|
||||
|
||||
// Jahresarchiv 2025 (GoBD — SHA-256 Prüfsumme)
|
||||
await db.jahresarchiv.create({
|
||||
data: {
|
||||
jahr: 2025, archivHash: 'sha256:' + Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2),
|
||||
buchungenCount: 342, belegeCount: 89, rechnungenCount: 47,
|
||||
zipFileName: 'aos-jahresarchiv-2025.zip', zipSizeBytes: 45800000,
|
||||
createdBy: 'nora@nordlicht.digital',
|
||||
notes: 'GoBD-konformer Jahresabschluss 2025. Alle Buchungen festgeschrieben.',
|
||||
},
|
||||
})
|
||||
|
||||
// --- Portal approvals (client milestone approvals with evidence) ---------
|
||||
const portalApprovals = [
|
||||
{ project: 'SEO-Optimierung & BFGG-Check', title: 'SEO-Audit & Keyword-Analyse', description: 'Audit-Bericht mit Keyword-Strategie und Wettbewerbsanalyse.', status: 'approved', decidedAt: daysFromNow(-8), decidedBy: 'Dr. med. Iris Brandt', decidedIp: '91.64.224.12', decision: 'Sehr gute Analyse, bitte umsetzen.' },
|
||||
|
||||
Reference in new issue
Block a user