Initial commit: Rapport Website (Hugo + Hextra)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 11:52:03 +02:00
commit e007bdd4e7
480 changed files with 41697 additions and 0 deletions
+35
View File
@@ -0,0 +1,35 @@
---
title: Dokumentation
linkTitle: Dokumentation
weight: 1
---
Vollständige Anleitung zu RAPPORT — von der Installation über den täglichen Arbeitsablauf bis zur Cloud-Variante und Eigen-Builds.
## Erste Schritte
{{< cards >}}
{{< card link="erste-schritte" title="Quick-Start" subtitle="In sechs Schritten von Null zur ersten Rechnung." >}}
{{< card link="installation" title="Installation" subtitle="macOS, Gatekeeper, Signatur, geplante Plattformen." >}}
{{< card link="einrichtung" title="Einrichtung" subtitle="Bürodaten, Mitarbeiter, Kunden, Projekte initial anlegen." >}}
{{< /cards >}}
## Im Alltag
{{< cards >}}
{{< card link="arbeitsablauf" title="Typischer Arbeitsablauf" subtitle="Kunde → Offerte → Projekt → Zeit → Rechnung." >}}
{{< card link="datenhaltung" title="Datenhaltung & Backup" subtitle="Wo die Daten liegen, wie du sie sicherst und wiederherstellst." >}}
{{< card link="troubleshooting" title="Troubleshooting" subtitle="App startet nicht, Daten weg, Update hängt." >}}
{{< /cards >}}
## Für Fortgeschrittene
{{< cards >}}
{{< card link="web-modus" title="Web-Modus (Multi-User)" subtitle="Rapport im Browser via Supabase — für Studios mit mehreren Nutzern." >}}
{{< card link="entwicklung" title="Entwicklung & Build" subtitle="Aus dem Quellcode kompilieren, beitragen, eigenes Release." >}}
{{< card link="changelog" title="Changelog" subtitle="Versionsgeschichte und Breaking Changes." >}}
{{< /cards >}}
## Hilfe & Support
Bei Bugs oder weiteren Fragen → [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues). Siehe auch die [FAQ](../faq) für häufige Fragen.
+129
View File
@@ -0,0 +1,129 @@
---
title: Typischer Arbeitsablauf
linkTitle: Arbeitsablauf
weight: 4
toc: true
---
Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.
## Übersicht
```text
Kunde → Offerte → Projekt → Zeit → Akonto → Schluss
anlegen erstellen (aus Offerte) erfassen -Rechnung -Rechnung
QR-Schein
```
## 1 · Kunde anlegen
**Kunden → Neu** — siehe [Einrichtung § 3](../einrichtung#3--kunden).
Falls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.
## 2 · Offerte erstellen
**Offerten → Neu**
| Feld | Inhalt |
|---|---|
| **Kunde** | aus Kundendatenbank wählen |
| **Bezeichnung** | Projekttitel (z. B. "Einfamilienhaus Müller, Bern") |
| **Honorartyp** | Stundensatz / SIA 102 / Pauschal |
| **Bauschätzwert** | bei SIA — Bruttowert in CHF |
| **Phasen** | bei SIA — anzuklickende Phasen |
| **Positionen** | bei Stundensatz/Pauschal — Position, Beschreibung, Betrag |
Mit *PDF exportieren* — fertige Offerte für den Kunden.
### Offerten-Status
| Status | Bedeutung |
|---|---|
| **Entwurf** | noch nicht versandt |
| **Versandt** | beim Kunden, wartet auf Antwort |
| **Angenommen** | Kunde hat zugesagt — bereit zur Konvertierung |
| **Abgelehnt** | Kunde hat abgelehnt — Archiv |
## 3 · Offerte → Projekt
Bei Status **"Angenommen"**: Knopf **"In Projekt konvertieren"**.
Das erzeugt:
- Ein neues Projekt mit den Daten der Offerte (Kunde, Bezeichnung, Honorar, Phasen)
- Eine Verknüpfung zwischen Offerte und Projekt
- Die Offerte selbst bleibt im Archiv erhalten
Siehe auch [Projekt-Feature](../../features/projekte).
## 4 · Zeit erfassen
**Zeit → Mitarbeiter wählen → Woche navigieren**
- **Klick** auf einen Halbstunden-Slot → Eintrag erstellen
- **Drag** über mehrere Slots → längerer Eintrag
- **Projekt zuweisen** (Pflichtfeld) — aus aktiven Projekten
- **SIA-Phase** zuweisen (optional, für detaillierte Auswertung)
### Spezialfälle
- **Ferien** — eigener "Projekt"-Typ "Ferien", in der Auswertung separat
- **Krankheit/Absenz** — eigener "Projekt"-Typ, ebenfalls separat
- **Interne Stunden** — z. B. Verwaltung, Marketing, IT — eigene interne Projekte
## 5 · Akonto-Rechnung
Während der Projektlaufzeit — typisch nach jeder abgeschlossenen SIA-Phase oder monatlich.
**Rechnungen → Neu → Akonto**
| Feld | Inhalt |
|---|---|
| **Projekt** | aus aktiven Projekten |
| **Bezug** | "Akonto für Phase 31 — Vorprojekt" |
| **Betrag** | Stundensatz × Stunden, oder Phasenanteil × Bausumme |
| **Fälligkeit** | i. d. R. 30 Tage |
Rapport zieht automatisch die geleisteten Stunden aus der Zeiterfassung — die kannst du als Basis nehmen oder überschreiben.
PDF inkl. **QR-Einzahlungsschein** — siehe [Rechnungen-Feature](../../features/rechnungen).
## 6 · Schlussrechnung
Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.
**Rechnungen → Neu → Schlussrechnung**
Rapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:
```text
Gesamthonorar (SIA / Pauschal / Stundensatz)
Akonto-Rechnung 1
Akonto-Rechnung 2
Akonto-Rechnung 3
= Schlussrechnung
```
## 7 · Projektabschluss
Im Projekt → Status auf **"Abgeschlossen"**.
Das Projekt bleibt für historische Auswertungen sichtbar, taucht aber nicht mehr in der Zeiterfassungs-Auswahl auf.
## Auswertungen
Wöchentlich / monatlich / am Jahresende:
- **Zeit → Auswertungen** — Stunden pro Mitarbeiter, pro Projekt, pro Phase
- **Rechnungen → Übersicht** — offene Beträge, bezahlt, Mahnungen
- **Buchhaltung → Erfolgsrechnung** — Einnahmen vs. Ausgaben
- **Mitarbeiter → Lohnabrechnung** — monatlich
## Tipps aus dem Alltag
- **Zeit jeden Tag erfassen** statt rückwirkend — sonst gehen Details verloren
- **Akonto regelmässig** statt einmal am Schluss — Liquidität
- **Backups** vor Jahresabschluss — siehe [Datenhaltung](../datenhaltung)
- **Briefbogen-Logo** in hoher Auflösung — sieht im PDF besser aus
+114
View File
@@ -0,0 +1,114 @@
---
title: Changelog
linkTitle: Changelog
weight: 9
toc: true
---
Versionsgeschichte von RAPPORT. Aktuelle Releases: [Gitea](https://git.kgva.ch/karim/RAPPORT/releases).
## 0.8.3 — Aktuelle Version <span class="rapport-status new">Aktuell</span>
Veröffentlicht am 2026-05-24.
**Neu / Verbessert**
- Diverse Verbesserungen und Bugfixes (Details werden im [Release auf Gitea](https://git.kgva.ch/karim/RAPPORT/releases/tag/0.8.3) gepflegt)
**Bekannte Einschränkungen**
- Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe [Installation § Gatekeeper](../installation#3--erster-start-macos-gatekeeper)
- Linux- und Windows-Builds noch nicht verfügbar
## 0.8.00.8.2 — Patch-Releases
Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe [Releases auf Gitea](https://git.kgva.ch/karim/RAPPORT/releases).
## 0.7.0 — Auto-Updater & System-Tray
**Neu**
- **Auto-Updater** — Rapport prüft beim Start auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden. ([Doku](../../features/auto-updater))
- **System-Tray** — Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter, Cmd+Q beendet die App vollständig. ([Doku](../../features/system-tray))
- **Quick-Open** der letzten 5 Projekte direkt aus dem Tray-Menü
**Verbessert**
- Schnellerer App-Start durch lazy-geladene Views
- Klarere Statusbadges in der Projekt-Übersicht
## 0.6.x — Spesen & Buchhaltung
**Neu**
- Spesenerfassung mit Beleg-Upload (Base64 in localStorage)
- Jahresbudget mit Einnahmen-/Ausgaben-Übersicht
- Vereinfachte Erfolgsrechnung pro Geschäftsjahr
**Verbessert**
- Lohnabrechnung integriert Spesen-Erstattungen
- CSV-Export aus der Zeiterfassung
## 0.5.x — Mitarbeiter & Lohn
**Neu**
- Mitarbeiterverwaltung mit Pensum, Stundensatz, Ferienanspruch
- Lohnabrechnung mit AHV/IV/EO, ALV, BVG, NBU
- Jahresabschluss mit Überstundenausgleich
- Ferien-Prorata bei Eintritt unter Jahr
## 0.4.x — Projekte & SIA 102
**Neu**
- Projektverwaltung nach SIA 102
- Vorgeschlagene Phasen-Anteile am Gesamthonorar
- Bauschätzwert-basiertes Honorar
**Verbessert**
- Zeit-Auswertung pro SIA-Phase
- Akonto- und Schlussrechnungen mit automatischer Differenzberechnung
## 0.3.x — Rechnungen & QR
**Neu**
- Rechnungsmodul mit QR-Einzahlungsschein (via `swissqrbill`)
- Akonto-, Teil- und Schlussrechnungen
- PDF-Export mit Bürobriefbogen
- Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung
## 0.2.x — Zeiterfassung
**Neu**
- Wochenraster mit Halbstunden-Slots
- Drag & Drop zur Slot-Erfassung
- Projekt-Zuweisung pro Eintrag
- Auswertungen pro Mitarbeiter und Projekt
## 0.1.x — Initial
**Neu**
- Erste Setup-Routine (Bürodaten, Mitarbeiter, Kunden)
- Briefe und Lieferscheine
- Tauri-2-Bundle für macOS
---
## Roadmap
Geplant — keine konkreten Termine:
- **Linux-Build** (Tauri 2 unterstützt es, Bedarf nötig)
- **Windows-Build** (analog)
- **Cloud-Modus** Stable (Supabase) — derzeit in [Web-Modus](../web-modus) verfügbar, aber experimentell
- **Französische / Italienische Übersetzung**
- **PostgreSQL-Migration** aus localStorage (Knopf in der App)
- **Mobile App** (iOS Companion zur Zeiterfassung) — offen
Wünsche oder Prioritäten → [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues).
+148
View File
@@ -0,0 +1,148 @@
---
title: Datenhaltung & Backup
linkTitle: Datenhaltung
weight: 5
toc: true
---
Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.
> **Diese Seite beschreibt die Desktop-App (Single-User).** Wer im Team arbeitet und Rapport gegen einen [Rapport Server](../../server/) betreibt, sichert stattdessen die Postgres-Datenbank — siehe [Rapport Server § Backup](../../server/#backup).
## Speicherort (Desktop-App)
Die Desktop-App speichert **alles lokal** — keine Cloud, kein Server.
### macOS
```text
~/Library/Application Support/com.rapport.app/
```
Dort liegt eine einzelne **`localStorage`**-Datenbank des WebView, in der **alle** Rapport-Daten als JSON unter dem Key `studio_data_v1` gespeichert sind:
- Bürodaten, Logo, IBAN
- Mitarbeiter, Kunden, Projekte, Offerten
- Zeit-Einträge, Rechnungen
- Spesen, Lohnabrechnungen, Protokolle
- App-Einstellungen
> **Konsequenz:** Wer den Application-Support-Ordner kopiert, hat ein vollständiges Backup. Wer ihn löscht, verliert alle Daten.
### Warum localStorage?
In der Desktop-App ist Rapport eine **Single-User-Anwendung**. localStorage ist dafür:
- **Schnell** — keine Datenbank-Roundtrips
- **Einfach** — keine Migration nötig, JSON-Schema im Code
- **Portabel** — eine Datei → ein Backup
Für **Multi-User-Betrieb** existiert [Rapport Server](../../server/) — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.
## Backup-Strategien
### A · Einfach (manuell)
Den ganzen Ordner kopieren:
```bash
cp -R "~/Library/Application Support/com.rapport.app" \
"~/Documents/Rapport-Backup-$(date +%Y%m%d)"
```
→ Auf USB-Stick, externen Datenträger oder in die Cloud.
### B · Time Machine
Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.
> **Einschränkung:** Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.
### C · Cron-Job (täglich automatisch)
```bash
# In ~/Library/LaunchAgents/com.rapport.backup.plist hinterlegen
# oder als crontab-Eintrag:
0 22 * * * rsync -a "$HOME/Library/Application Support/com.rapport.app/" \
"$HOME/Backups/rapport/$(date +\%Y\%m\%d)/"
```
### D · iCloud Drive (off-site)
Application-Support liegt **nicht** automatisch in iCloud. Wer das will:
```bash
# Symlink anlegen
mkdir -p "~/iCloud Drive/Rapport"
ln -s "~/Library/Application Support/com.rapport.app" "~/iCloud Drive/Rapport/data"
```
> **Achtung:** iCloud-Sync mit aktiver App kann zu **Race-Conditions** führen. Besser den Sync zeitversetzt (z. B. nachts via Cron).
## Wiederherstellung
### Vollständig (Rapport komplett tot)
1. Rapport beenden (Cmd+Q, nicht nur Fenster zu)
2. Aktuellen Ordner umbenennen (falls noch da):
```bash
mv "~/Library/Application Support/com.rapport.app" \
"~/Library/Application Support/com.rapport.app.bak"
```
3. Backup-Ordner zurück kopieren:
```bash
cp -R "~/Documents/Rapport-Backup-20260523" \
"~/Library/Application Support/com.rapport.app"
```
4. Rapport starten
### Selektiv (nur einzelne Daten)
Da alle Daten in **einem JSON unter `studio_data_v1`** liegen, ist selektive Wiederherstellung **manuell**:
1. Backup-`localStorage`-Datei öffnen (WebKit-Format → mit Tool wie [WebKit Storage Inspector] lesen, oder via Rapport DevTools)
2. Gewünschte Felder in die aktuelle Instanz übertragen
In der Praxis: meistens lohnt sich die **vollständige** Wiederherstellung mehr.
## Export-Funktionen (in der App)
Aus Rapport selbst:
| Was | Wo | Format |
|---|---|---|
| **Zeit-Auswertung** | Zeit → Export | CSV |
| **Rechnung** | Rechnung → PDF | PDF (inkl. QR) |
| **Offerte** | Offerte → PDF | PDF |
| **Lohnabrechnung** | Mitarbeiter → PDF | PDF |
| **Jahres-Buchhaltung** | Buchhaltung → Export | CSV |
Die Exports sind für externe Verwendung (Buchhalter, Treuhänder, Archiv) gedacht — kein Full-Backup.
## Schema-Migrationen
Bei Updates kann sich das Datenformat ändern. Rapport hat einen **Migrations-Mechanismus**: beim Start prüft die App, ob das gespeicherte Format dem aktuellen entspricht, und migriert es automatisch.
Code: [src/storage/migrations.js](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js).
> **Empfehlung:** Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.
## Was wird **nicht** gespeichert?
- **WebView-Cache** — `~/Library/Caches/com.rapport.app/` und `~/Library/WebKit/com.rapport.app/` sind sicher zu löschen (UI-Caches, regenerieren sich)
- **App-Updates** — werden bei Bedarf erneut runtergeladen
- **Logs** — `~/Library/Logs/com.rapport.app/` (geplant, derzeit nicht geschrieben)
## Datenmenge
Typische Grössen pro Bürojahr:
| Inhalt | Grösse |
|---|---|
| Logo (PNG/SVG) | 50 KB 1 MB |
| 1 Jahr Zeiterfassung (1 MA) | ~ 80 KB |
| 1 Jahr Zeiterfassung (5 MA) | ~ 400 KB |
| 50 Projekte mit je 5 Rechnungen | ~ 800 KB |
| **Total typisches Solo-Büro / Jahr** | **~ 12 MB** |
localStorage hat Limits (i. d. R. ~10 MB pro Origin). Für Solo-Büros reicht das problemlos für viele Jahre. Wer das Limit erreicht oder im Team arbeitet → [Rapport Server](../../server/).
+111
View File
@@ -0,0 +1,111 @@
---
title: Einrichtung
linkTitle: Einrichtung
weight: 3
toc: true
---
Nach der [Installation](../installation): Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.
## Reihenfolge
Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:
```text
1. Bürodaten → 2. Mitarbeiter → 3. Kunden → 4. Projekte
▼ ▼ ▼ ▼
Briefbogen, Zeiterfassung, Adressen, Zeiterfassung,
QR-Schein, Lohn Rechnungen Rechnungen
Login
```
## 1 · Bürodaten
**Einstellungen → Bürodaten**
| Feld | Beschreibung | Verwendung |
|---|---|---|
| **Name** | Bürobezeichnung | Briefbogen, Login-Screen |
| **Adresse** | Strasse, PLZ, Ort | Briefbogen, QR-Rechnung (Empfänger) |
| **Telefon, E-Mail** | Kontaktdaten | Briefbogen, Rechnung-Footer |
| **IBAN** | CH-IBAN (Format `CH XX XXXX …`) | **QR-Einzahlungsschein** — Pflicht |
| **Logo** | PNG/SVG-Upload | Briefbogen, Rechnung, Brief |
| **MwSt.-Nr.** | optional | Rechnung-Footer |
> **Tipp:** Das Logo wird hochauflösend gespeichert (Base64 im localStorage). Bei sehr grossen Dateien (>1 MB) vorher in Vorschau verkleinern.
## 2 · Mitarbeiter
**Einstellungen → Mitarbeiter → Neu**
| Feld | Beschreibung |
|---|---|
| **Name, Vorname** | wird in Zeiterfassung & Lohn verwendet |
| **Initialen** | Kürzel für Auswertungen (z. B. "KGE") |
| **Eintrittsdatum** | für **Prorata** der Ferien |
| **Pensum (%)** | 100 = Vollzeit |
| **Stundensatz (CHF)** | für Stundensatz-Rechnungen |
| **Ferienanspruch (Tage/Jahr)** | i. d. R. 2530 |
| **Lohn (brutto, monatlich)** | optional, für Lohnabrechnung |
Mindestens **ein Mitarbeiter** (z. B. der Inhaber selbst) muss angelegt sein, sonst lässt sich keine Zeit erfassen.
### Sozialabzüge (optional)
In Einstellungen → Lohn:
| Abzug | Standardwert (CH) |
|---|---|
| AHV / IV / EO | 5,3 % |
| ALV | 1,1 % |
| BVG (Pensionskasse) | variabel — je Mitarbeiter |
| NBU | je nach Versicherung |
Die Standardsätze sind hinterlegt, können aber überschrieben werden.
## 3 · Kunden
**Kunden → Neu**
| Feld | Beschreibung |
|---|---|
| **Typ** | Privatperson / Firma |
| **Anrede, Name** | für Brief / Rechnung |
| **Adresse** | Strasse, PLZ, Ort, Land |
| **Ansprechperson** | bei Firmen |
| **Telefon, E-Mail** | Kontakt |
| **Honorartyp Default** | Stundensatz / SIA / Pauschal |
| **Stundensatz** | falls vom Bürostandard abweichend |
| **MwSt.-pflichtig** | ja/nein |
## 4 · Projekte
**Projekte → Neu**
| Feld | Beschreibung |
|---|---|
| **Projekt-Nr.** | freie Form, oder generiert (`2026-001`) |
| **Bezeichnung** | Kurztitel |
| **Standort** | Adresse |
| **Kunde** | aus Kundendatenbank |
| **Bauschätzwert** | für SIA-Phasen-Honorar |
| **SIA-Phasen** | Vorprojekt / Bauprojekt / … — alle anwählbar |
| **Honorartyp** | Stundensatz / SIA 102 / Pauschal |
| **Status** | aktiv / pausiert / abgeschlossen |
### SIA-102-Phasen
Wenn als Honorartyp **SIA 102** gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe [Projekt-Feature](../../features/projekte#sia-102).
## Checkliste
Nach diesen vier Schritten ist Rapport einsatzbereit:
- [ ] Bürodaten inkl. IBAN erfasst
- [ ] Mindestens ein Mitarbeiter angelegt
- [ ] Erster Kunde angelegt
- [ ] Erstes Projekt angelegt
- [ ] Eine Test-Zeitbuchung erfasst — wird das Projekt korrekt zugewiesen?
- [ ] Eine Test-Rechnung erstellt — kommt der QR-Schein sauber raus?
Wenn alles funktioniert: [Typischer Arbeitsablauf](../arbeitsablauf).
+146
View File
@@ -0,0 +1,146 @@
---
title: Entwicklung & Build
linkTitle: Entwicklung
weight: 7
toc: true
---
Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.
## Voraussetzungen
| Tool | Version |
|---|---|
| **Node.js** | ≥ 20 (für Vite 8) |
| **npm** | ≥ 10 |
| **Rust toolchain** | ≥ 1.77.2 (via `rustup`) |
| **Plattform-Tools** | siehe [Tauri Prerequisites](https://v2.tauri.app/start/prerequisites/) |
Plattform-spezifisch:
- **macOS:** Xcode Command Line Tools (`xcode-select --install`)
- **Windows:** Microsoft C++ Build Tools + WebView2
- **Linux:** `webkit2gtk-4.1`, `librsvg2-dev`, `libayatana-appindicator3-dev`, `build-essential`
## Setup
```bash
git clone https://git.kgva.ch/karim/RAPPORT.git
cd RAPPORT/APP
npm install
```
## Entwicklung
### Web-Modus (HMR, schnellster Loop)
```bash
npm run dev # http://localhost:3000
```
- Hot-Module-Replacement
- Schnellster Iteration-Loop für UI-Arbeit
- Datenpersistierung: Browser-localStorage
### Native Window (Tauri-Fenster mit Desktop-Integration)
```bash
npx tauri dev
```
- Echtes Tauri-Fenster
- System-Tray, Updater, native APIs verfügbar
- Erster Start dauert lange (Rust-Compile)
## Architektur in einem Absatz
> RAPPORT ist eine monolithische SPA: ein React-Root in [App.jsx](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/App.jsx) hält den **gesamten** App-State in einem `useState({...})`, persistiert ihn synchron in `localStorage` unter `studio_data_v1`, und übergibt ihn als Props an lazy-geladene Views. **Kein Routing-Framework**, **kein State-Library**, **kein TypeScript**, **kein CSS-Framework**. Der **Rust-Teil** ist 109 Zeilen und macht nur drei Dinge: System-Tray, Window-Hide-on-Close, Plugin-Registrierung (Updater, Process, Log). **Keine** `#[tauri::command]` — Frontend ↔ Backend kommuniziert nur über das Event `rapport:navigate` (Tray → Frontend).
Detaillierte Karte: [ARCHITECTURE.md](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/ARCHITECTURE.md).
## Verzeichnis-Karte
```text
APP/
├── src/ React 19 (kein TS, nur .jsx)
│ ├── App.jsx Root: State, Navigation, Sidebar, Modals
│ ├── constants.js STORAGE_KEY, NAV_ITEMS, defaultData, SIA-Phasen
│ ├── utils.js Business-Logik: Kalkulation, QR-Bill, CSV, Lohn
│ ├── storage/adapter.js LocalStorageAdapter (Phase 1), SupabaseAdapter (Phase 2)
│ ├── storage/migrations.js Schema-Migrationen
│ ├── views/ 20 Top-Level-Screens, lazy-geladen
│ ├── components/UI.jsx StatusBadge, Modal, FormField, …
│ ├── components/Update* Auto-Update-UI
│ ├── print/ PrintComponents.jsx — alle Druckansichten
│ └── utils/updater.js @tauri-apps/plugin-updater Wrapper
├── supabase/migrations/ Postgres-Schema für Cloud-Variante
├── src-tauri/ Rust-Backend (Tauri 2.10.3)
│ ├── src/lib.rs ~103 Z. — Tray, Window-Events, Plugins
│ ├── tauri.conf.json Updater-URL, Public-Key, CSP, Bundle-Targets
│ └── capabilities/ Tauri Permissions
├── scripts/release.sh Build + Sign + latest.json erzeugen
├── latest.json Updater-Manifest
└── deploy/ Docker-Compose für Web-Modus
```
## Konventionen
- **JavaScript** statt TypeScript — bewusste Entscheidung für Solo-Dev-Velocity
- **Inline-Styles** statt CSS-Framework
- **kein Routing-Framework** — `view`-State in App.jsx triggert Komponente
- **JSON-Schema implizit** — definiert durch `defaultData` in `constants.js`
- **Migrationen** als reine Funktionen in [storage/migrations.js](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js)
## Build
### Desktop (Tauri DMG)
```bash
npm run build # erst Vite-Build (dist/)
npx tauri build # dann Tauri-Bundle (DMG)
```
Output: `src-tauri/target/release/bundle/dmg/Rapport_<version>_aarch64.dmg`
### Web (statisches Bundle)
```bash
npm run build # Output: dist/ (~500 KB)
```
Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe [Web-Modus](../web-modus).
## Release-Workflow
```bash
# 1 · Version bumpen in package.json + Cargo.toml + tauri.conf.json
./scripts/release.sh 0.7.1
# 2 · Build mit Signatur
TAURI_SIGNING_PRIVATE_KEY=$(cat ~/.tauri/rapport-key) \
TAURI_SIGNING_PRIVATE_KEY_PASSWORD=\
npx tauri build
# 3 · latest.json aktualisieren mit neuer Signatur
# 4 · DMG + latest.json auf Gitea Releases hochladen
```
## Beitragen
[Issues & Pull Requests](https://git.kgva.ch/karim/RAPPORT) sind willkommen. Wertvoll sind:
- **Bug-Reports** mit Reproduktionsschritten
- **Workflow-Verbesserungen** aus dem realen Büroalltag
- **Vorlagen** (Briefe, Protokolle, Lieferscheine) für andere Büros
- **Übersetzungen / Internationalisierung** (FR, IT)
- **Linux-/Windows-Builds** und plattformspezifische Fixes
Vor grösseren Änderungen → Issue zum Diskutieren.
## Lizenz
**GNU AGPL-3.0-or-later** — eigene Builds erlaubt, Modifikationen müssen unter derselben Lizenz veröffentlicht werden, wenn die Software als Service angeboten wird.
+62
View File
@@ -0,0 +1,62 @@
---
title: Erste Schritte
linkTitle: Erste Schritte
weight: 1
toc: true
---
Von der Installation bis zur ersten Rechnung — in sechs Schritten.
## 01 · Installation
DMG von [Gitea Releases](https://git.kgva.ch/karim/RAPPORT/releases) herunterladen. Rapport in den **Programme-Ordner** ziehen. Beim ersten Start: *Systemeinstellungen → Datenschutz & Sicherheit* öffnen und Rapport zulassen.
Die Pre-Release-Builds sind **signiert über Tauri**, aber (noch) nicht über die Apple-Notarisierung gegangen — daher der manuelle Freigabe-Schritt.
## 02 · Einrichtung
In den **Einstellungen** hinterlegen:
- **Bürodaten** — Name, Adresse, IBAN, Logo
- **Mitarbeiter** — Namen, Pensum, Stundensatz, Ferienanspruch
- **Kunden** — Adresse, Ansprechperson, Honorartyp
- **Projekte** — SIA-102-Phasen, Budget, Beteiligte
Danach ist die Zeiterfassung bereit.
## 03 · Zeiterfassung
Im Modul **Zeit**:
1. Mitarbeiter wählen
2. Woche navigieren
3. Stunden per **Klick** oder **Drag** erfassen
4. Jedem Eintrag ein Projekt zuweisen
Auswertungen pro Mitarbeiter und pro Projekt sind unter *Zeit → Auswertungen* abrufbar. Halbe Tage und Mehrfacheinträge pro Slot werden unterstützt.
## 04 · Rechnungen
Aus einer **Offerte** oder **direkt** erstellen:
- SIA-Phasen, Stundensatz oder Pauschal wählen
- Akonto-, Teil- oder Schlussrechnung
- Mit *PDF exportieren* wird die fertige Rechnung inkl. **QR-Einzahlungsschein** generiert
Offerten lassen sich nahtlos in Projekte und Rechnungen konvertieren.
## 05 · Backup
In der Desktop-App liegen alle Daten als **JSON** im Applikationsordner:
```text
~/Library/Application Support/com.rapport.app/
```
Für ein Backup reicht es, diesen Ordner zu kopieren — z. B. auf einen externen Datenträger oder in die Cloud. Empfohlen: regelmässig (wöchentlich oder via Time Machine). Im Server-Modus läuft das Backup über Postgres-Dumps — siehe [Rapport Server § Backup](../../server/#backup).
## 06 · Probleme melden
Ein [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues) erstellen — mit kurzer Beschreibung, was passiert ist. **Screenshots helfen.** Bitte die Rapport-Version (links unten in der App) angeben.
> **Tipp:** Wenn die App nicht mehr startet, hilft oft, den Cache-Ordner zu sichern und neu zu starten. Die JSON-Daten selbst bleiben unverändert.
+94
View File
@@ -0,0 +1,94 @@
---
title: Installation
linkTitle: Installation
weight: 2
toc: true
---
Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.
## Voraussetzungen
| Plattform | Status | Versionen |
|---|---|---|
| **macOS** Apple Silicon (M1 M4) | ✅ Unterstützt | macOS 12+ |
| **macOS** Intel | ⚠ Build auf Anfrage | macOS 12+ |
| **Linux** | 🕐 Geplant | — |
| **Windows** | 🕐 Geplant | — |
Eine Portierung auf Linux und Windows ist mit Tauri 2 möglich. [Issue erstellen](https://git.kgva.ch/karim/RAPPORT/issues/new), wenn du eine Plattform brauchst.
## 1 · Download
Aktueller Build: [Downloads-Seite](../../downloads) oder direkt [Releases auf Gitea](https://git.kgva.ch/karim/RAPPORT/releases).
| Datei | Plattform |
|---|---|
| `RAPPORT_<version>_aarch64.dmg` | macOS Apple Silicon |
| `RAPPORT_<version>_x86_64.dmg` | macOS Intel (auf Anfrage) |
## 2 · DMG öffnen & installieren
1. DMG doppelklicken
2. Rapport.app in den **Applications**-Ordner ziehen
3. DMG auswerfen
## 3 · Erster Start (macOS Gatekeeper)
Beim ersten Start verweigert macOS den Start, weil die Pre-Release-Builds **Tauri-signiert**, aber (noch) **nicht Apple-notarisiert** sind.
### Lösung
1. **Systemeinstellungen → Datenschutz & Sicherheit** öffnen
2. Bis ganz nach unten scrollen — es erscheint:
> "Rapport" wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.
3. Auf **"Trotzdem öffnen"** klicken
4. Bestätigen
Ab dem zweiten Start läuft Rapport ohne Rückfragen.
### Alternative (Terminal)
Falls der GUI-Weg nicht funktioniert:
```bash
xattr -d com.apple.quarantine /Applications/Rapport.app
```
Das entfernt das Quarantäne-Flag und macOS akzeptiert den Start.
## 4 · Erstes Setup
Beim ersten Start zeigt Rapport den **Setup-Bildschirm**. Hier werden die Stammdaten erfasst — siehe [Einrichtung](../einrichtung).
## 5 · Update-Strategie
Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe [Auto-Updater](../../features/auto-updater)). Updates können in den Einstellungen deaktiviert werden.
Manuelle Updates: einfach das neuere DMG installieren — die Daten bleiben erhalten, da sie unabhängig von der App liegen (siehe [Datenhaltung](../datenhaltung)).
## Deinstallation
```bash
# App entfernen
rm -rf /Applications/Rapport.app
# Daten entfernen (optional!)
rm -rf "~/Library/Application Support/com.rapport.app"
# Caches
rm -rf "~/Library/Caches/com.rapport.app"
rm -rf "~/Library/WebKit/com.rapport.app"
```
> **Achtung:** Schritt 2 löscht **alle Rapport-Daten unwiederbringlich**. Vorher Backup machen — siehe [Datenhaltung](../datenhaltung).
## Bekannte Probleme
| Problem | Lösung |
|---|---|
| App lässt sich nicht öffnen trotz Freigabe | Terminal-Variante mit `xattr` |
| "Rapport is damaged" | DMG erneut von Gitea ziehen (Browser-Cache hat evtl. Müll) |
| Schwarzer Bildschirm beim Start | `~/Library/WebKit/com.rapport.app` löschen, neu starten |
Mehr unter [Troubleshooting](../troubleshooting).
+203
View File
@@ -0,0 +1,203 @@
---
title: Troubleshooting
linkTitle: Troubleshooting
weight: 8
toc: true
---
Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues).
## App startet nicht
### "Rapport ist beschädigt" beim ersten Start
**Ursache:** macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.
**Lösung:** siehe [Installation § 3](../installation#3--erster-start-macos-gatekeeper). Kurz:
```bash
xattr -d com.apple.quarantine /Applications/Rapport.app
```
### App startet, zeigt aber schwarzen Bildschirm
**Ursache:** WebView-Cache korrupt.
**Lösung:**
```bash
rm -rf "~/Library/Caches/com.rapport.app"
rm -rf "~/Library/WebKit/com.rapport.app"
```
App neu starten. Daten gehen dabei **nicht** verloren (liegen in `Application Support`, nicht im Cache).
### App stürzt sofort beim Start ab
**Ursache:** wahrscheinlich beschädigte JSON-Daten in `studio_data_v1`.
**Diagnose:**
```bash
# Daten ansehen (DevTools-Output)
open "~/Library/Application Support/com.rapport.app"
```
**Lösung:**
1. Backup wiederherstellen (siehe [Datenhaltung](../datenhaltung#wiederherstellung))
2. **Oder** als letzter Ausweg: Daten zurücksetzen
```bash
mv "~/Library/Application Support/com.rapport.app" \
"~/Library/Application Support/com.rapport.app.bad"
```
App neu starten → erstellt frische Daten. Anschliessend Setup-Screen.
## Daten weg
### Nach einem App-Update fehlen Einträge
**Ursache:** mögliche fehlgeschlagene Migration.
**Sofortmassnahme:**
1. Rapport **beenden** (Cmd+Q, nicht nur Fenster zu)
2. **Aktuelles Datenverzeichnis sichern**:
```bash
cp -R "~/Library/Application Support/com.rapport.app" \
"~/Documents/Rapport-Notfall-$(date +%Y%m%d-%H%M)"
```
3. [Issue erstellen](https://git.kgva.ch/karim/RAPPORT/issues/new) mit:
- Version vor dem Update (falls bekannt)
- Version nach dem Update
- Was fehlt
- Optional: gesicherter Datenordner (via Pastebin oder verschlüsselt zugesandt)
### localStorage voll
**Symptom:** Rapport schreibt Fehler-Toast "Speicher voll" beim Sichern.
**Ursache:** macOS WebView limitiert localStorage auf ~10 MB pro Origin.
**Lösung:**
- Sehr grosse Logos durch kleinere ersetzen (Bürodaten → Logo)
- Belege (Spesen) selektiv löschen oder als externe Datei archivieren
- Auf [Web-Modus](../web-modus) wechseln (Postgres ohne praktisches Limit)
## Updates
### Auto-Update findet nichts
**Diagnose:**
```bash
curl -s https://git.kgva.ch/karim/RAPPORT/raw/branch/main/APP/latest.json
```
→ sollte JSON liefern. Wenn nicht: Server-/Netzwerkproblem.
### Update lädt, lässt sich aber nicht installieren
**Ursache:** Signaturprüfung scheitert (Public-Key in App ≠ Signatur in `latest.json`).
**Lösung:** Manuelles Update — DMG direkt von [Releases](https://git.kgva.ch/karim/RAPPORT/releases) laden und installieren. Daten bleiben erhalten.
### "Diese Version überspringen" rückgängig machen
In **Einstellungen → Updates** → *Übersprungene Versionen zurücksetzen*. Beim nächsten Start wird die Version wieder angeboten.
## PDF / QR-Schein
### QR-Schein hat falsche Daten
**Diagnose-Checkliste:**
- [ ] IBAN korrekt? (CH, 21 Zeichen, keine Leerzeichen)
- [ ] Empfänger-Adresse vollständig? (PLZ und Ort beide gefüllt)
- [ ] Schuldner-Adresse vollständig?
- [ ] Betrag > 0?
- [ ] Referenz nicht zu lang? (max 27 Zeichen)
QR-Bibliothek: [`swissqrbill`](https://github.com/schoero/SwissQRBill) — bei merkwürdigen Fehlern dort nachschauen.
### PDF-Export ist leer / weisses Blatt
**Ursache:** Print-View hat keine Daten (möglicherweise Race-Condition beim Laden).
**Lösung:** Rechnung schliessen, erneut öffnen, dann PDF.
### PDF-Schrift sieht falsch aus
**Ursache:** Web-Schrift nicht geladen, Fallback greift.
**Lösung:** Vor dem Drucken warten, bis das Vorschau-Bild komplett geladen ist (35 Sek).
## System-Tray
### Tray-Icon erscheint nicht
**Plattform-Hinweis:** Tray-Icons unter macOS sind bei extrem voller Menüleiste oder unter "Bartender"/"Hidden Bar" eventuell unsichtbar.
**Diagnose:**
```bash
ps aux | grep -i rapport
```
→ wenn Prozess läuft, aber kein Icon: in den Tray-Manager-Apps prüfen.
**Konfiguration:** Einstellungen → System-Tray → *Tray-Icon ausblenden* (aus → Icon erzwingen).
### Tray-Menü reagiert nicht / hängt
**Lösung:** App via *Activity Monitor* hart beenden und neu starten. Daten gehen nicht verloren (alle Schreibungen sind synchron in localStorage).
## Web-Modus
### Login-Screen zeigt keine Server-URL
**Ursache:** `.env.production` enthielt nicht den richtigen `VITE_SUPABASE_URL` zur Build-Zeit.
**Lösung:** `.env.production` prüfen, dann `npm run build` neu, Container restart.
### Realtime-Updates kommen nicht an
**Ursache:** Websocket-Support fehlt im Reverse Proxy.
**Lösung:** In Nginx Proxy Manager für `api.*` Websocket Support aktivieren.
Siehe [Web-Modus § Troubleshooting](../web-modus#troubleshooting).
## Debug-Informationen sammeln
Bei einem Issue helfen folgende Infos:
```bash
# Rapport-Version
defaults read /Applications/Rapport.app/Contents/Info.plist CFBundleShortVersionString
# macOS-Version
sw_vers
# Architektur
uname -m
# Datenverzeichnis-Grösse
du -sh "~/Library/Application Support/com.rapport.app"
# Cache-Verzeichnis-Grösse
du -sh "~/Library/Caches/com.rapport.app"
```
→ Bei Issue mit anhängen.
## Wenn nichts hilft
[Neues Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues/new) mit:
- Was du gemacht hast
- Was passiert ist
- Was du erwartet hättest
- Screenshots (auch von DevTools-Konsole falls möglich)
- Rapport-Version und macOS-Version
+53
View File
@@ -0,0 +1,53 @@
---
title: Web-Modus (Multi-User)
linkTitle: Web-Modus
weight: 6
toc: true
---
> **Hinweis:** Der frühere Supabase-basierte Web-Modus wurde durch **[Rapport Server](../../server/)** abgelöst — den vollständigen Selfhost-Stack mit eigenem Postgres, Auth, Realtime und Storage. Keine externe Cloud-Abhängigkeit mehr.
>
> Diese Seite bleibt als Referenz erhalten, der **empfohlene Weg** für Multi-User-Setups ist **[Rapport Server](../../server/)**.
## Wann brauchst du das?
| Anwendungsfall | Empfehlung |
|---|---|
| **Solo-Büro, ein Mac** | Desktop-App — siehe [Installation](../installation) |
| **25 Personen, gleicher Standort** | [Rapport Server](../../server/) auf einem Mac Mini im LAN |
| **Verteiltes Team / Home-Office** | [Rapport Server](../../server/) mit SSL + Reverse Proxy |
| **Hosted Backend (eigener VPS)** | [Rapport Server](../../server/) auf Linux-VPS |
## Architektur (Kurzfassung)
```text
┌────────────┐ HTTPS ┌──────────────┐ SQL ┌────────────┐
│ Browser │ ──────────────│ nginx │ ─────────────│ Postgres │
│ / Desktop │ │ (Frontend) │ │ + GoTrue │
└────────────┘ └──────────────┘ │ + REST │
│ + Realtime │
│ + Storage │
└────────────┘
```
- **Frontend:** dieselbe React-App, aber Vite-Build statt Tauri (`npm run build`)
- **Backend:** Postgres-Stack ([Rapport Server](../../server/))
- **Auth:** E-Mail / Passwort über GoTrue
- **Storage:** Belege, Logos in Object-Storage
## Setup
Alle Setup-Schritte (Repo klonen, `.env` erstellen, Migrations syncen, Docker-Compose starten, Reverse-Proxy konfigurieren) sind in **[Rapport Server](../../server/)** dokumentiert.
## Migration Desktop → Cloud
Wer mit der Desktop-App startet und später auf den Web-Modus wechseln möchte:
- **Aktuell:** manueller Export aus Rapport (CSV/PDF) und manuelles Wiederanlegen im neuen Setup
- **Geplant:** *"localStorage → Postgres"*-Import-Knopf direkt in der App
Status: [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues).
## Troubleshooting
Siehe [Rapport Server § Troubleshooting](../../server/) oder [allgemeine Troubleshooting-Seite](../troubleshooting).