Files
AnnasRechnungsManager/README.md
T

204 lines
5.4 KiB
Markdown

# Annas Rechnungsmanager
Buchhaltungs- und Rechnungsverwaltungssystem für Steuerberater und Buchhalter mit Mandantenverwaltung.
## Features
- **Mandantenverwaltung** — Mehrere Unternehmen verwalten, archivieren und wiederherstellen
- **Rechnungen** — Erstellen, versenden, bezahlen, als PDF exportieren (§14 UStG konform)
- **Kundenverwaltung** — Kundenstammdaten pro Mandant
- **Steuerberichte** — USt-Voranmeldung, monatliche & quartalsweise Auswertungen
- **Benutzerverwaltung** — Mehrere Benutzer mit Rollen (USER / ADMIN)
- **Audit-Log** — Protokollierung aller relevanten Aktionen mit Benutzer und IP
- **Archiv** — Archivierte Mandanten mit vollständiger Historie einsehbar
- **Papierkorb** — Gelöschte Rechnungen wiederherstellbar
## Tech Stack
- **React Router v7** (Framework Mode, SSR) + TypeScript
- **MariaDB** via Prisma ORM
- **Cookie-Session-Auth** (bcryptjs)
- **Tailwind CSS v4** + shadcn/ui
- **@react-pdf/renderer** für PDF-Generierung
- **Docker** für Datenbank und Deployment
---
## Lokale Entwicklung
### Voraussetzungen
- Node.js 22+
- Docker + Docker Compose
### Installation
```bash
npm install
```
### Umgebungsvariablen
`.env` im Projektstamm anlegen:
```env
DATABASE_URL="mysql://annas_user:annas_password@localhost:3306/annas_rechnungen"
AUTH_SECRET="dein-zufaelliger-geheimer-string"
```
### Datenbank einrichten
```bash
npx prisma migrate deploy # Migrationen ausführen
npm run db:seed # Demo-Daten einspielen (optional)
```
### Dev-Server starten
```bash
npm run dev
```
Startet den Vite-Dev-Server auf `http://localhost:5173`.
---
## Deployment
### Erstes Deployment
**1. Image bauen:**
```bash
docker build -t annasrechnungsmanager:latest .
```
**2. Secrets setzen** (Shell-Exports oder `.env`-Datei):
```bash
export AUTH_SECRET="langer-zufaelliger-string"
export ADMIN_PASSWORD="sicheres-startpasswort" # nur beim ersten Start
```
**3. Stack starten:**
```bash
docker compose up -d
```
Beim ersten Start mit gesetztem `ADMIN_PASSWORD`:
- Prisma-Migrationen werden automatisch ausgeführt
- Admin-Benutzer (`username: admin`) wird angelegt oder aktualisiert
**4. `ADMIN_PASSWORD` entfernen** (nach erfolgreichem Login und eigenem Passwort setzen).
> Die App läuft auf `http://localhost:3000`.
### Folge-Deployments
```bash
docker build -t annasrechnungsmanager:latest .
docker compose up -d --no-deps app
```
Migrationen werden beim Start automatisch angewendet. `ADMIN_PASSWORD` ist nicht erneut nötig.
---
## Admin-Benutzer & Recovery
### Admin-Passwort setzen (im laufenden Container)
```bash
docker exec -e ADMIN_PASSWORD=neuespasswort annas_app node scripts/setup-admin.js
```
Erstellt oder aktualisiert den Benutzer `admin` (idempotent). Mindestens 8 Zeichen.
### Passwort eines beliebigen Benutzers zurücksetzen
```bash
docker exec -it annas_app node scripts/reset-password.js --username anna --password neuespasswort
```
Zeigt alle vorhandenen Benutzer an, wenn der angegebene Username nicht existiert.
### Passwort im laufenden Betrieb ändern
Jeder eingeloggte Benutzer kann sein Passwort über das **Schlüssel-Icon** in der Topbar ändern (`/settings/password`).
---
## Benutzerverwaltung (Admin)
Erreichbar über den **Admin**-Button in der Topbar (nur für Benutzer mit Rolle `ADMIN`).
- Benutzer anlegen, bearbeiten, löschen
- Rollen vergeben: `USER` oder `ADMIN`
- Audit-Log einsehen (Aktion, Benutzer, IP-Adresse, Zeitstempel)
Login ist möglich mit **Benutzername** oder **E-Mail-Adresse**.
---
## Scripts
| Befehl | Beschreibung |
|---|---|
| `npm run dev` | Dev-Server starten |
| `npm run build` | Produktions-Build |
| `npm run start` | Produktions-Server starten |
| `npm run typecheck` | TypeScript prüfen |
| `npm run db:migrate` | Prisma Migrationen ausführen (Dev) |
| `npm run db:seed` | Demo-Daten einspielen |
| `npm run db:studio` | Prisma Studio öffnen |
| `npm run setup-admin` | Admin-Benutzer anlegen / Passwort setzen |
| `npm run reset-password` | Passwort eines Benutzers zurücksetzen |
**Beispiele (Entwicklung):**
```bash
# Admin-Passwort setzen
ADMIN_PASSWORD=geheim npm run setup-admin
# Passwort zurücksetzen
npm run reset-password -- --username anna --password neuespasswort
```
---
## Projektstruktur
```
app/
components/ UI-Komponenten (ui/, layout/, company/, invoice/)
lib/ Hilfsfunktionen (prisma, tax, utils, invoice-number, logger)
routes/ Route-Dateien (React Router v7, file-based)
admin.* Admin-Bereich (Benutzerverwaltung, Audit-Log)
api.* REST-API-Routen (resource routes)
settings.* Benutzereinstellungen (Passwort ändern)
archiv.tsx Archiv-Übersicht (archivierte Mandanten)
session.server.ts Auth (Login via Username/E-Mail, Logout, Session)
types/ Gemeinsame TypeScript-Typen
scripts/
setup-admin.ts Admin-Benutzer anlegen / Passwort setzen
reset-password.ts Recovery: Passwort eines Benutzers zurücksetzen
prisma/
schema.prisma Datenbankschema
migrations/ Migrationsverlauf
seed.ts Demo-Daten
```
---
## Rechnungs-Compliance (§14 UStG)
Alle PDFs enthalten die gesetzlich vorgeschriebenen Pflichtangaben:
- Name & Anschrift Rechnungssteller und -empfänger
- Steuernummer / USt-IdNr. des Ausstellers
- Rechnungsdatum & fortlaufende Rechnungsnummer
- Leistungsdatum / Lieferdatum
- Leistungsbeschreibung
- Nettobetrag, USt-Satz, USt-Betrag, Bruttobetrag