Files
Caramel-CRM/resources/js/pages/ProceduralDocumentation.vue
T

217 lines
7.2 KiB
Vue

<script setup lang="ts">
import AppLayout from '@/layouts/AppLayout.vue';
import { Table, TableCell, TableFooter, TableBody, TableHead, TableHeader, TableRow, } from '@/components/ui/table';
</script>
<template>
<AppLayout title="Verfahrensdokumentation">
<div class="pl-4 max-w-5xl">
<h1>Verfahrensdokumentation</h1>
<h2>GoBD-konforme Rechnungsverwaltung</h2>
<section>
<h3>1. Systembeschreibung</h3>
<p><strong>Zweck</strong>: Erstellung, Verwaltung und Archivierung von Rechnungen gemäß §14 UStG und
GoBD.</p>
<p><strong>Technologie</strong>: Laravel (Backend), Vue.js (Frontend), SQLite/MySQL (Datenbank), S3
(Speicher).</p>
</section>
<section>
<h3>2. Prozesse</h3>
<h4>2.1 Rechnungserstellung</h4>
<ol>
<li>
Nutzer erstellt <strong>Entwurf</strong> (Status: `draft`).
</li>
<li>
System speichert Entwurf <strong>ohne Rechnungsnummer</strong>.
</li>
<li>
Bei "Rechnung stellen":
<ul>
<li>
System vergibt <strong>fortlaufende Nummer</strong> (z. B. `RE-2023-001`).
</li>
<li>
Status wird auf `issued` gesetzt.
</li>
<li>
<strong>PDF/XML</strong> wird generiert und <strong>unveränderlich</strong> gespeichert
(S3 mit Versionierung).
</li>
<li>
<strong>Audit-Log</strong> wird erstellt.
</li>
</ul>
</li>
</ol>
</section>
<h4>2.2 Rechnungsstornierung</h4>
<ol>
<li>
Nutzer wählt "Stornieren" und gibt <strong>Grund</strong> an (GoBD-Pflicht!).
</li>
<li>
System:
<ul>
<li>Setzt Status auf `cancelled`.</li>
<li>Erstellt <strong>Gutschrift</strong> (Credit Note) mit negativem Betrag.</li>
<li>Speichert Stornierungsgrund im <strong>Audit-Log</strong>.</li>
</ul>
</li>
</ol>
<h4>2.3 Archivierung</h4>
<ol>
<li><strong>Automatische Backups</strong> täglich um 3:00 Uhr (`spatie/laravel-backup`).</li>
<li><strong>Aufbewahrungsfrist</strong>: 10 Jahre (S3 Lifecycle Policy).</li>
<li><strong>Speicherformat</strong>: PDF + XML (ZUGFeRD-konform).</li>
</ol>
<h3>3. Technische Maßnahmen</h3>
<Table>
<TableHeader>
<TableRow>
<TableHead>Maßnahme</TableHead>
<TableHead>Umsetzung</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell>Unveränderbarkeit</TableCell>
<TableCell>Rechnungen nach Stellung als `readonly` markiert. Datenbank-Trigger verhindern
Änderungen.</TableCell>
</TableRow>
<TableRow>
<TableCell>Nachvollziehbarkeit</TableCell>
<TableCell>`laravel-auditing` protokolliert alle Änderungen (wer, wann, was).</TableCell>
</TableRow>
<TableRow>
<TableCell>Vollständigkeit</TableCell>
<TableCell>Fortlaufende Nummernvergabe ohne Lücken (Datenbank-Transaktionen).</TableCell>
</TableRow>
<TableRow>
<TableCell>Aufbewahrung</TableCell>
<TableCell>Tägliche Backups auf S3 mit Versionierung (10 Jahre Aufbewahrung).</TableCell>
</TableRow>
<TableRow>
<TableCell>Zugriffsschutz</TableCell>
<TableCell>Laravel Policies schränken Berechtigungen ein (z. B. nur Buchhalter dürfen
stornieren).</TableCell>
</TableRow>
<TableRow>
<TableCell>Prüfbarkeit</TableCell>
<TableCell>Audit-Logs und Revisionsprotokolle sind über Admin-Oberfläche einsehbar.</TableCell>
</TableRow>
</TableBody>
</Table>
<h3>4. Verantwortlichkeiten</h3>
<Table>
<TableHeader>
<TableRow>
<TableHead>Rolle</TableHead>
<TableHead>Verantwortung</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell>Buchhaltung</TableCell>
<TableCell>Erstellung, Stellung und Stornierung von Rechnungen.</TableCell>
</TableRow>
<TableRow>
<TableCell>IT-Administration</TableCell>
<TableCell>Wartung der Systeme, Backups, Zugriffsrechte.</TableCell>
</TableRow>
<TableRow>
<TableCell>Geschäftsführung</TableCell>
<TableCell>Freigabe von Prozessen, regelmäßige Prüfung der GoBD-Konformität.</TableCell>
</TableRow>
</TableBody>
</Table>
<h3>5. Prüfprotokolle</h3>
<ul>
<li><strong>Monatlich</strong>: Automatischer Report aller gestellten/stornierten Rechnungen (via
`laravel-excel`).</li>
<li><strong>Jährlich</strong>: Manuelle Prüfung der Archivierung durch Steuerberater.</li>
</ul>
</div>
</AppLayout>
</template>
<style scoped>
h1 {
font-size: var(--text-xl);
font-weight: var(--font-weight-bold);
color: var(--color-primary-foreground);
}
h2 {
font-size: var(--text-lg);
color: var(--color-muted-foreground);
}
h3 {
font-size: var(--text-lg);
margin-top: calc(var(--spacing) * 12);
margin-bottom: calc(var(--spacing) * 6);
}
h4 {
font-size: var(--text-md);
margin-top: calc(var(--spacing) * 12);
margin-bottom: calc(var(--spacing) * 6);
color: var(--color-muted-foreground);
}
h3+h4 {
margin-top: calc(var(--spacing) * -3);
;
}
section {
margin-block: calc(var(--spacing) * 12);
}
p {
margin-block: calc(var(--spacing) * 3);
}
ul {
list-style-type: disc;
margin: calc(var(--spacing) * 4);
}
ol {
list-style-type: decimal;
margin: calc(var(--spacing) * 4);
}
li {
margin-block: calc(var(--spacing) * 1);
}
th,
td {
font-size: var(--text-base);
}
</style>