diff --git a/content/hosting-preise.md b/content/hosting-preise.md new file mode 100644 index 0000000..2315884 --- /dev/null +++ b/content/hosting-preise.md @@ -0,0 +1,6 @@ +--- +title: Hosting-Preise +layout: hosting +hostingpage: preise +toc: false +--- diff --git a/content/hosting/_index.md b/content/hosting/_index.md new file mode 100644 index 0000000..407f104 --- /dev/null +++ b/content/hosting/_index.md @@ -0,0 +1,85 @@ +--- +title: Hosting +layout: hextra-home +toc: false +--- + +{{< hextra/hero-badge >}} +
+ Gehostet in der Schweiz · Ohne eigenen Server +{{< /hextra/hero-badge >}} + +
+
+
RAPPORT
+
Hosting
+
+
+ +
+{{< hextra/hero-subtitle >}} + Ihre eigene Rapport-Instanz — in Minuten startklar. Studio-Management für Architekturbüros, gehostet, gewartet und gesichert. Sie arbeiten, wir kümmern uns um den Rest. +{{< /hextra/hero-subtitle >}} +
+ +
+ Jetzt starten + Preise ansehen ↗ +
+ +
+ Schweizer Hosting + Tägliche Backups + Jederzeit kündbar + Keine Installation +
+ +
+

SO EINFACH

+

Registrieren, Abo wählen, loslegen

+

Keine Server-Administration, keine Updates, keine Sorgen um Backups. Sie bekommen eine fertige Rapport-Instanz mit eigener Adresse — wir betreiben sie für Sie in der Schweiz.

+
+ +{{< hextra/feature-grid >}} + + {{< hextra/feature-card + title="In Minuten startklar" + subtitle="Konto erstellen, Abo wählen, fertig. Ihre Instanz wird automatisch eingerichtet — keine Installation, keine Technik." + style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.10),hsla(0,0%,100%,0));" + >}} + + {{< hextra/feature-card + title="Schweizer Hosting" + subtitle="Ihre Daten bleiben in der Schweiz. Tägliche Backups, sichere Infrastruktur — ohne dass Sie sich darum kümmern müssen." + style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.08),hsla(0,0%,100%,0));" + >}} + + {{< hextra/feature-card + title="Voller Funktionsumfang" + subtitle="Zeiterfassung, Rechnungen mit QR-Einzahlungsschein, Offerten, Projekte nach SIA 102, Mitarbeiter — alles in einer App." + style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.12),hsla(0,0%,100%,0));" + >}} + + {{< hextra/feature-card + title="Immer aktuell" + subtitle="Updates und Wartung übernehmen wir. Sie arbeiten immer mit der neuesten Version, ganz ohne Aufwand." + style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.10),hsla(0,0%,100%,0));" + >}} + + {{< hextra/feature-card + title="Faire Preise" + subtitle="Transparente Abos ab CHF 19/Monat. Monatlich kündbar, keine versteckten Kosten, keine Einrichtungsgebühr." + style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.08),hsla(0,0%,100%,0));" + >}} + + {{< hextra/feature-card + title="Kein Lock-in" + subtitle="Rapport ist Open Source (AGPL). Hosting nimmt Ihnen nur die Technik ab — Sie können jederzeit zum Selbstbetrieb wechseln." + style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.12),hsla(0,0%,100%,0));" + >}} + +{{< /hextra/feature-grid >}} + +
+ Kostenlos registrieren +
diff --git a/content/konto.md b/content/konto.md new file mode 100644 index 0000000..f200abb --- /dev/null +++ b/content/konto.md @@ -0,0 +1,6 @@ +--- +title: Konto +layout: hosting +hostingpage: konto +toc: false +--- diff --git a/content/login.md b/content/login.md new file mode 100644 index 0000000..0c38340 --- /dev/null +++ b/content/login.md @@ -0,0 +1,6 @@ +--- +title: Anmelden +layout: hosting +hostingpage: login +toc: false +--- diff --git a/content/register.md b/content/register.md new file mode 100644 index 0000000..5e6a148 --- /dev/null +++ b/content/register.md @@ -0,0 +1,6 @@ +--- +title: Registrieren +layout: hosting +hostingpage: register +toc: false +--- diff --git a/hugo.yaml b/hugo.yaml index b716a03..42ef925 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -50,10 +50,14 @@ menu: name: Server pageRef: /server weight: 4 + - identifier: hosting + name: Hosting + pageRef: /hosting + weight: 5 - identifier: faq name: FAQ pageRef: /faq - weight: 5 + weight: 6 - name: Search weight: 6 params: diff --git a/layouts/hosting.html b/layouts/hosting.html new file mode 100644 index 0000000..844f13c --- /dev/null +++ b/layouts/hosting.html @@ -0,0 +1,8 @@ +{{ define "main" }} +
+
+
+ +{{ end }} diff --git a/public/404.html b/public/404.html index 9b23949..59d8ad6 100644 --- a/public/404.html +++ b/public/404.html @@ -1 +1,40 @@ -

404

This page could not be found.

\ No newline at end of file + + + +
+ +

+ 404 +

+
+

This page could not be found.

+
+
+ + diff --git a/public/categories/index.html b/public/categories/index.html index 8871380..c990f6a 100644 --- a/public/categories/index.html +++ b/public/categories/index.html @@ -1,32 +1,560 @@ -Categories – RAPPORT + + + + + + + + +Categories – RAPPORT + + + + +Zum Inhalt springen

Categories

\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+

Categories

+
+
+ +
+
+ +
+
+
+
+ + + + + + + diff --git a/public/categories/index.xml b/public/categories/index.xml index ec51926..bac9f9d 100644 --- a/public/categories/index.xml +++ b/public/categories/index.xml @@ -1 +1,18 @@ -RAPPORT – Categorieshttps://rapport.gabrielevarano.ch/categories/Recent content in Categories on RAPPORTHugo -- gohugo.iode \ No newline at end of file + + + RAPPORT – Categories + /categories/ + Recent content in Categories on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + diff --git a/public/de.search-data.json b/public/de.search-data.json index c94b91f..8a44cca 100644 --- a/public/de.search-data.json +++ b/public/de.search-data.json @@ -1 +1 @@ -{"/docs/":{"data":{"":"Vollständige Anleitung zu RAPPORT — von der Installation über den täglichen Arbeitsablauf bis zur Cloud-Variante und Eigen-Builds.","erste-schritte#Erste Schritte":"Quick-StartIn sechs Schritten von Null zur ersten Rechnung. InstallationmacOS, Gatekeeper, Signatur, geplante Plattformen. EinrichtungBürodaten, Mitarbeiter, Kunden, Projekte initial anlegen.","für-fortgeschrittene#Für Fortgeschrittene":"Web-Modus (Multi-User)Rapport im Browser via Supabase — für Studios mit mehreren Nutzern. Entwicklung \u0026 BuildAus dem Quellcode kompilieren, beitragen, eigenes Release. ChangelogVersionsgeschichte und Breaking Changes.","hilfe--support#Hilfe \u0026amp; Support":"Bei Bugs oder weiteren Fragen → Issue auf Gitea . Siehe auch die FAQ für häufige Fragen.","im-alltag#Im Alltag":"Typischer ArbeitsablaufKunde → Offerte → Projekt → Zeit → Rechnung. Datenhaltung \u0026 BackupWo die Daten liegen, wie du sie sicherst und wiederherstellst. TroubleshootingApp startet nicht, Daten weg, Update hängt."},"title":"Dokumentation"},"/docs/arbeitsablauf/":{"data":{"":"Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.","1--kunde-anlegen#1 · Kunde anlegen":"Kunden → Neu — siehe Einrichtung § 3.\nFalls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.","2--offerte-erstellen#2 · Offerte erstellen":"Offerten → Neu\nFeld 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.","3--offerte--projekt#3 · Offerte → Projekt":"Bei Status “Angenommen”: Knopf “In Projekt konvertieren”.\nDas erzeugt:\nEin 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.","4--zeit-erfassen#4 · Zeit erfassen":"Zeit → Mitarbeiter wählen → Woche navigieren\nKlick 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)","5--akonto-rechnung#5 · Akonto-Rechnung":"Während der Projektlaufzeit — typisch nach jeder abgeschlossenen SIA-Phase oder monatlich.\nRechnungen → Neu → Akonto\nFeld 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.\nPDF inkl. QR-Einzahlungsschein — siehe Rechnungen-Feature.","6--schlussrechnung#6 · Schlussrechnung":"Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.\nRechnungen → Neu → Schlussrechnung\nRapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:\nGesamthonorar (SIA / Pauschal / Stundensatz) − Akonto-Rechnung 1 − Akonto-Rechnung 2 − Akonto-Rechnung 3 = Schlussrechnung","7--projektabschluss#7 · Projektabschluss":"Im Projekt → Status auf “Abgeschlossen”.\nDas Projekt bleibt für historische Auswertungen sichtbar, taucht aber nicht mehr in der Zeiterfassungs-Auswahl auf.","auswertungen#Auswertungen":"Wöchentlich / monatlich / am Jahresende:\nZeit → Auswertungen — Stunden pro Mitarbeiter, pro Projekt, pro Phase Rechnungen → Übersicht — offene Beträge, bezahlt, Mahnungen Buchhaltung → Erfolgsrechnung — Einnahmen vs. Ausgaben Mitarbeiter → Lohnabrechnung — monatlich","offerten-status#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","spezialfälle#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","tipps-aus-dem-alltag#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 Briefbogen-Logo in hoher Auflösung — sieht im PDF besser aus","übersicht#Übersicht":"Kunde → Offerte → Projekt → Zeit → Akonto → Schluss anlegen erstellen (aus Offerte) erfassen -Rechnung -Rechnung ↓ QR-Schein"},"title":"Arbeitsablauf"},"/docs/changelog/":{"data":{"":"Versionsgeschichte von RAPPORT. Aktuelle Releases: Gitea .","01x--initial#0.1.x — Initial":"Neu\nErste Setup-Routine (Bürodaten, Mitarbeiter, Kunden) Briefe und Lieferscheine Tauri-2-Bundle für macOS","02x--zeiterfassung#0.2.x — Zeiterfassung":"Neu\nWochenraster mit Halbstunden-Slots Drag \u0026 Drop zur Slot-Erfassung Projekt-Zuweisung pro Eintrag Auswertungen pro Mitarbeiter und Projekt","03x--rechnungen--qr#0.3.x — Rechnungen \u0026amp; QR":"Neu\nRechnungsmodul mit QR-Einzahlungsschein (via swissqrbill) Akonto-, Teil- und Schlussrechnungen PDF-Export mit Bürobriefbogen Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung","04x--projekte--sia-102#0.4.x — Projekte \u0026amp; SIA 102":"Neu\nProjektverwaltung nach SIA 102 Vorgeschlagene Phasen-Anteile am Gesamthonorar Bauschätzwert-basiertes Honorar Verbessert\nZeit-Auswertung pro SIA-Phase Akonto- und Schlussrechnungen mit automatischer Differenzberechnung","05x--mitarbeiter--lohn#0.5.x — Mitarbeiter \u0026amp; Lohn":"Neu\nMitarbeiterverwaltung mit Pensum, Stundensatz, Ferienanspruch Lohnabrechnung mit AHV/IV/EO, ALV, BVG, NBU Jahresabschluss mit Überstundenausgleich Ferien-Prorata bei Eintritt unter Jahr","06x--spesen--buchhaltung#0.6.x — Spesen \u0026amp; Buchhaltung":"Neu\nSpesenerfassung mit Beleg-Upload (Base64 in localStorage) Jahresbudget mit Einnahmen-/Ausgaben-Übersicht Vereinfachte Erfolgsrechnung pro Geschäftsjahr Verbessert\nLohnabrechnung integriert Spesen-Erstattungen CSV-Export aus der Zeiterfassung","070--auto-updater--system-tray#0.7.0 — Auto-Updater \u0026amp; System-Tray":"Neu\nAuto-Updater — Rapport prüft beim Start auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden. (Doku) 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) Quick-Open der letzten 5 Projekte direkt aus dem Tray-Menü Verbessert\nSchnellerer App-Start durch lazy-geladene Views Klarere Statusbadges in der Projekt-Übersicht","080081--patch-releases#0.8.0–0.8.1 — Patch-Releases":"Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe Releases auf Gitea .","082--aktuelle-version-aktuell#0.8.2 — Aktuelle Version \u003cspan class=\"rapport-status new\"\u003eAktuell\u003c/span\u003e":"Veröffentlicht am 2026-05-24.\nNeu / Verbessert\nDiverse Verbesserungen und Bugfixes (Details werden im Release auf Gitea gepflegt) Bekannte Einschränkungen\nBuilds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe Installation § Gatekeeper Linux- und Windows-Builds noch nicht verfügbar","roadmap#Roadmap":"Geplant — keine konkreten Termine:\nLinux-Build (Tauri 2 unterstützt es, Bedarf nötig) Windows-Build (analog) Cloud-Modus Stable (Supabase) — derzeit in 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 ."},"title":"Changelog"},"/docs/datenhaltung/":{"data":{"":"Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.\nDiese Seite beschreibt die Desktop-App (Single-User). Wer im Team arbeitet und Rapport gegen einen Rapport Server betreibt, sichert stattdessen die Postgres-Datenbank — siehe Rapport Server § Backup.","a--einfach-manuell#A · Einfach (manuell)":"Den ganzen Ordner kopieren:\ncp -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#B · Time Machine":"Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.\nEinschränkung: Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.","backup-strategien#Backup-Strategien":"","c--cron-job-täglich-automatisch#C · Cron-Job (täglich automatisch)":"# 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#D · iCloud Drive (off-site)":"Application-Support liegt nicht automatisch in iCloud. Wer das will:\n# 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).","datenmenge#Datenmenge":"Typische Grössen pro Bürojahr:\nInhalt 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 ~ 1–2 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.","export-funktionen-in-der-app#Export-Funktionen (in der App)":"Aus Rapport selbst:\nWas 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.","macos#macOS":"~/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:\nBü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.","schema-migrationen#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.\nCode: src/storage/migrations.js .\nEmpfehlung: Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.","selektiv-nur-einzelne-daten#Selektiv (nur einzelne Daten)":"Da alle Daten in einem JSON unter studio_data_v1 liegen, ist selektive Wiederherstellung manuell:\nBackup-localStorage-Datei öffnen (WebKit-Format → mit Tool wie [WebKit Storage Inspector] lesen, oder via Rapport DevTools) Gewünschte Felder in die aktuelle Instanz übertragen In der Praxis: meistens lohnt sich die vollständige Wiederherstellung mehr.","speicherort-desktop-app#Speicherort (Desktop-App)":"Die Desktop-App speichert alles lokal — keine Cloud, kein Server.","vollständig-rapport-komplett-tot#Vollständig (Rapport komplett tot)":"Rapport beenden (Cmd+Q, nicht nur Fenster zu) Aktuellen Ordner umbenennen (falls noch da): mv \"~/Library/Application Support/com.rapport.app\" \\ \"~/Library/Application Support/com.rapport.app.bak\" Backup-Ordner zurück kopieren: cp -R \"~/Documents/Rapport-Backup-20260523\" \\ \"~/Library/Application Support/com.rapport.app\" Rapport starten","warum-localstorage#Warum localStorage?":"In der Desktop-App ist Rapport eine Single-User-Anwendung. localStorage ist dafür:\nSchnell — 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 — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.","was-wird-nicht-gespeichert#Was wird \u003cstrong\u003enicht\u003c/strong\u003e 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)","wiederherstellung#Wiederherstellung":""},"title":"Datenhaltung"},"/docs/einrichtung/":{"data":{"":"Nach der Installation: Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.","1--bürodaten#1 · Bürodaten":"Einstellungen → Bürodaten\nFeld 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 (\u003e1 MB) vorher in Vorschau verkleinern.","2--mitarbeiter#2 · Mitarbeiter":"Einstellungen → Mitarbeiter → Neu\nFeld Beschreibung Name, Vorname wird in Zeiterfassung \u0026 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. 25–30 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.","3--kunden#3 · Kunden":"Kunden → Neu\nFeld 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#4 · Projekte":"Projekte → Neu\nFeld 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","checkliste#Checkliste":"Nach diesen vier Schritten ist Rapport einsatzbereit:\nBü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.","reihenfolge#Reihenfolge":"Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:\n1. Bürodaten → 2. Mitarbeiter → 3. Kunden → 4. Projekte ▼ ▼ ▼ ▼ Briefbogen, Zeiterfassung, Adressen, Zeiterfassung, QR-Schein, Lohn Rechnungen Rechnungen Login","sia-102-phasen#SIA-102-Phasen":"Wenn als Honorartyp SIA 102 gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe Projekt-Feature.","sozialabzüge-optional#Sozialabzüge (optional)":"In Einstellungen → Lohn:\nAbzug 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."},"title":"Einrichtung"},"/docs/entwicklung/":{"data":{"":"Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.","architektur-in-einem-absatz#Architektur in einem Absatz":"RAPPORT ist eine monolithische SPA: ein React-Root in 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).\nDetaillierte Karte: ARCHITECTURE.md .","beitragen#Beitragen":"Issues \u0026 Pull Requests sind willkommen. Wertvoll sind:\nBug-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.","build#Build":"","desktop-tauri-dmg#Desktop (Tauri DMG)":"npm run build # erst Vite-Build (dist/) npx tauri build # dann Tauri-Bundle (DMG) Output: src-tauri/target/release/bundle/dmg/Rapport__aarch64.dmg","entwicklung#Entwicklung":"","konventionen#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","lizenz#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.","native-window-tauri-fenster-mit-desktop-integration#Native Window (Tauri-Fenster mit Desktop-Integration)":"npx tauri dev Echtes Tauri-Fenster System-Tray, Updater, native APIs verfügbar Erster Start dauert lange (Rust-Compile)","release-workflow#Release-Workflow":"# 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","setup#Setup":"git clone https://git.kgva.ch/karim/RAPPORT.git cd RAPPORT/APP npm install","verzeichnis-karte#Verzeichnis-Karte":"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","voraussetzungen#Voraussetzungen":"Tool Version Node.js ≥ 20 (für Vite 8) npm ≥ 10 Rust toolchain ≥ 1.77.2 (via rustup) Plattform-Tools siehe Tauri Prerequisites Plattform-spezifisch:\nmacOS: Xcode Command Line Tools (xcode-select --install) Windows: Microsoft C++ Build Tools + WebView2 Linux: webkit2gtk-4.1, librsvg2-dev, libayatana-appindicator3-dev, build-essential","web-modus-hmr-schnellster-loop#Web-Modus (HMR, schnellster Loop)":"npm run dev # http://localhost:3000 Hot-Module-Replacement Schnellster Iteration-Loop für UI-Arbeit Datenpersistierung: Browser-localStorage","web-statisches-bundle#Web (statisches Bundle)":"npm run build # Output: dist/ (~500 KB) Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe Web-Modus."},"title":"Entwicklung"},"/docs/erste-schritte/":{"data":{"":"Von der Installation bis zur ersten Rechnung — in sechs Schritten.","01--installation#01 · Installation":"DMG von Gitea Releases herunterladen. Rapport in den Programme-Ordner ziehen. Beim ersten Start: Systemeinstellungen → Datenschutz \u0026 Sicherheit öffnen und Rapport zulassen.\nDie Pre-Release-Builds sind signiert über Tauri, aber (noch) nicht über die Apple-Notarisierung gegangen — daher der manuelle Freigabe-Schritt.","02--einrichtung#02 · Einrichtung":"In den Einstellungen hinterlegen:\nBü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#03 · Zeiterfassung":"Im Modul Zeit:\nMitarbeiter wählen Woche navigieren Stunden per Klick oder Drag erfassen 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#04 · Rechnungen":"Aus einer Offerte oder direkt erstellen:\nSIA-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#05 · Backup":"In der Desktop-App liegen alle Daten als JSON im Applikationsordner:\n~/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.","06--probleme-melden#06 · Probleme melden":"Ein Issue auf Gitea erstellen — mit kurzer Beschreibung, was passiert ist. Screenshots helfen. Bitte die Rapport-Version (links unten in der App) angeben.\nTipp: Wenn die App nicht mehr startet, hilft oft, den Cache-Ordner zu sichern und neu zu starten. Die JSON-Daten selbst bleiben unverändert."},"title":"Erste Schritte"},"/docs/installation/":{"data":{"":"Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.","1--download#1 · Download":"Aktueller Build: Downloads-Seite oder direkt Releases auf Gitea .\nDatei Plattform RAPPORT__aarch64.dmg macOS Apple Silicon RAPPORT__x86_64.dmg macOS Intel (auf Anfrage)","2--dmg-öffnen--installieren#2 · DMG öffnen \u0026amp; installieren":"DMG doppelklicken Rapport.app in den Applications-Ordner ziehen DMG auswerfen","3--erster-start-macos-gatekeeper#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.","4--erstes-setup#4 · Erstes Setup":"Beim ersten Start zeigt Rapport den Setup-Bildschirm. Hier werden die Stammdaten erfasst — siehe Einrichtung.","5--update-strategie#5 · Update-Strategie":"Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe Auto-Updater). Updates können in den Einstellungen deaktiviert werden.\nManuelle Updates: einfach das neuere DMG installieren — die Daten bleiben erhalten, da sie unabhängig von der App liegen (siehe Datenhaltung).","alternative-terminal#Alternative (Terminal)":"Falls der GUI-Weg nicht funktioniert:\nxattr -d com.apple.quarantine /Applications/Rapport.app Das entfernt das Quarantäne-Flag und macOS akzeptiert den Start.","bekannte-probleme#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.","deinstallation#Deinstallation":"# 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.","lösung#Lösung":"Systemeinstellungen → Datenschutz \u0026 Sicherheit öffnen Bis ganz nach unten scrollen — es erscheint: “Rapport” wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.\nAuf “Trotzdem öffnen” klicken Bestätigen Ab dem zweiten Start läuft Rapport ohne Rückfragen.","voraussetzungen#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 , wenn du eine Plattform brauchst."},"title":"Installation"},"/docs/troubleshooting/":{"data":{"":"Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → Issue auf Gitea .","app-startet-nicht#App startet nicht":"","app-startet-zeigt-aber-schwarzen-bildschirm#App startet, zeigt aber schwarzen Bildschirm":"Ursache: WebView-Cache korrupt.\nLösung:\nrm -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#App stürzt sofort beim Start ab":"Ursache: wahrscheinlich beschädigte JSON-Daten in studio_data_v1.\nDiagnose:\n# Daten ansehen (DevTools-Output) open \"~/Library/Application Support/com.rapport.app\" Lösung:\nBackup wiederherstellen (siehe Datenhaltung) Oder als letzter Ausweg: Daten zurücksetzen mv \"~/Library/Application Support/com.rapport.app\" \\ \"~/Library/Application Support/com.rapport.app.bad\" App neu starten → erstellt frische Daten. Anschliessend Setup-Screen.","auto-update-findet-nichts#Auto-Update findet nichts":"Diagnose:\ncurl -s https://git.kgva.ch/karim/RAPPORT/raw/branch/main/APP/latest.json → sollte JSON liefern. Wenn nicht: Server-/Netzwerkproblem.","daten-weg#Daten weg":"","debug-informationen-sammeln#Debug-Informationen sammeln":"Bei einem Issue helfen folgende Infos:\n# 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.","diese-version-überspringen-rückgängig-machen#\u0026ldquo;Diese Version überspringen\u0026rdquo; rückgängig machen":"In Einstellungen → Updates → Übersprungene Versionen zurücksetzen. Beim nächsten Start wird die Version wieder angeboten.","localstorage-voll#localStorage voll":"Symptom: Rapport schreibt Fehler-Toast “Speicher voll” beim Sichern.\nUrsache: macOS WebView limitiert localStorage auf ~10 MB pro Origin.\nLösung:\nSehr grosse Logos durch kleinere ersetzen (Bürodaten → Logo) Belege (Spesen) selektiv löschen oder als externe Datei archivieren Auf Web-Modus wechseln (Postgres ohne praktisches Limit)","login-screen-zeigt-keine-server-url#Login-Screen zeigt keine Server-URL":"Ursache: .env.production enthielt nicht den richtigen VITE_SUPABASE_URL zur Build-Zeit.\nLösung: .env.production prüfen, dann npm run build neu, Container restart.","nach-einem-app-update-fehlen-einträge#Nach einem App-Update fehlen Einträge":"Ursache: mögliche fehlgeschlagene Migration.\nSofortmassnahme:\nRapport beenden (Cmd+Q, nicht nur Fenster zu) Aktuelles Datenverzeichnis sichern: cp -R \"~/Library/Application Support/com.rapport.app\" \\ \"~/Documents/Rapport-Notfall-$(date +%Y%m%d-%H%M)\" Issue erstellen mit: Version vor dem Update (falls bekannt) Version nach dem Update Was fehlt Optional: gesicherter Datenordner (via Pastebin oder verschlüsselt zugesandt)","pdf--qr-schein#PDF / QR-Schein":"","pdf-export-ist-leer--weisses-blatt#PDF-Export ist leer / weisses Blatt":"Ursache: Print-View hat keine Daten (möglicherweise Race-Condition beim Laden).\nLösung: Rechnung schliessen, erneut öffnen, dann PDF.","pdf-schrift-sieht-falsch-aus#PDF-Schrift sieht falsch aus":"Ursache: Web-Schrift nicht geladen, Fallback greift.\nLösung: Vor dem Drucken warten, bis das Vorschau-Bild komplett geladen ist (3–5 Sek).","qr-schein-hat-falsche-daten#QR-Schein hat falsche Daten":"Diagnose-Checkliste:\nIBAN korrekt? (CH, 21 Zeichen, keine Leerzeichen) Empfänger-Adresse vollständig? (PLZ und Ort beide gefüllt) Schuldner-Adresse vollständig? Betrag \u003e 0? Referenz nicht zu lang? (max 27 Zeichen) QR-Bibliothek: swissqrbill — bei merkwürdigen Fehlern dort nachschauen.","rapport-ist-beschädigt-beim-ersten-start#\u0026ldquo;Rapport ist beschädigt\u0026rdquo; beim ersten Start":"Ursache: macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.\nLösung: siehe Installation § 3. Kurz:\nxattr -d com.apple.quarantine /Applications/Rapport.app","realtime-updates-kommen-nicht-an#Realtime-Updates kommen nicht an":"Ursache: Websocket-Support fehlt im Reverse Proxy.\nLösung: In Nginx Proxy Manager für api.* Websocket Support aktivieren.\nSiehe Web-Modus § Troubleshooting.","system-tray#System-Tray":"","tray-icon-erscheint-nicht#Tray-Icon erscheint nicht":"Plattform-Hinweis: Tray-Icons unter macOS sind bei extrem voller Menüleiste oder unter “Bartender”/“Hidden Bar” eventuell unsichtbar.\nDiagnose:\nps aux | grep -i rapport → wenn Prozess läuft, aber kein Icon: in den Tray-Manager-Apps prüfen.\nKonfiguration: Einstellungen → System-Tray → Tray-Icon ausblenden (aus → Icon erzwingen).","tray-menü-reagiert-nicht--hängt#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).","update-lädt-lässt-sich-aber-nicht-installieren#Update lädt, lässt sich aber nicht installieren":"Ursache: Signaturprüfung scheitert (Public-Key in App ≠ Signatur in latest.json).\nLösung: Manuelles Update — DMG direkt von Releases laden und installieren. Daten bleiben erhalten.","updates#Updates":"","web-modus#Web-Modus":"","wenn-nichts-hilft#Wenn nichts hilft":"Neues Issue auf Gitea mit:\nWas du gemacht hast Was passiert ist Was du erwartet hättest Screenshots (auch von DevTools-Konsole falls möglich) Rapport-Version und macOS-Version"},"title":"Troubleshooting"},"/docs/web-modus/":{"data":{"":"Hinweis: Der frühere Supabase-basierte Web-Modus wurde durch Rapport Server abgelöst — den vollständigen Selfhost-Stack mit eigenem Postgres, Auth, Realtime und Storage. Keine externe Cloud-Abhängigkeit mehr.\nDiese Seite bleibt als Referenz erhalten, der empfohlene Weg für Multi-User-Setups ist Rapport Server.","architektur-kurzfassung#Architektur (Kurzfassung)":"┌────────────┐ 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) Auth: E-Mail / Passwort über GoTrue Storage: Belege, Logos in Object-Storage","migration-desktop--cloud#Migration Desktop → Cloud":"Wer mit der Desktop-App startet und später auf den Web-Modus wechseln möchte:\nAktuell: 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 .","setup#Setup":"Alle Setup-Schritte (Repo klonen, .env erstellen, Migrations syncen, Docker-Compose starten, Reverse-Proxy konfigurieren) sind in Rapport Server dokumentiert.","troubleshooting#Troubleshooting":"Siehe Rapport Server § Troubleshooting oder allgemeine Troubleshooting-Seite.","wann-brauchst-du-das#Wann brauchst du das?":"Anwendungsfall Empfehlung Solo-Büro, ein Mac Desktop-App — siehe Installation 2–5 Personen, gleicher Standort Rapport Server auf einem Mac Mini im LAN Verteiltes Team / Home-Office Rapport Server mit SSL + Reverse Proxy Hosted Backend (eigener VPS) Rapport Server auf Linux-VPS"},"title":"Web-Modus"},"/downloads/":{"data":{"":"Aktuelle Builds von Rapport. Quellcode und ältere Versionen auf Gitea .\nRapport besteht aus zwei Komponenten:\nKomponente Für wen Aktuelle Version Desktop-App Solo-Büro, lokale Datenhaltung 0.8.2 Rapport Server Team / Multi-User / Selfhost 0.1.0","auto-update#Auto-Update":"Seit 0.7.0 prüft die Desktop-App beim Start automatisch auf neue Versionen — siehe Auto-Updater. Für Rapport Server: git pull \u0026\u0026 docker compose pull \u0026\u0026 docker compose up -d.","desktop-app--pre-release-082#Desktop-App — Pre-Release 0.8.2":"Aktuelle Version\nNeuerungen — siehe Changelog für Details.","docker-linux--vps--headless#Docker (Linux / VPS / Headless)":"Für Linux-Server, NAS oder VPS — der reine Docker-Compose-Stack ohne GUI.\ngit clone https://git.kgva.ch/karim/rapport-server.git cd rapport-server git checkout 0.1.0 cp .env.example .env # .env editieren (POSTGRES_PASSWORD, JWT_SECRET, SITE_URL) docker compose up -d Vollständige Anleitung mit .env-Variablen, Reverse-Proxy und Backup → Server-Seite.\nContainer-Images werden von Docker Hub / Gitea-Registry gezogen — docker compose pull aktualisiert auf die neuesten Tags.","linux--windows#Linux \u0026amp; Windows":"Geplant. Rapport basiert auf Tauri 2 — eine Portierung ist möglich, sobald der Bedarf besteht. Issue erstellen , wenn du eine Plattform brauchst.","macos#macOS":"Architektur Download Apple Silicon (M1–M4) RAPPORT_0.8.2_aarch64.dmg Intel (x86_64) auf Anfrage Erstinstallation: Systemeinstellungen → Datenschutz \u0026 Sicherheit öffnen und Rapport zulassen. Die Builds sind über Tauri signiert, aber (noch) nicht Apple-notarisiert.","quellcode#Quellcode":"Desktop-App — Tauri / React:\ngit clone https://git.kgva.ch/karim/RAPPORT.git cd RAPPORT/APP npm install npm run tauri dev Voraussetzungen: Node 20+, Rust (stable), Xcode-CLI (macOS).\nRapport Server:\ngit clone https://git.kgva.ch/karim/rapport-server.git Beide Repos auf Gitea — Issues und PRs willkommen.","rapport-server--010#Rapport Server — 0.1.0":"Erstes Release\nSelfhost-Backend für Multi-User-Setups — Postgres, Auth, Realtime-Sync, Storage. Details und Setup-Anleitung auf der Server-Seite.","server-app-macos#Server-App (macOS)":"GUI zum Starten, Stoppen und Verwalten der Server-Instanz auf einem Mac (Mac Mini, Studio-Rechner). Bündelt den Docker-Compose-Stack.\nArchitektur Download Apple Silicon (M1–M4) RAPPORT_SERVER_0.1.0_aarch64.dmg Intel (x86_64) auf Anfrage Voraussetzung: Colima oder Docker Desktop muss installiert sein. Die App verwaltet den Container-Stack darüber."},"title":"Downloads"},"/faq/":{"data":{"":"Häufige Fragen zu RAPPORT. Bei Bugs oder weiteren Fragen → Issue auf Gitea .","für-wen-ist-rapport-gedacht#Für wen ist Rapport gedacht?":"Für kleine Architekturbüros in der Schweiz. Die Strukturen folgen der SIA 102 (Phasen, Honorar). Rapport wurde für den internen Gebrauch entwickelt und wird mit diesem Projekt öffentlich geteilt.","ist-die-software-stabil-genug-für-den-betrieb#Ist die Software stabil genug für den Betrieb?":"Noch nicht. Aktuell befindet sich Rapport in aktiver Entwicklung (Pre-Release 0.8.2). Funktionen können sich ändern, Bugs sind möglich. Regelmässige Backups sind empfohlen. Testen und Feedback geben ist erwünscht.","ist-rapport-kostenlos#Ist Rapport kostenlos?":"Ja, vollständig. Quellcode unter GNU AGPL-3.0-or-later. Keine versteckten Kosten, keine Telemetrie. Die Daten bleiben lokal auf deinem Computer bzw. in deiner Instanz. Du hast die komplette Kontrolle über deine Daten.","kann-ich-zum-projekt-beitragen#Kann ich zum Projekt beitragen?":"Ja. Issues und Pull Requests sind willkommen auf Gitea . Rapport ist kein Framework — konkrete Verbesserungen für den Büroalltag sind am wertvollsten:\nBug-Reports mit Reproduktionsschritten Workflow-Verbesserungen aus dem realen Büroalltag Vorlagen (Briefe, Protokolle, Lieferscheine) für andere Büros Übersetzungen / Internationalisierung","warum-open-source#Warum Open Source?":"Bürowissen sollte nicht in proprietären Tools eingesperrt sein. Studio-Management-Workflows sind in der Branche gut etabliert — ein Tool, das die Schweizer Konventionen (SIA 102, QR-Rechnung) sauber umsetzt, gehört allen.\nAGPL-3.0 stellt sicher, dass Verbesserungen wieder ins Projekt fliessen.","was-ist-mit-dem-qr-einzahlungsschein#Was ist mit dem QR-Einzahlungsschein?":"Rapport erzeugt Schweizer QR-Rechnungen nach Norm — direkt eingebettet in das PDF der Rechnung. IBAN, Bürodaten und Empfänger werden aus den Einstellungen bzw. den Kundendaten gezogen. Akonto-, Teil- und Schlussrechnungen werden unterstützt.","welche-systeme-werden-unterstützt#Welche Systeme werden unterstützt?":"Aktuell nur macOS (Intel \u0026 Apple Silicon). Rapport basiert auf Tauri — eine Portierung auf Linux und Windows ist möglich, sobald der Bedarf seitens Community besteht.","wie-erhalte-ich-hilfe-bei-einem-problem#Wie erhalte ich Hilfe bei einem Problem?":"Ein Issue auf Gitea ist der beste Weg. Bitte beschreibe, was du gemacht hast und was passiert ist. Screenshots helfen. Die Rapport-Version (links unten in der App) bitte angeben.\nKanal Verwendung Gitea Issues Bugs, Feature-Wünsche, allgemeine Fragen gabrielevarano.ch Entwickler-Kontakt","wie-funktioniert-die-zeiterfassung#Wie funktioniert die Zeiterfassung?":"Tages- und Wochenraster mit Drag \u0026 Drop. Jeder Eintrag wird einem Projekt zugewiesen. Auswertungen pro Mitarbeiter und Projekt sind unter Zeit abrufbar. Ferienverwaltung mit Prorata und Jahresabschluss mit Überstundenausgleich.","wo-werden-die-daten-gespeichert#Wo werden die Daten gespeichert?":"Rapport unterstützt zwei Modi, beide selbst-gehostet:\nDesktop-App (Single-User) — alle Daten liegen lokal auf deinem Mac (localStorage im Applikationsordner). Kein Server nötig, kein Cloud-Account, keine Telemetrie. Server-Modus (Multi-User) — Daten in einer eigenen PostgreSQL-Datenbank über Rapport Server. Mehrere Personen, Realtime-Sync, eigene Domain. Wechsel direkt im Login-Bildschirm der App. In beiden Fällen bleibt die Kontrolle über die Daten bei dir."},"title":"FAQ"},"/features/":{"data":{"":"Die Bausteine von RAPPORT — Studio-Management für Schweizer Architekturbüros.","module#Module":"ZeiterfassungTages- \u0026 Wochenraster mit Drag \u0026 Drop. Rechnungen \u0026 OffertenQR-Einzahlungsscheine, SIA-Phasen, Akonto. Projekt- \u0026 KundenverwaltungSIA 102, Budget, Phasen, Beteiligte. MitarbeiterFerien, Absenzen, Lohnabrechnung. Spesen \u0026 BürobudgetBelegupload, Jahresbudget, Internes. Protokolle \u0026 LieferscheineSitzungsprotokolle, Briefe, Lieferscheine. Auto-UpdaterSignierte Updates via Tauri. System-TrayHide-on-Close, Quick-Open."},"title":"Features"},"/features/auto-updater/":{"data":{"":"Neu in 0.7.0\nRapport prüft beim Start automatisch auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden.","funktionsweise#Funktionsweise":"Beim App-Start:\nAbfrage gegen https://git.kgva.ch/karim/RAPPORT/releases/latest.json Versionsvergleich mit lokaler version im Tauri-Bundle Bei neuer Version → Update-Dialog Bei Bestätigung → Download + Signaturprüfung + Installation + Neustart","latest-endpoint#Latest-Endpoint":"{ \"version\": \"0.8.2\", \"notes\": \"Rapport 0.8.2\", \"pub_date\": \"2026-05-24T00:00:00Z\", \"platforms\": { \"darwin-aarch64\": { \"signature\": \"…\", \"url\": \"https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.2/RAPPORT%20PRE-RELEASE.app.tar.gz\" } } }","optionen#Optionen":"Update installieren — Download \u0026 Neustart Diese Version überspringen — überspringt nur diese eine Version Später erinnern — beim nächsten Start erneut fragen Updates können in den Einstellungen komplett deaktiviert werden.","sicherheit#Sicherheit":"Updates werden mit dem Tauri-Updater-Schlüssel signiert Manipulierte Downloads werden abgelehnt Quellcode und Build sind reproduzierbar (Gitea CI, geplant)"},"title":"Auto-Updater"},"/features/mitarbeiter/":{"data":{"":"In Arbeit\nFerienverwaltung, interne Stunden / Absenzen und Lohnabrechnung. Jahresabschluss mit Überstundenausgleich.","absenzen#Absenzen":"Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter.","ferienverwaltung#Ferienverwaltung":"Prorata-Berechnung bei Eintritt unter Jahr Ferien-Saldo in Tagen (live) Halbtage unterstützt Übertrag ins Folgejahr oder Auszahlung","jahresabschluss#Jahresabschluss":"Ferien-Restguthaben übertragen oder auszahlen Überstunden ausgleichen oder vergüten Lohnausweis vorbereiten (Export)","lohnabrechnung#Lohnabrechnung":"Monatliche Abrechnung mit:\nGrundlohn (basierend auf Pensum) Überstunden-Vergütung Spesen-Erstattung Sozialabzüge (AHV, ALV, Pensionskasse) PDF-Export pro Mitarbeiter.","stammdaten#Stammdaten":"Pro Mitarbeiter:\nName, Eintrittsdatum, Pensum (%) Stundensatz (intern, für Rechnungen) Ferienanspruch (Tage / Jahr) Lohn (monatlich, brutto)","verwandte-module#Verwandte Module":"Zeiterfassung — Pensum-Soll vs. Stunden-Ist Spesen — Spesen-Erstattung in der Lohnabrechnung"},"title":"Mitarbeiter"},"/features/projekte/":{"data":{"":"In Arbeit\nProjekte nach SIA 102 mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen.","auswertung#Auswertung":"Pro Projekt:\nGeleistete Stunden vs. Budget Honorar-Saldo (verrechnet / Akonto / offen) Phasen-Fortschritt","kundendatenbank#Kundendatenbank":"Adresse, Ansprechperson, Telefon, E-Mail Honorartyp (Stundensatz / SIA / Pauschal) Verknüpfung zu allen Projekten und Rechnungen des Kunden","projektstruktur#Projektstruktur":"Jedes Projekt besitzt:\nStammdaten — Nummer, Bezeichnung, Standort, Bauschätzwert Kunde — verknüpft mit Kundendatenbank Beteiligte — Bauleitung, Fachplaner, Behörden Phasen — SIA 102 (Vorprojekt, Bauprojekt, Ausschreibung, …) Budget — Gesamthonorar, pro Phase aufgeteilt","sia-102#SIA 102":"Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden.\nPhase Anteil (Standard) 31 — Vorprojekt 9 % 32 — Bauprojekt 21 % 33 — Bewilligung 3 % 41 — Ausschreibung 18 % 51 — Ausführung 38 % 52 — Inbetriebnahme 6 % 53 — Abschluss 5 %","verwandte-module#Verwandte Module":"Rechnungen — Offerte → Projekt Zeiterfassung — Stunden-Auswertung pro Phase"},"title":"Projekte"},"/features/protokolle/":{"data":{"":"In Arbeit\nEinfache Erstellung von Sitzungsprotokollen mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild.","briefe#Briefe":"Brief-Editor mit:\nEmpfänger aus Kundendatenbank Bezugszeile, Anrede, Text, Grussformel Briefbogen-Vorlage mit Logo PDF-Export","lieferscheine#Lieferscheine":"Pro Lieferung:\nEmpfänger, Datum, Bezug Positionen (Plan-Nummer, Bezeichnung, Anzahl, Massstab) Unterschriftenfeld Konsistentes Erscheinungsbild über alle Dokumenttypen — eine Briefbogen-Vorlage, mehrere Verwendungen.","sitzungsprotokolle#Sitzungsprotokolle":"Pro Sitzung:\nDatum, Ort, Teilnehmer (aus Beteiligten-Liste) Traktanden als nummerierte Liste Pro Traktandum: Beschluss, Aufgabe, Verantwortlich, Frist Anhänge PDF-Export mit Bürobriefbogen.","verwandte-module#Verwandte Module":"Projekte — Beteiligte als Empfänger"},"title":"Protokolle"},"/features/rechnungen/":{"data":{"":"In Arbeit\nQR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen. Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export.","honorarmodelle#Honorarmodelle":"Modell Berechnung Verwendung Stundensatz Aus Zeiterfassung × Mitarbeiter-Stundensatz Kleinaufträge, Beratung SIA-Phasen Bauschätzwert × Honorarsatz × Phasenanteil Reguläre Architektur-Aufträge Pauschal Fester Betrag Auf Wunsch des Kunden","pdf-export#PDF-Export":"Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant).","qr-einzahlungsschein#QR-Einzahlungsschein":"Schweizer QR-Rechnung nach Norm — direkt eingebettet in die PDF.\nAusgelesen aus:\nBürodaten — IBAN, Empfänger-Adresse Kundendaten — Schuldner-Adresse Rechnungs-Daten — Betrag, Referenz, Zusatzinformation","verwandte-module#Verwandte Module":"Projekte — Honorarstruktur stammt aus dem Projekt Zeiterfassung — Stundensatz-Rechnungen","workflow#Workflow":"Offerte erstellen — auf Basis SIA 102 oder pauschal Kunde nimmt an → konvertieren in Projekt + Rechnung Akonto-Rechnungen während der Projektlaufzeit Schlussrechnung mit Differenz zum bisher Akonto-bezahlten"},"title":"Rechnungen"},"/features/spesen/":{"data":{"":"In Arbeit\nSpesenerfassung mit Belegupload. Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen.","auswertung#Auswertung":"Einnahmen pro Kunde / Projekt Ausgaben pro Kategorie / Mitarbeiter Erfolgsrechnung pro Geschäftsjahr (vereinfacht)","jahresbudget#Jahresbudget":"Übersicht über:\nEinnahmen — Rechnungsbeträge, sortiert nach Eingang Ausgaben — Spesen, Bürokosten, Löhne, Sozialabzüge Saldo pro Monat / Quartal / Jahr","spesenerfassung#Spesenerfassung":"Pro Mitarbeiter:\nDatum, Betrag, Kategorie Beleg-Upload (PDF, JPG, PNG) Projekt-Zuordnung (optional) Status (offen / erstattet) Kategorien: Reise, Verpflegung, Material, Telefon, Sonstiges.","verwandte-module#Verwandte Module":"Mitarbeiter — Spesen-Erstattung in der Lohnabrechnung Rechnungen — Einnahmen-Quelle"},"title":"Spesen"},"/features/system-tray/":{"data":{"":"Neu in 0.7.0\nSchnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter — Cmd+Q beendet die App vollständig.","konfiguration#Konfiguration":"In den Einstellungen:\nBeim Systemstart starten (Login-Item) — Standard: aus Beim Schliessen beenden statt ins Tray — Standard: aus Tray-Icon ausblenden — App läuft, aber kein Menüleisten-Icon","tray-menü#Tray-Menü":"Rapport zeigen — Fenster nach vorne Neue Zeiterfassung — direkt im Zeit-Modul Neue Rechnung — direkt im Rechnungs-Modul Letzte Projekte — Quick-Open der letzten 5 Projekte Einstellungen Rapport beenden","verhalten#Verhalten":"Aktion Verhalten Fenster schliessen (⌘W oder rotes X) App läuft im Tray weiter Cmd+Q App wird vollständig beendet Klick auf Tray-Icon Fenster nach vorne, oder zeigen Rechtsklick auf Tray-Icon Menü mit Schnellzugriffen","verwandte-module#Verwandte Module":"Auto-Updater — prüft Updates im Hintergrund"},"title":"System-Tray"},"/features/zeiterfassung/":{"data":{"":"In Arbeit\nTages- und Wochenraster mit Drag \u0026 Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss.","auswertungen#Auswertungen":"Pro Mitarbeiter und pro Projekt:\nGeleistete Stunden vs. Soll-Pensum Ferienanspruch / -saldo (mit Prorata bei Eintritt unter Jahr) Überstunden-Saldo Stundenaufschlüsselung nach SIA-Phase pro Projekt","eingabe#Eingabe":"Wochenraster mit den 5 (oder 7) Arbeitstagen Halbstunden-Slots von 06:00 bis 22:00 Klick oder Drag über mehrere Slots Jeder Eintrag wird einem Projekt zugewiesen (Pflichtfeld) Mehrfacheinträge pro Slot möglich (z. B. parallele Telefonate)","jahresabschluss#Jahresabschluss":"Am Jahresende:\nFerien-Restguthaben übertragen oder auszahlen Überstunden ausgleichen oder vergüten Neues Jahr automatisch initialisieren","konzept#Konzept":"Die Zeiterfassung ist das Kernmodul von RAPPORT — alle anderen Module (Rechnungen, Auswertungen, Lohnabrechnung) greifen auf die hier erfassten Stunden zu.","verwandte-module#Verwandte Module":"Rechnungen — Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung Projekte — Stunden-Auswertung pro SIA-Phase Mitarbeiter — Pensum, Ferienanspruch"},"title":"Zeiterfassung"},"/glossary":{"data":{},"title":"Glossary"},"/lizenz/":{"data":{"":"Lizenz von RAPPORT, Zugehörigkeit zu OpenBureau und Attribution der verwendeten Open-Source-Software.","desktop-wrapper#Desktop-Wrapper":"Software Verwendung Lizenz Tauri 2 Cross-Platform Desktop-Wrapper MIT / Apache-2.0 WebKit WebView-Engine (macOS) LGPL-2.1 / BSD","diese-website#Diese Website":"Software Verwendung Lizenz Hugo Static-Site-Generator Apache-2.0 Hextra Hugo-Theme (von Xin) MIT Inter UI-Schrift (Rasmus Andersson) SIL OFL 1.1 Playfair Display Headings SIL OFL 1.1 Alle Logos und Marken-Namen gehören ihren jeweiligen Eigentümern.","frontend#Frontend":"Software Verwendung Lizenz React 19 UI-Bibliothek MIT Vite Build-Tool, Dev-Server MIT swissqrbill QR-Einzahlungsscheine MIT","kontakt#Kontakt":"Fragen zur Lizenz, kommerzieller Einsatz, Spezialfälle: Issue auf Gitea oder via gabrielevarano.ch .","lizenz#Lizenz":"Lizenziert unter GNU Affero General Public License v3.0 oder höher (AGPL-3.0-or-later ).\nDies bedeutet im Kern:\nFreie Nutzung für jeden Zweck (privat, kommerziell, behördlich) Freier Zugang zum Quellcode Freie Modifikation und Weitergabe — unter derselben Lizenz Netzwerk-Nutzung gilt als Weitergabe — wer eine modifizierte Version als Service anbietet, muss den Quellcode offenlegen Eigene Builds, eigene Forks, eigene Anpassungen — alles erlaubt, solange Modifikationen wieder unter AGPL-3.0 veröffentlicht werden.","lizenz-volltexte#Lizenz-Volltexte":"Die vollständigen Lizenztexte:\nAGPL-3.0 — RAPPORT MIT — React, Vite, Tauri, Hextra, swissqrbill Apache-2.0 — Tauri, Hugo, Supabase SIL OFL 1.1 — Inter, Playfair Display","mitwirkende#Mitwirkende":"RAPPORT wird derzeit als Ein-Personen-Projekt von Karim Gabriele Varano entwickelt. Beiträge — Code, Issues, Übersetzungen, Vorlagen — sind willkommen.\nWer beitragen möchte → Gitea Issues .","openbureau#OpenBureau":"RAPPORT ist Teil der OpenBureau-Initiative — einer Sammlung freier Software-Werkzeuge für den Architektur-Büro-Alltag.\nDie Idee: Bürowissen — Workflows, Konventionen, Vorlagen — sollte nicht in proprietären Tools eingesperrt sein. OpenBureau-Tools setzen die in der Branche etablierten Konventionen (SIA-Normen, QR-Rechnung, Plan-Verwaltung) sauber um und stehen unter freien Lizenzen zur Verfügung.\nTool Zweck Status RAPPORT Studio-Management Desktop-App (Zeit, Rechnungen, Projekte) Pre-Release Rapport Server Selfhost-Stack (Postgres + Auth + Realtime + Storage) Pre-Release DOSSIER Rhino-8-Plugin für Plan- und Dokumentationsausgabe Pre-Release Mehr unter gabrielevarano.ch .","rapport#RAPPORT":"RAPPORT — Studio Management Software für Architekturbüros.\nQuellcode: git.kgva.ch/karim/RAPPORT Autor: Karim Gabriele Varano","rapport-server-selfhost-stack#Rapport Server (Selfhost-Stack)":"Software Verwendung Lizenz PostgreSQL Datenbank PostgreSQL-Lizenz GoTrue Authentication-Service MIT PostgREST REST-API über Postgres-Schema MIT Realtime WebSocket-Sync Apache-2.0 Storage Object-Storage für Belege \u0026 Logos Apache-2.0 Kong API-Gateway Apache-2.0 nginx Frontend-Webserver BSD-2-Clause Docker Compose Orchestrierung Apache-2.0","verwendete-open-source-software#Verwendete Open-Source-Software":"RAPPORT baut auf freier Software auf. Diese Liste nennt die wichtigsten Komponenten und ihre jeweiligen Lizenzen."},"title":"Lizenz"},"/server/":{"data":{"":"Self-Hosting\nRapport Server — der vollständige Selfhost-Stack für Rapport. Eigene Daten, eigene Domain, eigener Server. Komplett Open-Source, Docker-Compose, AGPL-3.0.","1--repo-klonen#1 · Repo klonen":"git clone https://git.kgva.ch/karim/rapport-server.git cd rapport-server","2--env-erstellen#2 · \u003ccode\u003e.env\u003c/code\u003e erstellen":"cp .env.example .env In .env müssen mindestens diese Werte ersetzt werden:\nVariable Was POSTGRES_PASSWORD DB-Passwort (≥ 32 Zeichen, zufällig) JWT_SECRET JWT-Signatur (≥ 32 Zeichen, zufällig) ANON_KEY / SERVICE_ROLE_KEY aus JWT-Secret abgeleitet SITE_URL Public-URL der Instanz (z. B. https://app.rapport.studio.ch) Zufallswerte generieren:\nopenssl rand -hex 32 # für POSTGRES_PASSWORD und JWT_SECRET node scripts/generate-keys.mjs # ANON_KEY + SERVICE_ROLE_KEY aus JWT_SECRET","3--migrations-holen#3 · Migrations holen":"Die SQL-Migrations stammen aus dem App-Repo. Einmal initial holen:\n./scripts/sync-migrations.sh Bei späteren Rapport-Updates erneut ausführen, dann docker compose down \u0026\u0026 docker compose up -d.","4--stack-starten#4 · Stack starten":"docker compose up -d Erststart dauert ~1 Minute (Postgres initialisiert sich, Migrations laufen, Container starten).","5--health-check#5 · Health-Check":"docker compose ps Alle Container sollten healthy zeigen. Frontend ist dann erreichbar unter http://localhost:8080.","architektur#Architektur":"Rapport Server bündelt sechs Open-Source-Komponenten zu einem stimmigen Stack:\n┌──────────────────────────────────────────────────────┐ │ Browser / Desktop-App │ └──────────────┬───────────────────────┬───────────────┘ │ │ ▼ ▼ ┌──────────┐ ┌──────────┐ │ nginx │ │ Kong │ ← API-Gateway │ (app) │ │ │ └──────────┘ └──────────┘ │ ┌───────────────────┼─────────────────────┐ ▼ ▼ ▼ ┌────────┐ ┌──────────┐ ┌─────────┐ │ GoTrue │ │PostgREST │ │ Realtime│ │ (Auth) │ │ (API) │ │ (WS) │ └────────┘ └──────────┘ └─────────┘ │ │ │ └───────────────────┼─────────────────────┘ ▼ ┌─────────────────┐ │ PostgreSQL │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ Storage │ ← Belege, Logos └─────────────────┘ Komponente Funktion PostgreSQL Datenbank — alle Rapport-Daten GoTrue Authentication — Email/Passwort, JWT-Tokens PostgREST REST-API direkt aus dem Postgres-Schema Realtime WebSocket-Sync für Live-Updates Storage Object-Storage für Belege \u0026 Logos Kong API-Gateway, routet alle Calls app (nginx) Liefert das Rapport-Frontend (React-Build) Alles in einem Docker-Compose. Keine Cloud-Abhängigkeit, keine Telemetrie.","backup#Backup":"","bezug-rapport--rapport-server#Bezug Rapport ↔ Rapport Server":"Komponente Wo Lizenz Rapport Desktop-App git.kgva.ch/karim/RAPPORT AGPL-3.0 Rapport Server git.kgva.ch/karim/rapport-server AGPL-3.0 Die Desktop-App kann wahlweise im Lokal-Modus (JSON, kein Server nötig) oder im Cloud-Modus (gegen Rapport Server) betrieben werden. Wechsel erfolgt im Login-Bildschirm der App.","brauche-ich-supabase-cloud#Brauche ich Supabase Cloud?":"Nein. Rapport Server ist die Selfhost-Variante derselben Komponenten (Postgres + GoTrue + PostgREST + Realtime + Storage), aber komplett auf eigener Infrastruktur. Kein Supabase-Account, keine externe Abhängigkeit.","häufige-fragen#Häufige Fragen":"","kann-ich-von-der-desktop-app-auf-rapport-server-migrieren#Kann ich von der Desktop-App auf Rapport Server migrieren?":"Im Login der Desktop-App auf Cloud wechseln, Server-URL eingeben, Account erstellen, Daten manuell wieder anlegen (Bürodaten, Mitarbeiter, Kunden). Ein direkter localStorage → Postgres-Import ist geplant .","postgres-dump#Postgres-Dump":"docker compose exec -T db pg_dumpall -U postgres \u003e backup-$(date +%Y%m%d).sql Empfohlen: per cron täglich + auf externe Disk / S3 / Backblaze sichern.","quellcode#Quellcode":"git.kgva.ch/karim/rapport-server — Issues, Pull Requests und Forks willkommen.","restore#Restore":"docker compose down docker volume rm rapport-server_postgres-data docker compose up -d db sleep 10 cat backup-YYYYMMDD.sql | docker compose exec -T db psql -U postgres docker compose up -d","reverse-proxy--https#Reverse-Proxy + HTTPS":"Für Production-Setups mit eigener Domain — Caddy ist die einfachste Variante (config-as-code, Let’s-Encrypt automatisch):\napp.rapport.studio.ch { reverse_proxy localhost:8080 } api.rapport.studio.ch { reverse_proxy localhost:8000 } In .env dann:\nSITE_URL=https://app.rapport.studio.ch API_EXTERNAL_URL=https://api.rapport.studio.ch Alternativ über Nginx Proxy Manager mit Web-UI — siehe Troubleshooting.","setup-in-5-schritten#Setup in 5 Schritten":"","storage-belege-logos#Storage (Belege, Logos)":"docker compose exec storage tar -czf - /var/lib/storage \u003e storage-$(date +%Y%m%d).tar.gz","updates#Updates":"git pull ./scripts/sync-migrations.sh # falls neue SQL-Migrationen docker compose pull # neueste Container-Versionen docker compose up -d # neu starten Daten bleiben erhalten — das Volume postgres-data wird nicht angetastet.","voraussetzungen#Voraussetzungen":"OS Container-Runtime Linux (Ubuntu 22.04+, Debian 12+, …) Docker Engine + Compose v2 macOS (Mac Mini etc.) Colima + Docker CLI — voll OSS Auf macOS funktionieren auch OrbStack oder Docker Desktop, beide sind aber proprietär. Colima ist die OSS-Alternative und für Selfhost vollkommen ausreichend.\nPlus: ein DNS-Name für TLS (z. B. rapport.studio.ch), und optional ein Reverse-Proxy wie Nginx Proxy Manager oder Caddy .","wann-brauchst-du-rapport-server#Wann brauchst du Rapport Server?":"Szenario Lösung Ein Mensch, ein Mac Desktop-App reicht — Installation Mehrere Personen im Studio Rapport Server auf einem Mac Mini oder Linux-Server Verteiltes Team, Home-Office, Mobile-Zugriff Rapport Server mit Reverse-Proxy + SSL Cloud-Hosting bei einem Anbieter Rapport Server auf VPS/Hetzner/etc. Die Desktop-App speichert lokal als JSON. Rapport Server bringt Postgres + Multi-User + Realtime-Sync — für alle, die zu zweit oder im Team arbeiten.","was-kostet-das#Was kostet das?":"Nichts — Rapport Server ist Open-Source (AGPL-3.0). Du brauchst nur einen Server (Mac Mini, NAS, VPS) und ggf. eine Domain.","wieviel-server-resourcen#Wieviel Server-Resourcen?":"Ein Mac Mini M1 (8 GB RAM) reicht problemlos für ein 5-Personen-Studio. Linux-VPS mit 2 GB RAM + 2 CPU reicht auch."},"title":"Server"}} \ No newline at end of file +{"/docs/":{"data":{"":"Vollständige Anleitung zu RAPPORT — von der Installation über den täglichen Arbeitsablauf bis zur Cloud-Variante und Eigen-Builds.","erste-schritte#Erste Schritte":"Quick-StartIn sechs Schritten von Null zur ersten Rechnung. InstallationmacOS, Gatekeeper, Signatur, geplante Plattformen. EinrichtungBürodaten, Mitarbeiter, Kunden, Projekte initial anlegen.","für-fortgeschrittene#Für Fortgeschrittene":"Web-Modus (Multi-User)Rapport im Browser via Supabase — für Studios mit mehreren Nutzern. Entwicklung \u0026 BuildAus dem Quellcode kompilieren, beitragen, eigenes Release. ChangelogVersionsgeschichte und Breaking Changes.","hilfe--support#Hilfe \u0026amp; Support":"Bei Bugs oder weiteren Fragen → Issue auf Gitea . Siehe auch die FAQ für häufige Fragen.","im-alltag#Im Alltag":"Typischer ArbeitsablaufKunde → Offerte → Projekt → Zeit → Rechnung. Datenhaltung \u0026 BackupWo die Daten liegen, wie du sie sicherst und wiederherstellst. TroubleshootingApp startet nicht, Daten weg, Update hängt."},"title":"Dokumentation"},"/docs/arbeitsablauf/":{"data":{"":"Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.","1--kunde-anlegen#1 · Kunde anlegen":"Kunden → Neu — siehe Einrichtung § 3.\nFalls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.","2--offerte-erstellen#2 · Offerte erstellen":"Offerten → Neu\nFeld 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.","3--offerte--projekt#3 · Offerte → Projekt":"Bei Status “Angenommen”: Knopf “In Projekt konvertieren”.\nDas erzeugt:\nEin 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.","4--zeit-erfassen#4 · Zeit erfassen":"Zeit → Mitarbeiter wählen → Woche navigieren\nKlick 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)","5--akonto-rechnung#5 · Akonto-Rechnung":"Während der Projektlaufzeit — typisch nach jeder abgeschlossenen SIA-Phase oder monatlich.\nRechnungen → Neu → Akonto\nFeld 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.\nPDF inkl. QR-Einzahlungsschein — siehe Rechnungen-Feature.","6--schlussrechnung#6 · Schlussrechnung":"Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.\nRechnungen → Neu → Schlussrechnung\nRapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:\nGesamthonorar (SIA / Pauschal / Stundensatz) − Akonto-Rechnung 1 − Akonto-Rechnung 2 − Akonto-Rechnung 3 = Schlussrechnung","7--projektabschluss#7 · Projektabschluss":"Im Projekt → Status auf “Abgeschlossen”.\nDas Projekt bleibt für historische Auswertungen sichtbar, taucht aber nicht mehr in der Zeiterfassungs-Auswahl auf.","auswertungen#Auswertungen":"Wöchentlich / monatlich / am Jahresende:\nZeit → Auswertungen — Stunden pro Mitarbeiter, pro Projekt, pro Phase Rechnungen → Übersicht — offene Beträge, bezahlt, Mahnungen Buchhaltung → Erfolgsrechnung — Einnahmen vs. Ausgaben Mitarbeiter → Lohnabrechnung — monatlich","offerten-status#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","spezialfälle#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","tipps-aus-dem-alltag#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 Briefbogen-Logo in hoher Auflösung — sieht im PDF besser aus","übersicht#Übersicht":"Kunde → Offerte → Projekt → Zeit → Akonto → Schluss anlegen erstellen (aus Offerte) erfassen -Rechnung -Rechnung ↓ QR-Schein"},"title":"Arbeitsablauf"},"/docs/changelog/":{"data":{"":"Versionsgeschichte von RAPPORT. Aktuelle Releases: Gitea .","01x--initial#0.1.x — Initial":"Neu\nErste Setup-Routine (Bürodaten, Mitarbeiter, Kunden) Briefe und Lieferscheine Tauri-2-Bundle für macOS","02x--zeiterfassung#0.2.x — Zeiterfassung":"Neu\nWochenraster mit Halbstunden-Slots Drag \u0026 Drop zur Slot-Erfassung Projekt-Zuweisung pro Eintrag Auswertungen pro Mitarbeiter und Projekt","03x--rechnungen--qr#0.3.x — Rechnungen \u0026amp; QR":"Neu\nRechnungsmodul mit QR-Einzahlungsschein (via swissqrbill) Akonto-, Teil- und Schlussrechnungen PDF-Export mit Bürobriefbogen Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung","04x--projekte--sia-102#0.4.x — Projekte \u0026amp; SIA 102":"Neu\nProjektverwaltung nach SIA 102 Vorgeschlagene Phasen-Anteile am Gesamthonorar Bauschätzwert-basiertes Honorar Verbessert\nZeit-Auswertung pro SIA-Phase Akonto- und Schlussrechnungen mit automatischer Differenzberechnung","05x--mitarbeiter--lohn#0.5.x — Mitarbeiter \u0026amp; Lohn":"Neu\nMitarbeiterverwaltung mit Pensum, Stundensatz, Ferienanspruch Lohnabrechnung mit AHV/IV/EO, ALV, BVG, NBU Jahresabschluss mit Überstundenausgleich Ferien-Prorata bei Eintritt unter Jahr","06x--spesen--buchhaltung#0.6.x — Spesen \u0026amp; Buchhaltung":"Neu\nSpesenerfassung mit Beleg-Upload (Base64 in localStorage) Jahresbudget mit Einnahmen-/Ausgaben-Übersicht Vereinfachte Erfolgsrechnung pro Geschäftsjahr Verbessert\nLohnabrechnung integriert Spesen-Erstattungen CSV-Export aus der Zeiterfassung","070--auto-updater--system-tray#0.7.0 — Auto-Updater \u0026amp; System-Tray":"Neu\nAuto-Updater — Rapport prüft beim Start auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden. (Doku) 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) Quick-Open der letzten 5 Projekte direkt aus dem Tray-Menü Verbessert\nSchnellerer App-Start durch lazy-geladene Views Klarere Statusbadges in der Projekt-Übersicht","080081--patch-releases#0.8.0–0.8.1 — Patch-Releases":"Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe Releases auf Gitea .","082--aktuelle-version-aktuell#0.8.2 — Aktuelle Version \u003cspan class=\"rapport-status new\"\u003eAktuell\u003c/span\u003e":"Veröffentlicht am 2026-05-24.\nNeu / Verbessert\nDiverse Verbesserungen und Bugfixes (Details werden im Release auf Gitea gepflegt) Bekannte Einschränkungen\nBuilds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe Installation § Gatekeeper Linux- und Windows-Builds noch nicht verfügbar","roadmap#Roadmap":"Geplant — keine konkreten Termine:\nLinux-Build (Tauri 2 unterstützt es, Bedarf nötig) Windows-Build (analog) Cloud-Modus Stable (Supabase) — derzeit in 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 ."},"title":"Changelog"},"/docs/datenhaltung/":{"data":{"":"Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.\nDiese Seite beschreibt die Desktop-App (Single-User). Wer im Team arbeitet und Rapport gegen einen Rapport Server betreibt, sichert stattdessen die Postgres-Datenbank — siehe Rapport Server § Backup.","a--einfach-manuell#A · Einfach (manuell)":"Den ganzen Ordner kopieren:\ncp -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#B · Time Machine":"Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.\nEinschränkung: Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.","backup-strategien#Backup-Strategien":"","c--cron-job-täglich-automatisch#C · Cron-Job (täglich automatisch)":"# 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#D · iCloud Drive (off-site)":"Application-Support liegt nicht automatisch in iCloud. Wer das will:\n# 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).","datenmenge#Datenmenge":"Typische Grössen pro Bürojahr:\nInhalt 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 ~ 1–2 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.","export-funktionen-in-der-app#Export-Funktionen (in der App)":"Aus Rapport selbst:\nWas 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.","macos#macOS":"~/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:\nBü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.","schema-migrationen#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.\nCode: src/storage/migrations.js .\nEmpfehlung: Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.","selektiv-nur-einzelne-daten#Selektiv (nur einzelne Daten)":"Da alle Daten in einem JSON unter studio_data_v1 liegen, ist selektive Wiederherstellung manuell:\nBackup-localStorage-Datei öffnen (WebKit-Format → mit Tool wie [WebKit Storage Inspector] lesen, oder via Rapport DevTools) Gewünschte Felder in die aktuelle Instanz übertragen In der Praxis: meistens lohnt sich die vollständige Wiederherstellung mehr.","speicherort-desktop-app#Speicherort (Desktop-App)":"Die Desktop-App speichert alles lokal — keine Cloud, kein Server.","vollständig-rapport-komplett-tot#Vollständig (Rapport komplett tot)":"Rapport beenden (Cmd+Q, nicht nur Fenster zu) Aktuellen Ordner umbenennen (falls noch da): mv \"~/Library/Application Support/com.rapport.app\" \\ \"~/Library/Application Support/com.rapport.app.bak\" Backup-Ordner zurück kopieren: cp -R \"~/Documents/Rapport-Backup-20260523\" \\ \"~/Library/Application Support/com.rapport.app\" Rapport starten","warum-localstorage#Warum localStorage?":"In der Desktop-App ist Rapport eine Single-User-Anwendung. localStorage ist dafür:\nSchnell — 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 — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.","was-wird-nicht-gespeichert#Was wird \u003cstrong\u003enicht\u003c/strong\u003e 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)","wiederherstellung#Wiederherstellung":""},"title":"Datenhaltung"},"/docs/einrichtung/":{"data":{"":"Nach der Installation: Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.","1--bürodaten#1 · Bürodaten":"Einstellungen → Bürodaten\nFeld 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 (\u003e1 MB) vorher in Vorschau verkleinern.","2--mitarbeiter#2 · Mitarbeiter":"Einstellungen → Mitarbeiter → Neu\nFeld Beschreibung Name, Vorname wird in Zeiterfassung \u0026 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. 25–30 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.","3--kunden#3 · Kunden":"Kunden → Neu\nFeld 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#4 · Projekte":"Projekte → Neu\nFeld 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","checkliste#Checkliste":"Nach diesen vier Schritten ist Rapport einsatzbereit:\nBü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.","reihenfolge#Reihenfolge":"Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:\n1. Bürodaten → 2. Mitarbeiter → 3. Kunden → 4. Projekte ▼ ▼ ▼ ▼ Briefbogen, Zeiterfassung, Adressen, Zeiterfassung, QR-Schein, Lohn Rechnungen Rechnungen Login","sia-102-phasen#SIA-102-Phasen":"Wenn als Honorartyp SIA 102 gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe Projekt-Feature.","sozialabzüge-optional#Sozialabzüge (optional)":"In Einstellungen → Lohn:\nAbzug 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."},"title":"Einrichtung"},"/docs/entwicklung/":{"data":{"":"Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.","architektur-in-einem-absatz#Architektur in einem Absatz":"RAPPORT ist eine monolithische SPA: ein React-Root in 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).\nDetaillierte Karte: ARCHITECTURE.md .","beitragen#Beitragen":"Issues \u0026 Pull Requests sind willkommen. Wertvoll sind:\nBug-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.","build#Build":"","desktop-tauri-dmg#Desktop (Tauri DMG)":"npm run build # erst Vite-Build (dist/) npx tauri build # dann Tauri-Bundle (DMG) Output: src-tauri/target/release/bundle/dmg/Rapport__aarch64.dmg","entwicklung#Entwicklung":"","konventionen#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","lizenz#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.","native-window-tauri-fenster-mit-desktop-integration#Native Window (Tauri-Fenster mit Desktop-Integration)":"npx tauri dev Echtes Tauri-Fenster System-Tray, Updater, native APIs verfügbar Erster Start dauert lange (Rust-Compile)","release-workflow#Release-Workflow":"# 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","setup#Setup":"git clone https://git.kgva.ch/karim/RAPPORT.git cd RAPPORT/APP npm install","verzeichnis-karte#Verzeichnis-Karte":"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","voraussetzungen#Voraussetzungen":"Tool Version Node.js ≥ 20 (für Vite 8) npm ≥ 10 Rust toolchain ≥ 1.77.2 (via rustup) Plattform-Tools siehe Tauri Prerequisites Plattform-spezifisch:\nmacOS: Xcode Command Line Tools (xcode-select --install) Windows: Microsoft C++ Build Tools + WebView2 Linux: webkit2gtk-4.1, librsvg2-dev, libayatana-appindicator3-dev, build-essential","web-modus-hmr-schnellster-loop#Web-Modus (HMR, schnellster Loop)":"npm run dev # http://localhost:3000 Hot-Module-Replacement Schnellster Iteration-Loop für UI-Arbeit Datenpersistierung: Browser-localStorage","web-statisches-bundle#Web (statisches Bundle)":"npm run build # Output: dist/ (~500 KB) Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe Web-Modus."},"title":"Entwicklung"},"/docs/erste-schritte/":{"data":{"":"Von der Installation bis zur ersten Rechnung — in sechs Schritten.","01--installation#01 · Installation":"DMG von Gitea Releases herunterladen. Rapport in den Programme-Ordner ziehen. Beim ersten Start: Systemeinstellungen → Datenschutz \u0026 Sicherheit öffnen und Rapport zulassen.\nDie Pre-Release-Builds sind signiert über Tauri, aber (noch) nicht über die Apple-Notarisierung gegangen — daher der manuelle Freigabe-Schritt.","02--einrichtung#02 · Einrichtung":"In den Einstellungen hinterlegen:\nBü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#03 · Zeiterfassung":"Im Modul Zeit:\nMitarbeiter wählen Woche navigieren Stunden per Klick oder Drag erfassen 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#04 · Rechnungen":"Aus einer Offerte oder direkt erstellen:\nSIA-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#05 · Backup":"In der Desktop-App liegen alle Daten als JSON im Applikationsordner:\n~/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.","06--probleme-melden#06 · Probleme melden":"Ein Issue auf Gitea erstellen — mit kurzer Beschreibung, was passiert ist. Screenshots helfen. Bitte die Rapport-Version (links unten in der App) angeben.\nTipp: Wenn die App nicht mehr startet, hilft oft, den Cache-Ordner zu sichern und neu zu starten. Die JSON-Daten selbst bleiben unverändert."},"title":"Erste Schritte"},"/docs/installation/":{"data":{"":"Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.","1--download#1 · Download":"Aktueller Build: Downloads-Seite oder direkt Releases auf Gitea .\nDatei Plattform RAPPORT__aarch64.dmg macOS Apple Silicon RAPPORT__x86_64.dmg macOS Intel (auf Anfrage)","2--dmg-öffnen--installieren#2 · DMG öffnen \u0026amp; installieren":"DMG doppelklicken Rapport.app in den Applications-Ordner ziehen DMG auswerfen","3--erster-start-macos-gatekeeper#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.","4--erstes-setup#4 · Erstes Setup":"Beim ersten Start zeigt Rapport den Setup-Bildschirm. Hier werden die Stammdaten erfasst — siehe Einrichtung.","5--update-strategie#5 · Update-Strategie":"Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe Auto-Updater). Updates können in den Einstellungen deaktiviert werden.\nManuelle Updates: einfach das neuere DMG installieren — die Daten bleiben erhalten, da sie unabhängig von der App liegen (siehe Datenhaltung).","alternative-terminal#Alternative (Terminal)":"Falls der GUI-Weg nicht funktioniert:\nxattr -d com.apple.quarantine /Applications/Rapport.app Das entfernt das Quarantäne-Flag und macOS akzeptiert den Start.","bekannte-probleme#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.","deinstallation#Deinstallation":"# 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.","lösung#Lösung":"Systemeinstellungen → Datenschutz \u0026 Sicherheit öffnen Bis ganz nach unten scrollen — es erscheint: “Rapport” wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.\nAuf “Trotzdem öffnen” klicken Bestätigen Ab dem zweiten Start läuft Rapport ohne Rückfragen.","voraussetzungen#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 , wenn du eine Plattform brauchst."},"title":"Installation"},"/docs/troubleshooting/":{"data":{"":"Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → Issue auf Gitea .","app-startet-nicht#App startet nicht":"","app-startet-zeigt-aber-schwarzen-bildschirm#App startet, zeigt aber schwarzen Bildschirm":"Ursache: WebView-Cache korrupt.\nLösung:\nrm -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#App stürzt sofort beim Start ab":"Ursache: wahrscheinlich beschädigte JSON-Daten in studio_data_v1.\nDiagnose:\n# Daten ansehen (DevTools-Output) open \"~/Library/Application Support/com.rapport.app\" Lösung:\nBackup wiederherstellen (siehe Datenhaltung) Oder als letzter Ausweg: Daten zurücksetzen mv \"~/Library/Application Support/com.rapport.app\" \\ \"~/Library/Application Support/com.rapport.app.bad\" App neu starten → erstellt frische Daten. Anschliessend Setup-Screen.","auto-update-findet-nichts#Auto-Update findet nichts":"Diagnose:\ncurl -s https://git.kgva.ch/karim/RAPPORT/raw/branch/main/APP/latest.json → sollte JSON liefern. Wenn nicht: Server-/Netzwerkproblem.","daten-weg#Daten weg":"","debug-informationen-sammeln#Debug-Informationen sammeln":"Bei einem Issue helfen folgende Infos:\n# 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.","diese-version-überspringen-rückgängig-machen#\u0026ldquo;Diese Version überspringen\u0026rdquo; rückgängig machen":"In Einstellungen → Updates → Übersprungene Versionen zurücksetzen. Beim nächsten Start wird die Version wieder angeboten.","localstorage-voll#localStorage voll":"Symptom: Rapport schreibt Fehler-Toast “Speicher voll” beim Sichern.\nUrsache: macOS WebView limitiert localStorage auf ~10 MB pro Origin.\nLösung:\nSehr grosse Logos durch kleinere ersetzen (Bürodaten → Logo) Belege (Spesen) selektiv löschen oder als externe Datei archivieren Auf Web-Modus wechseln (Postgres ohne praktisches Limit)","login-screen-zeigt-keine-server-url#Login-Screen zeigt keine Server-URL":"Ursache: .env.production enthielt nicht den richtigen VITE_SUPABASE_URL zur Build-Zeit.\nLösung: .env.production prüfen, dann npm run build neu, Container restart.","nach-einem-app-update-fehlen-einträge#Nach einem App-Update fehlen Einträge":"Ursache: mögliche fehlgeschlagene Migration.\nSofortmassnahme:\nRapport beenden (Cmd+Q, nicht nur Fenster zu) Aktuelles Datenverzeichnis sichern: cp -R \"~/Library/Application Support/com.rapport.app\" \\ \"~/Documents/Rapport-Notfall-$(date +%Y%m%d-%H%M)\" Issue erstellen mit: Version vor dem Update (falls bekannt) Version nach dem Update Was fehlt Optional: gesicherter Datenordner (via Pastebin oder verschlüsselt zugesandt)","pdf--qr-schein#PDF / QR-Schein":"","pdf-export-ist-leer--weisses-blatt#PDF-Export ist leer / weisses Blatt":"Ursache: Print-View hat keine Daten (möglicherweise Race-Condition beim Laden).\nLösung: Rechnung schliessen, erneut öffnen, dann PDF.","pdf-schrift-sieht-falsch-aus#PDF-Schrift sieht falsch aus":"Ursache: Web-Schrift nicht geladen, Fallback greift.\nLösung: Vor dem Drucken warten, bis das Vorschau-Bild komplett geladen ist (3–5 Sek).","qr-schein-hat-falsche-daten#QR-Schein hat falsche Daten":"Diagnose-Checkliste:\nIBAN korrekt? (CH, 21 Zeichen, keine Leerzeichen) Empfänger-Adresse vollständig? (PLZ und Ort beide gefüllt) Schuldner-Adresse vollständig? Betrag \u003e 0? Referenz nicht zu lang? (max 27 Zeichen) QR-Bibliothek: swissqrbill — bei merkwürdigen Fehlern dort nachschauen.","rapport-ist-beschädigt-beim-ersten-start#\u0026ldquo;Rapport ist beschädigt\u0026rdquo; beim ersten Start":"Ursache: macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.\nLösung: siehe Installation § 3. Kurz:\nxattr -d com.apple.quarantine /Applications/Rapport.app","realtime-updates-kommen-nicht-an#Realtime-Updates kommen nicht an":"Ursache: Websocket-Support fehlt im Reverse Proxy.\nLösung: In Nginx Proxy Manager für api.* Websocket Support aktivieren.\nSiehe Web-Modus § Troubleshooting.","system-tray#System-Tray":"","tray-icon-erscheint-nicht#Tray-Icon erscheint nicht":"Plattform-Hinweis: Tray-Icons unter macOS sind bei extrem voller Menüleiste oder unter “Bartender”/“Hidden Bar” eventuell unsichtbar.\nDiagnose:\nps aux | grep -i rapport → wenn Prozess läuft, aber kein Icon: in den Tray-Manager-Apps prüfen.\nKonfiguration: Einstellungen → System-Tray → Tray-Icon ausblenden (aus → Icon erzwingen).","tray-menü-reagiert-nicht--hängt#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).","update-lädt-lässt-sich-aber-nicht-installieren#Update lädt, lässt sich aber nicht installieren":"Ursache: Signaturprüfung scheitert (Public-Key in App ≠ Signatur in latest.json).\nLösung: Manuelles Update — DMG direkt von Releases laden und installieren. Daten bleiben erhalten.","updates#Updates":"","web-modus#Web-Modus":"","wenn-nichts-hilft#Wenn nichts hilft":"Neues Issue auf Gitea mit:\nWas du gemacht hast Was passiert ist Was du erwartet hättest Screenshots (auch von DevTools-Konsole falls möglich) Rapport-Version und macOS-Version"},"title":"Troubleshooting"},"/docs/web-modus/":{"data":{"":"Hinweis: Der frühere Supabase-basierte Web-Modus wurde durch Rapport Server abgelöst — den vollständigen Selfhost-Stack mit eigenem Postgres, Auth, Realtime und Storage. Keine externe Cloud-Abhängigkeit mehr.\nDiese Seite bleibt als Referenz erhalten, der empfohlene Weg für Multi-User-Setups ist Rapport Server.","architektur-kurzfassung#Architektur (Kurzfassung)":"┌────────────┐ 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) Auth: E-Mail / Passwort über GoTrue Storage: Belege, Logos in Object-Storage","migration-desktop--cloud#Migration Desktop → Cloud":"Wer mit der Desktop-App startet und später auf den Web-Modus wechseln möchte:\nAktuell: 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 .","setup#Setup":"Alle Setup-Schritte (Repo klonen, .env erstellen, Migrations syncen, Docker-Compose starten, Reverse-Proxy konfigurieren) sind in Rapport Server dokumentiert.","troubleshooting#Troubleshooting":"Siehe Rapport Server § Troubleshooting oder allgemeine Troubleshooting-Seite.","wann-brauchst-du-das#Wann brauchst du das?":"Anwendungsfall Empfehlung Solo-Büro, ein Mac Desktop-App — siehe Installation 2–5 Personen, gleicher Standort Rapport Server auf einem Mac Mini im LAN Verteiltes Team / Home-Office Rapport Server mit SSL + Reverse Proxy Hosted Backend (eigener VPS) Rapport Server auf Linux-VPS"},"title":"Web-Modus"},"/downloads/":{"data":{"":"Aktuelle Builds von Rapport. Quellcode und ältere Versionen auf Gitea .\nRapport besteht aus zwei Komponenten:\nKomponente Für wen Aktuelle Version Desktop-App Solo-Büro, lokale Datenhaltung 0.8.2 Rapport Server Team / Multi-User / Selfhost 0.1.0","auto-update#Auto-Update":"Seit 0.7.0 prüft die Desktop-App beim Start automatisch auf neue Versionen — siehe Auto-Updater. Für Rapport Server: git pull \u0026\u0026 docker compose pull \u0026\u0026 docker compose up -d.","desktop-app--pre-release-082#Desktop-App — Pre-Release 0.8.2":"Aktuelle Version\nNeuerungen — siehe Changelog für Details.","docker-linux--vps--headless#Docker (Linux / VPS / Headless)":"Für Linux-Server, NAS oder VPS — der reine Docker-Compose-Stack ohne GUI.\ngit clone https://git.kgva.ch/karim/rapport-server.git cd rapport-server git checkout 0.1.0 cp .env.example .env # .env editieren (POSTGRES_PASSWORD, JWT_SECRET, SITE_URL) docker compose up -d Vollständige Anleitung mit .env-Variablen, Reverse-Proxy und Backup → Server-Seite.\nContainer-Images werden von Docker Hub / Gitea-Registry gezogen — docker compose pull aktualisiert auf die neuesten Tags.","linux--windows#Linux \u0026amp; Windows":"Geplant. Rapport basiert auf Tauri 2 — eine Portierung ist möglich, sobald der Bedarf besteht. Issue erstellen , wenn du eine Plattform brauchst.","macos#macOS":"Architektur Download Apple Silicon (M1–M4) RAPPORT_0.8.2_aarch64.dmg Intel (x86_64) auf Anfrage Erstinstallation: Systemeinstellungen → Datenschutz \u0026 Sicherheit öffnen und Rapport zulassen. Die Builds sind über Tauri signiert, aber (noch) nicht Apple-notarisiert.","quellcode#Quellcode":"Desktop-App — Tauri / React:\ngit clone https://git.kgva.ch/karim/RAPPORT.git cd RAPPORT/APP npm install npm run tauri dev Voraussetzungen: Node 20+, Rust (stable), Xcode-CLI (macOS).\nRapport Server:\ngit clone https://git.kgva.ch/karim/rapport-server.git Beide Repos auf Gitea — Issues und PRs willkommen.","rapport-server--010#Rapport Server — 0.1.0":"Erstes Release\nSelfhost-Backend für Multi-User-Setups — Postgres, Auth, Realtime-Sync, Storage. Details und Setup-Anleitung auf der Server-Seite.","server-app-macos#Server-App (macOS)":"GUI zum Starten, Stoppen und Verwalten der Server-Instanz auf einem Mac (Mac Mini, Studio-Rechner). Bündelt den Docker-Compose-Stack.\nArchitektur Download Apple Silicon (M1–M4) RAPPORT_SERVER_0.1.0_aarch64.dmg Intel (x86_64) auf Anfrage Voraussetzung: Colima oder Docker Desktop muss installiert sein. Die App verwaltet den Container-Stack darüber."},"title":"Downloads"},"/faq/":{"data":{"":"Häufige Fragen zu RAPPORT. Bei Bugs oder weiteren Fragen → Issue auf Gitea .","für-wen-ist-rapport-gedacht#Für wen ist Rapport gedacht?":"Für kleine Architekturbüros in der Schweiz. Die Strukturen folgen der SIA 102 (Phasen, Honorar). Rapport wurde für den internen Gebrauch entwickelt und wird mit diesem Projekt öffentlich geteilt.","ist-die-software-stabil-genug-für-den-betrieb#Ist die Software stabil genug für den Betrieb?":"Noch nicht. Aktuell befindet sich Rapport in aktiver Entwicklung (Pre-Release 0.8.2). Funktionen können sich ändern, Bugs sind möglich. Regelmässige Backups sind empfohlen. Testen und Feedback geben ist erwünscht.","ist-rapport-kostenlos#Ist Rapport kostenlos?":"Ja, vollständig. Quellcode unter GNU AGPL-3.0-or-later. Keine versteckten Kosten, keine Telemetrie. Die Daten bleiben lokal auf deinem Computer bzw. in deiner Instanz. Du hast die komplette Kontrolle über deine Daten.","kann-ich-zum-projekt-beitragen#Kann ich zum Projekt beitragen?":"Ja. Issues und Pull Requests sind willkommen auf Gitea . Rapport ist kein Framework — konkrete Verbesserungen für den Büroalltag sind am wertvollsten:\nBug-Reports mit Reproduktionsschritten Workflow-Verbesserungen aus dem realen Büroalltag Vorlagen (Briefe, Protokolle, Lieferscheine) für andere Büros Übersetzungen / Internationalisierung","warum-open-source#Warum Open Source?":"Bürowissen sollte nicht in proprietären Tools eingesperrt sein. Studio-Management-Workflows sind in der Branche gut etabliert — ein Tool, das die Schweizer Konventionen (SIA 102, QR-Rechnung) sauber umsetzt, gehört allen.\nAGPL-3.0 stellt sicher, dass Verbesserungen wieder ins Projekt fliessen.","was-ist-mit-dem-qr-einzahlungsschein#Was ist mit dem QR-Einzahlungsschein?":"Rapport erzeugt Schweizer QR-Rechnungen nach Norm — direkt eingebettet in das PDF der Rechnung. IBAN, Bürodaten und Empfänger werden aus den Einstellungen bzw. den Kundendaten gezogen. Akonto-, Teil- und Schlussrechnungen werden unterstützt.","welche-systeme-werden-unterstützt#Welche Systeme werden unterstützt?":"Aktuell nur macOS (Intel \u0026 Apple Silicon). Rapport basiert auf Tauri — eine Portierung auf Linux und Windows ist möglich, sobald der Bedarf seitens Community besteht.","wie-erhalte-ich-hilfe-bei-einem-problem#Wie erhalte ich Hilfe bei einem Problem?":"Ein Issue auf Gitea ist der beste Weg. Bitte beschreibe, was du gemacht hast und was passiert ist. Screenshots helfen. Die Rapport-Version (links unten in der App) bitte angeben.\nKanal Verwendung Gitea Issues Bugs, Feature-Wünsche, allgemeine Fragen gabrielevarano.ch Entwickler-Kontakt","wie-funktioniert-die-zeiterfassung#Wie funktioniert die Zeiterfassung?":"Tages- und Wochenraster mit Drag \u0026 Drop. Jeder Eintrag wird einem Projekt zugewiesen. Auswertungen pro Mitarbeiter und Projekt sind unter Zeit abrufbar. Ferienverwaltung mit Prorata und Jahresabschluss mit Überstundenausgleich.","wo-werden-die-daten-gespeichert#Wo werden die Daten gespeichert?":"Rapport unterstützt zwei Modi, beide selbst-gehostet:\nDesktop-App (Single-User) — alle Daten liegen lokal auf deinem Mac (localStorage im Applikationsordner). Kein Server nötig, kein Cloud-Account, keine Telemetrie. Server-Modus (Multi-User) — Daten in einer eigenen PostgreSQL-Datenbank über Rapport Server. Mehrere Personen, Realtime-Sync, eigene Domain. Wechsel direkt im Login-Bildschirm der App. In beiden Fällen bleibt die Kontrolle über die Daten bei dir."},"title":"FAQ"},"/features/":{"data":{"":"Die Bausteine von RAPPORT — Studio-Management für Schweizer Architekturbüros.","module#Module":"ZeiterfassungTages- \u0026 Wochenraster mit Drag \u0026 Drop. Rechnungen \u0026 OffertenQR-Einzahlungsscheine, SIA-Phasen, Akonto. Projekt- \u0026 KundenverwaltungSIA 102, Budget, Phasen, Beteiligte. MitarbeiterFerien, Absenzen, Lohnabrechnung. Spesen \u0026 BürobudgetBelegupload, Jahresbudget, Internes. Protokolle \u0026 LieferscheineSitzungsprotokolle, Briefe, Lieferscheine. Auto-UpdaterSignierte Updates via Tauri. System-TrayHide-on-Close, Quick-Open."},"title":"Features"},"/features/auto-updater/":{"data":{"":"Neu in 0.7.0\nRapport prüft beim Start automatisch auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden.","funktionsweise#Funktionsweise":"Beim App-Start:\nAbfrage gegen https://git.kgva.ch/karim/RAPPORT/releases/latest.json Versionsvergleich mit lokaler version im Tauri-Bundle Bei neuer Version → Update-Dialog Bei Bestätigung → Download + Signaturprüfung + Installation + Neustart","latest-endpoint#Latest-Endpoint":"{ \"version\": \"0.8.2\", \"notes\": \"Rapport 0.8.2\", \"pub_date\": \"2026-05-24T00:00:00Z\", \"platforms\": { \"darwin-aarch64\": { \"signature\": \"…\", \"url\": \"https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.2/RAPPORT%20PRE-RELEASE.app.tar.gz\" } } }","optionen#Optionen":"Update installieren — Download \u0026 Neustart Diese Version überspringen — überspringt nur diese eine Version Später erinnern — beim nächsten Start erneut fragen Updates können in den Einstellungen komplett deaktiviert werden.","sicherheit#Sicherheit":"Updates werden mit dem Tauri-Updater-Schlüssel signiert Manipulierte Downloads werden abgelehnt Quellcode und Build sind reproduzierbar (Gitea CI, geplant)"},"title":"Auto-Updater"},"/features/mitarbeiter/":{"data":{"":"In Arbeit\nFerienverwaltung, interne Stunden / Absenzen und Lohnabrechnung. Jahresabschluss mit Überstundenausgleich.","absenzen#Absenzen":"Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter.","ferienverwaltung#Ferienverwaltung":"Prorata-Berechnung bei Eintritt unter Jahr Ferien-Saldo in Tagen (live) Halbtage unterstützt Übertrag ins Folgejahr oder Auszahlung","jahresabschluss#Jahresabschluss":"Ferien-Restguthaben übertragen oder auszahlen Überstunden ausgleichen oder vergüten Lohnausweis vorbereiten (Export)","lohnabrechnung#Lohnabrechnung":"Monatliche Abrechnung mit:\nGrundlohn (basierend auf Pensum) Überstunden-Vergütung Spesen-Erstattung Sozialabzüge (AHV, ALV, Pensionskasse) PDF-Export pro Mitarbeiter.","stammdaten#Stammdaten":"Pro Mitarbeiter:\nName, Eintrittsdatum, Pensum (%) Stundensatz (intern, für Rechnungen) Ferienanspruch (Tage / Jahr) Lohn (monatlich, brutto)","verwandte-module#Verwandte Module":"Zeiterfassung — Pensum-Soll vs. Stunden-Ist Spesen — Spesen-Erstattung in der Lohnabrechnung"},"title":"Mitarbeiter"},"/features/projekte/":{"data":{"":"In Arbeit\nProjekte nach SIA 102 mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen.","auswertung#Auswertung":"Pro Projekt:\nGeleistete Stunden vs. Budget Honorar-Saldo (verrechnet / Akonto / offen) Phasen-Fortschritt","kundendatenbank#Kundendatenbank":"Adresse, Ansprechperson, Telefon, E-Mail Honorartyp (Stundensatz / SIA / Pauschal) Verknüpfung zu allen Projekten und Rechnungen des Kunden","projektstruktur#Projektstruktur":"Jedes Projekt besitzt:\nStammdaten — Nummer, Bezeichnung, Standort, Bauschätzwert Kunde — verknüpft mit Kundendatenbank Beteiligte — Bauleitung, Fachplaner, Behörden Phasen — SIA 102 (Vorprojekt, Bauprojekt, Ausschreibung, …) Budget — Gesamthonorar, pro Phase aufgeteilt","sia-102#SIA 102":"Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden.\nPhase Anteil (Standard) 31 — Vorprojekt 9 % 32 — Bauprojekt 21 % 33 — Bewilligung 3 % 41 — Ausschreibung 18 % 51 — Ausführung 38 % 52 — Inbetriebnahme 6 % 53 — Abschluss 5 %","verwandte-module#Verwandte Module":"Rechnungen — Offerte → Projekt Zeiterfassung — Stunden-Auswertung pro Phase"},"title":"Projekte"},"/features/protokolle/":{"data":{"":"In Arbeit\nEinfache Erstellung von Sitzungsprotokollen mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild.","briefe#Briefe":"Brief-Editor mit:\nEmpfänger aus Kundendatenbank Bezugszeile, Anrede, Text, Grussformel Briefbogen-Vorlage mit Logo PDF-Export","lieferscheine#Lieferscheine":"Pro Lieferung:\nEmpfänger, Datum, Bezug Positionen (Plan-Nummer, Bezeichnung, Anzahl, Massstab) Unterschriftenfeld Konsistentes Erscheinungsbild über alle Dokumenttypen — eine Briefbogen-Vorlage, mehrere Verwendungen.","sitzungsprotokolle#Sitzungsprotokolle":"Pro Sitzung:\nDatum, Ort, Teilnehmer (aus Beteiligten-Liste) Traktanden als nummerierte Liste Pro Traktandum: Beschluss, Aufgabe, Verantwortlich, Frist Anhänge PDF-Export mit Bürobriefbogen.","verwandte-module#Verwandte Module":"Projekte — Beteiligte als Empfänger"},"title":"Protokolle"},"/features/rechnungen/":{"data":{"":"In Arbeit\nQR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen. Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export.","honorarmodelle#Honorarmodelle":"Modell Berechnung Verwendung Stundensatz Aus Zeiterfassung × Mitarbeiter-Stundensatz Kleinaufträge, Beratung SIA-Phasen Bauschätzwert × Honorarsatz × Phasenanteil Reguläre Architektur-Aufträge Pauschal Fester Betrag Auf Wunsch des Kunden","pdf-export#PDF-Export":"Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant).","qr-einzahlungsschein#QR-Einzahlungsschein":"Schweizer QR-Rechnung nach Norm — direkt eingebettet in die PDF.\nAusgelesen aus:\nBürodaten — IBAN, Empfänger-Adresse Kundendaten — Schuldner-Adresse Rechnungs-Daten — Betrag, Referenz, Zusatzinformation","verwandte-module#Verwandte Module":"Projekte — Honorarstruktur stammt aus dem Projekt Zeiterfassung — Stundensatz-Rechnungen","workflow#Workflow":"Offerte erstellen — auf Basis SIA 102 oder pauschal Kunde nimmt an → konvertieren in Projekt + Rechnung Akonto-Rechnungen während der Projektlaufzeit Schlussrechnung mit Differenz zum bisher Akonto-bezahlten"},"title":"Rechnungen"},"/features/spesen/":{"data":{"":"In Arbeit\nSpesenerfassung mit Belegupload. Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen.","auswertung#Auswertung":"Einnahmen pro Kunde / Projekt Ausgaben pro Kategorie / Mitarbeiter Erfolgsrechnung pro Geschäftsjahr (vereinfacht)","jahresbudget#Jahresbudget":"Übersicht über:\nEinnahmen — Rechnungsbeträge, sortiert nach Eingang Ausgaben — Spesen, Bürokosten, Löhne, Sozialabzüge Saldo pro Monat / Quartal / Jahr","spesenerfassung#Spesenerfassung":"Pro Mitarbeiter:\nDatum, Betrag, Kategorie Beleg-Upload (PDF, JPG, PNG) Projekt-Zuordnung (optional) Status (offen / erstattet) Kategorien: Reise, Verpflegung, Material, Telefon, Sonstiges.","verwandte-module#Verwandte Module":"Mitarbeiter — Spesen-Erstattung in der Lohnabrechnung Rechnungen — Einnahmen-Quelle"},"title":"Spesen"},"/features/system-tray/":{"data":{"":"Neu in 0.7.0\nSchnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter — Cmd+Q beendet die App vollständig.","konfiguration#Konfiguration":"In den Einstellungen:\nBeim Systemstart starten (Login-Item) — Standard: aus Beim Schliessen beenden statt ins Tray — Standard: aus Tray-Icon ausblenden — App läuft, aber kein Menüleisten-Icon","tray-menü#Tray-Menü":"Rapport zeigen — Fenster nach vorne Neue Zeiterfassung — direkt im Zeit-Modul Neue Rechnung — direkt im Rechnungs-Modul Letzte Projekte — Quick-Open der letzten 5 Projekte Einstellungen Rapport beenden","verhalten#Verhalten":"Aktion Verhalten Fenster schliessen (⌘W oder rotes X) App läuft im Tray weiter Cmd+Q App wird vollständig beendet Klick auf Tray-Icon Fenster nach vorne, oder zeigen Rechtsklick auf Tray-Icon Menü mit Schnellzugriffen","verwandte-module#Verwandte Module":"Auto-Updater — prüft Updates im Hintergrund"},"title":"System-Tray"},"/features/zeiterfassung/":{"data":{"":"In Arbeit\nTages- und Wochenraster mit Drag \u0026 Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss.","auswertungen#Auswertungen":"Pro Mitarbeiter und pro Projekt:\nGeleistete Stunden vs. Soll-Pensum Ferienanspruch / -saldo (mit Prorata bei Eintritt unter Jahr) Überstunden-Saldo Stundenaufschlüsselung nach SIA-Phase pro Projekt","eingabe#Eingabe":"Wochenraster mit den 5 (oder 7) Arbeitstagen Halbstunden-Slots von 06:00 bis 22:00 Klick oder Drag über mehrere Slots Jeder Eintrag wird einem Projekt zugewiesen (Pflichtfeld) Mehrfacheinträge pro Slot möglich (z. B. parallele Telefonate)","jahresabschluss#Jahresabschluss":"Am Jahresende:\nFerien-Restguthaben übertragen oder auszahlen Überstunden ausgleichen oder vergüten Neues Jahr automatisch initialisieren","konzept#Konzept":"Die Zeiterfassung ist das Kernmodul von RAPPORT — alle anderen Module (Rechnungen, Auswertungen, Lohnabrechnung) greifen auf die hier erfassten Stunden zu.","verwandte-module#Verwandte Module":"Rechnungen — Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung Projekte — Stunden-Auswertung pro SIA-Phase Mitarbeiter — Pensum, Ferienanspruch"},"title":"Zeiterfassung"},"/glossary":{"data":{},"title":"Glossary"},"/hosting/":{"data":{"":"Gehostet in der Schweiz · Ohne eigenen Server RAPPORT Hosting Ihre eigene Rapport-Instanz — in Minuten startklar. Studio-Management für Architekturbüros, gehostet, gewartet und gesichert. Sie arbeiten, wir kümmern uns um den Rest. Jetzt starten Preise ansehen ↗ Schweizer Hosting Tägliche Backups Jederzeit kündbar Keine Installation SO EINFACH\nRegistrieren, Abo wählen, loslegen Keine Server-Administration, keine Updates, keine Sorgen um Backups. Sie bekommen eine fertige Rapport-Instanz mit eigener Adresse — wir betreiben sie für Sie in der Schweiz.\nIn Minuten startklar Konto erstellen, Abo wählen, fertig. Ihre Instanz wird automatisch eingerichtet — keine Installation, keine Technik.\nSchweizer Hosting Ihre Daten bleiben in der Schweiz. Tägliche Backups, sichere Infrastruktur — ohne dass Sie sich darum kümmern müssen.\nVoller Funktionsumfang Zeiterfassung, Rechnungen mit QR-Einzahlungsschein, Offerten, Projekte nach SIA 102, Mitarbeiter — alles in einer App.\nImmer aktuell Updates und Wartung übernehmen wir. Sie arbeiten immer mit der neuesten Version, ganz ohne Aufwand.\nFaire Preise Transparente Abos ab CHF 19/Monat. Monatlich kündbar, keine versteckten Kosten, keine Einrichtungsgebühr.\nKein Lock-in Rapport ist Open Source (AGPL). Hosting nimmt Ihnen nur die Technik ab — Sie können jederzeit zum Selbstbetrieb wechseln.\nKostenlos registrieren"},"title":"Hosting"},"/lizenz/":{"data":{"":"Lizenz von RAPPORT, Zugehörigkeit zu OpenBureau und Attribution der verwendeten Open-Source-Software.","desktop-wrapper#Desktop-Wrapper":"Software Verwendung Lizenz Tauri 2 Cross-Platform Desktop-Wrapper MIT / Apache-2.0 WebKit WebView-Engine (macOS) LGPL-2.1 / BSD","diese-website#Diese Website":"Software Verwendung Lizenz Hugo Static-Site-Generator Apache-2.0 Hextra Hugo-Theme (von Xin) MIT Inter UI-Schrift (Rasmus Andersson) SIL OFL 1.1 Playfair Display Headings SIL OFL 1.1 Alle Logos und Marken-Namen gehören ihren jeweiligen Eigentümern.","frontend#Frontend":"Software Verwendung Lizenz React 19 UI-Bibliothek MIT Vite Build-Tool, Dev-Server MIT swissqrbill QR-Einzahlungsscheine MIT","kontakt#Kontakt":"Fragen zur Lizenz, kommerzieller Einsatz, Spezialfälle: Issue auf Gitea oder via gabrielevarano.ch .","lizenz#Lizenz":"Lizenziert unter GNU Affero General Public License v3.0 oder höher (AGPL-3.0-or-later ).\nDies bedeutet im Kern:\nFreie Nutzung für jeden Zweck (privat, kommerziell, behördlich) Freier Zugang zum Quellcode Freie Modifikation und Weitergabe — unter derselben Lizenz Netzwerk-Nutzung gilt als Weitergabe — wer eine modifizierte Version als Service anbietet, muss den Quellcode offenlegen Eigene Builds, eigene Forks, eigene Anpassungen — alles erlaubt, solange Modifikationen wieder unter AGPL-3.0 veröffentlicht werden.","lizenz-volltexte#Lizenz-Volltexte":"Die vollständigen Lizenztexte:\nAGPL-3.0 — RAPPORT MIT — React, Vite, Tauri, Hextra, swissqrbill Apache-2.0 — Tauri, Hugo, Supabase SIL OFL 1.1 — Inter, Playfair Display","mitwirkende#Mitwirkende":"RAPPORT wird derzeit als Ein-Personen-Projekt von Karim Gabriele Varano entwickelt. Beiträge — Code, Issues, Übersetzungen, Vorlagen — sind willkommen.\nWer beitragen möchte → Gitea Issues .","openbureau#OpenBureau":"RAPPORT ist Teil der OpenBureau-Initiative — einer Sammlung freier Software-Werkzeuge für den Architektur-Büro-Alltag.\nDie Idee: Bürowissen — Workflows, Konventionen, Vorlagen — sollte nicht in proprietären Tools eingesperrt sein. OpenBureau-Tools setzen die in der Branche etablierten Konventionen (SIA-Normen, QR-Rechnung, Plan-Verwaltung) sauber um und stehen unter freien Lizenzen zur Verfügung.\nTool Zweck Status RAPPORT Studio-Management Desktop-App (Zeit, Rechnungen, Projekte) Pre-Release Rapport Server Selfhost-Stack (Postgres + Auth + Realtime + Storage) Pre-Release DOSSIER Rhino-8-Plugin für Plan- und Dokumentationsausgabe Pre-Release Mehr unter gabrielevarano.ch .","rapport#RAPPORT":"RAPPORT — Studio Management Software für Architekturbüros.\nQuellcode: git.kgva.ch/karim/RAPPORT Autor: Karim Gabriele Varano","rapport-server-selfhost-stack#Rapport Server (Selfhost-Stack)":"Software Verwendung Lizenz PostgreSQL Datenbank PostgreSQL-Lizenz GoTrue Authentication-Service MIT PostgREST REST-API über Postgres-Schema MIT Realtime WebSocket-Sync Apache-2.0 Storage Object-Storage für Belege \u0026 Logos Apache-2.0 Kong API-Gateway Apache-2.0 nginx Frontend-Webserver BSD-2-Clause Docker Compose Orchestrierung Apache-2.0","verwendete-open-source-software#Verwendete Open-Source-Software":"RAPPORT baut auf freier Software auf. Diese Liste nennt die wichtigsten Komponenten und ihre jeweiligen Lizenzen."},"title":"Lizenz"},"/server/":{"data":{"":"Self-Hosting\nRapport Server — der vollständige Selfhost-Stack für Rapport. Eigene Daten, eigene Domain, eigener Server. Komplett Open-Source, Docker-Compose, AGPL-3.0.","1--repo-klonen#1 · Repo klonen":"git clone https://git.kgva.ch/karim/rapport-server.git cd rapport-server","2--env-erstellen#2 · \u003ccode\u003e.env\u003c/code\u003e erstellen":"cp .env.example .env In .env müssen mindestens diese Werte ersetzt werden:\nVariable Was POSTGRES_PASSWORD DB-Passwort (≥ 32 Zeichen, zufällig) JWT_SECRET JWT-Signatur (≥ 32 Zeichen, zufällig) ANON_KEY / SERVICE_ROLE_KEY aus JWT-Secret abgeleitet SITE_URL Public-URL der Instanz (z. B. https://app.rapport.studio.ch) Zufallswerte generieren:\nopenssl rand -hex 32 # für POSTGRES_PASSWORD und JWT_SECRET node scripts/generate-keys.mjs # ANON_KEY + SERVICE_ROLE_KEY aus JWT_SECRET","3--migrations-holen#3 · Migrations holen":"Die SQL-Migrations stammen aus dem App-Repo. Einmal initial holen:\n./scripts/sync-migrations.sh Bei späteren Rapport-Updates erneut ausführen, dann docker compose down \u0026\u0026 docker compose up -d.","4--stack-starten#4 · Stack starten":"docker compose up -d Erststart dauert ~1 Minute (Postgres initialisiert sich, Migrations laufen, Container starten).","5--health-check#5 · Health-Check":"docker compose ps Alle Container sollten healthy zeigen. Frontend ist dann erreichbar unter http://localhost:8080.","architektur#Architektur":"Rapport Server bündelt sechs Open-Source-Komponenten zu einem stimmigen Stack:\n┌──────────────────────────────────────────────────────┐ │ Browser / Desktop-App │ └──────────────┬───────────────────────┬───────────────┘ │ │ ▼ ▼ ┌──────────┐ ┌──────────┐ │ nginx │ │ Kong │ ← API-Gateway │ (app) │ │ │ └──────────┘ └──────────┘ │ ┌───────────────────┼─────────────────────┐ ▼ ▼ ▼ ┌────────┐ ┌──────────┐ ┌─────────┐ │ GoTrue │ │PostgREST │ │ Realtime│ │ (Auth) │ │ (API) │ │ (WS) │ └────────┘ └──────────┘ └─────────┘ │ │ │ └───────────────────┼─────────────────────┘ ▼ ┌─────────────────┐ │ PostgreSQL │ └─────────────────┘ │ ▼ ┌─────────────────┐ │ Storage │ ← Belege, Logos └─────────────────┘ Komponente Funktion PostgreSQL Datenbank — alle Rapport-Daten GoTrue Authentication — Email/Passwort, JWT-Tokens PostgREST REST-API direkt aus dem Postgres-Schema Realtime WebSocket-Sync für Live-Updates Storage Object-Storage für Belege \u0026 Logos Kong API-Gateway, routet alle Calls app (nginx) Liefert das Rapport-Frontend (React-Build) Alles in einem Docker-Compose. Keine Cloud-Abhängigkeit, keine Telemetrie.","backup#Backup":"","bezug-rapport--rapport-server#Bezug Rapport ↔ Rapport Server":"Komponente Wo Lizenz Rapport Desktop-App git.kgva.ch/karim/RAPPORT AGPL-3.0 Rapport Server git.kgva.ch/karim/rapport-server AGPL-3.0 Die Desktop-App kann wahlweise im Lokal-Modus (JSON, kein Server nötig) oder im Cloud-Modus (gegen Rapport Server) betrieben werden. Wechsel erfolgt im Login-Bildschirm der App.","brauche-ich-supabase-cloud#Brauche ich Supabase Cloud?":"Nein. Rapport Server ist die Selfhost-Variante derselben Komponenten (Postgres + GoTrue + PostgREST + Realtime + Storage), aber komplett auf eigener Infrastruktur. Kein Supabase-Account, keine externe Abhängigkeit.","häufige-fragen#Häufige Fragen":"","kann-ich-von-der-desktop-app-auf-rapport-server-migrieren#Kann ich von der Desktop-App auf Rapport Server migrieren?":"Im Login der Desktop-App auf Cloud wechseln, Server-URL eingeben, Account erstellen, Daten manuell wieder anlegen (Bürodaten, Mitarbeiter, Kunden). Ein direkter localStorage → Postgres-Import ist geplant .","postgres-dump#Postgres-Dump":"docker compose exec -T db pg_dumpall -U postgres \u003e backup-$(date +%Y%m%d).sql Empfohlen: per cron täglich + auf externe Disk / S3 / Backblaze sichern.","quellcode#Quellcode":"git.kgva.ch/karim/rapport-server — Issues, Pull Requests und Forks willkommen.","restore#Restore":"docker compose down docker volume rm rapport-server_postgres-data docker compose up -d db sleep 10 cat backup-YYYYMMDD.sql | docker compose exec -T db psql -U postgres docker compose up -d","reverse-proxy--https#Reverse-Proxy + HTTPS":"Für Production-Setups mit eigener Domain — Caddy ist die einfachste Variante (config-as-code, Let’s-Encrypt automatisch):\napp.rapport.studio.ch { reverse_proxy localhost:8080 } api.rapport.studio.ch { reverse_proxy localhost:8000 } In .env dann:\nSITE_URL=https://app.rapport.studio.ch API_EXTERNAL_URL=https://api.rapport.studio.ch Alternativ über Nginx Proxy Manager mit Web-UI — siehe Troubleshooting.","setup-in-5-schritten#Setup in 5 Schritten":"","storage-belege-logos#Storage (Belege, Logos)":"docker compose exec storage tar -czf - /var/lib/storage \u003e storage-$(date +%Y%m%d).tar.gz","updates#Updates":"git pull ./scripts/sync-migrations.sh # falls neue SQL-Migrationen docker compose pull # neueste Container-Versionen docker compose up -d # neu starten Daten bleiben erhalten — das Volume postgres-data wird nicht angetastet.","voraussetzungen#Voraussetzungen":"OS Container-Runtime Linux (Ubuntu 22.04+, Debian 12+, …) Docker Engine + Compose v2 macOS (Mac Mini etc.) Colima + Docker CLI — voll OSS Auf macOS funktionieren auch OrbStack oder Docker Desktop, beide sind aber proprietär. Colima ist die OSS-Alternative und für Selfhost vollkommen ausreichend.\nPlus: ein DNS-Name für TLS (z. B. rapport.studio.ch), und optional ein Reverse-Proxy wie Nginx Proxy Manager oder Caddy .","wann-brauchst-du-rapport-server#Wann brauchst du Rapport Server?":"Szenario Lösung Ein Mensch, ein Mac Desktop-App reicht — Installation Mehrere Personen im Studio Rapport Server auf einem Mac Mini oder Linux-Server Verteiltes Team, Home-Office, Mobile-Zugriff Rapport Server mit Reverse-Proxy + SSL Cloud-Hosting bei einem Anbieter Rapport Server auf VPS/Hetzner/etc. Die Desktop-App speichert lokal als JSON. Rapport Server bringt Postgres + Multi-User + Realtime-Sync — für alle, die zu zweit oder im Team arbeiten.","was-kostet-das#Was kostet das?":"Nichts — Rapport Server ist Open-Source (AGPL-3.0). Du brauchst nur einen Server (Mac Mini, NAS, VPS) und ggf. eine Domain.","wieviel-server-resourcen#Wieviel Server-Resourcen?":"Ein Mac Mini M1 (8 GB RAM) reicht problemlos für ein 5-Personen-Studio. Linux-VPS mit 2 GB RAM + 2 CPU reicht auch."},"title":"Server"}} \ No newline at end of file diff --git a/public/docs/arbeitsablauf/index.html b/public/docs/arbeitsablauf/index.html index 3ceb869..13e1c10 100644 --- a/public/docs/arbeitsablauf/index.html +++ b/public/docs/arbeitsablauf/index.html @@ -1,5 +1,21 @@ -Typischer Arbeitsablauf – RAPPORT + + + + + + + + +Typischer Arbeitsablauf – RAPPORT + + + + +Zum Inhalt springen
Arbeitsablauf

Typischer Arbeitsablauf

Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.

Übersicht -

  Kunde     →     Offerte    →    Projekt    →    Zeit   →    Akonto   →    Schluss
- anlegen        erstellen       (aus Offerte)   erfassen    -Rechnung      -Rechnung
-                                                                  ↓
-                                                              QR-Schein

1 · Kunde anlegen -

Kunden → Neu — siehe Einrichtung § 3.

Falls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.

2 · Offerte erstellen -

Offerten → Neu

FeldInhalt
Kundeaus Kundendatenbank wählen
BezeichnungProjekttitel (z. B. “Einfamilienhaus Müller, Bern”)
HonorartypStundensatz / SIA 102 / Pauschal
Bauschätzwertbei SIA — Bruttowert in CHF
Phasenbei SIA — anzuklickende Phasen
Positionenbei Stundensatz/Pauschal — Position, Beschreibung, Betrag

Mit PDF exportieren — fertige Offerte für den Kunden.

Offerten-Status -

StatusBedeutung
Entwurfnoch nicht versandt
Versandtbeim Kunden, wartet auf Antwort
AngenommenKunde hat zugesagt — bereit zur Konvertierung
AbgelehntKunde 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.

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

FeldInhalt
Projektaus aktiven Projekten
Bezug“Akonto für Phase 31 — Vorprojekt”
BetragStundensatz × Stunden, oder Phasenanteil × Bausumme
Fälligkeiti. 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.

6 · Schlussrechnung -

Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.

Rechnungen → Neu → Schlussrechnung

Rapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:

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
  • Briefbogen-Logo in hoher Auflösung — sieht im PDF besser aus
\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Arbeitsablauf
+
+ +
+ +
+

Typischer Arbeitsablauf

+ +
+ +

Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.

+

Übersicht +

+ +
  Kunde     →     Offerte    →    Projekt    →    Zeit   →    Akonto   →    Schluss
+ anlegen        erstellen       (aus Offerte)   erfassen    -Rechnung      -Rechnung
+                                                                  ↓
+                                                              QR-Schein
+ +
+
+

1 · Kunde anlegen +

Kunden → Neu — siehe Einrichtung § 3.

+

Falls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.

+

2 · Offerte erstellen +

Offerten → Neu

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldInhalt
Kundeaus Kundendatenbank wählen
BezeichnungProjekttitel (z. B. “Einfamilienhaus Müller, Bern”)
HonorartypStundensatz / SIA 102 / Pauschal
Bauschätzwertbei SIA — Bruttowert in CHF
Phasenbei SIA — anzuklickende Phasen
Positionenbei Stundensatz/Pauschal — Position, Beschreibung, Betrag
+

Mit PDF exportieren — fertige Offerte für den Kunden.

+

Offerten-Status +

+ + + + + + + + + + + + + + + + + + + + + + + + +
StatusBedeutung
Entwurfnoch nicht versandt
Versandtbeim Kunden, wartet auf Antwort
AngenommenKunde hat zugesagt — bereit zur Konvertierung
AbgelehntKunde 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.

+

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

+ + + + + + + + + + + + + + + + + + + + + + + + + +
FeldInhalt
Projektaus aktiven Projekten
Bezug“Akonto für Phase 31 — Vorprojekt”
BetragStundensatz × Stunden, oder Phasenanteil × Bausumme
Fälligkeiti. 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.

+

6 · Schlussrechnung +

Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.

+

Rechnungen → Neu → Schlussrechnung

+

Rapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:

+
+ +
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
  • +
  • Briefbogen-Logo in hoher Auflösung — sieht im PDF besser aus
  • +
+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/changelog/index.html b/public/docs/changelog/index.html index 02a4262..4d76597 100644 --- a/public/docs/changelog/index.html +++ b/public/docs/changelog/index.html @@ -1,8 +1,24 @@ -Changelog – RAPPORT + + + + + + + + +Changelog – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen
Changelog

Changelog

Versionsgeschichte von RAPPORT. Aktuelle Releases: Gitea.

0.8.2 — Aktuelle Version Aktuell -

Veröffentlicht am 2026-05-24.

Neu / Verbessert

Bekannte Einschränkungen

  • Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe Installation § Gatekeeper
  • Linux- und Windows-Builds noch nicht verfügbar

0.8.0–0.8.1 — Patch-Releases -

Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe Releases auf Gitea.

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)
  • 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)
  • 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 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.

\ No newline at end of file +Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe Installation § Gatekeeper Linux- und Windows-Builds noch nicht verfügbar 0.8.0–0.8.1 — Patch-Releases Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe Releases auf Gitea ."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Changelog
+
+ +
+ +
+

Changelog

+ +
+ +

Versionsgeschichte von RAPPORT. Aktuelle Releases: Gitea.

+

0.8.2 — Aktuelle Version Aktuell +

Veröffentlicht am 2026-05-24.

+

Neu / Verbessert

+ +

Bekannte Einschränkungen

+
    +
  • Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe Installation § Gatekeeper
  • +
  • Linux- und Windows-Builds noch nicht verfügbar
  • +
+

0.8.0–0.8.1 — Patch-Releases +

Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe Releases auf Gitea.

+

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)
  • +
  • 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)
  • +
  • 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 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.

+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/datenhaltung/index.html b/public/docs/datenhaltung/index.html index 7e399c8..33094da 100644 --- a/public/docs/datenhaltung/index.html +++ b/public/docs/datenhaltung/index.html @@ -1,7 +1,23 @@ -Datenhaltung & Backup – RAPPORT + + + + + + + + +Datenhaltung & Backup – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen
Datenhaltung

Datenhaltung & Backup

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 betreibt, sichert stattdessen die Postgres-Datenbank — siehe Rapport Server § Backup.

Speicherort (Desktop-App) -

Die Desktop-App speichert alles lokal — keine Cloud, kein Server.

macOS -

~/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 — 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:

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) -

# 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:

# 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):
    mv "~/Library/Application Support/com.rapport.app" \
    -   "~/Library/Application Support/com.rapport.app.bak"
  3. Backup-Ordner zurück kopieren:
    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:

WasWoFormat
Zeit-AuswertungZeit → ExportCSV
RechnungRechnung → PDFPDF (inkl. QR)
OfferteOfferte → PDFPDF
LohnabrechnungMitarbeiter → PDFPDF
Jahres-BuchhaltungBuchhaltung → ExportCSV

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.

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:

InhaltGrö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~ 1–2 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.

\ No newline at end of file +macOS ~/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:"> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Datenhaltung
+
+ +
+ +
+

Datenhaltung & Backup

+ +
+ +

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 betreibt, sichert stattdessen die Postgres-Datenbank — siehe Rapport Server § Backup.

+ +
+

Speicherort (Desktop-App) +

Die Desktop-App speichert alles lokal — keine Cloud, kein Server.

+

macOS +

+ +
~/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 — 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:

+
+ +
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) +

+ +
# 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:

+
+ +
# 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. +
  3. Aktuellen Ordner umbenennen (falls noch da): +
    + +
    mv "~/Library/Application Support/com.rapport.app" \
    +   "~/Library/Application Support/com.rapport.app.bak"
    + +
    +
    +
  4. +
  5. Backup-Ordner zurück kopieren: +
    + +
    cp -R "~/Documents/Rapport-Backup-20260523" \
    +      "~/Library/Application Support/com.rapport.app"
    + +
    +
    +
  6. +
  7. Rapport starten
  8. +
+

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. +
  3. Gewünschte Felder in die aktuelle Instanz übertragen
  4. +
+

In der Praxis: meistens lohnt sich die vollständige Wiederherstellung mehr.

+

Export-Funktionen (in der App) +

Aus Rapport selbst:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WasWoFormat
Zeit-AuswertungZeit → ExportCSV
RechnungRechnung → PDFPDF (inkl. QR)
OfferteOfferte → PDFPDF
LohnabrechnungMitarbeiter → PDFPDF
Jahres-BuchhaltungBuchhaltung → ExportCSV
+

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.

+
+

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:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InhaltGrö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~ 1–2 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.

+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/einrichtung/index.html b/public/docs/einrichtung/index.html index 606f8da..c97260b 100644 --- a/public/docs/einrichtung/index.html +++ b/public/docs/einrichtung/index.html @@ -1,6 +1,22 @@ -Einrichtung – RAPPORT + + + + + + + + +Einrichtung – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen
Einrichtung

Einrichtung

Nach der Installation: Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.

Reihenfolge -

Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:

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

FeldBeschreibungVerwendung
NameBürobezeichnungBriefbogen, Login-Screen
AdresseStrasse, PLZ, OrtBriefbogen, QR-Rechnung (Empfänger)
Telefon, E-MailKontaktdatenBriefbogen, Rechnung-Footer
IBANCH-IBAN (Format CH XX XXXX …)QR-Einzahlungsschein — Pflicht
LogoPNG/SVG-UploadBriefbogen, Rechnung, Brief
MwSt.-Nr.optionalRechnung-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

FeldBeschreibung
Name, Vornamewird in Zeiterfassung & Lohn verwendet
InitialenKürzel für Auswertungen (z. B. “KGE”)
Eintrittsdatumfür Prorata der Ferien
Pensum (%)100 = Vollzeit
Stundensatz (CHF)für Stundensatz-Rechnungen
Ferienanspruch (Tage/Jahr)i. d. R. 25–30
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:

AbzugStandardwert (CH)
AHV / IV / EO5,3 %
ALV1,1 %
BVG (Pensionskasse)variabel — je Mitarbeiter
NBUje nach Versicherung

Die Standardsätze sind hinterlegt, können aber überschrieben werden.

3 · Kunden -

Kunden → Neu

FeldBeschreibung
TypPrivatperson / Firma
Anrede, Namefür Brief / Rechnung
AdresseStrasse, PLZ, Ort, Land
Ansprechpersonbei Firmen
Telefon, E-MailKontakt
Honorartyp DefaultStundensatz / SIA / Pauschal
Stundensatzfalls vom Bürostandard abweichend
MwSt.-pflichtigja/nein

4 · Projekte -

Projekte → Neu

FeldBeschreibung
Projekt-Nr.freie Form, oder generiert (2026-001)
BezeichnungKurztitel
StandortAdresse
Kundeaus Kundendatenbank
Bauschätzwertfür SIA-Phasen-Honorar
SIA-PhasenVorprojekt / Bauprojekt / … — alle anwählbar
HonorartypStundensatz / SIA 102 / Pauschal
Statusaktiv / pausiert / abgeschlossen

SIA-102-Phasen -

Wenn als Honorartyp SIA 102 gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe Projekt-Feature.

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.

\ No newline at end of file +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"> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Einrichtung
+
+ +
+ +
+

Einrichtung

+ +
+ +

Nach der Installation: Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.

+

Reihenfolge +

Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:

+
+ +
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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibungVerwendung
NameBürobezeichnungBriefbogen, Login-Screen
AdresseStrasse, PLZ, OrtBriefbogen, QR-Rechnung (Empfänger)
Telefon, E-MailKontaktdatenBriefbogen, Rechnung-Footer
IBANCH-IBAN (Format CH XX XXXX …)QR-Einzahlungsschein — Pflicht
LogoPNG/SVG-UploadBriefbogen, Rechnung, Brief
MwSt.-Nr.optionalRechnung-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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibung
Name, Vornamewird in Zeiterfassung & Lohn verwendet
InitialenKürzel für Auswertungen (z. B. “KGE”)
Eintrittsdatumfür Prorata der Ferien
Pensum (%)100 = Vollzeit
Stundensatz (CHF)für Stundensatz-Rechnungen
Ferienanspruch (Tage/Jahr)i. d. R. 25–30
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:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
AbzugStandardwert (CH)
AHV / IV / EO5,3 %
ALV1,1 %
BVG (Pensionskasse)variabel — je Mitarbeiter
NBUje nach Versicherung
+

Die Standardsätze sind hinterlegt, können aber überschrieben werden.

+

3 · Kunden +

Kunden → Neu

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibung
TypPrivatperson / Firma
Anrede, Namefür Brief / Rechnung
AdresseStrasse, PLZ, Ort, Land
Ansprechpersonbei Firmen
Telefon, E-MailKontakt
Honorartyp DefaultStundensatz / SIA / Pauschal
Stundensatzfalls vom Bürostandard abweichend
MwSt.-pflichtigja/nein
+

4 · Projekte +

Projekte → Neu

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeldBeschreibung
Projekt-Nr.freie Form, oder generiert (2026-001)
BezeichnungKurztitel
StandortAdresse
Kundeaus Kundendatenbank
Bauschätzwertfür SIA-Phasen-Honorar
SIA-PhasenVorprojekt / Bauprojekt / … — alle anwählbar
HonorartypStundensatz / SIA 102 / Pauschal
Statusaktiv / pausiert / abgeschlossen
+

SIA-102-Phasen +

Wenn als Honorartyp SIA 102 gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe Projekt-Feature.

+

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.

+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/entwicklung/index.html b/public/docs/entwicklung/index.html index 4ed8fda..30e7698 100644 --- a/public/docs/entwicklung/index.html +++ b/public/docs/entwicklung/index.html @@ -1,6 +1,22 @@ -Entwicklung & Build – RAPPORT + + + + + + + + +Entwicklung & Build – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen
Entwicklung

Entwicklung & Build

Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.

Voraussetzungen -

ToolVersion
Node.js≥ 20 (für Vite 8)
npm≥ 10
Rust toolchain≥ 1.77.2 (via rustup)
Plattform-Toolssiehe Tauri 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 -

git clone https://git.kgva.ch/karim/RAPPORT.git
-cd RAPPORT/APP
-npm install

Entwicklung -

Web-Modus (HMR, schnellster Loop) -

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) -

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 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.

Verzeichnis-Karte -

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-Frameworkview-State in App.jsx triggert Komponente
  • JSON-Schema implizit — definiert durch defaultData in constants.js
  • Migrationen als reine Funktionen in storage/migrations.js

Build -

Desktop (Tauri DMG) -

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) -

npm run build         # Output: dist/ (~500 KB)

Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe Web-Modus.

Release-Workflow -

# 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 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.

\ No newline at end of file +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 git clone https://git.kgva.ch/karim/RAPPORT.git cd RAPPORT/APP npm install Entwicklung Web-Modus (HMR, schnellster Loop) 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) 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 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)."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Entwicklung
+
+ +
+ +
+

Entwicklung & Build

+ +
+ +

Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.

+

Voraussetzungen +

+ + + + + + + + + + + + + + + + + + + + + + + + +
ToolVersion
Node.js≥ 20 (für Vite 8)
npm≥ 10
Rust toolchain≥ 1.77.2 (via rustup)
Plattform-Toolssiehe Tauri 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 +

+ +
git clone https://git.kgva.ch/karim/RAPPORT.git
+cd RAPPORT/APP
+npm install
+ +
+
+

Entwicklung +

Web-Modus (HMR, schnellster Loop) +

+ +
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) +

+ +
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 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.

+

Verzeichnis-Karte +

+ +
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-Frameworkview-State in App.jsx triggert Komponente
  • +
  • JSON-Schema implizit — definiert durch defaultData in constants.js
  • +
  • Migrationen als reine Funktionen in storage/migrations.js
  • +
+

Build +

Desktop (Tauri DMG) +

+ +
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) +

+ +
npm run build         # Output: dist/ (~500 KB)
+ +
+
+

Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe Web-Modus.

+

Release-Workflow +

+ +
# 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 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.

+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/erste-schritte/index.html b/public/docs/erste-schritte/index.html index 2a4114e..64176c3 100644 --- a/public/docs/erste-schritte/index.html +++ b/public/docs/erste-schritte/index.html @@ -1,44 +1,738 @@ -Erste Schritte – RAPPORT + + + + + + + + +Erste Schritte – RAPPORT + + + + +Zum Inhalt springen
Erste Schritte

Erste Schritte

Von der Installation bis zur ersten Rechnung — in sechs Schritten.

01 · Installation -

DMG von Gitea 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:

~/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.

06 · Probleme melden -

Ein Issue auf Gitea 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.

\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Erste Schritte
+
+ +
+ +
+

Erste Schritte

+ +
+ +

Von der Installation bis zur ersten Rechnung — in sechs Schritten.

+

01 · Installation +

DMG von Gitea 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. +
  3. Woche navigieren
  4. +
  5. Stunden per Klick oder Drag erfassen
  6. +
  7. Jedem Eintrag ein Projekt zuweisen
  8. +
+

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:

+
+ +
~/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.

+

06 · Probleme melden +

Ein Issue auf Gitea 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.

+ +
+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/index.html b/public/docs/index.html index 24953f6..187d951 100644 --- a/public/docs/index.html +++ b/public/docs/index.html @@ -1,34 +1,697 @@ -Dokumentation – RAPPORT + + + + + + + + +Dokumentation – RAPPORT + + + + +Zum Inhalt springen
Dokumentation
\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
Dokumentation
+
+ + +
+
+
+
+ + + + + + + diff --git a/public/docs/index.xml b/public/docs/index.xml index c596201..59f3e98 100644 --- a/public/docs/index.xml +++ b/public/docs/index.xml @@ -1,12 +1,36 @@ -RAPPORT – Dokumentationhttps://rapport.gabrielevarano.ch/docs/Recent content in Dokumentation on RAPPORTHugo -- gohugo.iodeErste Schrittehttps://rapport.gabrielevarano.ch/docs/erste-schritte/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/erste-schritte/ -<p>Von der Installation bis zur ersten Rechnung — in sechs Schritten.</p> -<h2>01 · Installation<span class="hx:absolute hx:-mt-20" id="01--installation"></span> -<a href="#01--installation" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>DMG von <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Gitea Releases<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> + + + RAPPORT – Dokumentation + /docs/ + Recent content in Dokumentation on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + Erste Schritte + /docs/erste-schritte/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/erste-schritte/ + + + + <p>Von der Installation bis zur ersten Rechnung — in sechs Schritten.</p> +<h2>01 · Installation<span class="hx:absolute hx:-mt-20" id="01--installation"></span> + <a href="#01--installation" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>DMG von <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Gitea Releases<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> herunterladen. Rapport in den <strong>Programme-Ordner</strong> ziehen. Beim ersten Start: <em>Systemeinstellungen → Datenschutz &amp; Sicherheit</em> öffnen und Rapport zulassen.</p> <p>Die Pre-Release-Builds sind <strong>signiert über Tauri</strong>, aber (noch) nicht über die Apple-Notarisierung gegangen — daher der manuelle Freigabe-Schritt.</p> -<h2>02 · Einrichtung<span class="hx:absolute hx:-mt-20" id="02--einrichtung"></span> -<a href="#02--einrichtung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>In den <strong>Einstellungen</strong> hinterlegen:</p> +<h2>02 · Einrichtung<span class="hx:absolute hx:-mt-20" id="02--einrichtung"></span> + <a href="#02--einrichtung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>In den <strong>Einstellungen</strong> hinterlegen:</p> <ul> <li><strong>Bürodaten</strong> — Name, Adresse, IBAN, Logo</li> <li><strong>Mitarbeiter</strong> — Namen, Pensum, Stundensatz, Ferienanspruch</li> @@ -14,8 +38,8 @@ <li><strong>Projekte</strong> — SIA-102-Phasen, Budget, Beteiligte</li> </ul> <p>Danach ist die Zeiterfassung bereit.</p> -<h2>03 · Zeiterfassung<span class="hx:absolute hx:-mt-20" id="03--zeiterfassung"></span> -<a href="#03--zeiterfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Im Modul <strong>Zeit</strong>:</p> +<h2>03 · Zeiterfassung<span class="hx:absolute hx:-mt-20" id="03--zeiterfassung"></span> + <a href="#03--zeiterfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Im Modul <strong>Zeit</strong>:</p> <ol> <li>Mitarbeiter wählen</li> <li>Woche navigieren</li> @@ -23,618 +47,682 @@ <li>Jedem Eintrag ein Projekt zuweisen</li> </ol> <p>Auswertungen pro Mitarbeiter und pro Projekt sind unter <em>Zeit → Auswertungen</em> abrufbar. Halbe Tage und Mehrfacheinträge pro Slot werden unterstützt.</p> -<h2>04 · Rechnungen<span class="hx:absolute hx:-mt-20" id="04--rechnungen"></span> -<a href="#04--rechnungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Aus einer <strong>Offerte</strong> oder <strong>direkt</strong> erstellen:</p> +<h2>04 · Rechnungen<span class="hx:absolute hx:-mt-20" id="04--rechnungen"></span> + <a href="#04--rechnungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Aus einer <strong>Offerte</strong> oder <strong>direkt</strong> erstellen:</p> <ul> <li>SIA-Phasen, Stundensatz oder Pauschal wählen</li> <li>Akonto-, Teil- oder Schlussrechnung</li> <li>Mit <em>PDF exportieren</em> wird die fertige Rechnung inkl. <strong>QR-Einzahlungsschein</strong> generiert</li> </ul> <p>Offerten lassen sich nahtlos in Projekte und Rechnungen konvertieren.</p> -<h2>05 · Backup<span class="hx:absolute hx:-mt-20" id="05--backup"></span> -<a href="#05--backup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>In der Desktop-App liegen alle Daten als <strong>JSON</strong> im Applikationsordner:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">~/Library/Application Support/com.rapport.app/</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>05 · Backup<span class="hx:absolute hx:-mt-20" id="05--backup"></span> + <a href="#05--backup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>In der Desktop-App liegen alle Daten als <strong>JSON</strong> im Applikationsordner:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">~/Library/Application Support/com.rapport.app/</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<p>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 <a href="../../server/#backup">Rapport Server § Backup</a>.</p> -<h2>06 · Probleme melden<span class="hx:absolute hx:-mt-20" id="06--probleme-melden"></span> -<a href="#06--probleme-melden" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Ein <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<p>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 <a href="../../server/#backup">Rapport Server § Backup</a>.</p> +<h2>06 · Probleme melden<span class="hx:absolute hx:-mt-20" id="06--probleme-melden"></span> + <a href="#06--probleme-melden" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Ein <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> erstellen — mit kurzer Beschreibung, was passiert ist. <strong>Screenshots helfen.</strong> Bitte die Rapport-Version (links unten in der App) angeben.</p> <blockquote> -<p><strong>Tipp:</strong> Wenn die App nicht mehr startet, hilft oft, den Cache-Ordner zu sichern und neu zu starten. Die JSON-Daten selbst bleiben unverändert.</p> -</blockquote>Installationhttps://rapport.gabrielevarano.ch/docs/installation/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/installation/ -<p>Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.</p> -<h2>Voraussetzungen<span class="hx:absolute hx:-mt-20" id="voraussetzungen"></span> -<a href="#voraussetzungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> -<thead> -<tr> -<th>Plattform</th> -<th>Status</th> -<th>Versionen</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>macOS</strong> Apple Silicon (M1 – M4)</td> -<td>✅ Unterstützt</td> -<td>macOS 12+</td> -</tr> -<tr> -<td><strong>macOS</strong> Intel</td> -<td>⚠ Build auf Anfrage</td> -<td>macOS 12+</td> -</tr> -<tr> -<td><strong>Linux</strong></td> -<td>🕐 Geplant</td> -<td>—</td> -</tr> -<tr> -<td><strong>Windows</strong></td> -<td>🕐 Geplant</td> -<td>—</td> -</tr> -</tbody> + <p><strong>Tipp:</strong> Wenn die App nicht mehr startet, hilft oft, den Cache-Ordner zu sichern und neu zu starten. Die JSON-Daten selbst bleiben unverändert.</p> + +</blockquote> + + + + + + Installation + /docs/installation/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/installation/ + + + + <p>Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.</p> +<h2>Voraussetzungen<span class="hx:absolute hx:-mt-20" id="voraussetzungen"></span> + <a href="#voraussetzungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> + <thead> + <tr> + <th>Plattform</th> + <th>Status</th> + <th>Versionen</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>macOS</strong> Apple Silicon (M1 – M4)</td> + <td>✅ Unterstützt</td> + <td>macOS 12+</td> + </tr> + <tr> + <td><strong>macOS</strong> Intel</td> + <td>⚠ Build auf Anfrage</td> + <td>macOS 12+</td> + </tr> + <tr> + <td><strong>Linux</strong></td> + <td>🕐 Geplant</td> + <td>—</td> + </tr> + <tr> + <td><strong>Windows</strong></td> + <td>🕐 Geplant</td> + <td>—</td> + </tr> + </tbody> </table> -<p>Eine Portierung auf Linux und Windows ist mit Tauri 2 möglich. <a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener">Issue erstellen<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<p>Eine Portierung auf Linux und Windows ist mit Tauri 2 möglich. <a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener">Issue erstellen<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>, wenn du eine Plattform brauchst.</p> -<h2>1 · Download<span class="hx:absolute hx:-mt-20" id="1--download"></span> -<a href="#1--download" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Aktueller Build: <a href="../../downloads">Downloads-Seite</a> oder direkt <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Releases auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>1 · Download<span class="hx:absolute hx:-mt-20" id="1--download"></span> + <a href="#1--download" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Aktueller Build: <a href="../../downloads">Downloads-Seite</a> oder direkt <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Releases auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>.</p> <table> -<thead> -<tr> -<th>Datei</th> -<th>Plattform</th> -</tr> -</thead> -<tbody> -<tr> -<td><code>RAPPORT_&lt;version&gt;_aarch64.dmg</code></td> -<td>macOS Apple Silicon</td> -</tr> -<tr> -<td><code>RAPPORT_&lt;version&gt;_x86_64.dmg</code></td> -<td>macOS Intel (auf Anfrage)</td> -</tr> -</tbody> + <thead> + <tr> + <th>Datei</th> + <th>Plattform</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>RAPPORT_&lt;version&gt;_aarch64.dmg</code></td> + <td>macOS Apple Silicon</td> + </tr> + <tr> + <td><code>RAPPORT_&lt;version&gt;_x86_64.dmg</code></td> + <td>macOS Intel (auf Anfrage)</td> + </tr> + </tbody> </table> -<h2>2 · DMG öffnen &amp; installieren<span class="hx:absolute hx:-mt-20" id="2--dmg-öffnen--installieren"></span> -<a href="#2--dmg-%c3%b6ffnen--installieren" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ol> +<h2>2 · DMG öffnen &amp; installieren<span class="hx:absolute hx:-mt-20" id="2--dmg-öffnen--installieren"></span> + <a href="#2--dmg-%c3%b6ffnen--installieren" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ol> <li>DMG doppelklicken</li> <li>Rapport.app in den <strong>Applications</strong>-Ordner ziehen</li> <li>DMG auswerfen</li> </ol> -<h2>3 · Erster Start (macOS Gatekeeper)<span class="hx:absolute hx:-mt-20" id="3--erster-start-macos-gatekeeper"></span> -<a href="#3--erster-start-macos-gatekeeper" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Beim ersten Start verweigert macOS den Start, weil die Pre-Release-Builds <strong>Tauri-signiert</strong>, aber (noch) <strong>nicht Apple-notarisiert</strong> sind.</p> -<h3>Lösung<span class="hx:absolute hx:-mt-20" id="lösung"></span> -<a href="#l%c3%b6sung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><ol> +<h2>3 · Erster Start (macOS Gatekeeper)<span class="hx:absolute hx:-mt-20" id="3--erster-start-macos-gatekeeper"></span> + <a href="#3--erster-start-macos-gatekeeper" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Beim ersten Start verweigert macOS den Start, weil die Pre-Release-Builds <strong>Tauri-signiert</strong>, aber (noch) <strong>nicht Apple-notarisiert</strong> sind.</p> +<h3>Lösung<span class="hx:absolute hx:-mt-20" id="lösung"></span> + <a href="#l%c3%b6sung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><ol> <li><strong>Systemeinstellungen → Datenschutz &amp; Sicherheit</strong> öffnen</li> <li>Bis ganz nach unten scrollen — es erscheint: <blockquote> -<p>&ldquo;Rapport&rdquo; wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.</p> + <p>&ldquo;Rapport&rdquo; wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.</p> + </blockquote> </li> <li>Auf <strong>&ldquo;Trotzdem öffnen&rdquo;</strong> klicken</li> <li>Bestätigen</li> </ol> <p>Ab dem zweiten Start läuft Rapport ohne Rückfragen.</p> -<h3>Alternative (Terminal)<span class="hx:absolute hx:-mt-20" id="alternative-terminal"></span> -<a href="#alternative-terminal" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Falls der GUI-Weg nicht funktioniert:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">xattr -d com.apple.quarantine /Applications/Rapport.app</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h3>Alternative (Terminal)<span class="hx:absolute hx:-mt-20" id="alternative-terminal"></span> + <a href="#alternative-terminal" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Falls der GUI-Weg nicht funktioniert:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">xattr -d com.apple.quarantine /Applications/Rapport.app</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>Das entfernt das Quarantäne-Flag und macOS akzeptiert den Start.</p> -<h2>4 · Erstes Setup<span class="hx:absolute hx:-mt-20" id="4--erstes-setup"></span> -<a href="#4--erstes-setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Beim ersten Start zeigt Rapport den <strong>Setup-Bildschirm</strong>. Hier werden die Stammdaten erfasst — siehe <a href="../einrichtung">Einrichtung</a>.</p> -<h2>5 · Update-Strategie<span class="hx:absolute hx:-mt-20" id="5--update-strategie"></span> -<a href="#5--update-strategie" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe <a href="../../features/auto-updater">Auto-Updater</a>). Updates können in den Einstellungen deaktiviert werden.</p> -<p>Manuelle Updates: einfach das neuere DMG installieren — die Daten bleiben erhalten, da sie unabhängig von der App liegen (siehe <a href="../datenhaltung">Datenhaltung</a>).</p> -<h2>Deinstallation<span class="hx:absolute hx:-mt-20" id="deinstallation"></span> -<a href="#deinstallation" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># App entfernen</span> -</span></span><span class="line"><span class="cl">rm -rf /Applications/Rapport.app -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># Daten entfernen (optional!)</span> -</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># Caches</span> -</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/Caches/com.rapport.app&#34;</span> -</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/WebKit/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>4 · Erstes Setup<span class="hx:absolute hx:-mt-20" id="4--erstes-setup"></span> + <a href="#4--erstes-setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Beim ersten Start zeigt Rapport den <strong>Setup-Bildschirm</strong>. Hier werden die Stammdaten erfasst — siehe <a href="../einrichtung">Einrichtung</a>.</p> +<h2>5 · Update-Strategie<span class="hx:absolute hx:-mt-20" id="5--update-strategie"></span> + <a href="#5--update-strategie" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe <a href="../../features/auto-updater">Auto-Updater</a>). Updates können in den Einstellungen deaktiviert werden.</p> +<p>Manuelle Updates: einfach das neuere DMG installieren — die Daten bleiben erhalten, da sie unabhängig von der App liegen (siehe <a href="../datenhaltung">Datenhaltung</a>).</p> +<h2>Deinstallation<span class="hx:absolute hx:-mt-20" id="deinstallation"></span> + <a href="#deinstallation" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># App entfernen</span> +</span></span><span class="line"><span class="cl">rm -rf /Applications/Rapport.app +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># Daten entfernen (optional!)</span> +</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># Caches</span> +</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/Caches/com.rapport.app&#34;</span> +</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/WebKit/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <blockquote> -<p><strong>Achtung:</strong> Schritt 2 löscht <strong>alle Rapport-Daten unwiederbringlich</strong>. Vorher Backup machen — siehe <a href="../datenhaltung">Datenhaltung</a>.</p> + <p><strong>Achtung:</strong> Schritt 2 löscht <strong>alle Rapport-Daten unwiederbringlich</strong>. Vorher Backup machen — siehe <a href="../datenhaltung">Datenhaltung</a>.</p> + </blockquote> -<h2>Bekannte Probleme<span class="hx:absolute hx:-mt-20" id="bekannte-probleme"></span> -<a href="#bekannte-probleme" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> -<thead> -<tr> -<th>Problem</th> -<th>Lösung</th> -</tr> -</thead> -<tbody> -<tr> -<td>App lässt sich nicht öffnen trotz Freigabe</td> -<td>Terminal-Variante mit <code>xattr</code></td> -</tr> -<tr> -<td>&ldquo;Rapport is damaged&rdquo;</td> -<td>DMG erneut von Gitea ziehen (Browser-Cache hat evtl. Müll)</td> -</tr> -<tr> -<td>Schwarzer Bildschirm beim Start</td> -<td><code>~/Library/WebKit/com.rapport.app</code> löschen, neu starten</td> -</tr> -</tbody> +<h2>Bekannte Probleme<span class="hx:absolute hx:-mt-20" id="bekannte-probleme"></span> + <a href="#bekannte-probleme" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> + <thead> + <tr> + <th>Problem</th> + <th>Lösung</th> + </tr> + </thead> + <tbody> + <tr> + <td>App lässt sich nicht öffnen trotz Freigabe</td> + <td>Terminal-Variante mit <code>xattr</code></td> + </tr> + <tr> + <td>&ldquo;Rapport is damaged&rdquo;</td> + <td>DMG erneut von Gitea ziehen (Browser-Cache hat evtl. Müll)</td> + </tr> + <tr> + <td>Schwarzer Bildschirm beim Start</td> + <td><code>~/Library/WebKit/com.rapport.app</code> löschen, neu starten</td> + </tr> + </tbody> </table> -<p>Mehr unter <a href="../troubleshooting">Troubleshooting</a>.</p>Einrichtunghttps://rapport.gabrielevarano.ch/docs/einrichtung/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/einrichtung/ -<p>Nach der <a href="../installation">Installation</a>: Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.</p> -<h2>Reihenfolge<span class="hx:absolute hx:-mt-20" id="reihenfolge"></span> -<a href="#reihenfolge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1. Bürodaten → 2. Mitarbeiter → 3. Kunden → 4. Projekte -</span></span><span class="line"><span class="cl"> ▼ ▼ ▼ ▼ -</span></span><span class="line"><span class="cl"> Briefbogen, Zeiterfassung, Adressen, Zeiterfassung, -</span></span><span class="line"><span class="cl"> QR-Schein, Lohn Rechnungen Rechnungen -</span></span><span class="line"><span class="cl"> Login</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<p>Mehr unter <a href="../troubleshooting">Troubleshooting</a>.</p> + + + + + + Einrichtung + /docs/einrichtung/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/einrichtung/ + + + + <p>Nach der <a href="../installation">Installation</a>: Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.</p> +<h2>Reihenfolge<span class="hx:absolute hx:-mt-20" id="reihenfolge"></span> + <a href="#reihenfolge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1. Bürodaten → 2. Mitarbeiter → 3. Kunden → 4. Projekte +</span></span><span class="line"><span class="cl"> ▼ ▼ ▼ ▼ +</span></span><span class="line"><span class="cl"> Briefbogen, Zeiterfassung, Adressen, Zeiterfassung, +</span></span><span class="line"><span class="cl"> QR-Schein, Lohn Rechnungen Rechnungen +</span></span><span class="line"><span class="cl"> Login</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h2>1 · Bürodaten<span class="hx:absolute hx:-mt-20" id="1--bürodaten"></span> -<a href="#1--b%c3%bcrodaten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Einstellungen → Bürodaten</strong></p> +<h2>1 · Bürodaten<span class="hx:absolute hx:-mt-20" id="1--bürodaten"></span> + <a href="#1--b%c3%bcrodaten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Einstellungen → Bürodaten</strong></p> <table> -<thead> -<tr> -<th>Feld</th> -<th>Beschreibung</th> -<th>Verwendung</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Name</strong></td> -<td>Bürobezeichnung</td> -<td>Briefbogen, Login-Screen</td> -</tr> -<tr> -<td><strong>Adresse</strong></td> -<td>Strasse, PLZ, Ort</td> -<td>Briefbogen, QR-Rechnung (Empfänger)</td> -</tr> -<tr> -<td><strong>Telefon, E-Mail</strong></td> -<td>Kontaktdaten</td> -<td>Briefbogen, Rechnung-Footer</td> -</tr> -<tr> -<td><strong>IBAN</strong></td> -<td>CH-IBAN (Format <code>CH XX XXXX …</code>)</td> -<td><strong>QR-Einzahlungsschein</strong> — Pflicht</td> -</tr> -<tr> -<td><strong>Logo</strong></td> -<td>PNG/SVG-Upload</td> -<td>Briefbogen, Rechnung, Brief</td> -</tr> -<tr> -<td><strong>MwSt.-Nr.</strong></td> -<td>optional</td> -<td>Rechnung-Footer</td> -</tr> -</tbody> + <thead> + <tr> + <th>Feld</th> + <th>Beschreibung</th> + <th>Verwendung</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Name</strong></td> + <td>Bürobezeichnung</td> + <td>Briefbogen, Login-Screen</td> + </tr> + <tr> + <td><strong>Adresse</strong></td> + <td>Strasse, PLZ, Ort</td> + <td>Briefbogen, QR-Rechnung (Empfänger)</td> + </tr> + <tr> + <td><strong>Telefon, E-Mail</strong></td> + <td>Kontaktdaten</td> + <td>Briefbogen, Rechnung-Footer</td> + </tr> + <tr> + <td><strong>IBAN</strong></td> + <td>CH-IBAN (Format <code>CH XX XXXX …</code>)</td> + <td><strong>QR-Einzahlungsschein</strong> — Pflicht</td> + </tr> + <tr> + <td><strong>Logo</strong></td> + <td>PNG/SVG-Upload</td> + <td>Briefbogen, Rechnung, Brief</td> + </tr> + <tr> + <td><strong>MwSt.-Nr.</strong></td> + <td>optional</td> + <td>Rechnung-Footer</td> + </tr> + </tbody> </table> <blockquote> -<p><strong>Tipp:</strong> Das Logo wird hochauflösend gespeichert (Base64 im localStorage). Bei sehr grossen Dateien (&gt;1 MB) vorher in Vorschau verkleinern.</p> + <p><strong>Tipp:</strong> Das Logo wird hochauflösend gespeichert (Base64 im localStorage). Bei sehr grossen Dateien (&gt;1 MB) vorher in Vorschau verkleinern.</p> + </blockquote> -<h2>2 · Mitarbeiter<span class="hx:absolute hx:-mt-20" id="2--mitarbeiter"></span> -<a href="#2--mitarbeiter" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Einstellungen → Mitarbeiter → Neu</strong></p> +<h2>2 · Mitarbeiter<span class="hx:absolute hx:-mt-20" id="2--mitarbeiter"></span> + <a href="#2--mitarbeiter" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Einstellungen → Mitarbeiter → Neu</strong></p> <table> -<thead> -<tr> -<th>Feld</th> -<th>Beschreibung</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Name, Vorname</strong></td> -<td>wird in Zeiterfassung &amp; Lohn verwendet</td> -</tr> -<tr> -<td><strong>Initialen</strong></td> -<td>Kürzel für Auswertungen (z. B. &ldquo;KGE&rdquo;)</td> -</tr> -<tr> -<td><strong>Eintrittsdatum</strong></td> -<td>für <strong>Prorata</strong> der Ferien</td> -</tr> -<tr> -<td><strong>Pensum (%)</strong></td> -<td>100 = Vollzeit</td> -</tr> -<tr> -<td><strong>Stundensatz (CHF)</strong></td> -<td>für Stundensatz-Rechnungen</td> -</tr> -<tr> -<td><strong>Ferienanspruch (Tage/Jahr)</strong></td> -<td>i. d. R. 25–30</td> -</tr> -<tr> -<td><strong>Lohn (brutto, monatlich)</strong></td> -<td>optional, für Lohnabrechnung</td> -</tr> -</tbody> + <thead> + <tr> + <th>Feld</th> + <th>Beschreibung</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Name, Vorname</strong></td> + <td>wird in Zeiterfassung &amp; Lohn verwendet</td> + </tr> + <tr> + <td><strong>Initialen</strong></td> + <td>Kürzel für Auswertungen (z. B. &ldquo;KGE&rdquo;)</td> + </tr> + <tr> + <td><strong>Eintrittsdatum</strong></td> + <td>für <strong>Prorata</strong> der Ferien</td> + </tr> + <tr> + <td><strong>Pensum (%)</strong></td> + <td>100 = Vollzeit</td> + </tr> + <tr> + <td><strong>Stundensatz (CHF)</strong></td> + <td>für Stundensatz-Rechnungen</td> + </tr> + <tr> + <td><strong>Ferienanspruch (Tage/Jahr)</strong></td> + <td>i. d. R. 25–30</td> + </tr> + <tr> + <td><strong>Lohn (brutto, monatlich)</strong></td> + <td>optional, für Lohnabrechnung</td> + </tr> + </tbody> </table> <p>Mindestens <strong>ein Mitarbeiter</strong> (z. B. der Inhaber selbst) muss angelegt sein, sonst lässt sich keine Zeit erfassen.</p> -<h3>Sozialabzüge (optional)<span class="hx:absolute hx:-mt-20" id="sozialabzüge-optional"></span> -<a href="#sozialabz%c3%bcge-optional" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>In Einstellungen → Lohn:</p> +<h3>Sozialabzüge (optional)<span class="hx:absolute hx:-mt-20" id="sozialabzüge-optional"></span> + <a href="#sozialabz%c3%bcge-optional" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>In Einstellungen → Lohn:</p> <table> -<thead> -<tr> -<th>Abzug</th> -<th>Standardwert (CH)</th> -</tr> -</thead> -<tbody> -<tr> -<td>AHV / IV / EO</td> -<td>5,3 %</td> -</tr> -<tr> -<td>ALV</td> -<td>1,1 %</td> -</tr> -<tr> -<td>BVG (Pensionskasse)</td> -<td>variabel — je Mitarbeiter</td> -</tr> -<tr> -<td>NBU</td> -<td>je nach Versicherung</td> -</tr> -</tbody> + <thead> + <tr> + <th>Abzug</th> + <th>Standardwert (CH)</th> + </tr> + </thead> + <tbody> + <tr> + <td>AHV / IV / EO</td> + <td>5,3 %</td> + </tr> + <tr> + <td>ALV</td> + <td>1,1 %</td> + </tr> + <tr> + <td>BVG (Pensionskasse)</td> + <td>variabel — je Mitarbeiter</td> + </tr> + <tr> + <td>NBU</td> + <td>je nach Versicherung</td> + </tr> + </tbody> </table> <p>Die Standardsätze sind hinterlegt, können aber überschrieben werden.</p> -<h2>3 · Kunden<span class="hx:absolute hx:-mt-20" id="3--kunden"></span> -<a href="#3--kunden" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Kunden → Neu</strong></p> +<h2>3 · Kunden<span class="hx:absolute hx:-mt-20" id="3--kunden"></span> + <a href="#3--kunden" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Kunden → Neu</strong></p> <table> -<thead> -<tr> -<th>Feld</th> -<th>Beschreibung</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Typ</strong></td> -<td>Privatperson / Firma</td> -</tr> -<tr> -<td><strong>Anrede, Name</strong></td> -<td>für Brief / Rechnung</td> -</tr> -<tr> -<td><strong>Adresse</strong></td> -<td>Strasse, PLZ, Ort, Land</td> -</tr> -<tr> -<td><strong>Ansprechperson</strong></td> -<td>bei Firmen</td> -</tr> -<tr> -<td><strong>Telefon, E-Mail</strong></td> -<td>Kontakt</td> -</tr> -<tr> -<td><strong>Honorartyp Default</strong></td> -<td>Stundensatz / SIA / Pauschal</td> -</tr> -<tr> -<td><strong>Stundensatz</strong></td> -<td>falls vom Bürostandard abweichend</td> -</tr> -<tr> -<td><strong>MwSt.-pflichtig</strong></td> -<td>ja/nein</td> -</tr> -</tbody> + <thead> + <tr> + <th>Feld</th> + <th>Beschreibung</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Typ</strong></td> + <td>Privatperson / Firma</td> + </tr> + <tr> + <td><strong>Anrede, Name</strong></td> + <td>für Brief / Rechnung</td> + </tr> + <tr> + <td><strong>Adresse</strong></td> + <td>Strasse, PLZ, Ort, Land</td> + </tr> + <tr> + <td><strong>Ansprechperson</strong></td> + <td>bei Firmen</td> + </tr> + <tr> + <td><strong>Telefon, E-Mail</strong></td> + <td>Kontakt</td> + </tr> + <tr> + <td><strong>Honorartyp Default</strong></td> + <td>Stundensatz / SIA / Pauschal</td> + </tr> + <tr> + <td><strong>Stundensatz</strong></td> + <td>falls vom Bürostandard abweichend</td> + </tr> + <tr> + <td><strong>MwSt.-pflichtig</strong></td> + <td>ja/nein</td> + </tr> + </tbody> </table> -<h2>4 · Projekte<span class="hx:absolute hx:-mt-20" id="4--projekte"></span> -<a href="#4--projekte" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Projekte → Neu</strong></p> +<h2>4 · Projekte<span class="hx:absolute hx:-mt-20" id="4--projekte"></span> + <a href="#4--projekte" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Projekte → Neu</strong></p> <table> -<thead> -<tr> -<th>Feld</th> -<th>Beschreibung</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Projekt-Nr.</strong></td> -<td>freie Form, oder generiert (<code>2026-001</code>)</td> -</tr> -<tr> -<td><strong>Bezeichnung</strong></td> -<td>Kurztitel</td> -</tr> -<tr> -<td><strong>Standort</strong></td> -<td>Adresse</td> -</tr> -<tr> -<td><strong>Kunde</strong></td> -<td>aus Kundendatenbank</td> -</tr> -<tr> -<td><strong>Bauschätzwert</strong></td> -<td>für SIA-Phasen-Honorar</td> -</tr> -<tr> -<td><strong>SIA-Phasen</strong></td> -<td>Vorprojekt / Bauprojekt / … — alle anwählbar</td> -</tr> -<tr> -<td><strong>Honorartyp</strong></td> -<td>Stundensatz / SIA 102 / Pauschal</td> -</tr> -<tr> -<td><strong>Status</strong></td> -<td>aktiv / pausiert / abgeschlossen</td> -</tr> -</tbody> + <thead> + <tr> + <th>Feld</th> + <th>Beschreibung</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Projekt-Nr.</strong></td> + <td>freie Form, oder generiert (<code>2026-001</code>)</td> + </tr> + <tr> + <td><strong>Bezeichnung</strong></td> + <td>Kurztitel</td> + </tr> + <tr> + <td><strong>Standort</strong></td> + <td>Adresse</td> + </tr> + <tr> + <td><strong>Kunde</strong></td> + <td>aus Kundendatenbank</td> + </tr> + <tr> + <td><strong>Bauschätzwert</strong></td> + <td>für SIA-Phasen-Honorar</td> + </tr> + <tr> + <td><strong>SIA-Phasen</strong></td> + <td>Vorprojekt / Bauprojekt / … — alle anwählbar</td> + </tr> + <tr> + <td><strong>Honorartyp</strong></td> + <td>Stundensatz / SIA 102 / Pauschal</td> + </tr> + <tr> + <td><strong>Status</strong></td> + <td>aktiv / pausiert / abgeschlossen</td> + </tr> + </tbody> </table> -<h3>SIA-102-Phasen<span class="hx:absolute hx:-mt-20" id="sia-102-phasen"></span> -<a href="#sia-102-phasen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Wenn als Honorartyp <strong>SIA 102</strong> gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe <a href="../../features/projekte#sia-102">Projekt-Feature</a>.</p> -<h2>Checkliste<span class="hx:absolute hx:-mt-20" id="checkliste"></span> -<a href="#checkliste" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Nach diesen vier Schritten ist Rapport einsatzbereit:</p> +<h3>SIA-102-Phasen<span class="hx:absolute hx:-mt-20" id="sia-102-phasen"></span> + <a href="#sia-102-phasen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Wenn als Honorartyp <strong>SIA 102</strong> gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe <a href="../../features/projekte#sia-102">Projekt-Feature</a>.</p> +<h2>Checkliste<span class="hx:absolute hx:-mt-20" id="checkliste"></span> + <a href="#checkliste" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Nach diesen vier Schritten ist Rapport einsatzbereit:</p> <ul> -<li><input disabled="" type="checkbox"> Bürodaten inkl. IBAN erfasst</li> -<li><input disabled="" type="checkbox"> Mindestens ein Mitarbeiter angelegt</li> -<li><input disabled="" type="checkbox"> Erster Kunde angelegt</li> -<li><input disabled="" type="checkbox"> Erstes Projekt angelegt</li> -<li><input disabled="" type="checkbox"> Eine Test-Zeitbuchung erfasst — wird das Projekt korrekt zugewiesen?</li> -<li><input disabled="" type="checkbox"> Eine Test-Rechnung erstellt — kommt der QR-Schein sauber raus?</li> +<li><input disabled="" type="checkbox"> Bürodaten inkl. IBAN erfasst</li> +<li><input disabled="" type="checkbox"> Mindestens ein Mitarbeiter angelegt</li> +<li><input disabled="" type="checkbox"> Erster Kunde angelegt</li> +<li><input disabled="" type="checkbox"> Erstes Projekt angelegt</li> +<li><input disabled="" type="checkbox"> Eine Test-Zeitbuchung erfasst — wird das Projekt korrekt zugewiesen?</li> +<li><input disabled="" type="checkbox"> Eine Test-Rechnung erstellt — kommt der QR-Schein sauber raus?</li> </ul> -<p>Wenn alles funktioniert: <a href="../arbeitsablauf">Typischer Arbeitsablauf</a>.</p>Typischer Arbeitsablaufhttps://rapport.gabrielevarano.ch/docs/arbeitsablauf/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/arbeitsablauf/ -<p>Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.</p> -<h2>Übersicht<span class="hx:absolute hx:-mt-20" id="übersicht"></span> -<a href="#%c3%bcbersicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"> Kunde → Offerte → Projekt → Zeit → Akonto → Schluss -</span></span><span class="line"><span class="cl"> anlegen erstellen (aus Offerte) erfassen -Rechnung -Rechnung -</span></span><span class="line"><span class="cl"> ↓ -</span></span><span class="line"><span class="cl"> QR-Schein</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<p>Wenn alles funktioniert: <a href="../arbeitsablauf">Typischer Arbeitsablauf</a>.</p> + + + + + + Typischer Arbeitsablauf + /docs/arbeitsablauf/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/arbeitsablauf/ + + + + <p>Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.</p> +<h2>Übersicht<span class="hx:absolute hx:-mt-20" id="übersicht"></span> + <a href="#%c3%bcbersicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"> Kunde → Offerte → Projekt → Zeit → Akonto → Schluss +</span></span><span class="line"><span class="cl"> anlegen erstellen (aus Offerte) erfassen -Rechnung -Rechnung +</span></span><span class="line"><span class="cl"> ↓ +</span></span><span class="line"><span class="cl"> QR-Schein</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h2>1 · Kunde anlegen<span class="hx:absolute hx:-mt-20" id="1--kunde-anlegen"></span> -<a href="#1--kunde-anlegen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Kunden → Neu</strong> — siehe <a href="../einrichtung#3--kunden">Einrichtung § 3</a>.</p> +<h2>1 · Kunde anlegen<span class="hx:absolute hx:-mt-20" id="1--kunde-anlegen"></span> + <a href="#1--kunde-anlegen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Kunden → Neu</strong> — siehe <a href="../einrichtung#3--kunden">Einrichtung § 3</a>.</p> <p>Falls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.</p> -<h2>2 · Offerte erstellen<span class="hx:absolute hx:-mt-20" id="2--offerte-erstellen"></span> -<a href="#2--offerte-erstellen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Offerten → Neu</strong></p> +<h2>2 · Offerte erstellen<span class="hx:absolute hx:-mt-20" id="2--offerte-erstellen"></span> + <a href="#2--offerte-erstellen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Offerten → Neu</strong></p> <table> -<thead> -<tr> -<th>Feld</th> -<th>Inhalt</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Kunde</strong></td> -<td>aus Kundendatenbank wählen</td> -</tr> -<tr> -<td><strong>Bezeichnung</strong></td> -<td>Projekttitel (z. B. &ldquo;Einfamilienhaus Müller, Bern&rdquo;)</td> -</tr> -<tr> -<td><strong>Honorartyp</strong></td> -<td>Stundensatz / SIA 102 / Pauschal</td> -</tr> -<tr> -<td><strong>Bauschätzwert</strong></td> -<td>bei SIA — Bruttowert in CHF</td> -</tr> -<tr> -<td><strong>Phasen</strong></td> -<td>bei SIA — anzuklickende Phasen</td> -</tr> -<tr> -<td><strong>Positionen</strong></td> -<td>bei Stundensatz/Pauschal — Position, Beschreibung, Betrag</td> -</tr> -</tbody> + <thead> + <tr> + <th>Feld</th> + <th>Inhalt</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Kunde</strong></td> + <td>aus Kundendatenbank wählen</td> + </tr> + <tr> + <td><strong>Bezeichnung</strong></td> + <td>Projekttitel (z. B. &ldquo;Einfamilienhaus Müller, Bern&rdquo;)</td> + </tr> + <tr> + <td><strong>Honorartyp</strong></td> + <td>Stundensatz / SIA 102 / Pauschal</td> + </tr> + <tr> + <td><strong>Bauschätzwert</strong></td> + <td>bei SIA — Bruttowert in CHF</td> + </tr> + <tr> + <td><strong>Phasen</strong></td> + <td>bei SIA — anzuklickende Phasen</td> + </tr> + <tr> + <td><strong>Positionen</strong></td> + <td>bei Stundensatz/Pauschal — Position, Beschreibung, Betrag</td> + </tr> + </tbody> </table> <p>Mit <em>PDF exportieren</em> — fertige Offerte für den Kunden.</p> -<h3>Offerten-Status<span class="hx:absolute hx:-mt-20" id="offerten-status"></span> -<a href="#offerten-status" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><table> -<thead> -<tr> -<th>Status</th> -<th>Bedeutung</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Entwurf</strong></td> -<td>noch nicht versandt</td> -</tr> -<tr> -<td><strong>Versandt</strong></td> -<td>beim Kunden, wartet auf Antwort</td> -</tr> -<tr> -<td><strong>Angenommen</strong></td> -<td>Kunde hat zugesagt — bereit zur Konvertierung</td> -</tr> -<tr> -<td><strong>Abgelehnt</strong></td> -<td>Kunde hat abgelehnt — Archiv</td> -</tr> -</tbody> +<h3>Offerten-Status<span class="hx:absolute hx:-mt-20" id="offerten-status"></span> + <a href="#offerten-status" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><table> + <thead> + <tr> + <th>Status</th> + <th>Bedeutung</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Entwurf</strong></td> + <td>noch nicht versandt</td> + </tr> + <tr> + <td><strong>Versandt</strong></td> + <td>beim Kunden, wartet auf Antwort</td> + </tr> + <tr> + <td><strong>Angenommen</strong></td> + <td>Kunde hat zugesagt — bereit zur Konvertierung</td> + </tr> + <tr> + <td><strong>Abgelehnt</strong></td> + <td>Kunde hat abgelehnt — Archiv</td> + </tr> + </tbody> </table> -<h2>3 · Offerte → Projekt<span class="hx:absolute hx:-mt-20" id="3--offerte--projekt"></span> -<a href="#3--offerte--projekt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Bei Status <strong>&ldquo;Angenommen&rdquo;</strong>: Knopf <strong>&ldquo;In Projekt konvertieren&rdquo;</strong>.</p> +<h2>3 · Offerte → Projekt<span class="hx:absolute hx:-mt-20" id="3--offerte--projekt"></span> + <a href="#3--offerte--projekt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Bei Status <strong>&ldquo;Angenommen&rdquo;</strong>: Knopf <strong>&ldquo;In Projekt konvertieren&rdquo;</strong>.</p> <p>Das erzeugt:</p> <ul> <li>Ein neues Projekt mit den Daten der Offerte (Kunde, Bezeichnung, Honorar, Phasen)</li> <li>Eine Verknüpfung zwischen Offerte und Projekt</li> <li>Die Offerte selbst bleibt im Archiv erhalten</li> </ul> -<p>Siehe auch <a href="../../features/projekte">Projekt-Feature</a>.</p> -<h2>4 · Zeit erfassen<span class="hx:absolute hx:-mt-20" id="4--zeit-erfassen"></span> -<a href="#4--zeit-erfassen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Zeit → Mitarbeiter wählen → Woche navigieren</strong></p> +<p>Siehe auch <a href="../../features/projekte">Projekt-Feature</a>.</p> +<h2>4 · Zeit erfassen<span class="hx:absolute hx:-mt-20" id="4--zeit-erfassen"></span> + <a href="#4--zeit-erfassen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Zeit → Mitarbeiter wählen → Woche navigieren</strong></p> <ul> <li><strong>Klick</strong> auf einen Halbstunden-Slot → Eintrag erstellen</li> <li><strong>Drag</strong> über mehrere Slots → längerer Eintrag</li> <li><strong>Projekt zuweisen</strong> (Pflichtfeld) — aus aktiven Projekten</li> <li><strong>SIA-Phase</strong> zuweisen (optional, für detaillierte Auswertung)</li> </ul> -<h3>Spezialfälle<span class="hx:absolute hx:-mt-20" id="spezialfälle"></span> -<a href="#spezialf%c3%a4lle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><ul> +<h3>Spezialfälle<span class="hx:absolute hx:-mt-20" id="spezialfälle"></span> + <a href="#spezialf%c3%a4lle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><ul> <li><strong>Ferien</strong> — eigener &ldquo;Projekt&rdquo;-Typ &ldquo;Ferien&rdquo;, in der Auswertung separat</li> <li><strong>Krankheit/Absenz</strong> — eigener &ldquo;Projekt&rdquo;-Typ, ebenfalls separat</li> <li><strong>Interne Stunden</strong> — z. B. Verwaltung, Marketing, IT — eigene interne Projekte</li> </ul> -<h2>5 · Akonto-Rechnung<span class="hx:absolute hx:-mt-20" id="5--akonto-rechnung"></span> -<a href="#5--akonto-rechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Während der Projektlaufzeit — typisch nach jeder abgeschlossenen SIA-Phase oder monatlich.</p> +<h2>5 · Akonto-Rechnung<span class="hx:absolute hx:-mt-20" id="5--akonto-rechnung"></span> + <a href="#5--akonto-rechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Während der Projektlaufzeit — typisch nach jeder abgeschlossenen SIA-Phase oder monatlich.</p> <p><strong>Rechnungen → Neu → Akonto</strong></p> <table> -<thead> -<tr> -<th>Feld</th> -<th>Inhalt</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Projekt</strong></td> -<td>aus aktiven Projekten</td> -</tr> -<tr> -<td><strong>Bezug</strong></td> -<td>&ldquo;Akonto für Phase 31 — Vorprojekt&rdquo;</td> -</tr> -<tr> -<td><strong>Betrag</strong></td> -<td>Stundensatz × Stunden, oder Phasenanteil × Bausumme</td> -</tr> -<tr> -<td><strong>Fälligkeit</strong></td> -<td>i. d. R. 30 Tage</td> -</tr> -</tbody> + <thead> + <tr> + <th>Feld</th> + <th>Inhalt</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Projekt</strong></td> + <td>aus aktiven Projekten</td> + </tr> + <tr> + <td><strong>Bezug</strong></td> + <td>&ldquo;Akonto für Phase 31 — Vorprojekt&rdquo;</td> + </tr> + <tr> + <td><strong>Betrag</strong></td> + <td>Stundensatz × Stunden, oder Phasenanteil × Bausumme</td> + </tr> + <tr> + <td><strong>Fälligkeit</strong></td> + <td>i. d. R. 30 Tage</td> + </tr> + </tbody> </table> <p>Rapport zieht automatisch die geleisteten Stunden aus der Zeiterfassung — die kannst du als Basis nehmen oder überschreiben.</p> -<p>PDF inkl. <strong>QR-Einzahlungsschein</strong> — siehe <a href="../../features/rechnungen">Rechnungen-Feature</a>.</p> -<h2>6 · Schlussrechnung<span class="hx:absolute hx:-mt-20" id="6--schlussrechnung"></span> -<a href="#6--schlussrechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.</p> +<p>PDF inkl. <strong>QR-Einzahlungsschein</strong> — siehe <a href="../../features/rechnungen">Rechnungen-Feature</a>.</p> +<h2>6 · Schlussrechnung<span class="hx:absolute hx:-mt-20" id="6--schlussrechnung"></span> + <a href="#6--schlussrechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.</p> <p><strong>Rechnungen → Neu → Schlussrechnung</strong></p> <p>Rapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Gesamthonorar (SIA / Pauschal / Stundensatz) -</span></span><span class="line"><span class="cl"> − Akonto-Rechnung 1 -</span></span><span class="line"><span class="cl"> − Akonto-Rechnung 2 -</span></span><span class="line"><span class="cl"> − Akonto-Rechnung 3 -</span></span><span class="line"><span class="cl"> = Schlussrechnung</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Gesamthonorar (SIA / Pauschal / Stundensatz) +</span></span><span class="line"><span class="cl"> − Akonto-Rechnung 1 +</span></span><span class="line"><span class="cl"> − Akonto-Rechnung 2 +</span></span><span class="line"><span class="cl"> − Akonto-Rechnung 3 +</span></span><span class="line"><span class="cl"> = Schlussrechnung</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h2>7 · Projektabschluss<span class="hx:absolute hx:-mt-20" id="7--projektabschluss"></span> -<a href="#7--projektabschluss" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Im Projekt → Status auf <strong>&ldquo;Abgeschlossen&rdquo;</strong>.</p> +<h2>7 · Projektabschluss<span class="hx:absolute hx:-mt-20" id="7--projektabschluss"></span> + <a href="#7--projektabschluss" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Im Projekt → Status auf <strong>&ldquo;Abgeschlossen&rdquo;</strong>.</p> <p>Das Projekt bleibt für historische Auswertungen sichtbar, taucht aber nicht mehr in der Zeiterfassungs-Auswahl auf.</p> -<h2>Auswertungen<span class="hx:absolute hx:-mt-20" id="auswertungen"></span> -<a href="#auswertungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Wöchentlich / monatlich / am Jahresende:</p> +<h2>Auswertungen<span class="hx:absolute hx:-mt-20" id="auswertungen"></span> + <a href="#auswertungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Wöchentlich / monatlich / am Jahresende:</p> <ul> <li><strong>Zeit → Auswertungen</strong> — Stunden pro Mitarbeiter, pro Projekt, pro Phase</li> <li><strong>Rechnungen → Übersicht</strong> — offene Beträge, bezahlt, Mahnungen</li> <li><strong>Buchhaltung → Erfolgsrechnung</strong> — Einnahmen vs. Ausgaben</li> <li><strong>Mitarbeiter → Lohnabrechnung</strong> — monatlich</li> </ul> -<h2>Tipps aus dem Alltag<span class="hx:absolute hx:-mt-20" id="tipps-aus-dem-alltag"></span> -<a href="#tipps-aus-dem-alltag" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Tipps aus dem Alltag<span class="hx:absolute hx:-mt-20" id="tipps-aus-dem-alltag"></span> + <a href="#tipps-aus-dem-alltag" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li><strong>Zeit jeden Tag erfassen</strong> statt rückwirkend — sonst gehen Details verloren</li> <li><strong>Akonto regelmässig</strong> statt einmal am Schluss — Liquidität</li> -<li><strong>Backups</strong> vor Jahresabschluss — siehe <a href="../datenhaltung">Datenhaltung</a></li> +<li><strong>Backups</strong> vor Jahresabschluss — siehe <a href="../datenhaltung">Datenhaltung</a></li> <li><strong>Briefbogen-Logo</strong> in hoher Auflösung — sieht im PDF besser aus</li> -</ul>Datenhaltung & Backuphttps://rapport.gabrielevarano.ch/docs/datenhaltung/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/datenhaltung/ -<p>Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.</p> +</ul> + + + + + + Datenhaltung & Backup + /docs/datenhaltung/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/datenhaltung/ + + + + <p>Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.</p> <blockquote> -<p><strong>Diese Seite beschreibt die Desktop-App (Single-User).</strong> Wer im Team arbeitet und Rapport gegen einen <a href="../../server/">Rapport Server</a> betreibt, sichert stattdessen die Postgres-Datenbank — siehe <a href="../../server/#backup">Rapport Server § Backup</a>.</p> + <p><strong>Diese Seite beschreibt die Desktop-App (Single-User).</strong> Wer im Team arbeitet und Rapport gegen einen <a href="../../server/">Rapport Server</a> betreibt, sichert stattdessen die Postgres-Datenbank — siehe <a href="../../server/#backup">Rapport Server § Backup</a>.</p> + </blockquote> -<h2>Speicherort (Desktop-App)<span class="hx:absolute hx:-mt-20" id="speicherort-desktop-app"></span> -<a href="#speicherort-desktop-app" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Die Desktop-App speichert <strong>alles lokal</strong> — keine Cloud, kein Server.</p> -<h3>macOS<span class="hx:absolute hx:-mt-20" id="macos"></span> -<a href="#macos" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">~/Library/Application Support/com.rapport.app/</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Speicherort (Desktop-App)<span class="hx:absolute hx:-mt-20" id="speicherort-desktop-app"></span> + <a href="#speicherort-desktop-app" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Die Desktop-App speichert <strong>alles lokal</strong> — keine Cloud, kein Server.</p> +<h3>macOS<span class="hx:absolute hx:-mt-20" id="macos"></span> + <a href="#macos" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">~/Library/Application Support/com.rapport.app/</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>Dort liegt eine einzelne <strong><code>localStorage</code></strong>-Datenbank des WebView, in der <strong>alle</strong> Rapport-Daten als JSON unter dem Key <code>studio_data_v1</code> gespeichert sind:</p> @@ -646,306 +734,343 @@ data-copied-label="Kopiert!" <li>App-Einstellungen</li> </ul> <blockquote> -<p><strong>Konsequenz:</strong> Wer den Application-Support-Ordner kopiert, hat ein vollständiges Backup. Wer ihn löscht, verliert alle Daten.</p> + <p><strong>Konsequenz:</strong> Wer den Application-Support-Ordner kopiert, hat ein vollständiges Backup. Wer ihn löscht, verliert alle Daten.</p> + </blockquote> -<h3>Warum localStorage?<span class="hx:absolute hx:-mt-20" id="warum-localstorage"></span> -<a href="#warum-localstorage" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>In der Desktop-App ist Rapport eine <strong>Single-User-Anwendung</strong>. localStorage ist dafür:</p> +<h3>Warum localStorage?<span class="hx:absolute hx:-mt-20" id="warum-localstorage"></span> + <a href="#warum-localstorage" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>In der Desktop-App ist Rapport eine <strong>Single-User-Anwendung</strong>. localStorage ist dafür:</p> <ul> <li><strong>Schnell</strong> — keine Datenbank-Roundtrips</li> <li><strong>Einfach</strong> — keine Migration nötig, JSON-Schema im Code</li> <li><strong>Portabel</strong> — eine Datei → ein Backup</li> </ul> -<p>Für <strong>Multi-User-Betrieb</strong> existiert <a href="../../server/">Rapport Server</a> — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.</p> -<h2>Backup-Strategien<span class="hx:absolute hx:-mt-20" id="backup-strategien"></span> -<a href="#backup-strategien" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>A · Einfach (manuell)<span class="hx:absolute hx:-mt-20" id="a--einfach-manuell"></span> -<a href="#a--einfach-manuell" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Den ganzen Ordner kopieren:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp -R <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ -</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Documents/Rapport-Backup-</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<p>Für <strong>Multi-User-Betrieb</strong> existiert <a href="../../server/">Rapport Server</a> — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.</p> +<h2>Backup-Strategien<span class="hx:absolute hx:-mt-20" id="backup-strategien"></span> + <a href="#backup-strategien" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>A · Einfach (manuell)<span class="hx:absolute hx:-mt-20" id="a--einfach-manuell"></span> + <a href="#a--einfach-manuell" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Den ganzen Ordner kopieren:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp -R <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Documents/Rapport-Backup-</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>→ Auf USB-Stick, externen Datenträger oder in die Cloud.</p> -<h3>B · Time Machine<span class="hx:absolute hx:-mt-20" id="b--time-machine"></span> -<a href="#b--time-machine" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.</p> +<h3>B · Time Machine<span class="hx:absolute hx:-mt-20" id="b--time-machine"></span> + <a href="#b--time-machine" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.</p> <blockquote> -<p><strong>Einschränkung:</strong> Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.</p> + <p><strong>Einschränkung:</strong> Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.</p> + </blockquote> -<h3>C · Cron-Job (täglich automatisch)<span class="hx:absolute hx:-mt-20" id="c--cron-job-täglich-automatisch"></span> -<a href="#c--cron-job-t%c3%a4glich-automatisch" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># In ~/Library/LaunchAgents/com.rapport.backup.plist hinterlegen</span> -</span></span><span class="line"><span class="cl"><span class="c1"># oder als crontab-Eintrag:</span> -</span></span><span class="line"><span class="cl"><span class="m">0</span> <span class="m">22</span> * * * rsync -a <span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/Library/Application Support/com.rapport.app/&#34;</span> <span class="se">\ -</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/Backups/rapport/</span><span class="k">$(</span>date +<span class="se">\%</span>Y<span class="se">\%</span>m<span class="se">\%</span>d<span class="k">)</span><span class="s2">/&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h3>C · Cron-Job (täglich automatisch)<span class="hx:absolute hx:-mt-20" id="c--cron-job-täglich-automatisch"></span> + <a href="#c--cron-job-t%c3%a4glich-automatisch" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># In ~/Library/LaunchAgents/com.rapport.backup.plist hinterlegen</span> +</span></span><span class="line"><span class="cl"><span class="c1"># oder als crontab-Eintrag:</span> +</span></span><span class="line"><span class="cl"><span class="m">0</span> <span class="m">22</span> * * * rsync -a <span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/Library/Application Support/com.rapport.app/&#34;</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;</span><span class="nv">$HOME</span><span class="s2">/Backups/rapport/</span><span class="k">$(</span>date +<span class="se">\%</span>Y<span class="se">\%</span>m<span class="se">\%</span>d<span class="k">)</span><span class="s2">/&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h3>D · iCloud Drive (off-site)<span class="hx:absolute hx:-mt-20" id="d--icloud-drive-off-site"></span> -<a href="#d--icloud-drive-off-site" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Application-Support liegt <strong>nicht</strong> automatisch in iCloud. Wer das will:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Symlink anlegen</span> -</span></span><span class="line"><span class="cl">mkdir -p <span class="s2">&#34;~/iCloud Drive/Rapport&#34;</span> -</span></span><span class="line"><span class="cl">ln -s <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="s2">&#34;~/iCloud Drive/Rapport/data&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h3>D · iCloud Drive (off-site)<span class="hx:absolute hx:-mt-20" id="d--icloud-drive-off-site"></span> + <a href="#d--icloud-drive-off-site" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Application-Support liegt <strong>nicht</strong> automatisch in iCloud. Wer das will:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Symlink anlegen</span> +</span></span><span class="line"><span class="cl">mkdir -p <span class="s2">&#34;~/iCloud Drive/Rapport&#34;</span> +</span></span><span class="line"><span class="cl">ln -s <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="s2">&#34;~/iCloud Drive/Rapport/data&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <blockquote> -<p><strong>Achtung:</strong> iCloud-Sync mit aktiver App kann zu <strong>Race-Conditions</strong> führen. Besser den Sync zeitversetzt (z. B. nachts via Cron).</p> + <p><strong>Achtung:</strong> iCloud-Sync mit aktiver App kann zu <strong>Race-Conditions</strong> führen. Besser den Sync zeitversetzt (z. B. nachts via Cron).</p> + </blockquote> -<h2>Wiederherstellung<span class="hx:absolute hx:-mt-20" id="wiederherstellung"></span> -<a href="#wiederherstellung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Vollständig (Rapport komplett tot)<span class="hx:absolute hx:-mt-20" id="vollständig-rapport-komplett-tot"></span> -<a href="#vollst%c3%a4ndig-rapport-komplett-tot" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><ol> +<h2>Wiederherstellung<span class="hx:absolute hx:-mt-20" id="wiederherstellung"></span> + <a href="#wiederherstellung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Vollständig (Rapport komplett tot)<span class="hx:absolute hx:-mt-20" id="vollständig-rapport-komplett-tot"></span> + <a href="#vollst%c3%a4ndig-rapport-komplett-tot" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><ol> <li>Rapport beenden (Cmd+Q, nicht nur Fenster zu)</li> <li>Aktuellen Ordner umbenennen (falls noch da): -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mv <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ -</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Library/Application Support/com.rapport.app.bak&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mv <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Library/Application Support/com.rapport.app.bak&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> </li> <li>Backup-Ordner zurück kopieren: -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp -R <span class="s2">&#34;~/Documents/Rapport-Backup-20260523&#34;</span> <span class="se">\ -</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp -R <span class="s2">&#34;~/Documents/Rapport-Backup-20260523&#34;</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> </li> <li>Rapport starten</li> </ol> -<h3>Selektiv (nur einzelne Daten)<span class="hx:absolute hx:-mt-20" id="selektiv-nur-einzelne-daten"></span> -<a href="#selektiv-nur-einzelne-daten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Da alle Daten in <strong>einem JSON unter <code>studio_data_v1</code></strong> liegen, ist selektive Wiederherstellung <strong>manuell</strong>:</p> +<h3>Selektiv (nur einzelne Daten)<span class="hx:absolute hx:-mt-20" id="selektiv-nur-einzelne-daten"></span> + <a href="#selektiv-nur-einzelne-daten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>Da alle Daten in <strong>einem JSON unter <code>studio_data_v1</code></strong> liegen, ist selektive Wiederherstellung <strong>manuell</strong>:</p> <ol> <li>Backup-<code>localStorage</code>-Datei öffnen (WebKit-Format → mit Tool wie [WebKit Storage Inspector] lesen, oder via Rapport DevTools)</li> <li>Gewünschte Felder in die aktuelle Instanz übertragen</li> </ol> <p>In der Praxis: meistens lohnt sich die <strong>vollständige</strong> Wiederherstellung mehr.</p> -<h2>Export-Funktionen (in der App)<span class="hx:absolute hx:-mt-20" id="export-funktionen-in-der-app"></span> -<a href="#export-funktionen-in-der-app" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Aus Rapport selbst:</p> +<h2>Export-Funktionen (in der App)<span class="hx:absolute hx:-mt-20" id="export-funktionen-in-der-app"></span> + <a href="#export-funktionen-in-der-app" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Aus Rapport selbst:</p> <table> -<thead> -<tr> -<th>Was</th> -<th>Wo</th> -<th>Format</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Zeit-Auswertung</strong></td> -<td>Zeit → Export</td> -<td>CSV</td> -</tr> -<tr> -<td><strong>Rechnung</strong></td> -<td>Rechnung → PDF</td> -<td>PDF (inkl. QR)</td> -</tr> -<tr> -<td><strong>Offerte</strong></td> -<td>Offerte → PDF</td> -<td>PDF</td> -</tr> -<tr> -<td><strong>Lohnabrechnung</strong></td> -<td>Mitarbeiter → PDF</td> -<td>PDF</td> -</tr> -<tr> -<td><strong>Jahres-Buchhaltung</strong></td> -<td>Buchhaltung → Export</td> -<td>CSV</td> -</tr> -</tbody> + <thead> + <tr> + <th>Was</th> + <th>Wo</th> + <th>Format</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Zeit-Auswertung</strong></td> + <td>Zeit → Export</td> + <td>CSV</td> + </tr> + <tr> + <td><strong>Rechnung</strong></td> + <td>Rechnung → PDF</td> + <td>PDF (inkl. QR)</td> + </tr> + <tr> + <td><strong>Offerte</strong></td> + <td>Offerte → PDF</td> + <td>PDF</td> + </tr> + <tr> + <td><strong>Lohnabrechnung</strong></td> + <td>Mitarbeiter → PDF</td> + <td>PDF</td> + </tr> + <tr> + <td><strong>Jahres-Buchhaltung</strong></td> + <td>Buchhaltung → Export</td> + <td>CSV</td> + </tr> + </tbody> </table> <p>Die Exports sind für externe Verwendung (Buchhalter, Treuhänder, Archiv) gedacht — kein Full-Backup.</p> -<h2>Schema-Migrationen<span class="hx:absolute hx:-mt-20" id="schema-migrationen"></span> -<a href="#schema-migrationen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Bei Updates kann sich das Datenformat ändern. Rapport hat einen <strong>Migrations-Mechanismus</strong>: beim Start prüft die App, ob das gespeicherte Format dem aktuellen entspricht, und migriert es automatisch.</p> -<p>Code: <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js"target="_blank" rel="noopener">src/storage/migrations.js<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>Schema-Migrationen<span class="hx:absolute hx:-mt-20" id="schema-migrationen"></span> + <a href="#schema-migrationen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Bei Updates kann sich das Datenformat ändern. Rapport hat einen <strong>Migrations-Mechanismus</strong>: beim Start prüft die App, ob das gespeicherte Format dem aktuellen entspricht, und migriert es automatisch.</p> +<p>Code: <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js"target="_blank" rel="noopener">src/storage/migrations.js<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>.</p> <blockquote> -<p><strong>Empfehlung:</strong> Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.</p> + <p><strong>Empfehlung:</strong> Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.</p> + </blockquote> -<h2>Was wird <strong>nicht</strong> gespeichert?<span class="hx:absolute hx:-mt-20" id="was-wird-nicht-gespeichert"></span> -<a href="#was-wird-nicht-gespeichert" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Was wird <strong>nicht</strong> gespeichert?<span class="hx:absolute hx:-mt-20" id="was-wird-nicht-gespeichert"></span> + <a href="#was-wird-nicht-gespeichert" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li><strong>WebView-Cache</strong> — <code>~/Library/Caches/com.rapport.app/</code> und <code>~/Library/WebKit/com.rapport.app/</code> sind sicher zu löschen (UI-Caches, regenerieren sich)</li> <li><strong>App-Updates</strong> — werden bei Bedarf erneut runtergeladen</li> <li><strong>Logs</strong> — <code>~/Library/Logs/com.rapport.app/</code> (geplant, derzeit nicht geschrieben)</li> </ul> -<h2>Datenmenge<span class="hx:absolute hx:-mt-20" id="datenmenge"></span> -<a href="#datenmenge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Typische Grössen pro Bürojahr:</p> +<h2>Datenmenge<span class="hx:absolute hx:-mt-20" id="datenmenge"></span> + <a href="#datenmenge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Typische Grössen pro Bürojahr:</p> <table> -<thead> -<tr> -<th>Inhalt</th> -<th>Grösse</th> -</tr> -</thead> -<tbody> -<tr> -<td>Logo (PNG/SVG)</td> -<td>50 KB – 1 MB</td> -</tr> -<tr> -<td>1 Jahr Zeiterfassung (1 MA)</td> -<td>~ 80 KB</td> -</tr> -<tr> -<td>1 Jahr Zeiterfassung (5 MA)</td> -<td>~ 400 KB</td> -</tr> -<tr> -<td>50 Projekte mit je 5 Rechnungen</td> -<td>~ 800 KB</td> -</tr> -<tr> -<td><strong>Total typisches Solo-Büro / Jahr</strong></td> -<td><strong>~ 1–2 MB</strong></td> -</tr> -</tbody> + <thead> + <tr> + <th>Inhalt</th> + <th>Grösse</th> + </tr> + </thead> + <tbody> + <tr> + <td>Logo (PNG/SVG)</td> + <td>50 KB – 1 MB</td> + </tr> + <tr> + <td>1 Jahr Zeiterfassung (1 MA)</td> + <td>~ 80 KB</td> + </tr> + <tr> + <td>1 Jahr Zeiterfassung (5 MA)</td> + <td>~ 400 KB</td> + </tr> + <tr> + <td>50 Projekte mit je 5 Rechnungen</td> + <td>~ 800 KB</td> + </tr> + <tr> + <td><strong>Total typisches Solo-Büro / Jahr</strong></td> + <td><strong>~ 1–2 MB</strong></td> + </tr> + </tbody> </table> -<p>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 → <a href="../../server/">Rapport Server</a>.</p>Web-Modus (Multi-User)https://rapport.gabrielevarano.ch/docs/web-modus/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/web-modus/ -<blockquote> -<p><strong>Hinweis:</strong> Der frühere Supabase-basierte Web-Modus wurde durch <strong><a href="../../server/">Rapport Server</a></strong> abgelöst — den vollständigen Selfhost-Stack mit eigenem Postgres, Auth, Realtime und Storage. Keine externe Cloud-Abhängigkeit mehr.</p> -<p>Diese Seite bleibt als Referenz erhalten, der <strong>empfohlene Weg</strong> für Multi-User-Setups ist <strong><a href="../../server/">Rapport Server</a></strong>.</p> +<p>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 → <a href="../../server/">Rapport Server</a>.</p> + + + + + + Web-Modus (Multi-User) + /docs/web-modus/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/web-modus/ + + + + <blockquote> + <p><strong>Hinweis:</strong> Der frühere Supabase-basierte Web-Modus wurde durch <strong><a href="../../server/">Rapport Server</a></strong> abgelöst — den vollständigen Selfhost-Stack mit eigenem Postgres, Auth, Realtime und Storage. Keine externe Cloud-Abhängigkeit mehr.</p> +<p>Diese Seite bleibt als Referenz erhalten, der <strong>empfohlene Weg</strong> für Multi-User-Setups ist <strong><a href="../../server/">Rapport Server</a></strong>.</p> + </blockquote> -<h2>Wann brauchst du das?<span class="hx:absolute hx:-mt-20" id="wann-brauchst-du-das"></span> -<a href="#wann-brauchst-du-das" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> -<thead> -<tr> -<th>Anwendungsfall</th> -<th>Empfehlung</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Solo-Büro, ein Mac</strong></td> -<td>Desktop-App — siehe <a href="../installation">Installation</a></td> -</tr> -<tr> -<td><strong>2–5 Personen, gleicher Standort</strong></td> -<td><a href="../../server/">Rapport Server</a> auf einem Mac Mini im LAN</td> -</tr> -<tr> -<td><strong>Verteiltes Team / Home-Office</strong></td> -<td><a href="../../server/">Rapport Server</a> mit SSL + Reverse Proxy</td> -</tr> -<tr> -<td><strong>Hosted Backend (eigener VPS)</strong></td> -<td><a href="../../server/">Rapport Server</a> auf Linux-VPS</td> -</tr> -</tbody> +<h2>Wann brauchst du das?<span class="hx:absolute hx:-mt-20" id="wann-brauchst-du-das"></span> + <a href="#wann-brauchst-du-das" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> + <thead> + <tr> + <th>Anwendungsfall</th> + <th>Empfehlung</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Solo-Büro, ein Mac</strong></td> + <td>Desktop-App — siehe <a href="../installation">Installation</a></td> + </tr> + <tr> + <td><strong>2–5 Personen, gleicher Standort</strong></td> + <td><a href="../../server/">Rapport Server</a> auf einem Mac Mini im LAN</td> + </tr> + <tr> + <td><strong>Verteiltes Team / Home-Office</strong></td> + <td><a href="../../server/">Rapport Server</a> mit SSL + Reverse Proxy</td> + </tr> + <tr> + <td><strong>Hosted Backend (eigener VPS)</strong></td> + <td><a href="../../server/">Rapport Server</a> auf Linux-VPS</td> + </tr> + </tbody> </table> -<h2>Architektur (Kurzfassung)<span class="hx:absolute hx:-mt-20" id="architektur-kurzfassung"></span> -<a href="#architektur-kurzfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">┌────────────┐ HTTPS ┌──────────────┐ SQL ┌────────────┐ -</span></span><span class="line"><span class="cl">│ Browser │ ──────────────│ nginx │ ─────────────│ Postgres │ -</span></span><span class="line"><span class="cl">│ / Desktop │ │ (Frontend) │ │ + GoTrue │ -</span></span><span class="line"><span class="cl">└────────────┘ └──────────────┘ │ + REST │ -</span></span><span class="line"><span class="cl"> │ + Realtime │ -</span></span><span class="line"><span class="cl"> │ + Storage │ -</span></span><span class="line"><span class="cl"> └────────────┘</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Architektur (Kurzfassung)<span class="hx:absolute hx:-mt-20" id="architektur-kurzfassung"></span> + <a href="#architektur-kurzfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">┌────────────┐ HTTPS ┌──────────────┐ SQL ┌────────────┐ +</span></span><span class="line"><span class="cl">│ Browser │ ──────────────│ nginx │ ─────────────│ Postgres │ +</span></span><span class="line"><span class="cl">│ / Desktop │ │ (Frontend) │ │ + GoTrue │ +</span></span><span class="line"><span class="cl">└────────────┘ └──────────────┘ │ + REST │ +</span></span><span class="line"><span class="cl"> │ + Realtime │ +</span></span><span class="line"><span class="cl"> │ + Storage │ +</span></span><span class="line"><span class="cl"> └────────────┘</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <ul> <li><strong>Frontend:</strong> dieselbe React-App, aber Vite-Build statt Tauri (<code>npm run build</code>)</li> -<li><strong>Backend:</strong> Postgres-Stack (<a href="../../server/">Rapport Server</a>)</li> +<li><strong>Backend:</strong> Postgres-Stack (<a href="../../server/">Rapport Server</a>)</li> <li><strong>Auth:</strong> E-Mail / Passwort über GoTrue</li> <li><strong>Storage:</strong> Belege, Logos in Object-Storage</li> </ul> -<h2>Setup<span class="hx:absolute hx:-mt-20" id="setup"></span> -<a href="#setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Alle Setup-Schritte (Repo klonen, <code>.env</code> erstellen, Migrations syncen, Docker-Compose starten, Reverse-Proxy konfigurieren) sind in <strong><a href="../../server/">Rapport Server</a></strong> dokumentiert.</p> -<h2>Migration Desktop → Cloud<span class="hx:absolute hx:-mt-20" id="migration-desktop--cloud"></span> -<a href="#migration-desktop--cloud" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Wer mit der Desktop-App startet und später auf den Web-Modus wechseln möchte:</p> +<h2>Setup<span class="hx:absolute hx:-mt-20" id="setup"></span> + <a href="#setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Alle Setup-Schritte (Repo klonen, <code>.env</code> erstellen, Migrations syncen, Docker-Compose starten, Reverse-Proxy konfigurieren) sind in <strong><a href="../../server/">Rapport Server</a></strong> dokumentiert.</p> +<h2>Migration Desktop → Cloud<span class="hx:absolute hx:-mt-20" id="migration-desktop--cloud"></span> + <a href="#migration-desktop--cloud" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Wer mit der Desktop-App startet und später auf den Web-Modus wechseln möchte:</p> <ul> <li><strong>Aktuell:</strong> manueller Export aus Rapport (CSV/PDF) und manuelles Wiederanlegen im neuen Setup</li> <li><strong>Geplant:</strong> <em>&ldquo;localStorage → Postgres&rdquo;</em>-Import-Knopf direkt in der App</li> </ul> -<p>Status: <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<p>Status: <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>.</p> -<h2>Troubleshooting<span class="hx:absolute hx:-mt-20" id="troubleshooting"></span> -<a href="#troubleshooting" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Siehe <a href="../../server/">Rapport Server § Troubleshooting</a> oder <a href="../troubleshooting">allgemeine Troubleshooting-Seite</a>.</p>Entwicklung & Buildhttps://rapport.gabrielevarano.ch/docs/entwicklung/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/entwicklung/ -<p>Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.</p> -<h2>Voraussetzungen<span class="hx:absolute hx:-mt-20" id="voraussetzungen"></span> -<a href="#voraussetzungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> -<thead> -<tr> -<th>Tool</th> -<th>Version</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Node.js</strong></td> -<td>≥ 20 (für Vite 8)</td> -</tr> -<tr> -<td><strong>npm</strong></td> -<td>≥ 10</td> -</tr> -<tr> -<td><strong>Rust toolchain</strong></td> -<td>≥ 1.77.2 (via <code>rustup</code>)</td> -</tr> -<tr> -<td><strong>Plattform-Tools</strong></td> -<td>siehe <a href="https://v2.tauri.app/start/prerequisites/"target="_blank" rel="noopener">Tauri Prerequisites<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>Troubleshooting<span class="hx:absolute hx:-mt-20" id="troubleshooting"></span> + <a href="#troubleshooting" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Siehe <a href="../../server/">Rapport Server § Troubleshooting</a> oder <a href="../troubleshooting">allgemeine Troubleshooting-Seite</a>.</p> + + + + + + Entwicklung & Build + /docs/entwicklung/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/entwicklung/ + + + + <p>Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.</p> +<h2>Voraussetzungen<span class="hx:absolute hx:-mt-20" id="voraussetzungen"></span> + <a href="#voraussetzungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> + <thead> + <tr> + <th>Tool</th> + <th>Version</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Node.js</strong></td> + <td>≥ 20 (für Vite 8)</td> + </tr> + <tr> + <td><strong>npm</strong></td> + <td>≥ 10</td> + </tr> + <tr> + <td><strong>Rust toolchain</strong></td> + <td>≥ 1.77.2 (via <code>rustup</code>)</td> + </tr> + <tr> + <td><strong>Plattform-Tools</strong></td> + <td>siehe <a href="https://v2.tauri.app/start/prerequisites/"target="_blank" rel="noopener">Tauri Prerequisites<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a></td> -</tr> -</tbody> + </tr> + </tbody> </table> <p>Plattform-spezifisch:</p> <ul> @@ -953,35 +1078,37 @@ data-copied-label="Kopiert!" <li><strong>Windows:</strong> Microsoft C++ Build Tools + WebView2</li> <li><strong>Linux:</strong> <code>webkit2gtk-4.1</code>, <code>librsvg2-dev</code>, <code>libayatana-appindicator3-dev</code>, <code>build-essential</code></li> </ul> -<h2>Setup<span class="hx:absolute hx:-mt-20" id="setup"></span> -<a href="#setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://git.kgva.ch/karim/RAPPORT.git -</span></span><span class="line"><span class="cl"><span class="nb">cd</span> RAPPORT/APP -</span></span><span class="line"><span class="cl">npm install</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Setup<span class="hx:absolute hx:-mt-20" id="setup"></span> + <a href="#setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://git.kgva.ch/karim/RAPPORT.git +</span></span><span class="line"><span class="cl"><span class="nb">cd</span> RAPPORT/APP +</span></span><span class="line"><span class="cl">npm install</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h2>Entwicklung<span class="hx:absolute hx:-mt-20" id="entwicklung"></span> -<a href="#entwicklung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Web-Modus (HMR, schnellster Loop)<span class="hx:absolute hx:-mt-20" id="web-modus-hmr-schnellster-loop"></span> -<a href="#web-modus-hmr-schnellster-loop" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm run dev <span class="c1"># http://localhost:3000</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Entwicklung<span class="hx:absolute hx:-mt-20" id="entwicklung"></span> + <a href="#entwicklung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Web-Modus (HMR, schnellster Loop)<span class="hx:absolute hx:-mt-20" id="web-modus-hmr-schnellster-loop"></span> + <a href="#web-modus-hmr-schnellster-loop" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm run dev <span class="c1"># http://localhost:3000</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <ul> @@ -989,18 +1116,19 @@ data-copied-label="Kopiert!" <li>Schnellster Iteration-Loop für UI-Arbeit</li> <li>Datenpersistierung: Browser-localStorage</li> </ul> -<h3>Native Window (Tauri-Fenster mit Desktop-Integration)<span class="hx:absolute hx:-mt-20" id="native-window-tauri-fenster-mit-desktop-integration"></span> -<a href="#native-window-tauri-fenster-mit-desktop-integration" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npx tauri dev</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h3>Native Window (Tauri-Fenster mit Desktop-Integration)<span class="hx:absolute hx:-mt-20" id="native-window-tauri-fenster-mit-desktop-integration"></span> + <a href="#native-window-tauri-fenster-mit-desktop-integration" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npx tauri dev</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <ul> @@ -1008,120 +1136,125 @@ data-copied-label="Kopiert!" <li>System-Tray, Updater, native APIs verfügbar</li> <li>Erster Start dauert lange (Rust-Compile)</li> </ul> -<h2>Architektur in einem Absatz<span class="hx:absolute hx:-mt-20" id="architektur-in-einem-absatz"></span> -<a href="#architektur-in-einem-absatz" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><blockquote> -<p>RAPPORT ist eine monolithische SPA: ein React-Root in <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/App.jsx"target="_blank" rel="noopener">App.jsx<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>Architektur in einem Absatz<span class="hx:absolute hx:-mt-20" id="architektur-in-einem-absatz"></span> + <a href="#architektur-in-einem-absatz" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><blockquote> + <p>RAPPORT ist eine monolithische SPA: ein React-Root in <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/App.jsx"target="_blank" rel="noopener">App.jsx<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> hält den <strong>gesamten</strong> App-State in einem <code>useState({...})</code>, persistiert ihn synchron in <code>localStorage</code> unter <code>studio_data_v1</code>, und übergibt ihn als Props an lazy-geladene Views. <strong>Kein Routing-Framework</strong>, <strong>kein State-Library</strong>, <strong>kein TypeScript</strong>, <strong>kein CSS-Framework</strong>. Der <strong>Rust-Teil</strong> ist 109 Zeilen und macht nur drei Dinge: System-Tray, Window-Hide-on-Close, Plugin-Registrierung (Updater, Process, Log). <strong>Keine</strong> <code>#[tauri::command]</code> — Frontend ↔ Backend kommuniziert nur über das Event <code>rapport:navigate</code> (Tray → Frontend).</p> + </blockquote> -<p>Detaillierte Karte: <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/ARCHITECTURE.md"target="_blank" rel="noopener">ARCHITECTURE.md<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<p>Detaillierte Karte: <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/ARCHITECTURE.md"target="_blank" rel="noopener">ARCHITECTURE.md<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>.</p> -<h2>Verzeichnis-Karte<span class="hx:absolute hx:-mt-20" id="verzeichnis-karte"></span> -<a href="#verzeichnis-karte" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">APP/ -</span></span><span class="line"><span class="cl">├── src/ React 19 (kein TS, nur .jsx) -</span></span><span class="line"><span class="cl">│ ├── App.jsx Root: State, Navigation, Sidebar, Modals -</span></span><span class="line"><span class="cl">│ ├── constants.js STORAGE_KEY, NAV_ITEMS, defaultData, SIA-Phasen -</span></span><span class="line"><span class="cl">│ ├── utils.js Business-Logik: Kalkulation, QR-Bill, CSV, Lohn -</span></span><span class="line"><span class="cl">│ ├── storage/adapter.js LocalStorageAdapter (Phase 1), SupabaseAdapter (Phase 2) -</span></span><span class="line"><span class="cl">│ ├── storage/migrations.js Schema-Migrationen -</span></span><span class="line"><span class="cl">│ ├── views/ 20 Top-Level-Screens, lazy-geladen -</span></span><span class="line"><span class="cl">│ ├── components/UI.jsx StatusBadge, Modal, FormField, … -</span></span><span class="line"><span class="cl">│ ├── components/Update* Auto-Update-UI -</span></span><span class="line"><span class="cl">│ ├── print/ PrintComponents.jsx — alle Druckansichten -</span></span><span class="line"><span class="cl">│ └── utils/updater.js @tauri-apps/plugin-updater Wrapper -</span></span><span class="line"><span class="cl">│ -</span></span><span class="line"><span class="cl">├── supabase/migrations/ Postgres-Schema für Cloud-Variante -</span></span><span class="line"><span class="cl">│ -</span></span><span class="line"><span class="cl">├── src-tauri/ Rust-Backend (Tauri 2.10.3) -</span></span><span class="line"><span class="cl">│ ├── src/lib.rs ~103 Z. — Tray, Window-Events, Plugins -</span></span><span class="line"><span class="cl">│ ├── tauri.conf.json Updater-URL, Public-Key, CSP, Bundle-Targets -</span></span><span class="line"><span class="cl">│ └── capabilities/ Tauri Permissions -</span></span><span class="line"><span class="cl">│ -</span></span><span class="line"><span class="cl">├── scripts/release.sh Build + Sign + latest.json erzeugen -</span></span><span class="line"><span class="cl">├── latest.json Updater-Manifest -</span></span><span class="line"><span class="cl">└── deploy/ Docker-Compose für Web-Modus</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Verzeichnis-Karte<span class="hx:absolute hx:-mt-20" id="verzeichnis-karte"></span> + <a href="#verzeichnis-karte" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">APP/ +</span></span><span class="line"><span class="cl">├── src/ React 19 (kein TS, nur .jsx) +</span></span><span class="line"><span class="cl">│ ├── App.jsx Root: State, Navigation, Sidebar, Modals +</span></span><span class="line"><span class="cl">│ ├── constants.js STORAGE_KEY, NAV_ITEMS, defaultData, SIA-Phasen +</span></span><span class="line"><span class="cl">│ ├── utils.js Business-Logik: Kalkulation, QR-Bill, CSV, Lohn +</span></span><span class="line"><span class="cl">│ ├── storage/adapter.js LocalStorageAdapter (Phase 1), SupabaseAdapter (Phase 2) +</span></span><span class="line"><span class="cl">│ ├── storage/migrations.js Schema-Migrationen +</span></span><span class="line"><span class="cl">│ ├── views/ 20 Top-Level-Screens, lazy-geladen +</span></span><span class="line"><span class="cl">│ ├── components/UI.jsx StatusBadge, Modal, FormField, … +</span></span><span class="line"><span class="cl">│ ├── components/Update* Auto-Update-UI +</span></span><span class="line"><span class="cl">│ ├── print/ PrintComponents.jsx — alle Druckansichten +</span></span><span class="line"><span class="cl">│ └── utils/updater.js @tauri-apps/plugin-updater Wrapper +</span></span><span class="line"><span class="cl">│ +</span></span><span class="line"><span class="cl">├── supabase/migrations/ Postgres-Schema für Cloud-Variante +</span></span><span class="line"><span class="cl">│ +</span></span><span class="line"><span class="cl">├── src-tauri/ Rust-Backend (Tauri 2.10.3) +</span></span><span class="line"><span class="cl">│ ├── src/lib.rs ~103 Z. — Tray, Window-Events, Plugins +</span></span><span class="line"><span class="cl">│ ├── tauri.conf.json Updater-URL, Public-Key, CSP, Bundle-Targets +</span></span><span class="line"><span class="cl">│ └── capabilities/ Tauri Permissions +</span></span><span class="line"><span class="cl">│ +</span></span><span class="line"><span class="cl">├── scripts/release.sh Build + Sign + latest.json erzeugen +</span></span><span class="line"><span class="cl">├── latest.json Updater-Manifest +</span></span><span class="line"><span class="cl">└── deploy/ Docker-Compose für Web-Modus</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h2>Konventionen<span class="hx:absolute hx:-mt-20" id="konventionen"></span> -<a href="#konventionen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Konventionen<span class="hx:absolute hx:-mt-20" id="konventionen"></span> + <a href="#konventionen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li><strong>JavaScript</strong> statt TypeScript — bewusste Entscheidung für Solo-Dev-Velocity</li> <li><strong>Inline-Styles</strong> statt CSS-Framework</li> <li><strong>kein Routing-Framework</strong> — <code>view</code>-State in App.jsx triggert Komponente</li> <li><strong>JSON-Schema implizit</strong> — definiert durch <code>defaultData</code> in <code>constants.js</code></li> -<li><strong>Migrationen</strong> als reine Funktionen in <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js"target="_blank" rel="noopener">storage/migrations.js<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<li><strong>Migrationen</strong> als reine Funktionen in <a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js"target="_blank" rel="noopener">storage/migrations.js<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a></li> </ul> -<h2>Build<span class="hx:absolute hx:-mt-20" id="build"></span> -<a href="#build" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Desktop (Tauri DMG)<span class="hx:absolute hx:-mt-20" id="desktop-tauri-dmg"></span> -<a href="#desktop-tauri-dmg" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm run build <span class="c1"># erst Vite-Build (dist/)</span> -</span></span><span class="line"><span class="cl">npx tauri build <span class="c1"># dann Tauri-Bundle (DMG)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Build<span class="hx:absolute hx:-mt-20" id="build"></span> + <a href="#build" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Desktop (Tauri DMG)<span class="hx:absolute hx:-mt-20" id="desktop-tauri-dmg"></span> + <a href="#desktop-tauri-dmg" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm run build <span class="c1"># erst Vite-Build (dist/)</span> +</span></span><span class="line"><span class="cl">npx tauri build <span class="c1"># dann Tauri-Bundle (DMG)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>Output: <code>src-tauri/target/release/bundle/dmg/Rapport_&lt;version&gt;_aarch64.dmg</code></p> -<h3>Web (statisches Bundle)<span class="hx:absolute hx:-mt-20" id="web-statisches-bundle"></span> -<a href="#web-statisches-bundle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm run build <span class="c1"># Output: dist/ (~500 KB)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h3>Web (statisches Bundle)<span class="hx:absolute hx:-mt-20" id="web-statisches-bundle"></span> + <a href="#web-statisches-bundle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm run build <span class="c1"># Output: dist/ (~500 KB)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<p>Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe <a href="../web-modus">Web-Modus</a>.</p> -<h2>Release-Workflow<span class="hx:absolute hx:-mt-20" id="release-workflow"></span> -<a href="#release-workflow" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1 · Version bumpen in package.json + Cargo.toml + tauri.conf.json</span> -</span></span><span class="line"><span class="cl">./scripts/release.sh 0.7.1 -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># 2 · Build mit Signatur</span> -</span></span><span class="line"><span class="cl"><span class="nv">TAURI_SIGNING_PRIVATE_KEY</span><span class="o">=</span><span class="k">$(</span>cat ~/.tauri/rapport-key<span class="k">)</span> <span class="se">\ -</span></span></span><span class="line"><span class="cl"><span class="nv">TAURI_SIGNING_PRIVATE_KEY_PASSWORD</span><span class="o">=</span>… <span class="se">\ -</span></span></span><span class="line"><span class="cl">npx tauri build -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># 3 · latest.json aktualisieren mit neuer Signatur</span> -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># 4 · DMG + latest.json auf Gitea Releases hochladen</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<p>Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe <a href="../web-modus">Web-Modus</a>.</p> +<h2>Release-Workflow<span class="hx:absolute hx:-mt-20" id="release-workflow"></span> + <a href="#release-workflow" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1 · Version bumpen in package.json + Cargo.toml + tauri.conf.json</span> +</span></span><span class="line"><span class="cl">./scripts/release.sh 0.7.1 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># 2 · Build mit Signatur</span> +</span></span><span class="line"><span class="cl"><span class="nv">TAURI_SIGNING_PRIVATE_KEY</span><span class="o">=</span><span class="k">$(</span>cat ~/.tauri/rapport-key<span class="k">)</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="nv">TAURI_SIGNING_PRIVATE_KEY_PASSWORD</span><span class="o">=</span>… <span class="se">\ +</span></span></span><span class="line"><span class="cl">npx tauri build +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># 3 · latest.json aktualisieren mit neuer Signatur</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># 4 · DMG + latest.json auf Gitea Releases hochladen</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h2>Beitragen<span class="hx:absolute hx:-mt-20" id="beitragen"></span> -<a href="#beitragen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><a href="https://git.kgva.ch/karim/RAPPORT"target="_blank" rel="noopener">Issues &amp; Pull Requests<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>Beitragen<span class="hx:absolute hx:-mt-20" id="beitragen"></span> + <a href="#beitragen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><a href="https://git.kgva.ch/karim/RAPPORT"target="_blank" rel="noopener">Issues &amp; Pull Requests<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> sind willkommen. Wertvoll sind:</p> <ul> <li><strong>Bug-Reports</strong> mit Reproduktionsschritten</li> @@ -1131,107 +1264,125 @@ data-copied-label="Kopiert!" <li><strong>Linux-/Windows-Builds</strong> und plattformspezifische Fixes</li> </ul> <p>Vor grösseren Änderungen → Issue zum Diskutieren.</p> -<h2>Lizenz<span class="hx:absolute hx:-mt-20" id="lizenz"></span> -<a href="#lizenz" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>GNU AGPL-3.0-or-later</strong> — eigene Builds erlaubt, Modifikationen müssen unter derselben Lizenz veröffentlicht werden, wenn die Software als Service angeboten wird.</p>Troubleshootinghttps://rapport.gabrielevarano.ch/docs/troubleshooting/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/troubleshooting/ -<p>Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>Lizenz<span class="hx:absolute hx:-mt-20" id="lizenz"></span> + <a href="#lizenz" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>GNU AGPL-3.0-or-later</strong> — eigene Builds erlaubt, Modifikationen müssen unter derselben Lizenz veröffentlicht werden, wenn die Software als Service angeboten wird.</p> + + + + + + Troubleshooting + /docs/troubleshooting/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/troubleshooting/ + + + + <p>Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>.</p> -<h2>App startet nicht<span class="hx:absolute hx:-mt-20" id="app-startet-nicht"></span> -<a href="#app-startet-nicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>&ldquo;Rapport ist beschädigt&rdquo; beim ersten Start<span class="hx:absolute hx:-mt-20" id="rapport-ist-beschädigt-beim-ersten-start"></span> -<a href="#rapport-ist-besch%c3%a4digt-beim-ersten-start" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.</p> -<p><strong>Lösung:</strong> siehe <a href="../installation#3--erster-start-macos-gatekeeper">Installation § 3</a>. Kurz:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">xattr -d com.apple.quarantine /Applications/Rapport.app</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>App startet nicht<span class="hx:absolute hx:-mt-20" id="app-startet-nicht"></span> + <a href="#app-startet-nicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>&ldquo;Rapport ist beschädigt&rdquo; beim ersten Start<span class="hx:absolute hx:-mt-20" id="rapport-ist-beschädigt-beim-ersten-start"></span> + <a href="#rapport-ist-besch%c3%a4digt-beim-ersten-start" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.</p> +<p><strong>Lösung:</strong> siehe <a href="../installation#3--erster-start-macos-gatekeeper">Installation § 3</a>. Kurz:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">xattr -d com.apple.quarantine /Applications/Rapport.app</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> -<h3>App startet, zeigt aber schwarzen Bildschirm<span class="hx:absolute hx:-mt-20" id="app-startet-zeigt-aber-schwarzen-bildschirm"></span> -<a href="#app-startet-zeigt-aber-schwarzen-bildschirm" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> WebView-Cache korrupt.</p> +<h3>App startet, zeigt aber schwarzen Bildschirm<span class="hx:absolute hx:-mt-20" id="app-startet-zeigt-aber-schwarzen-bildschirm"></span> + <a href="#app-startet-zeigt-aber-schwarzen-bildschirm" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> WebView-Cache korrupt.</p> <p><strong>Lösung:</strong></p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/Caches/com.rapport.app&#34;</span> -</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/WebKit/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/Caches/com.rapport.app&#34;</span> +</span></span><span class="line"><span class="cl">rm -rf <span class="s2">&#34;~/Library/WebKit/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>App neu starten. Daten gehen dabei <strong>nicht</strong> verloren (liegen in <code>Application Support</code>, nicht im Cache).</p> -<h3>App stürzt sofort beim Start ab<span class="hx:absolute hx:-mt-20" id="app-stürzt-sofort-beim-start-ab"></span> -<a href="#app-st%c3%bcrzt-sofort-beim-start-ab" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> wahrscheinlich beschädigte JSON-Daten in <code>studio_data_v1</code>.</p> +<h3>App stürzt sofort beim Start ab<span class="hx:absolute hx:-mt-20" id="app-stürzt-sofort-beim-start-ab"></span> + <a href="#app-st%c3%bcrzt-sofort-beim-start-ab" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> wahrscheinlich beschädigte JSON-Daten in <code>studio_data_v1</code>.</p> <p><strong>Diagnose:</strong></p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Daten ansehen (DevTools-Output)</span> -</span></span><span class="line"><span class="cl">open <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Daten ansehen (DevTools-Output)</span> +</span></span><span class="line"><span class="cl">open <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p><strong>Lösung:</strong></p> <ol> -<li>Backup wiederherstellen (siehe <a href="../datenhaltung#wiederherstellung">Datenhaltung</a>)</li> +<li>Backup wiederherstellen (siehe <a href="../datenhaltung#wiederherstellung">Datenhaltung</a>)</li> <li><strong>Oder</strong> als letzter Ausweg: Daten zurücksetzen -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mv <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ -</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Library/Application Support/com.rapport.app.bad&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mv <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Library/Application Support/com.rapport.app.bad&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> App neu starten → erstellt frische Daten. Anschliessend Setup-Screen.</li> </ol> -<h2>Daten weg<span class="hx:absolute hx:-mt-20" id="daten-weg"></span> -<a href="#daten-weg" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Nach einem App-Update fehlen Einträge<span class="hx:absolute hx:-mt-20" id="nach-einem-app-update-fehlen-einträge"></span> -<a href="#nach-einem-app-update-fehlen-eintr%c3%a4ge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> mögliche fehlgeschlagene Migration.</p> +<h2>Daten weg<span class="hx:absolute hx:-mt-20" id="daten-weg"></span> + <a href="#daten-weg" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Nach einem App-Update fehlen Einträge<span class="hx:absolute hx:-mt-20" id="nach-einem-app-update-fehlen-einträge"></span> + <a href="#nach-einem-app-update-fehlen-eintr%c3%a4ge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> mögliche fehlgeschlagene Migration.</p> <p><strong>Sofortmassnahme:</strong></p> <ol> <li>Rapport <strong>beenden</strong> (Cmd+Q, nicht nur Fenster zu)</li> <li><strong>Aktuelles Datenverzeichnis sichern</strong>: -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp -R <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ -</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Documents/Rapport-Notfall-</span><span class="k">$(</span>date +%Y%m%d-%H%M<span class="k">)</span><span class="s2">&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp -R <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"> <span class="s2">&#34;~/Documents/Rapport-Notfall-</span><span class="k">$(</span>date +%Y%m%d-%H%M<span class="k">)</span><span class="s2">&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> </li> -<li><a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener">Issue erstellen<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<li><a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener">Issue erstellen<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> mit: <ul> <li>Version vor dem Update (falls bekannt)</li> @@ -1241,119 +1392,122 @@ data-copied-label="Kopiert!" </ul> </li> </ol> -<h3>localStorage voll<span class="hx:absolute hx:-mt-20" id="localstorage-voll"></span> -<a href="#localstorage-voll" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Symptom:</strong> Rapport schreibt Fehler-Toast &ldquo;Speicher voll&rdquo; beim Sichern.</p> +<h3>localStorage voll<span class="hx:absolute hx:-mt-20" id="localstorage-voll"></span> + <a href="#localstorage-voll" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Symptom:</strong> Rapport schreibt Fehler-Toast &ldquo;Speicher voll&rdquo; beim Sichern.</p> <p><strong>Ursache:</strong> macOS WebView limitiert localStorage auf ~10 MB pro Origin.</p> <p><strong>Lösung:</strong></p> <ul> <li>Sehr grosse Logos durch kleinere ersetzen (Bürodaten → Logo)</li> <li>Belege (Spesen) selektiv löschen oder als externe Datei archivieren</li> -<li>Auf <a href="../web-modus">Web-Modus</a> wechseln (Postgres ohne praktisches Limit)</li> +<li>Auf <a href="../web-modus">Web-Modus</a> wechseln (Postgres ohne praktisches Limit)</li> </ul> -<h2>Updates<span class="hx:absolute hx:-mt-20" id="updates"></span> -<a href="#updates" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Auto-Update findet nichts<span class="hx:absolute hx:-mt-20" id="auto-update-findet-nichts"></span> -<a href="#auto-update-findet-nichts" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Diagnose:</strong></p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -s https://git.kgva.ch/karim/RAPPORT/raw/branch/main/APP/latest.json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Updates<span class="hx:absolute hx:-mt-20" id="updates"></span> + <a href="#updates" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Auto-Update findet nichts<span class="hx:absolute hx:-mt-20" id="auto-update-findet-nichts"></span> + <a href="#auto-update-findet-nichts" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Diagnose:</strong></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -s https://git.kgva.ch/karim/RAPPORT/raw/branch/main/APP/latest.json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>→ sollte JSON liefern. Wenn nicht: Server-/Netzwerkproblem.</p> -<h3>Update lädt, lässt sich aber nicht installieren<span class="hx:absolute hx:-mt-20" id="update-lädt-lässt-sich-aber-nicht-installieren"></span> -<a href="#update-l%c3%a4dt-l%c3%a4sst-sich-aber-nicht-installieren" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Signaturprüfung scheitert (Public-Key in App ≠ Signatur in <code>latest.json</code>).</p> -<p><strong>Lösung:</strong> Manuelles Update — DMG direkt von <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Releases<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h3>Update lädt, lässt sich aber nicht installieren<span class="hx:absolute hx:-mt-20" id="update-lädt-lässt-sich-aber-nicht-installieren"></span> + <a href="#update-l%c3%a4dt-l%c3%a4sst-sich-aber-nicht-installieren" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Signaturprüfung scheitert (Public-Key in App ≠ Signatur in <code>latest.json</code>).</p> +<p><strong>Lösung:</strong> Manuelles Update — DMG direkt von <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Releases<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> laden und installieren. Daten bleiben erhalten.</p> -<h3>&ldquo;Diese Version überspringen&rdquo; rückgängig machen<span class="hx:absolute hx:-mt-20" id="diese-version-überspringen-rückgängig-machen"></span> -<a href="#diese-version-%c3%bcberspringen-r%c3%bcckg%c3%a4ngig-machen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>In <strong>Einstellungen → Updates</strong> → <em>Übersprungene Versionen zurücksetzen</em>. Beim nächsten Start wird die Version wieder angeboten.</p> -<h2>PDF / QR-Schein<span class="hx:absolute hx:-mt-20" id="pdf--qr-schein"></span> -<a href="#pdf--qr-schein" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>QR-Schein hat falsche Daten<span class="hx:absolute hx:-mt-20" id="qr-schein-hat-falsche-daten"></span> -<a href="#qr-schein-hat-falsche-daten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Diagnose-Checkliste:</strong></p> +<h3>&ldquo;Diese Version überspringen&rdquo; rückgängig machen<span class="hx:absolute hx:-mt-20" id="diese-version-überspringen-rückgängig-machen"></span> + <a href="#diese-version-%c3%bcberspringen-r%c3%bcckg%c3%a4ngig-machen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p>In <strong>Einstellungen → Updates</strong> → <em>Übersprungene Versionen zurücksetzen</em>. Beim nächsten Start wird die Version wieder angeboten.</p> +<h2>PDF / QR-Schein<span class="hx:absolute hx:-mt-20" id="pdf--qr-schein"></span> + <a href="#pdf--qr-schein" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>QR-Schein hat falsche Daten<span class="hx:absolute hx:-mt-20" id="qr-schein-hat-falsche-daten"></span> + <a href="#qr-schein-hat-falsche-daten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Diagnose-Checkliste:</strong></p> <ul> -<li><input disabled="" type="checkbox"> IBAN korrekt? (CH, 21 Zeichen, keine Leerzeichen)</li> -<li><input disabled="" type="checkbox"> Empfänger-Adresse vollständig? (PLZ und Ort beide gefüllt)</li> -<li><input disabled="" type="checkbox"> Schuldner-Adresse vollständig?</li> -<li><input disabled="" type="checkbox"> Betrag &gt; 0?</li> -<li><input disabled="" type="checkbox"> Referenz nicht zu lang? (max 27 Zeichen)</li> +<li><input disabled="" type="checkbox"> IBAN korrekt? (CH, 21 Zeichen, keine Leerzeichen)</li> +<li><input disabled="" type="checkbox"> Empfänger-Adresse vollständig? (PLZ und Ort beide gefüllt)</li> +<li><input disabled="" type="checkbox"> Schuldner-Adresse vollständig?</li> +<li><input disabled="" type="checkbox"> Betrag &gt; 0?</li> +<li><input disabled="" type="checkbox"> Referenz nicht zu lang? (max 27 Zeichen)</li> </ul> -<p>QR-Bibliothek: <a href="https://github.com/schoero/SwissQRBill"target="_blank" rel="noopener"><code>swissqrbill</code><svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<p>QR-Bibliothek: <a href="https://github.com/schoero/SwissQRBill"target="_blank" rel="noopener"><code>swissqrbill</code><svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> — bei merkwürdigen Fehlern dort nachschauen.</p> -<h3>PDF-Export ist leer / weisses Blatt<span class="hx:absolute hx:-mt-20" id="pdf-export-ist-leer--weisses-blatt"></span> -<a href="#pdf-export-ist-leer--weisses-blatt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Print-View hat keine Daten (möglicherweise Race-Condition beim Laden).</p> +<h3>PDF-Export ist leer / weisses Blatt<span class="hx:absolute hx:-mt-20" id="pdf-export-ist-leer--weisses-blatt"></span> + <a href="#pdf-export-ist-leer--weisses-blatt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Print-View hat keine Daten (möglicherweise Race-Condition beim Laden).</p> <p><strong>Lösung:</strong> Rechnung schliessen, erneut öffnen, dann PDF.</p> -<h3>PDF-Schrift sieht falsch aus<span class="hx:absolute hx:-mt-20" id="pdf-schrift-sieht-falsch-aus"></span> -<a href="#pdf-schrift-sieht-falsch-aus" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Web-Schrift nicht geladen, Fallback greift.</p> +<h3>PDF-Schrift sieht falsch aus<span class="hx:absolute hx:-mt-20" id="pdf-schrift-sieht-falsch-aus"></span> + <a href="#pdf-schrift-sieht-falsch-aus" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Web-Schrift nicht geladen, Fallback greift.</p> <p><strong>Lösung:</strong> Vor dem Drucken warten, bis das Vorschau-Bild komplett geladen ist (3–5 Sek).</p> -<h2>System-Tray<span class="hx:absolute hx:-mt-20" id="system-tray"></span> -<a href="#system-tray" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Tray-Icon erscheint nicht<span class="hx:absolute hx:-mt-20" id="tray-icon-erscheint-nicht"></span> -<a href="#tray-icon-erscheint-nicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Plattform-Hinweis:</strong> Tray-Icons unter macOS sind bei extrem voller Menüleiste oder unter &ldquo;Bartender&rdquo;/&ldquo;Hidden Bar&rdquo; eventuell unsichtbar.</p> +<h2>System-Tray<span class="hx:absolute hx:-mt-20" id="system-tray"></span> + <a href="#system-tray" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Tray-Icon erscheint nicht<span class="hx:absolute hx:-mt-20" id="tray-icon-erscheint-nicht"></span> + <a href="#tray-icon-erscheint-nicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Plattform-Hinweis:</strong> Tray-Icons unter macOS sind bei extrem voller Menüleiste oder unter &ldquo;Bartender&rdquo;/&ldquo;Hidden Bar&rdquo; eventuell unsichtbar.</p> <p><strong>Diagnose:</strong></p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ps aux <span class="p">|</span> grep -i rapport</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ps aux <span class="p">|</span> grep -i rapport</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>→ wenn Prozess läuft, aber kein Icon: in den Tray-Manager-Apps prüfen.</p> <p><strong>Konfiguration:</strong> Einstellungen → System-Tray → <em>Tray-Icon ausblenden</em> (aus → Icon erzwingen).</p> -<h3>Tray-Menü reagiert nicht / hängt<span class="hx:absolute hx:-mt-20" id="tray-menü-reagiert-nicht--hängt"></span> -<a href="#tray-men%c3%bc-reagiert-nicht--h%c3%a4ngt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Lösung:</strong> App via <em>Activity Monitor</em> hart beenden und neu starten. Daten gehen nicht verloren (alle Schreibungen sind synchron in localStorage).</p> -<h2>Web-Modus<span class="hx:absolute hx:-mt-20" id="web-modus"></span> -<a href="#web-modus" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Login-Screen zeigt keine Server-URL<span class="hx:absolute hx:-mt-20" id="login-screen-zeigt-keine-server-url"></span> -<a href="#login-screen-zeigt-keine-server-url" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> <code>.env.production</code> enthielt nicht den richtigen <code>VITE_SUPABASE_URL</code> zur Build-Zeit.</p> +<h3>Tray-Menü reagiert nicht / hängt<span class="hx:absolute hx:-mt-20" id="tray-menü-reagiert-nicht--hängt"></span> + <a href="#tray-men%c3%bc-reagiert-nicht--h%c3%a4ngt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Lösung:</strong> App via <em>Activity Monitor</em> hart beenden und neu starten. Daten gehen nicht verloren (alle Schreibungen sind synchron in localStorage).</p> +<h2>Web-Modus<span class="hx:absolute hx:-mt-20" id="web-modus"></span> + <a href="#web-modus" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><h3>Login-Screen zeigt keine Server-URL<span class="hx:absolute hx:-mt-20" id="login-screen-zeigt-keine-server-url"></span> + <a href="#login-screen-zeigt-keine-server-url" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> <code>.env.production</code> enthielt nicht den richtigen <code>VITE_SUPABASE_URL</code> zur Build-Zeit.</p> <p><strong>Lösung:</strong> <code>.env.production</code> prüfen, dann <code>npm run build</code> neu, Container restart.</p> -<h3>Realtime-Updates kommen nicht an<span class="hx:absolute hx:-mt-20" id="realtime-updates-kommen-nicht-an"></span> -<a href="#realtime-updates-kommen-nicht-an" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Websocket-Support fehlt im Reverse Proxy.</p> +<h3>Realtime-Updates kommen nicht an<span class="hx:absolute hx:-mt-20" id="realtime-updates-kommen-nicht-an"></span> + <a href="#realtime-updates-kommen-nicht-an" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h3><p><strong>Ursache:</strong> Websocket-Support fehlt im Reverse Proxy.</p> <p><strong>Lösung:</strong> In Nginx Proxy Manager für <code>api.*</code> Websocket Support aktivieren.</p> -<p>Siehe <a href="../web-modus#troubleshooting">Web-Modus § Troubleshooting</a>.</p> -<h2>Debug-Informationen sammeln<span class="hx:absolute hx:-mt-20" id="debug-informationen-sammeln"></span> -<a href="#debug-informationen-sammeln" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Bei einem Issue helfen folgende Infos:</p> -<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Rapport-Version</span> -</span></span><span class="line"><span class="cl">defaults <span class="nb">read</span> /Applications/Rapport.app/Contents/Info.plist CFBundleShortVersionString -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># macOS-Version</span> -</span></span><span class="line"><span class="cl">sw_vers -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># Architektur</span> -</span></span><span class="line"><span class="cl">uname -m -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># Datenverzeichnis-Grösse</span> -</span></span><span class="line"><span class="cl">du -sh <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> -</span></span><span class="line"><span class="cl"> -</span></span><span class="line"><span class="cl"><span class="c1"># Cache-Verzeichnis-Grösse</span> -</span></span><span class="line"><span class="cl">du -sh <span class="s2">&#34;~/Library/Caches/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<p>Siehe <a href="../web-modus#troubleshooting">Web-Modus § Troubleshooting</a>.</p> +<h2>Debug-Informationen sammeln<span class="hx:absolute hx:-mt-20" id="debug-informationen-sammeln"></span> + <a href="#debug-informationen-sammeln" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Bei einem Issue helfen folgende Infos:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Rapport-Version</span> +</span></span><span class="line"><span class="cl">defaults <span class="nb">read</span> /Applications/Rapport.app/Contents/Info.plist CFBundleShortVersionString +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># macOS-Version</span> +</span></span><span class="line"><span class="cl">sw_vers +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># Architektur</span> +</span></span><span class="line"><span class="cl">uname -m +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># Datenverzeichnis-Grösse</span> +</span></span><span class="line"><span class="cl">du -sh <span class="s2">&#34;~/Library/Application Support/com.rapport.app&#34;</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># Cache-Verzeichnis-Grösse</span> +</span></span><span class="line"><span class="cl">du -sh <span class="s2">&#34;~/Library/Caches/com.rapport.app&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> </div> <p>→ Bei Issue mit anhängen.</p> -<h2>Wenn nichts hilft<span class="hx:absolute hx:-mt-20" id="wenn-nichts-hilft"></span> -<a href="#wenn-nichts-hilft" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener">Neues Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>Wenn nichts hilft<span class="hx:absolute hx:-mt-20" id="wenn-nichts-hilft"></span> + <a href="#wenn-nichts-hilft" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener">Neues Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> mit:</p> <ul> <li>Was du gemacht hast</li> @@ -1361,32 +1515,45 @@ data-copied-label="Kopiert!" <li>Was du erwartet hättest</li> <li>Screenshots (auch von DevTools-Konsole falls möglich)</li> <li>Rapport-Version und macOS-Version</li> -</ul>Changeloghttps://rapport.gabrielevarano.ch/docs/changelog/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/docs/changelog/ -<p>Versionsgeschichte von RAPPORT. Aktuelle Releases: <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +</ul> + + + + + + Changelog + /docs/changelog/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /docs/changelog/ + + + + <p>Versionsgeschichte von RAPPORT. Aktuelle Releases: <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>.</p> -<h2>0.8.2 — Aktuelle Version <span class="rapport-status new">Aktuell</span><span class="hx:absolute hx:-mt-20" id="082--aktuelle-version-aktuell"></span> -<a href="#082--aktuelle-version-aktuell" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Veröffentlicht am 2026-05-24.</p> +<h2>0.8.2 — Aktuelle Version <span class="rapport-status new">Aktuell</span><span class="hx:absolute hx:-mt-20" id="082--aktuelle-version-aktuell"></span> + <a href="#082--aktuelle-version-aktuell" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Veröffentlicht am 2026-05-24.</p> <p><strong>Neu / Verbessert</strong></p> <ul> -<li>Diverse Verbesserungen und Bugfixes (Details werden im <a href="https://git.kgva.ch/karim/RAPPORT/releases/tag/0.8.2"target="_blank" rel="noopener">Release auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<li>Diverse Verbesserungen und Bugfixes (Details werden im <a href="https://git.kgva.ch/karim/RAPPORT/releases/tag/0.8.2"target="_blank" rel="noopener">Release auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a> gepflegt)</li> </ul> <p><strong>Bekannte Einschränkungen</strong></p> <ul> -<li>Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe <a href="../installation#3--erster-start-macos-gatekeeper">Installation § Gatekeeper</a></li> +<li>Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe <a href="../installation#3--erster-start-macos-gatekeeper">Installation § Gatekeeper</a></li> <li>Linux- und Windows-Builds noch nicht verfügbar</li> </ul> -<h2>0.8.0–0.8.1 — Patch-Releases<span class="hx:absolute hx:-mt-20" id="080081--patch-releases"></span> -<a href="#080081--patch-releases" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Releases auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +<h2>0.8.0–0.8.1 — Patch-Releases<span class="hx:absolute hx:-mt-20" id="080081--patch-releases"></span> + <a href="#080081--patch-releases" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe <a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener">Releases auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> </svg></a>.</p> -<h2>0.7.0 — Auto-Updater &amp; System-Tray<span class="hx:absolute hx:-mt-20" id="070--auto-updater--system-tray"></span> -<a href="#070--auto-updater--system-tray" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> +<h2>0.7.0 — Auto-Updater &amp; System-Tray<span class="hx:absolute hx:-mt-20" id="070--auto-updater--system-tray"></span> + <a href="#070--auto-updater--system-tray" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> <ul> -<li><strong>Auto-Updater</strong> — Rapport prüft beim Start auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden. (<a href="../../features/auto-updater">Doku</a>)</li> -<li><strong>System-Tray</strong> — Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter, Cmd+Q beendet die App vollständig. (<a href="../../features/system-tray">Doku</a>)</li> +<li><strong>Auto-Updater</strong> — Rapport prüft beim Start auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden. (<a href="../../features/auto-updater">Doku</a>)</li> +<li><strong>System-Tray</strong> — Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter, Cmd+Q beendet die App vollständig. (<a href="../../features/system-tray">Doku</a>)</li> <li><strong>Quick-Open</strong> der letzten 5 Projekte direkt aus dem Tray-Menü</li> </ul> <p><strong>Verbessert</strong></p> @@ -1394,8 +1561,8 @@ data-copied-label="Kopiert!" <li>Schnellerer App-Start durch lazy-geladene Views</li> <li>Klarere Statusbadges in der Projekt-Übersicht</li> </ul> -<h2>0.6.x — Spesen &amp; Buchhaltung<span class="hx:absolute hx:-mt-20" id="06x--spesen--buchhaltung"></span> -<a href="#06x--spesen--buchhaltung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> +<h2>0.6.x — Spesen &amp; Buchhaltung<span class="hx:absolute hx:-mt-20" id="06x--spesen--buchhaltung"></span> + <a href="#06x--spesen--buchhaltung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> <ul> <li>Spesenerfassung mit Beleg-Upload (Base64 in localStorage)</li> <li>Jahresbudget mit Einnahmen-/Ausgaben-Übersicht</li> @@ -1406,16 +1573,16 @@ data-copied-label="Kopiert!" <li>Lohnabrechnung integriert Spesen-Erstattungen</li> <li>CSV-Export aus der Zeiterfassung</li> </ul> -<h2>0.5.x — Mitarbeiter &amp; Lohn<span class="hx:absolute hx:-mt-20" id="05x--mitarbeiter--lohn"></span> -<a href="#05x--mitarbeiter--lohn" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> +<h2>0.5.x — Mitarbeiter &amp; Lohn<span class="hx:absolute hx:-mt-20" id="05x--mitarbeiter--lohn"></span> + <a href="#05x--mitarbeiter--lohn" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> <ul> <li>Mitarbeiterverwaltung mit Pensum, Stundensatz, Ferienanspruch</li> <li>Lohnabrechnung mit AHV/IV/EO, ALV, BVG, NBU</li> <li>Jahresabschluss mit Überstundenausgleich</li> <li>Ferien-Prorata bei Eintritt unter Jahr</li> </ul> -<h2>0.4.x — Projekte &amp; SIA 102<span class="hx:absolute hx:-mt-20" id="04x--projekte--sia-102"></span> -<a href="#04x--projekte--sia-102" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> +<h2>0.4.x — Projekte &amp; SIA 102<span class="hx:absolute hx:-mt-20" id="04x--projekte--sia-102"></span> + <a href="#04x--projekte--sia-102" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> <ul> <li>Projektverwaltung nach SIA 102</li> <li>Vorgeschlagene Phasen-Anteile am Gesamthonorar</li> @@ -1426,40 +1593,46 @@ data-copied-label="Kopiert!" <li>Zeit-Auswertung pro SIA-Phase</li> <li>Akonto- und Schlussrechnungen mit automatischer Differenzberechnung</li> </ul> -<h2>0.3.x — Rechnungen &amp; QR<span class="hx:absolute hx:-mt-20" id="03x--rechnungen--qr"></span> -<a href="#03x--rechnungen--qr" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> +<h2>0.3.x — Rechnungen &amp; QR<span class="hx:absolute hx:-mt-20" id="03x--rechnungen--qr"></span> + <a href="#03x--rechnungen--qr" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> <ul> <li>Rechnungsmodul mit QR-Einzahlungsschein (via <code>swissqrbill</code>)</li> <li>Akonto-, Teil- und Schlussrechnungen</li> <li>PDF-Export mit Bürobriefbogen</li> <li>Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung</li> </ul> -<h2>0.2.x — Zeiterfassung<span class="hx:absolute hx:-mt-20" id="02x--zeiterfassung"></span> -<a href="#02x--zeiterfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> +<h2>0.2.x — Zeiterfassung<span class="hx:absolute hx:-mt-20" id="02x--zeiterfassung"></span> + <a href="#02x--zeiterfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> <ul> <li>Wochenraster mit Halbstunden-Slots</li> <li>Drag &amp; Drop zur Slot-Erfassung</li> <li>Projekt-Zuweisung pro Eintrag</li> <li>Auswertungen pro Mitarbeiter und Projekt</li> </ul> -<h2>0.1.x — Initial<span class="hx:absolute hx:-mt-20" id="01x--initial"></span> -<a href="#01x--initial" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> +<h2>0.1.x — Initial<span class="hx:absolute hx:-mt-20" id="01x--initial"></span> + <a href="#01x--initial" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p><strong>Neu</strong></p> <ul> <li>Erste Setup-Routine (Bürodaten, Mitarbeiter, Kunden)</li> <li>Briefe und Lieferscheine</li> <li>Tauri-2-Bundle für macOS</li> </ul> <hr> -<h2>Roadmap<span class="hx:absolute hx:-mt-20" id="roadmap"></span> -<a href="#roadmap" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Geplant — keine konkreten Termine:</p> +<h2>Roadmap<span class="hx:absolute hx:-mt-20" id="roadmap"></span> + <a href="#roadmap" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Geplant — keine konkreten Termine:</p> <ul> <li><strong>Linux-Build</strong> (Tauri 2 unterstützt es, Bedarf nötig)</li> <li><strong>Windows-Build</strong> (analog)</li> -<li><strong>Cloud-Modus</strong> Stable (Supabase) — derzeit in <a href="../web-modus">Web-Modus</a> verfügbar, aber experimentell</li> +<li><strong>Cloud-Modus</strong> Stable (Supabase) — derzeit in <a href="../web-modus">Web-Modus</a> verfügbar, aber experimentell</li> <li><strong>Französische / Italienische Übersetzung</strong></li> <li><strong>PostgreSQL-Migration</strong> aus localStorage (Knopf in der App)</li> <li><strong>Mobile App</strong> (iOS Companion zur Zeiterfassung) — offen</li> </ul> -<p>Wünsche oder Prioritäten → <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> -<path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> -</svg></a>.</p> \ No newline at end of file +<p>Wünsche oder Prioritäten → <a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener">Issue auf Gitea<svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/> +</svg></a>.</p> + + + + + + diff --git a/public/docs/installation/index.html b/public/docs/installation/index.html index 89081fe..be51e70 100644 --- a/public/docs/installation/index.html +++ b/public/docs/installation/index.html @@ -1,5 +1,21 @@ -Installation – RAPPORT + + + + + + + + +Installation – RAPPORT + + + + +Zum Inhalt springen
Installation

Installation

Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.

Voraussetzungen -

PlattformStatusVersionen
macOS Apple Silicon (M1 – M4)✅ UnterstütztmacOS 12+
macOS Intel⚠ Build auf AnfragemacOS 12+
Linux🕐 Geplant
Windows🕐 Geplant

Eine Portierung auf Linux und Windows ist mit Tauri 2 möglich. Issue erstellen, wenn du eine Plattform brauchst.

1 · Download -

Aktueller Build: Downloads-Seite oder direkt Releases auf Gitea.

DateiPlattform
RAPPORT_<version>_aarch64.dmgmacOS Apple Silicon
RAPPORT_<version>_x86_64.dmgmacOS 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:

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.

5 · Update-Strategie -

Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe 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).

Deinstallation -

# 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.

Bekannte Probleme -

ProblemLösung
App lässt sich nicht öffnen trotz FreigabeTerminal-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.

\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Installation
+
+ +
+ +
+

Installation

+ +
+ +

Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.

+

Voraussetzungen +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlattformStatusVersionen
macOS Apple Silicon (M1 – M4)✅ UnterstütztmacOS 12+
macOS Intel⚠ Build auf AnfragemacOS 12+
Linux🕐 Geplant
Windows🕐 Geplant
+

Eine Portierung auf Linux und Windows ist mit Tauri 2 möglich. Issue erstellen, wenn du eine Plattform brauchst.

+

1 · Download +

Aktueller Build: Downloads-Seite oder direkt Releases auf Gitea.

+ + + + + + + + + + + + + + + + + +
DateiPlattform
RAPPORT_<version>_aarch64.dmgmacOS Apple Silicon
RAPPORT_<version>_x86_64.dmgmacOS Intel (auf Anfrage)
+

2 · DMG öffnen & installieren +

    +
  1. DMG doppelklicken
  2. +
  3. Rapport.app in den Applications-Ordner ziehen
  4. +
  5. DMG auswerfen
  6. +
+

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. +
  3. Bis ganz nach unten scrollen — es erscheint: +
    +

    “Rapport” wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.

    + +
    +
  4. +
  5. Auf “Trotzdem öffnen” klicken
  6. +
  7. Bestätigen
  8. +
+

Ab dem zweiten Start läuft Rapport ohne Rückfragen.

+

Alternative (Terminal) +

Falls der GUI-Weg nicht funktioniert:

+
+ +
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.

+

5 · Update-Strategie +

Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe 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).

+

Deinstallation +

+ +
# 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.

+ +
+

Bekannte Probleme +

+ + + + + + + + + + + + + + + + + + + + +
ProblemLösung
App lässt sich nicht öffnen trotz FreigabeTerminal-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.

+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/troubleshooting/index.html b/public/docs/troubleshooting/index.html index 8eb3103..8b98f5d 100644 --- a/public/docs/troubleshooting/index.html +++ b/public/docs/troubleshooting/index.html @@ -1,7 +1,23 @@ -Troubleshooting – RAPPORT + + + + + + + + +Troubleshooting – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen
Troubleshooting

Troubleshooting

Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → Issue auf Gitea.

App startet nicht -

“Rapport ist beschädigt” beim ersten Start -

Ursache: macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.

Lösung: siehe Installation § 3. Kurz:

xattr -d com.apple.quarantine /Applications/Rapport.app

App startet, zeigt aber schwarzen Bildschirm -

Ursache: WebView-Cache korrupt.

Lösung:

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:

# Daten ansehen (DevTools-Output)
-open "~/Library/Application Support/com.rapport.app"

Lösung:

  1. Backup wiederherstellen (siehe Datenhaltung)
  2. Oder als letzter Ausweg: Daten zurücksetzen
    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:
    cp -R "~/Library/Application Support/com.rapport.app" \
    -      "~/Documents/Rapport-Notfall-$(date +%Y%m%d-%H%M)"
  3. Issue erstellen 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 wechseln (Postgres ohne praktisches Limit)

Updates -

Auto-Update findet nichts -

Diagnose:

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 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 — 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 (3–5 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:

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.

Debug-Informationen sammeln -

Bei einem Issue helfen folgende Infos:

# 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 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
\ No newline at end of file +xattr -d com.apple.quarantine /Applications/Rapport.app App startet, zeigt aber schwarzen Bildschirm Ursache: WebView-Cache korrupt."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Troubleshooting
+
+ +
+ +
+

Troubleshooting

+ +
+ +

Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → Issue auf Gitea.

+

App startet nicht +

“Rapport ist beschädigt” beim ersten Start +

Ursache: macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.

+

Lösung: siehe Installation § 3. Kurz:

+
+ +
xattr -d com.apple.quarantine /Applications/Rapport.app
+ +
+
+

App startet, zeigt aber schwarzen Bildschirm +

Ursache: WebView-Cache korrupt.

+

Lösung:

+
+ +
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:

+
+ +
# Daten ansehen (DevTools-Output)
+open "~/Library/Application Support/com.rapport.app"
+ +
+
+

Lösung:

+
    +
  1. Backup wiederherstellen (siehe Datenhaltung)
  2. +
  3. Oder als letzter Ausweg: Daten zurücksetzen +
    + +
    mv "~/Library/Application Support/com.rapport.app" \
    +   "~/Library/Application Support/com.rapport.app.bad"
    + +
    +
    +App neu starten → erstellt frische Daten. Anschliessend Setup-Screen.
  4. +
+

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. +
  3. Aktuelles Datenverzeichnis sichern: +
    + +
    cp -R "~/Library/Application Support/com.rapport.app" \
    +      "~/Documents/Rapport-Notfall-$(date +%Y%m%d-%H%M)"
    + +
    +
    +
  4. +
  5. Issue erstellen mit: +
      +
    • Version vor dem Update (falls bekannt)
    • +
    • Version nach dem Update
    • +
    • Was fehlt
    • +
    • Optional: gesicherter Datenordner (via Pastebin oder verschlüsselt zugesandt)
    • +
    +
  6. +
+

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 wechseln (Postgres ohne praktisches Limit)
  • +
+

Updates +

Auto-Update findet nichts +

Diagnose:

+
+ +
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 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 — 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 (3–5 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:

+
+ +
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.

+

Debug-Informationen sammeln +

Bei einem Issue helfen folgende Infos:

+
+ +
# 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 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
  • +
+ +
+
+
+
+
+ + + + + + + diff --git a/public/docs/web-modus/index.html b/public/docs/web-modus/index.html index 5159f24..2174e2b 100644 --- a/public/docs/web-modus/index.html +++ b/public/docs/web-modus/index.html @@ -1,6 +1,22 @@ -Web-Modus (Multi-User) – RAPPORT + + + + + + + + +Web-Modus (Multi-User) – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen
Web-Modus

Web-Modus (Multi-User)

Hinweis: Der frühere Supabase-basierte Web-Modus wurde durch Rapport 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.

Wann brauchst du das? -

AnwendungsfallEmpfehlung
Solo-Büro, ein MacDesktop-App — siehe Installation
2–5 Personen, gleicher StandortRapport Server auf einem Mac Mini im LAN
Verteiltes Team / Home-OfficeRapport Server mit SSL + Reverse Proxy
Hosted Backend (eigener VPS)Rapport Server auf Linux-VPS

Architektur (Kurzfassung) -

┌────────────┐     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)
  • 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 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.

Troubleshooting -

Siehe Rapport Server § Troubleshooting oder allgemeine Troubleshooting-Seite.

\ No newline at end of file +Wann brauchst du das? Anwendungsfall Empfehlung Solo-Büro, ein Mac Desktop-App — siehe Installation 2–5 Personen, gleicher Standort Rapport Server auf einem Mac Mini im LAN Verteiltes Team / Home-Office Rapport Server mit SSL + Reverse Proxy Hosted Backend (eigener VPS) Rapport Server auf Linux-VPS Architektur (Kurzfassung) ┌────────────┐ 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) 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 dokumentiert."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+
Web-Modus
+
+ +
+ +
+

Web-Modus (Multi-User)

+ +
+ +
+

Hinweis: Der frühere Supabase-basierte Web-Modus wurde durch Rapport 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.

+ +
+

Wann brauchst du das? +

+ + + + + + + + + + + + + + + + + + + + + + + + +
AnwendungsfallEmpfehlung
Solo-Büro, ein MacDesktop-App — siehe Installation
2–5 Personen, gleicher StandortRapport Server auf einem Mac Mini im LAN
Verteiltes Team / Home-OfficeRapport Server mit SSL + Reverse Proxy
Hosted Backend (eigener VPS)Rapport Server auf Linux-VPS
+

Architektur (Kurzfassung) +

+ +
┌────────────┐     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)
  • +
  • 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 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.

+

Troubleshooting +

Siehe Rapport Server § Troubleshooting oder allgemeine Troubleshooting-Seite.

+ +
+
+
+
+
+ + + + + + + diff --git a/public/downloads/index.html b/public/downloads/index.html index 605fc7b..27b7946 100644 --- a/public/downloads/index.html +++ b/public/downloads/index.html @@ -1,55 +1,741 @@ -Downloads – RAPPORT + + + + + + + + +Downloads – RAPPORT + + + + + + + + + + + + + + Zum Inhalt springen

Downloads

Aktuelle Builds von Rapport. Quellcode und ältere Versionen auf Gitea.

Rapport besteht aus zwei Komponenten:

KomponenteFür wenAktuelle Version
Desktop-AppSolo-Büro, lokale Datenhaltung0.8.2
Rapport ServerTeam / Multi-User / Selfhost0.1.0

Desktop-App — Pre-Release 0.8.2 -

Aktuelle Version

Neuerungen — siehe Changelog für Details.

macOS -

ArchitekturDownload
Apple Silicon (M1–M4)RAPPORT_0.8.2_aarch64.dmg
Intel (x86_64)auf Anfrage

Erstinstallation: Systemeinstellungen → Datenschutz & Sicherheit öffnen und Rapport zulassen. Die Builds sind über Tauri signiert, aber (noch) nicht Apple-notarisiert.

Linux & Windows -

Geplant. Rapport basiert auf Tauri 2 — eine Portierung ist möglich, sobald der Bedarf besteht. Issue erstellen, wenn du eine Plattform brauchst.


Rapport Server — 0.1.0 -

Erstes Release

Selfhost-Backend für Multi-User-Setups — Postgres, Auth, Realtime-Sync, Storage. Details und Setup-Anleitung auf der Server-Seite.

Server-App (macOS) -

GUI zum Starten, Stoppen und Verwalten der Server-Instanz auf einem Mac (Mac Mini, Studio-Rechner). Bündelt den Docker-Compose-Stack.

ArchitekturDownload
Apple Silicon (M1–M4)RAPPORT_SERVER_0.1.0_aarch64.dmg
Intel (x86_64)auf Anfrage

Voraussetzung: Colima oder Docker Desktop muss installiert sein. Die App verwaltet den Container-Stack darüber.

Docker (Linux / VPS / Headless) -

Für Linux-Server, NAS oder VPS — der reine Docker-Compose-Stack ohne GUI.

git clone https://git.kgva.ch/karim/rapport-server.git
-cd rapport-server
-git checkout 0.1.0
-cp .env.example .env
-# .env editieren (POSTGRES_PASSWORD, JWT_SECRET, SITE_URL)
-docker compose up -d

Vollständige Anleitung mit .env-Variablen, Reverse-Proxy und Backup → Server-Seite.

Container-Images werden von Docker Hub / Gitea-Registry gezogen — docker compose pull aktualisiert auf die neuesten Tags.


Quellcode -

Desktop-App — Tauri / React:

git clone https://git.kgva.ch/karim/RAPPORT.git
-cd RAPPORT/APP
-npm install
-npm run tauri dev

Voraussetzungen: Node 20+, Rust (stable), Xcode-CLI (macOS).

Rapport Server:

git clone https://git.kgva.ch/karim/rapport-server.git

Beide Repos auf Gitea — Issues und PRs willkommen.

Auto-Update -

Seit 0.7.0 prüft die Desktop-App beim Start automatisch auf neue Versionen — siehe Auto-Updater. Für Rapport Server: git pull && docker compose pull && docker compose up -d.

\ No newline at end of file +macOS Architektur Download Apple Silicon (M1–M4) RAPPORT_0.8.2_aarch64.dmg Intel (x86_64) auf Anfrage Erstinstallation: Systemeinstellungen → Datenschutz & Sicherheit öffnen und Rapport zulassen. Die Builds sind über Tauri signiert, aber (noch) nicht Apple-notarisiert."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Downloads

+

Aktuelle Builds von Rapport. Quellcode und ältere Versionen auf Gitea.

+

Rapport besteht aus zwei Komponenten:

+ + + + + + + + + + + + + + + + + + + + +
KomponenteFür wenAktuelle Version
Desktop-AppSolo-Büro, lokale Datenhaltung0.8.2
Rapport ServerTeam / Multi-User / Selfhost0.1.0
+
+

Desktop-App — Pre-Release 0.8.2 +

Aktuelle Version

+

Neuerungen — siehe Changelog für Details.

+

macOS +

+ + + + + + + + + + + + + + + + +
ArchitekturDownload
Apple Silicon (M1–M4)RAPPORT_0.8.2_aarch64.dmg
Intel (x86_64)auf Anfrage
+
+

Erstinstallation: Systemeinstellungen → Datenschutz & Sicherheit öffnen und Rapport zulassen. Die Builds sind über Tauri signiert, aber (noch) nicht Apple-notarisiert.

+ +
+

Linux & Windows +

Geplant. Rapport basiert auf Tauri 2 — eine Portierung ist möglich, sobald der Bedarf besteht. Issue erstellen, wenn du eine Plattform brauchst.

+
+

Rapport Server — 0.1.0 +

Erstes Release

+

Selfhost-Backend für Multi-User-Setups — Postgres, Auth, Realtime-Sync, Storage. Details und Setup-Anleitung auf der Server-Seite.

+

Server-App (macOS) +

GUI zum Starten, Stoppen und Verwalten der Server-Instanz auf einem Mac (Mac Mini, Studio-Rechner). Bündelt den Docker-Compose-Stack.

+ + + + + + + + + + + + + + + + + +
ArchitekturDownload
Apple Silicon (M1–M4)RAPPORT_SERVER_0.1.0_aarch64.dmg
Intel (x86_64)auf Anfrage
+
+

Voraussetzung: Colima oder Docker Desktop muss installiert sein. Die App verwaltet den Container-Stack darüber.

+ +
+

Docker (Linux / VPS / Headless) +

Für Linux-Server, NAS oder VPS — der reine Docker-Compose-Stack ohne GUI.

+
+ +
git clone https://git.kgva.ch/karim/rapport-server.git
+cd rapport-server
+git checkout 0.1.0
+cp .env.example .env
+# .env editieren (POSTGRES_PASSWORD, JWT_SECRET, SITE_URL)
+docker compose up -d
+ +
+
+

Vollständige Anleitung mit .env-Variablen, Reverse-Proxy und Backup → Server-Seite.

+

Container-Images werden von Docker Hub / Gitea-Registry gezogen — docker compose pull aktualisiert auf die neuesten Tags.

+
+

Quellcode +

Desktop-App — Tauri / React:

+
+ +
git clone https://git.kgva.ch/karim/RAPPORT.git
+cd RAPPORT/APP
+npm install
+npm run tauri dev
+ +
+
+

Voraussetzungen: Node 20+, Rust (stable), Xcode-CLI (macOS).

+

Rapport Server:

+
+ +
git clone https://git.kgva.ch/karim/rapport-server.git
+ +
+
+

Beide Repos auf Gitea — Issues und PRs willkommen.

+

Auto-Update +

Seit 0.7.0 prüft die Desktop-App beim Start automatisch auf neue Versionen — siehe Auto-Updater. Für Rapport Server: git pull && docker compose pull && docker compose up -d.

+ +
+
+
+ +
+
+
+ + + + + + + diff --git a/public/downloads/index.xml b/public/downloads/index.xml index c6e5332..cc730c0 100644 --- a/public/downloads/index.xml +++ b/public/downloads/index.xml @@ -1 +1,18 @@ -RAPPORT – Downloadshttps://rapport.gabrielevarano.ch/downloads/Recent content in Downloads on RAPPORTHugo -- gohugo.iode \ No newline at end of file + + + RAPPORT – Downloads + /downloads/ + Recent content in Downloads on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + diff --git a/public/faq/index.html b/public/faq/index.html index 2937fa0..37da60d 100644 --- a/public/faq/index.html +++ b/public/faq/index.html @@ -1,43 +1,678 @@ -FAQ – RAPPORT + + + + + + + + +FAQ – RAPPORT + + + + + + + + + + + + + + Zum Inhalt springen

FAQ

Häufige Fragen zu RAPPORT. Bei Bugs oder weiteren Fragen → Issue auf Gitea.

Für wen ist Rapport gedacht? -

Für kleine Architekturbüros in der Schweiz. Die Strukturen folgen der SIA 102 (Phasen, Honorar). Rapport wurde für den internen Gebrauch entwickelt und wird mit diesem Projekt öffentlich geteilt.

Ist Rapport kostenlos? -

Ja, vollständig. Quellcode unter GNU AGPL-3.0-or-later. Keine versteckten Kosten, keine Telemetrie. Die Daten bleiben lokal auf deinem Computer bzw. in deiner Instanz. Du hast die komplette Kontrolle über deine Daten.

Welche Systeme werden unterstützt? -

Aktuell nur macOS (Intel & Apple Silicon). Rapport basiert auf Tauri — eine Portierung auf Linux und Windows ist möglich, sobald der Bedarf seitens Community besteht.

Wo werden die Daten gespeichert? -

Rapport unterstützt zwei Modi, beide selbst-gehostet:

  • Desktop-App (Single-User) — alle Daten liegen lokal auf deinem Mac (localStorage im Applikationsordner). Kein Server nötig, kein Cloud-Account, keine Telemetrie.
  • Server-Modus (Multi-User) — Daten in einer eigenen PostgreSQL-Datenbank über Rapport Server. Mehrere Personen, Realtime-Sync, eigene Domain. Wechsel direkt im Login-Bildschirm der App.

In beiden Fällen bleibt die Kontrolle über die Daten bei dir.

Ist die Software stabil genug für den Betrieb? -

Noch nicht. Aktuell befindet sich Rapport in aktiver Entwicklung (Pre-Release 0.8.2). Funktionen können sich ändern, Bugs sind möglich. Regelmässige Backups sind empfohlen. Testen und Feedback geben ist erwünscht.

Was ist mit dem QR-Einzahlungsschein? -

Rapport erzeugt Schweizer QR-Rechnungen nach Norm — direkt eingebettet in das PDF der Rechnung. IBAN, Bürodaten und Empfänger werden aus den Einstellungen bzw. den Kundendaten gezogen. Akonto-, Teil- und Schlussrechnungen werden unterstützt.

Wie funktioniert die Zeiterfassung? -

Tages- und Wochenraster mit Drag & Drop. Jeder Eintrag wird einem Projekt zugewiesen. Auswertungen pro Mitarbeiter und Projekt sind unter Zeit abrufbar. Ferienverwaltung mit Prorata und Jahresabschluss mit Überstundenausgleich.

Kann ich zum Projekt beitragen? -

Ja. Issues und Pull Requests sind willkommen auf Gitea. Rapport ist kein Framework — konkrete Verbesserungen für den Büroalltag sind am wertvollsten:

  • Bug-Reports mit Reproduktionsschritten
  • Workflow-Verbesserungen aus dem realen Büroalltag
  • Vorlagen (Briefe, Protokolle, Lieferscheine) für andere Büros
  • Übersetzungen / Internationalisierung

Wie erhalte ich Hilfe bei einem Problem? -

Ein Issue auf Gitea ist der beste Weg. Bitte beschreibe, was du gemacht hast und was passiert ist. Screenshots helfen. Die Rapport-Version (links unten in der App) bitte angeben.

KanalVerwendung
Gitea IssuesBugs, Feature-Wünsche, allgemeine Fragen
gabrielevarano.chEntwickler-Kontakt

Warum Open Source? -

Bürowissen sollte nicht in proprietären Tools eingesperrt sein. Studio-Management-Workflows sind in der Branche gut etabliert — ein Tool, das die Schweizer Konventionen (SIA 102, QR-Rechnung) sauber umsetzt, gehört allen.

AGPL-3.0 stellt sicher, dass Verbesserungen wieder ins Projekt fliessen.

\ No newline at end of file +Ist Rapport kostenlos? Ja, vollständig. Quellcode unter GNU AGPL-3.0-or-later. Keine versteckten Kosten, keine Telemetrie. Die Daten bleiben lokal auf deinem Computer bzw. in deiner Instanz. Du hast die komplette Kontrolle über deine Daten."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

FAQ

+

Häufige Fragen zu RAPPORT. Bei Bugs oder weiteren Fragen → Issue auf Gitea.

+

Für wen ist Rapport gedacht? +

Für kleine Architekturbüros in der Schweiz. Die Strukturen folgen der SIA 102 (Phasen, Honorar). Rapport wurde für den internen Gebrauch entwickelt und wird mit diesem Projekt öffentlich geteilt.

+

Ist Rapport kostenlos? +

Ja, vollständig. Quellcode unter GNU AGPL-3.0-or-later. Keine versteckten Kosten, keine Telemetrie. Die Daten bleiben lokal auf deinem Computer bzw. in deiner Instanz. Du hast die komplette Kontrolle über deine Daten.

+

Welche Systeme werden unterstützt? +

Aktuell nur macOS (Intel & Apple Silicon). Rapport basiert auf Tauri — eine Portierung auf Linux und Windows ist möglich, sobald der Bedarf seitens Community besteht.

+

Wo werden die Daten gespeichert? +

Rapport unterstützt zwei Modi, beide selbst-gehostet:

+
    +
  • Desktop-App (Single-User) — alle Daten liegen lokal auf deinem Mac (localStorage im Applikationsordner). Kein Server nötig, kein Cloud-Account, keine Telemetrie.
  • +
  • Server-Modus (Multi-User) — Daten in einer eigenen PostgreSQL-Datenbank über Rapport Server. Mehrere Personen, Realtime-Sync, eigene Domain. Wechsel direkt im Login-Bildschirm der App.
  • +
+

In beiden Fällen bleibt die Kontrolle über die Daten bei dir.

+

Ist die Software stabil genug für den Betrieb? +

Noch nicht. Aktuell befindet sich Rapport in aktiver Entwicklung (Pre-Release 0.8.2). Funktionen können sich ändern, Bugs sind möglich. Regelmässige Backups sind empfohlen. Testen und Feedback geben ist erwünscht.

+

Was ist mit dem QR-Einzahlungsschein? +

Rapport erzeugt Schweizer QR-Rechnungen nach Norm — direkt eingebettet in das PDF der Rechnung. IBAN, Bürodaten und Empfänger werden aus den Einstellungen bzw. den Kundendaten gezogen. Akonto-, Teil- und Schlussrechnungen werden unterstützt.

+

Wie funktioniert die Zeiterfassung? +

Tages- und Wochenraster mit Drag & Drop. Jeder Eintrag wird einem Projekt zugewiesen. Auswertungen pro Mitarbeiter und Projekt sind unter Zeit abrufbar. Ferienverwaltung mit Prorata und Jahresabschluss mit Überstundenausgleich.

+

Kann ich zum Projekt beitragen? +

Ja. Issues und Pull Requests sind willkommen auf Gitea. Rapport ist kein Framework — konkrete Verbesserungen für den Büroalltag sind am wertvollsten:

+
    +
  • Bug-Reports mit Reproduktionsschritten
  • +
  • Workflow-Verbesserungen aus dem realen Büroalltag
  • +
  • Vorlagen (Briefe, Protokolle, Lieferscheine) für andere Büros
  • +
  • Übersetzungen / Internationalisierung
  • +
+

Wie erhalte ich Hilfe bei einem Problem? +

Ein Issue auf Gitea ist der beste Weg. Bitte beschreibe, was du gemacht hast und was passiert ist. Screenshots helfen. Die Rapport-Version (links unten in der App) bitte angeben.

+ + + + + + + + + + + + + + + + + +
KanalVerwendung
Gitea IssuesBugs, Feature-Wünsche, allgemeine Fragen
gabrielevarano.chEntwickler-Kontakt
+

Warum Open Source? +

Bürowissen sollte nicht in proprietären Tools eingesperrt sein. Studio-Management-Workflows sind in der Branche gut etabliert — ein Tool, das die Schweizer Konventionen (SIA 102, QR-Rechnung) sauber umsetzt, gehört allen.

+

AGPL-3.0 stellt sicher, dass Verbesserungen wieder ins Projekt fliessen.

+ +
+
+
+ +
+
+
+ + + + + + + diff --git a/public/faq/index.xml b/public/faq/index.xml index af5d9ac..202a237 100644 --- a/public/faq/index.xml +++ b/public/faq/index.xml @@ -1 +1,18 @@ -RAPPORT – FAQhttps://rapport.gabrielevarano.ch/faq/Recent content in FAQ on RAPPORTHugo -- gohugo.iode \ No newline at end of file + + + RAPPORT – FAQ + /faq/ + Recent content in FAQ on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + diff --git a/public/features/auto-updater/index.html b/public/features/auto-updater/index.html index 57f728e..f137820 100644 --- a/public/features/auto-updater/index.html +++ b/public/features/auto-updater/index.html @@ -1,7 +1,23 @@ -Auto-Updater – RAPPORT + + + + + + + + +Auto-Updater – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen

Auto-Updater

Neu in 0.7.0

Rapport prüft beim Start automatisch auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden.

Funktionsweise -

Beim App-Start:

  1. Abfrage gegen https://git.kgva.ch/karim/RAPPORT/releases/latest.json
  2. Versionsvergleich mit lokaler version im Tauri-Bundle
  3. Bei neuer Version → Update-Dialog
  4. Bei Bestätigung → Download + Signaturprüfung + Installation + Neustart

Sicherheit -

  • Updates werden mit dem Tauri-Updater-Schlüssel signiert
  • Manipulierte Downloads werden abgelehnt
  • Quellcode und Build sind reproduzierbar (Gitea CI, geplant)

Optionen -

  • Update installieren — Download & Neustart
  • Diese Version überspringen — überspringt nur diese eine Version
  • Später erinnern — beim nächsten Start erneut fragen

Updates können in den Einstellungen komplett deaktiviert werden.

Latest-Endpoint -

{
-  "version": "0.8.2",
-  "notes": "Rapport 0.8.2",
-  "pub_date": "2026-05-24T00:00:00Z",
-  "platforms": {
-    "darwin-aarch64": {
-      "signature": "…",
-      "url": "https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.2/RAPPORT%20PRE-RELEASE.app.tar.gz"
-    }
-  }
-}
\ No newline at end of file +Abfrage gegen https://git.kgva.ch/karim/RAPPORT/releases/latest.json Versionsvergleich mit lokaler version im Tauri-Bundle Bei neuer Version → Update-Dialog Bei Bestätigung → Download + Signaturprüfung + Installation + Neustart Sicherheit Updates werden mit dem Tauri-Updater-Schlüssel signiert Manipulierte Downloads werden abgelehnt Quellcode und Build sind reproduzierbar (Gitea CI, geplant) Optionen Update installieren — Download & Neustart Diese Version überspringen — überspringt nur diese eine Version Später erinnern — beim nächsten Start erneut fragen Updates können in den Einstellungen komplett deaktiviert werden."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Auto-Updater

+
+
+

Neu in 0.7.0

+

Rapport prüft beim Start automatisch auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden.

+

Funktionsweise +

Beim App-Start:

+
    +
  1. Abfrage gegen https://git.kgva.ch/karim/RAPPORT/releases/latest.json
  2. +
  3. Versionsvergleich mit lokaler version im Tauri-Bundle
  4. +
  5. Bei neuer Version → Update-Dialog
  6. +
  7. Bei Bestätigung → Download + Signaturprüfung + Installation + Neustart
  8. +
+

Sicherheit +

    +
  • Updates werden mit dem Tauri-Updater-Schlüssel signiert
  • +
  • Manipulierte Downloads werden abgelehnt
  • +
  • Quellcode und Build sind reproduzierbar (Gitea CI, geplant)
  • +
+

Optionen +

    +
  • Update installieren — Download & Neustart
  • +
  • Diese Version überspringen — überspringt nur diese eine Version
  • +
  • Später erinnern — beim nächsten Start erneut fragen
  • +
+

Updates können in den Einstellungen komplett deaktiviert werden.

+

Latest-Endpoint +

+ +
{
+  "version": "0.8.2",
+  "notes": "Rapport 0.8.2",
+  "pub_date": "2026-05-24T00:00:00Z",
+  "platforms": {
+    "darwin-aarch64": {
+      "signature": "…",
+      "url": "https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.2/RAPPORT%20PRE-RELEASE.app.tar.gz"
+    }
+  }
+}
+ +
+
+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/index.html b/public/features/index.html index d76060a..49ce1e8 100644 --- a/public/features/index.html +++ b/public/features/index.html @@ -1,31 +1,637 @@ -Features – RAPPORT + + + + + + + + +Features – RAPPORT + + + + +Zum Inhalt springen
\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ + +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/index.xml b/public/features/index.xml index 9d2a803..926c2f1 100644 --- a/public/features/index.xml +++ b/public/features/index.xml @@ -1,92 +1,142 @@ -RAPPORT – Featureshttps://rapport.gabrielevarano.ch/features/Recent content in Features on RAPPORTHugo -- gohugo.iodeZeiterfassunghttps://rapport.gabrielevarano.ch/features/zeiterfassung/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/zeiterfassung/ -<p><span class="rapport-status active">In Arbeit</span></p> + + + RAPPORT – Features + /features/ + Recent content in Features on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + Zeiterfassung + /features/zeiterfassung/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/zeiterfassung/ + + + + <p><span class="rapport-status active">In Arbeit</span></p> <p><strong>Tages- und Wochenraster</strong> mit Drag &amp; Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss.</p> -<h2>Konzept<span class="hx:absolute hx:-mt-20" id="konzept"></span> -<a href="#konzept" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Die Zeiterfassung ist das <strong>Kernmodul</strong> von RAPPORT — alle anderen Module (Rechnungen, Auswertungen, Lohnabrechnung) greifen auf die hier erfassten Stunden zu.</p> -<h2>Eingabe<span class="hx:absolute hx:-mt-20" id="eingabe"></span> -<a href="#eingabe" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Konzept<span class="hx:absolute hx:-mt-20" id="konzept"></span> + <a href="#konzept" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Die Zeiterfassung ist das <strong>Kernmodul</strong> von RAPPORT — alle anderen Module (Rechnungen, Auswertungen, Lohnabrechnung) greifen auf die hier erfassten Stunden zu.</p> +<h2>Eingabe<span class="hx:absolute hx:-mt-20" id="eingabe"></span> + <a href="#eingabe" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li><strong>Wochenraster</strong> mit den 5 (oder 7) Arbeitstagen</li> <li><strong>Halbstunden-Slots</strong> von 06:00 bis 22:00</li> <li><strong>Klick</strong> oder <strong>Drag</strong> über mehrere Slots</li> <li>Jeder Eintrag wird einem <strong>Projekt</strong> zugewiesen (Pflichtfeld)</li> <li>Mehrfacheinträge pro Slot möglich (z. B. parallele Telefonate)</li> </ul> -<h2>Auswertungen<span class="hx:absolute hx:-mt-20" id="auswertungen"></span> -<a href="#auswertungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Mitarbeiter und pro Projekt:</p> +<h2>Auswertungen<span class="hx:absolute hx:-mt-20" id="auswertungen"></span> + <a href="#auswertungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Mitarbeiter und pro Projekt:</p> <ul> <li>Geleistete Stunden vs. Soll-Pensum</li> <li>Ferienanspruch / -saldo (mit Prorata bei Eintritt unter Jahr)</li> <li>Überstunden-Saldo</li> <li>Stundenaufschlüsselung nach SIA-Phase pro Projekt</li> </ul> -<h2>Jahresabschluss<span class="hx:absolute hx:-mt-20" id="jahresabschluss"></span> -<a href="#jahresabschluss" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Am Jahresende:</p> +<h2>Jahresabschluss<span class="hx:absolute hx:-mt-20" id="jahresabschluss"></span> + <a href="#jahresabschluss" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Am Jahresende:</p> <ul> <li>Ferien-Restguthaben übertragen oder auszahlen</li> <li>Überstunden ausgleichen oder vergüten</li> <li>Neues Jahr automatisch initialisieren</li> </ul> -<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> -<a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> -<li><a href="../rechnungen">Rechnungen</a> — Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung</li> -<li><a href="../projekte">Projekte</a> — Stunden-Auswertung pro SIA-Phase</li> -<li><a href="../mitarbeiter">Mitarbeiter</a> — Pensum, Ferienanspruch</li> -</ul>Rechnungen & Offertenhttps://rapport.gabrielevarano.ch/features/rechnungen/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/rechnungen/ -<p><span class="rapport-status active">In Arbeit</span></p> +<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> + <a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<li><a href="../rechnungen">Rechnungen</a> — Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung</li> +<li><a href="../projekte">Projekte</a> — Stunden-Auswertung pro SIA-Phase</li> +<li><a href="../mitarbeiter">Mitarbeiter</a> — Pensum, Ferienanspruch</li> +</ul> + + + + + + Rechnungen & Offerten + /features/rechnungen/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/rechnungen/ + + + + <p><span class="rapport-status active">In Arbeit</span></p> <p><strong>QR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen.</strong> Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export.</p> -<h2>Workflow<span class="hx:absolute hx:-mt-20" id="workflow"></span> -<a href="#workflow" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ol> +<h2>Workflow<span class="hx:absolute hx:-mt-20" id="workflow"></span> + <a href="#workflow" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ol> <li><strong>Offerte</strong> erstellen — auf Basis SIA 102 oder pauschal</li> <li>Kunde nimmt an → <strong>konvertieren in Projekt + Rechnung</strong></li> <li><strong>Akonto-Rechnungen</strong> während der Projektlaufzeit</li> <li><strong>Schlussrechnung</strong> mit Differenz zum bisher Akonto-bezahlten</li> </ol> -<h2>QR-Einzahlungsschein<span class="hx:absolute hx:-mt-20" id="qr-einzahlungsschein"></span> -<a href="#qr-einzahlungsschein" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Schweizer <strong>QR-Rechnung</strong> nach Norm — direkt eingebettet in die PDF.</p> +<h2>QR-Einzahlungsschein<span class="hx:absolute hx:-mt-20" id="qr-einzahlungsschein"></span> + <a href="#qr-einzahlungsschein" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Schweizer <strong>QR-Rechnung</strong> nach Norm — direkt eingebettet in die PDF.</p> <p>Ausgelesen aus:</p> <ul> <li><strong>Bürodaten</strong> — IBAN, Empfänger-Adresse</li> <li><strong>Kundendaten</strong> — Schuldner-Adresse</li> <li><strong>Rechnungs-Daten</strong> — Betrag, Referenz, Zusatzinformation</li> </ul> -<h2>Honorarmodelle<span class="hx:absolute hx:-mt-20" id="honorarmodelle"></span> -<a href="#honorarmodelle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> -<thead> -<tr> -<th>Modell</th> -<th>Berechnung</th> -<th>Verwendung</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Stundensatz</strong></td> -<td>Aus Zeiterfassung × Mitarbeiter-Stundensatz</td> -<td>Kleinaufträge, Beratung</td> -</tr> -<tr> -<td><strong>SIA-Phasen</strong></td> -<td>Bauschätzwert × Honorarsatz × Phasenanteil</td> -<td>Reguläre Architektur-Aufträge</td> -</tr> -<tr> -<td><strong>Pauschal</strong></td> -<td>Fester Betrag</td> -<td>Auf Wunsch des Kunden</td> -</tr> -</tbody> +<h2>Honorarmodelle<span class="hx:absolute hx:-mt-20" id="honorarmodelle"></span> + <a href="#honorarmodelle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> + <thead> + <tr> + <th>Modell</th> + <th>Berechnung</th> + <th>Verwendung</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Stundensatz</strong></td> + <td>Aus Zeiterfassung × Mitarbeiter-Stundensatz</td> + <td>Kleinaufträge, Beratung</td> + </tr> + <tr> + <td><strong>SIA-Phasen</strong></td> + <td>Bauschätzwert × Honorarsatz × Phasenanteil</td> + <td>Reguläre Architektur-Aufträge</td> + </tr> + <tr> + <td><strong>Pauschal</strong></td> + <td>Fester Betrag</td> + <td>Auf Wunsch des Kunden</td> + </tr> + </tbody> </table> -<h2>PDF-Export<span class="hx:absolute hx:-mt-20" id="pdf-export"></span> -<a href="#pdf-export" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant).</p> -<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> -<a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> -<li><a href="../projekte">Projekte</a> — Honorarstruktur stammt aus dem Projekt</li> -<li><a href="../zeiterfassung">Zeiterfassung</a> — Stundensatz-Rechnungen</li> -</ul>Projekt- & Kundenverwaltunghttps://rapport.gabrielevarano.ch/features/projekte/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/projekte/ -<p><span class="rapport-status active">In Arbeit</span></p> +<h2>PDF-Export<span class="hx:absolute hx:-mt-20" id="pdf-export"></span> + <a href="#pdf-export" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant).</p> +<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> + <a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<li><a href="../projekte">Projekte</a> — Honorarstruktur stammt aus dem Projekt</li> +<li><a href="../zeiterfassung">Zeiterfassung</a> — Stundensatz-Rechnungen</li> +</ul> + + + + + + Projekt- & Kundenverwaltung + /features/projekte/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/projekte/ + + + + <p><span class="rapport-status active">In Arbeit</span></p> <p><strong>Projekte nach SIA 102</strong> mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen.</p> -<h2>Projektstruktur<span class="hx:absolute hx:-mt-20" id="projektstruktur"></span> -<a href="#projektstruktur" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Jedes Projekt besitzt:</p> +<h2>Projektstruktur<span class="hx:absolute hx:-mt-20" id="projektstruktur"></span> + <a href="#projektstruktur" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Jedes Projekt besitzt:</p> <ul> <li><strong>Stammdaten</strong> — Nummer, Bezeichnung, Standort, Bauschätzwert</li> <li><strong>Kunde</strong> — verknüpft mit Kundendatenbank</li> @@ -94,85 +144,98 @@ <li><strong>Phasen</strong> — SIA 102 (Vorprojekt, Bauprojekt, Ausschreibung, …)</li> <li><strong>Budget</strong> — Gesamthonorar, pro Phase aufgeteilt</li> </ul> -<h2>SIA 102<span class="hx:absolute hx:-mt-20" id="sia-102"></span> -<a href="#sia-102" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden.</p> +<h2>SIA 102<span class="hx:absolute hx:-mt-20" id="sia-102"></span> + <a href="#sia-102" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden.</p> <table> -<thead> -<tr> -<th>Phase</th> -<th>Anteil (Standard)</th> -</tr> -</thead> -<tbody> -<tr> -<td>31 — Vorprojekt</td> -<td>9 %</td> -</tr> -<tr> -<td>32 — Bauprojekt</td> -<td>21 %</td> -</tr> -<tr> -<td>33 — Bewilligung</td> -<td>3 %</td> -</tr> -<tr> -<td>41 — Ausschreibung</td> -<td>18 %</td> -</tr> -<tr> -<td>51 — Ausführung</td> -<td>38 %</td> -</tr> -<tr> -<td>52 — Inbetriebnahme</td> -<td>6 %</td> -</tr> -<tr> -<td>53 — Abschluss</td> -<td>5 %</td> -</tr> -</tbody> + <thead> + <tr> + <th>Phase</th> + <th>Anteil (Standard)</th> + </tr> + </thead> + <tbody> + <tr> + <td>31 — Vorprojekt</td> + <td>9 %</td> + </tr> + <tr> + <td>32 — Bauprojekt</td> + <td>21 %</td> + </tr> + <tr> + <td>33 — Bewilligung</td> + <td>3 %</td> + </tr> + <tr> + <td>41 — Ausschreibung</td> + <td>18 %</td> + </tr> + <tr> + <td>51 — Ausführung</td> + <td>38 %</td> + </tr> + <tr> + <td>52 — Inbetriebnahme</td> + <td>6 %</td> + </tr> + <tr> + <td>53 — Abschluss</td> + <td>5 %</td> + </tr> + </tbody> </table> -<h2>Kundendatenbank<span class="hx:absolute hx:-mt-20" id="kundendatenbank"></span> -<a href="#kundendatenbank" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Kundendatenbank<span class="hx:absolute hx:-mt-20" id="kundendatenbank"></span> + <a href="#kundendatenbank" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li>Adresse, Ansprechperson, Telefon, E-Mail</li> <li>Honorartyp (Stundensatz / SIA / Pauschal)</li> <li>Verknüpfung zu allen Projekten und Rechnungen des Kunden</li> </ul> -<h2>Auswertung<span class="hx:absolute hx:-mt-20" id="auswertung"></span> -<a href="#auswertung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Projekt:</p> +<h2>Auswertung<span class="hx:absolute hx:-mt-20" id="auswertung"></span> + <a href="#auswertung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Projekt:</p> <ul> <li>Geleistete Stunden vs. Budget</li> <li>Honorar-Saldo (verrechnet / Akonto / offen)</li> <li>Phasen-Fortschritt</li> </ul> -<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> -<a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> -<li><a href="../rechnungen">Rechnungen</a> — Offerte → Projekt</li> -<li><a href="../zeiterfassung">Zeiterfassung</a> — Stunden-Auswertung pro Phase</li> -</ul>Mitarbeiterhttps://rapport.gabrielevarano.ch/features/mitarbeiter/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/mitarbeiter/ -<p><span class="rapport-status active">In Arbeit</span></p> +<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> + <a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<li><a href="../rechnungen">Rechnungen</a> — Offerte → Projekt</li> +<li><a href="../zeiterfassung">Zeiterfassung</a> — Stunden-Auswertung pro Phase</li> +</ul> + + + + + + Mitarbeiter + /features/mitarbeiter/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/mitarbeiter/ + + + + <p><span class="rapport-status active">In Arbeit</span></p> <p><strong>Ferienverwaltung, interne Stunden / Absenzen und Lohnabrechnung.</strong> Jahresabschluss mit Überstundenausgleich.</p> -<h2>Stammdaten<span class="hx:absolute hx:-mt-20" id="stammdaten"></span> -<a href="#stammdaten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Mitarbeiter:</p> +<h2>Stammdaten<span class="hx:absolute hx:-mt-20" id="stammdaten"></span> + <a href="#stammdaten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Mitarbeiter:</p> <ul> <li>Name, Eintrittsdatum, Pensum (%)</li> <li>Stundensatz (intern, für Rechnungen)</li> <li>Ferienanspruch (Tage / Jahr)</li> <li>Lohn (monatlich, brutto)</li> </ul> -<h2>Ferienverwaltung<span class="hx:absolute hx:-mt-20" id="ferienverwaltung"></span> -<a href="#ferienverwaltung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Ferienverwaltung<span class="hx:absolute hx:-mt-20" id="ferienverwaltung"></span> + <a href="#ferienverwaltung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li><strong>Prorata-Berechnung</strong> bei Eintritt unter Jahr</li> <li><strong>Ferien-Saldo</strong> in Tagen (live)</li> <li><strong>Halbtage</strong> unterstützt</li> <li><strong>Übertrag</strong> ins Folgejahr oder Auszahlung</li> </ul> -<h2>Absenzen<span class="hx:absolute hx:-mt-20" id="absenzen"></span> -<a href="#absenzen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter.</p> -<h2>Lohnabrechnung<span class="hx:absolute hx:-mt-20" id="lohnabrechnung"></span> -<a href="#lohnabrechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Monatliche Abrechnung mit:</p> +<h2>Absenzen<span class="hx:absolute hx:-mt-20" id="absenzen"></span> + <a href="#absenzen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter.</p> +<h2>Lohnabrechnung<span class="hx:absolute hx:-mt-20" id="lohnabrechnung"></span> + <a href="#lohnabrechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Monatliche Abrechnung mit:</p> <ul> <li>Grundlohn (basierend auf Pensum)</li> <li>Überstunden-Vergütung</li> @@ -180,21 +243,34 @@ <li>Sozialabzüge (AHV, ALV, Pensionskasse)</li> </ul> <p>PDF-Export pro Mitarbeiter.</p> -<h2>Jahresabschluss<span class="hx:absolute hx:-mt-20" id="jahresabschluss"></span> -<a href="#jahresabschluss" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Jahresabschluss<span class="hx:absolute hx:-mt-20" id="jahresabschluss"></span> + <a href="#jahresabschluss" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li>Ferien-Restguthaben übertragen oder auszahlen</li> <li>Überstunden ausgleichen oder vergüten</li> <li>Lohnausweis vorbereiten (Export)</li> </ul> -<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> -<a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> -<li><a href="../zeiterfassung">Zeiterfassung</a> — Pensum-Soll vs. Stunden-Ist</li> -<li><a href="../spesen">Spesen</a> — Spesen-Erstattung in der Lohnabrechnung</li> -</ul>Spesen & Bürobudgethttps://rapport.gabrielevarano.ch/features/spesen/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/spesen/ -<p><span class="rapport-status active">In Arbeit</span></p> +<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> + <a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<li><a href="../zeiterfassung">Zeiterfassung</a> — Pensum-Soll vs. Stunden-Ist</li> +<li><a href="../spesen">Spesen</a> — Spesen-Erstattung in der Lohnabrechnung</li> +</ul> + + + + + + Spesen & Bürobudget + /features/spesen/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/spesen/ + + + + <p><span class="rapport-status active">In Arbeit</span></p> <p><strong>Spesenerfassung mit Belegupload.</strong> Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen.</p> -<h2>Spesenerfassung<span class="hx:absolute hx:-mt-20" id="spesenerfassung"></span> -<a href="#spesenerfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Mitarbeiter:</p> +<h2>Spesenerfassung<span class="hx:absolute hx:-mt-20" id="spesenerfassung"></span> + <a href="#spesenerfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Mitarbeiter:</p> <ul> <li>Datum, Betrag, Kategorie</li> <li><strong>Beleg-Upload</strong> (PDF, JPG, PNG)</li> @@ -202,28 +278,41 @@ <li>Status (offen / erstattet)</li> </ul> <p>Kategorien: Reise, Verpflegung, Material, Telefon, Sonstiges.</p> -<h2>Jahresbudget<span class="hx:absolute hx:-mt-20" id="jahresbudget"></span> -<a href="#jahresbudget" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Übersicht über:</p> +<h2>Jahresbudget<span class="hx:absolute hx:-mt-20" id="jahresbudget"></span> + <a href="#jahresbudget" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Übersicht über:</p> <ul> <li><strong>Einnahmen</strong> — Rechnungsbeträge, sortiert nach Eingang</li> <li><strong>Ausgaben</strong> — Spesen, Bürokosten, Löhne, Sozialabzüge</li> <li><strong>Saldo</strong> pro Monat / Quartal / Jahr</li> </ul> -<h2>Auswertung<span class="hx:absolute hx:-mt-20" id="auswertung"></span> -<a href="#auswertung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Auswertung<span class="hx:absolute hx:-mt-20" id="auswertung"></span> + <a href="#auswertung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li>Einnahmen pro Kunde / Projekt</li> <li>Ausgaben pro Kategorie / Mitarbeiter</li> <li>Erfolgsrechnung pro Geschäftsjahr (vereinfacht)</li> </ul> -<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> -<a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> -<li><a href="../mitarbeiter">Mitarbeiter</a> — Spesen-Erstattung in der Lohnabrechnung</li> -<li><a href="../rechnungen">Rechnungen</a> — Einnahmen-Quelle</li> -</ul>Protokolle & Lieferscheinehttps://rapport.gabrielevarano.ch/features/protokolle/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/protokolle/ -<p><span class="rapport-status active">In Arbeit</span></p> +<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> + <a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<li><a href="../mitarbeiter">Mitarbeiter</a> — Spesen-Erstattung in der Lohnabrechnung</li> +<li><a href="../rechnungen">Rechnungen</a> — Einnahmen-Quelle</li> +</ul> + + + + + + Protokolle & Lieferscheine + /features/protokolle/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/protokolle/ + + + + <p><span class="rapport-status active">In Arbeit</span></p> <p><strong>Einfache Erstellung von Sitzungsprotokollen</strong> mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild.</p> -<h2>Sitzungsprotokolle<span class="hx:absolute hx:-mt-20" id="sitzungsprotokolle"></span> -<a href="#sitzungsprotokolle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Sitzung:</p> +<h2>Sitzungsprotokolle<span class="hx:absolute hx:-mt-20" id="sitzungsprotokolle"></span> + <a href="#sitzungsprotokolle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Sitzung:</p> <ul> <li>Datum, Ort, Teilnehmer (aus Beteiligten-Liste)</li> <li><strong>Traktanden</strong> als nummerierte Liste</li> @@ -231,104 +320,131 @@ <li>Anhänge</li> </ul> <p>PDF-Export mit Bürobriefbogen.</p> -<h2>Briefe<span class="hx:absolute hx:-mt-20" id="briefe"></span> -<a href="#briefe" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Brief-Editor mit:</p> +<h2>Briefe<span class="hx:absolute hx:-mt-20" id="briefe"></span> + <a href="#briefe" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Brief-Editor mit:</p> <ul> <li>Empfänger aus Kundendatenbank</li> <li>Bezugszeile, Anrede, Text, Grussformel</li> <li>Briefbogen-Vorlage mit Logo</li> <li>PDF-Export</li> </ul> -<h2>Lieferscheine<span class="hx:absolute hx:-mt-20" id="lieferscheine"></span> -<a href="#lieferscheine" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Lieferung:</p> +<h2>Lieferscheine<span class="hx:absolute hx:-mt-20" id="lieferscheine"></span> + <a href="#lieferscheine" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Pro Lieferung:</p> <ul> <li>Empfänger, Datum, Bezug</li> <li>Positionen (Plan-Nummer, Bezeichnung, Anzahl, Massstab)</li> <li>Unterschriftenfeld</li> </ul> <p>Konsistentes Erscheinungsbild über alle Dokumenttypen — eine Briefbogen-Vorlage, mehrere Verwendungen.</p> -<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> -<a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> -<li><a href="../projekte">Projekte</a> — Beteiligte als Empfänger</li> -</ul>Auto-Updaterhttps://rapport.gabrielevarano.ch/features/auto-updater/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/auto-updater/ -<p><span class="rapport-status new">Neu in 0.7.0</span></p> +<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> + <a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<li><a href="../projekte">Projekte</a> — Beteiligte als Empfänger</li> +</ul> + + + + + + Auto-Updater + /features/auto-updater/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/auto-updater/ + + + + <p><span class="rapport-status new">Neu in 0.7.0</span></p> <p><strong>Rapport prüft beim Start automatisch auf neue Versionen</strong> und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden.</p> -<h2>Funktionsweise<span class="hx:absolute hx:-mt-20" id="funktionsweise"></span> -<a href="#funktionsweise" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Beim App-Start:</p> +<h2>Funktionsweise<span class="hx:absolute hx:-mt-20" id="funktionsweise"></span> + <a href="#funktionsweise" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>Beim App-Start:</p> <ol> <li>Abfrage gegen <code>https://git.kgva.ch/karim/RAPPORT/releases/latest.json</code></li> <li>Versionsvergleich mit lokaler <code>version</code> im Tauri-Bundle</li> <li>Bei neuer Version → Update-Dialog</li> <li>Bei Bestätigung → Download + Signaturprüfung + Installation + Neustart</li> </ol> -<h2>Sicherheit<span class="hx:absolute hx:-mt-20" id="sicherheit"></span> -<a href="#sicherheit" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Sicherheit<span class="hx:absolute hx:-mt-20" id="sicherheit"></span> + <a href="#sicherheit" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li>Updates werden mit dem <strong>Tauri-Updater-Schlüssel</strong> signiert</li> <li>Manipulierte Downloads werden abgelehnt</li> <li>Quellcode und Build sind reproduzierbar (Gitea CI, geplant)</li> </ul> -<h2>Optionen<span class="hx:absolute hx:-mt-20" id="optionen"></span> -<a href="#optionen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Optionen<span class="hx:absolute hx:-mt-20" id="optionen"></span> + <a href="#optionen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li><strong>Update installieren</strong> — Download &amp; Neustart</li> <li><strong>Diese Version überspringen</strong> — überspringt nur diese eine Version</li> <li><strong>Später erinnern</strong> — beim nächsten Start erneut fragen</li> </ul> <p>Updates können in den Einstellungen komplett deaktiviert werden.</p> -<h2>Latest-Endpoint<span class="hx:absolute hx:-mt-20" id="latest-endpoint"></span> -<a href="#latest-endpoint" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> -<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> -</span></span><span class="line"><span class="cl"> <span class="nt">&#34;version&#34;</span><span class="p">:</span> <span class="s2">&#34;0.8.2&#34;</span><span class="p">,</span> -</span></span><span class="line"><span class="cl"> <span class="nt">&#34;notes&#34;</span><span class="p">:</span> <span class="s2">&#34;Rapport 0.8.2&#34;</span><span class="p">,</span> -</span></span><span class="line"><span class="cl"> <span class="nt">&#34;pub_date&#34;</span><span class="p">:</span> <span class="s2">&#34;2026-05-24T00:00:00Z&#34;</span><span class="p">,</span> -</span></span><span class="line"><span class="cl"> <span class="nt">&#34;platforms&#34;</span><span class="p">:</span> <span class="p">{</span> -</span></span><span class="line"><span class="cl"> <span class="nt">&#34;darwin-aarch64&#34;</span><span class="p">:</span> <span class="p">{</span> -</span></span><span class="line"><span class="cl"> <span class="nt">&#34;signature&#34;</span><span class="p">:</span> <span class="s2">&#34;…&#34;</span><span class="p">,</span> -</span></span><span class="line"><span class="cl"> <span class="nt">&#34;url&#34;</span><span class="p">:</span> <span class="s2">&#34;https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.2/RAPPORT%20PRE-RELEASE.app.tar.gz&#34;</span> -</span></span><span class="line"><span class="cl"> <span class="p">}</span> -</span></span><span class="line"><span class="cl"> <span class="p">}</span> -</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> -<button -class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" -title="Code kopieren" -aria-label="Code kopieren" -data-copied-label="Kopiert!" -> -<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> -<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> -</button> +<h2>Latest-Endpoint<span class="hx:absolute hx:-mt-20" id="latest-endpoint"></span> + <a href="#latest-endpoint" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> + +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;version&#34;</span><span class="p">:</span> <span class="s2">&#34;0.8.2&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;notes&#34;</span><span class="p">:</span> <span class="s2">&#34;Rapport 0.8.2&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;pub_date&#34;</span><span class="p">:</span> <span class="s2">&#34;2026-05-24T00:00:00Z&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;platforms&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;darwin-aarch64&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;signature&#34;</span><span class="p">:</span> <span class="s2">&#34;…&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;url&#34;</span><span class="p">:</span> <span class="s2">&#34;https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.2/RAPPORT%20PRE-RELEASE.app.tar.gz&#34;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> + <button + class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" + title="Code kopieren" + aria-label="Code kopieren" + data-copied-label="Kopiert!" + > + <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> + </button> </div> -</div>System-Trayhttps://rapport.gabrielevarano.ch/features/system-tray/Mon, 01 Jan 0001 00:00:00 +0000https://rapport.gabrielevarano.ch/features/system-tray/ -<p><span class="rapport-status new">Neu in 0.7.0</span></p> +</div> + + + + + + System-Tray + /features/system-tray/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /features/system-tray/ + + + + <p><span class="rapport-status new">Neu in 0.7.0</span></p> <p><strong>Schnellzugriff über die Menüleiste mit Hide-on-Close.</strong> Beim Schliessen läuft Rapport im Hintergrund weiter — Cmd+Q beendet die App vollständig.</p> -<h2>Verhalten<span class="hx:absolute hx:-mt-20" id="verhalten"></span> -<a href="#verhalten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> -<thead> -<tr> -<th>Aktion</th> -<th>Verhalten</th> -</tr> -</thead> -<tbody> -<tr> -<td><strong>Fenster schliessen</strong> (⌘W oder rotes X)</td> -<td>App läuft im Tray weiter</td> -</tr> -<tr> -<td><strong>Cmd+Q</strong></td> -<td>App wird vollständig beendet</td> -</tr> -<tr> -<td><strong>Klick auf Tray-Icon</strong></td> -<td>Fenster nach vorne, oder zeigen</td> -</tr> -<tr> -<td><strong>Rechtsklick auf Tray-Icon</strong></td> -<td>Menü mit Schnellzugriffen</td> -</tr> -</tbody> +<h2>Verhalten<span class="hx:absolute hx:-mt-20" id="verhalten"></span> + <a href="#verhalten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><table> + <thead> + <tr> + <th>Aktion</th> + <th>Verhalten</th> + </tr> + </thead> + <tbody> + <tr> + <td><strong>Fenster schliessen</strong> (⌘W oder rotes X)</td> + <td>App läuft im Tray weiter</td> + </tr> + <tr> + <td><strong>Cmd+Q</strong></td> + <td>App wird vollständig beendet</td> + </tr> + <tr> + <td><strong>Klick auf Tray-Icon</strong></td> + <td>Fenster nach vorne, oder zeigen</td> + </tr> + <tr> + <td><strong>Rechtsklick auf Tray-Icon</strong></td> + <td>Menü mit Schnellzugriffen</td> + </tr> + </tbody> </table> -<h2>Tray-Menü<span class="hx:absolute hx:-mt-20" id="tray-menü"></span> -<a href="#tray-men%c3%bc" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<h2>Tray-Menü<span class="hx:absolute hx:-mt-20" id="tray-menü"></span> + <a href="#tray-men%c3%bc" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> <li><strong>Rapport zeigen</strong> — Fenster nach vorne</li> <li><strong>Neue Zeiterfassung</strong> — direkt im Zeit-Modul</li> <li><strong>Neue Rechnung</strong> — direkt im Rechnungs-Modul</li> @@ -336,14 +452,20 @@ data-copied-label="Kopiert!" <li><strong>Einstellungen</strong></li> <li><strong>Rapport beenden</strong></li> </ul> -<h2>Konfiguration<span class="hx:absolute hx:-mt-20" id="konfiguration"></span> -<a href="#konfiguration" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>In den Einstellungen:</p> +<h2>Konfiguration<span class="hx:absolute hx:-mt-20" id="konfiguration"></span> + <a href="#konfiguration" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><p>In den Einstellungen:</p> <ul> <li><strong>Beim Systemstart starten</strong> (Login-Item) — Standard: aus</li> <li><strong>Beim Schliessen beenden</strong> statt ins Tray — Standard: aus</li> <li><strong>Tray-Icon ausblenden</strong> — App läuft, aber kein Menüleisten-Icon</li> </ul> -<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> -<a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> -<li><a href="../auto-updater">Auto-Updater</a> — prüft Updates im Hintergrund</li> -</ul> \ No newline at end of file +<h2>Verwandte Module<span class="hx:absolute hx:-mt-20" id="verwandte-module"></span> + <a href="#verwandte-module" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"></a></h2><ul> +<li><a href="../auto-updater">Auto-Updater</a> — prüft Updates im Hintergrund</li> +</ul> + + + + + + diff --git a/public/features/mitarbeiter/index.html b/public/features/mitarbeiter/index.html index a6011e4..5300356 100644 --- a/public/features/mitarbeiter/index.html +++ b/public/features/mitarbeiter/index.html @@ -1,7 +1,23 @@ -Mitarbeiter – RAPPORT + + + + + + + + +Mitarbeiter – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen

Mitarbeiter

In Arbeit

Ferienverwaltung, interne Stunden / Absenzen und Lohnabrechnung. Jahresabschluss mit Überstundenausgleich.

Stammdaten -

Pro Mitarbeiter:

  • Name, Eintrittsdatum, Pensum (%)
  • Stundensatz (intern, für Rechnungen)
  • Ferienanspruch (Tage / Jahr)
  • Lohn (monatlich, brutto)

Ferienverwaltung -

  • Prorata-Berechnung bei Eintritt unter Jahr
  • Ferien-Saldo in Tagen (live)
  • Halbtage unterstützt
  • Übertrag ins Folgejahr oder Auszahlung

Absenzen -

Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter.

Lohnabrechnung -

Monatliche Abrechnung mit:

  • Grundlohn (basierend auf Pensum)
  • Überstunden-Vergütung
  • Spesen-Erstattung
  • Sozialabzüge (AHV, ALV, Pensionskasse)

PDF-Export pro Mitarbeiter.

Jahresabschluss -

  • Ferien-Restguthaben übertragen oder auszahlen
  • Überstunden ausgleichen oder vergüten
  • Lohnausweis vorbereiten (Export)

Verwandte Module -

  • Zeiterfassung — Pensum-Soll vs. Stunden-Ist
  • Spesen — Spesen-Erstattung in der Lohnabrechnung
\ No newline at end of file +Name, Eintrittsdatum, Pensum (%) Stundensatz (intern, für Rechnungen) Ferienanspruch (Tage / Jahr) Lohn (monatlich, brutto) Ferienverwaltung Prorata-Berechnung bei Eintritt unter Jahr Ferien-Saldo in Tagen (live) Halbtage unterstützt Übertrag ins Folgejahr oder Auszahlung Absenzen Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Mitarbeiter

+
+
+

In Arbeit

+

Ferienverwaltung, interne Stunden / Absenzen und Lohnabrechnung. Jahresabschluss mit Überstundenausgleich.

+

Stammdaten +

Pro Mitarbeiter:

+
    +
  • Name, Eintrittsdatum, Pensum (%)
  • +
  • Stundensatz (intern, für Rechnungen)
  • +
  • Ferienanspruch (Tage / Jahr)
  • +
  • Lohn (monatlich, brutto)
  • +
+

Ferienverwaltung +

    +
  • Prorata-Berechnung bei Eintritt unter Jahr
  • +
  • Ferien-Saldo in Tagen (live)
  • +
  • Halbtage unterstützt
  • +
  • Übertrag ins Folgejahr oder Auszahlung
  • +
+

Absenzen +

Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter.

+

Lohnabrechnung +

Monatliche Abrechnung mit:

+
    +
  • Grundlohn (basierend auf Pensum)
  • +
  • Überstunden-Vergütung
  • +
  • Spesen-Erstattung
  • +
  • Sozialabzüge (AHV, ALV, Pensionskasse)
  • +
+

PDF-Export pro Mitarbeiter.

+

Jahresabschluss +

    +
  • Ferien-Restguthaben übertragen oder auszahlen
  • +
  • Überstunden ausgleichen oder vergüten
  • +
  • Lohnausweis vorbereiten (Export)
  • +
+

Verwandte Module +

    +
  • Zeiterfassung — Pensum-Soll vs. Stunden-Ist
  • +
  • Spesen — Spesen-Erstattung in der Lohnabrechnung
  • +
+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/projekte/index.html b/public/features/projekte/index.html index d575cb4..cdafa7a 100644 --- a/public/features/projekte/index.html +++ b/public/features/projekte/index.html @@ -1,7 +1,23 @@ -Projekt- & Kundenverwaltung – RAPPORT + + + + + + + + +Projekt- & Kundenverwaltung – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen

Projekt- & Kundenverwaltung

In Arbeit

Projekte nach SIA 102 mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen.

Projektstruktur -

Jedes Projekt besitzt:

  • Stammdaten — Nummer, Bezeichnung, Standort, Bauschätzwert
  • Kunde — verknüpft mit Kundendatenbank
  • Beteiligte — Bauleitung, Fachplaner, Behörden
  • Phasen — SIA 102 (Vorprojekt, Bauprojekt, Ausschreibung, …)
  • Budget — Gesamthonorar, pro Phase aufgeteilt

SIA 102 -

Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden.

PhaseAnteil (Standard)
31 — Vorprojekt9 %
32 — Bauprojekt21 %
33 — Bewilligung3 %
41 — Ausschreibung18 %
51 — Ausführung38 %
52 — Inbetriebnahme6 %
53 — Abschluss5 %

Kundendatenbank -

  • Adresse, Ansprechperson, Telefon, E-Mail
  • Honorartyp (Stundensatz / SIA / Pauschal)
  • Verknüpfung zu allen Projekten und Rechnungen des Kunden

Auswertung -

Pro Projekt:

  • Geleistete Stunden vs. Budget
  • Honorar-Saldo (verrechnet / Akonto / offen)
  • Phasen-Fortschritt

Verwandte Module -

\ No newline at end of file +Stammdaten — Nummer, Bezeichnung, Standort, Bauschätzwert Kunde — verknüpft mit Kundendatenbank Beteiligte — Bauleitung, Fachplaner, Behörden Phasen — SIA 102 (Vorprojekt, Bauprojekt, Ausschreibung, …) Budget — Gesamthonorar, pro Phase aufgeteilt SIA 102 Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Projekt- & Kundenverwaltung

+
+
+

In Arbeit

+

Projekte nach SIA 102 mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen.

+

Projektstruktur +

Jedes Projekt besitzt:

+
    +
  • Stammdaten — Nummer, Bezeichnung, Standort, Bauschätzwert
  • +
  • Kunde — verknüpft mit Kundendatenbank
  • +
  • Beteiligte — Bauleitung, Fachplaner, Behörden
  • +
  • Phasen — SIA 102 (Vorprojekt, Bauprojekt, Ausschreibung, …)
  • +
  • Budget — Gesamthonorar, pro Phase aufgeteilt
  • +
+

SIA 102 +

Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PhaseAnteil (Standard)
31 — Vorprojekt9 %
32 — Bauprojekt21 %
33 — Bewilligung3 %
41 — Ausschreibung18 %
51 — Ausführung38 %
52 — Inbetriebnahme6 %
53 — Abschluss5 %
+

Kundendatenbank +

    +
  • Adresse, Ansprechperson, Telefon, E-Mail
  • +
  • Honorartyp (Stundensatz / SIA / Pauschal)
  • +
  • Verknüpfung zu allen Projekten und Rechnungen des Kunden
  • +
+

Auswertung +

Pro Projekt:

+
    +
  • Geleistete Stunden vs. Budget
  • +
  • Honorar-Saldo (verrechnet / Akonto / offen)
  • +
  • Phasen-Fortschritt
  • +
+

Verwandte Module +

+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/protokolle/index.html b/public/features/protokolle/index.html index 0d63a75..409c4b5 100644 --- a/public/features/protokolle/index.html +++ b/public/features/protokolle/index.html @@ -1,10 +1,26 @@ -Protokolle & Lieferscheine – RAPPORT + + + + + + + + +Protokolle & Lieferscheine – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen

Protokolle & Lieferscheine

In Arbeit

Einfache Erstellung von Sitzungsprotokollen mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild.

Sitzungsprotokolle -

Pro Sitzung:

  • Datum, Ort, Teilnehmer (aus Beteiligten-Liste)
  • Traktanden als nummerierte Liste
  • Pro Traktandum: Beschluss, Aufgabe, Verantwortlich, Frist
  • Anhänge

PDF-Export mit Bürobriefbogen.

Briefe -

Brief-Editor mit:

  • Empfänger aus Kundendatenbank
  • Bezugszeile, Anrede, Text, Grussformel
  • Briefbogen-Vorlage mit Logo
  • PDF-Export

Lieferscheine -

Pro Lieferung:

  • Empfänger, Datum, Bezug
  • Positionen (Plan-Nummer, Bezeichnung, Anzahl, Massstab)
  • Unterschriftenfeld

Konsistentes Erscheinungsbild über alle Dokumenttypen — eine Briefbogen-Vorlage, mehrere Verwendungen.

Verwandte Module -

\ No newline at end of file +Empfänger, Datum, Bezug Positionen (Plan-Nummer, Bezeichnung, Anzahl, Massstab) Unterschriftenfeld Konsistentes Erscheinungsbild über alle Dokumenttypen — eine Briefbogen-Vorlage, mehrere Verwendungen."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Protokolle & Lieferscheine

+
+
+

In Arbeit

+

Einfache Erstellung von Sitzungsprotokollen mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild.

+

Sitzungsprotokolle +

Pro Sitzung:

+
    +
  • Datum, Ort, Teilnehmer (aus Beteiligten-Liste)
  • +
  • Traktanden als nummerierte Liste
  • +
  • Pro Traktandum: Beschluss, Aufgabe, Verantwortlich, Frist
  • +
  • Anhänge
  • +
+

PDF-Export mit Bürobriefbogen.

+

Briefe +

Brief-Editor mit:

+
    +
  • Empfänger aus Kundendatenbank
  • +
  • Bezugszeile, Anrede, Text, Grussformel
  • +
  • Briefbogen-Vorlage mit Logo
  • +
  • PDF-Export
  • +
+

Lieferscheine +

Pro Lieferung:

+
    +
  • Empfänger, Datum, Bezug
  • +
  • Positionen (Plan-Nummer, Bezeichnung, Anzahl, Massstab)
  • +
  • Unterschriftenfeld
  • +
+

Konsistentes Erscheinungsbild über alle Dokumenttypen — eine Briefbogen-Vorlage, mehrere Verwendungen.

+

Verwandte Module +

    +
  • Projekte — Beteiligte als Empfänger
  • +
+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/rechnungen/index.html b/public/features/rechnungen/index.html index 5a2051d..9c78f89 100644 --- a/public/features/rechnungen/index.html +++ b/public/features/rechnungen/index.html @@ -1,15 +1,31 @@ -Rechnungen & Offerten – RAPPORT + + + + + + + + +Rechnungen & Offerten – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen

Rechnungen & Offerten

In Arbeit

QR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen. Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export.

Workflow -

  1. Offerte erstellen — auf Basis SIA 102 oder pauschal
  2. Kunde nimmt an → konvertieren in Projekt + Rechnung
  3. Akonto-Rechnungen während der Projektlaufzeit
  4. Schlussrechnung mit Differenz zum bisher Akonto-bezahlten

QR-Einzahlungsschein -

Schweizer QR-Rechnung nach Norm — direkt eingebettet in die PDF.

Ausgelesen aus:

  • Bürodaten — IBAN, Empfänger-Adresse
  • Kundendaten — Schuldner-Adresse
  • Rechnungs-Daten — Betrag, Referenz, Zusatzinformation

Honorarmodelle -

ModellBerechnungVerwendung
StundensatzAus Zeiterfassung × Mitarbeiter-StundensatzKleinaufträge, Beratung
SIA-PhasenBauschätzwert × Honorarsatz × PhasenanteilReguläre Architektur-Aufträge
PauschalFester BetragAuf Wunsch des Kunden

PDF-Export -

Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant).

Verwandte Module -

\ No newline at end of file +Bürodaten — IBAN, Empfänger-Adresse Kundendaten — Schuldner-Adresse Rechnungs-Daten — Betrag, Referenz, Zusatzinformation Honorarmodelle Modell Berechnung Verwendung Stundensatz Aus Zeiterfassung × Mitarbeiter-Stundensatz Kleinaufträge, Beratung SIA-Phasen Bauschätzwert × Honorarsatz × Phasenanteil Reguläre Architektur-Aufträge Pauschal Fester Betrag Auf Wunsch des Kunden PDF-Export Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant)."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Rechnungen & Offerten

+
+
+

In Arbeit

+

QR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen. Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export.

+

Workflow +

    +
  1. Offerte erstellen — auf Basis SIA 102 oder pauschal
  2. +
  3. Kunde nimmt an → konvertieren in Projekt + Rechnung
  4. +
  5. Akonto-Rechnungen während der Projektlaufzeit
  6. +
  7. Schlussrechnung mit Differenz zum bisher Akonto-bezahlten
  8. +
+

QR-Einzahlungsschein +

Schweizer QR-Rechnung nach Norm — direkt eingebettet in die PDF.

+

Ausgelesen aus:

+
    +
  • Bürodaten — IBAN, Empfänger-Adresse
  • +
  • Kundendaten — Schuldner-Adresse
  • +
  • Rechnungs-Daten — Betrag, Referenz, Zusatzinformation
  • +
+

Honorarmodelle +

+ + + + + + + + + + + + + + + + + + + + + + + + +
ModellBerechnungVerwendung
StundensatzAus Zeiterfassung × Mitarbeiter-StundensatzKleinaufträge, Beratung
SIA-PhasenBauschätzwert × Honorarsatz × PhasenanteilReguläre Architektur-Aufträge
PauschalFester BetragAuf Wunsch des Kunden
+

PDF-Export +

Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant).

+

Verwandte Module +

+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/spesen/index.html b/public/features/spesen/index.html index 1905c0e..0dd5272 100644 --- a/public/features/spesen/index.html +++ b/public/features/spesen/index.html @@ -1,9 +1,25 @@ -Spesen & Bürobudget – RAPPORT + + + + + + + + +Spesen & Bürobudget – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen

Spesen & Bürobudget

In Arbeit

Spesenerfassung mit Belegupload. Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen.

Spesenerfassung -

Pro Mitarbeiter:

  • Datum, Betrag, Kategorie
  • Beleg-Upload (PDF, JPG, PNG)
  • Projekt-Zuordnung (optional)
  • Status (offen / erstattet)

Kategorien: Reise, Verpflegung, Material, Telefon, Sonstiges.

Jahresbudget -

Übersicht über:

  • Einnahmen — Rechnungsbeträge, sortiert nach Eingang
  • Ausgaben — Spesen, Bürokosten, Löhne, Sozialabzüge
  • Saldo pro Monat / Quartal / Jahr

Auswertung -

  • Einnahmen pro Kunde / Projekt
  • Ausgaben pro Kategorie / Mitarbeiter
  • Erfolgsrechnung pro Geschäftsjahr (vereinfacht)

Verwandte Module -

\ No newline at end of file +Einnahmen — Rechnungsbeträge, sortiert nach Eingang Ausgaben — Spesen, Bürokosten, Löhne, Sozialabzüge Saldo pro Monat / Quartal / Jahr Auswertung Einnahmen pro Kunde / Projekt Ausgaben pro Kategorie / Mitarbeiter Erfolgsrechnung pro Geschäftsjahr (vereinfacht) Verwandte Module Mitarbeiter — Spesen-Erstattung in der Lohnabrechnung Rechnungen — Einnahmen-Quelle"> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Spesen & Bürobudget

+
+
+

In Arbeit

+

Spesenerfassung mit Belegupload. Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen.

+

Spesenerfassung +

Pro Mitarbeiter:

+
    +
  • Datum, Betrag, Kategorie
  • +
  • Beleg-Upload (PDF, JPG, PNG)
  • +
  • Projekt-Zuordnung (optional)
  • +
  • Status (offen / erstattet)
  • +
+

Kategorien: Reise, Verpflegung, Material, Telefon, Sonstiges.

+

Jahresbudget +

Übersicht über:

+
    +
  • Einnahmen — Rechnungsbeträge, sortiert nach Eingang
  • +
  • Ausgaben — Spesen, Bürokosten, Löhne, Sozialabzüge
  • +
  • Saldo pro Monat / Quartal / Jahr
  • +
+

Auswertung +

    +
  • Einnahmen pro Kunde / Projekt
  • +
  • Ausgaben pro Kategorie / Mitarbeiter
  • +
  • Erfolgsrechnung pro Geschäftsjahr (vereinfacht)
  • +
+

Verwandte Module +

+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/system-tray/index.html b/public/features/system-tray/index.html index 42df1d4..a9fdf80 100644 --- a/public/features/system-tray/index.html +++ b/public/features/system-tray/index.html @@ -1,9 +1,25 @@ -System-Tray – RAPPORT + + + + + + + + +System-Tray – RAPPORT + + + + +Zum Inhalt springen

System-Tray

Neu in 0.7.0

Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter — Cmd+Q beendet die App vollständig.

Verhalten -

AktionVerhalten
Fenster schliessen (⌘W oder rotes X)App läuft im Tray weiter
Cmd+QApp wird vollständig beendet
Klick auf Tray-IconFenster nach vorne, oder zeigen
Rechtsklick auf Tray-IconMenü mit Schnellzugriffen

Tray-Menü -

  • Rapport zeigen — Fenster nach vorne
  • Neue Zeiterfassung — direkt im Zeit-Modul
  • Neue Rechnung — direkt im Rechnungs-Modul
  • Letzte Projekte — Quick-Open der letzten 5 Projekte
  • Einstellungen
  • Rapport beenden

Konfiguration -

In den Einstellungen:

  • Beim Systemstart starten (Login-Item) — Standard: aus
  • Beim Schliessen beenden statt ins Tray — Standard: aus
  • Tray-Icon ausblenden — App läuft, aber kein Menüleisten-Icon

Verwandte Module -

\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

System-Tray

+
+
+

Neu in 0.7.0

+

Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter — Cmd+Q beendet die App vollständig.

+

Verhalten +

+ + + + + + + + + + + + + + + + + + + + + + + + +
AktionVerhalten
Fenster schliessen (⌘W oder rotes X)App läuft im Tray weiter
Cmd+QApp wird vollständig beendet
Klick auf Tray-IconFenster nach vorne, oder zeigen
Rechtsklick auf Tray-IconMenü mit Schnellzugriffen
+

Tray-Menü +

    +
  • Rapport zeigen — Fenster nach vorne
  • +
  • Neue Zeiterfassung — direkt im Zeit-Modul
  • +
  • Neue Rechnung — direkt im Rechnungs-Modul
  • +
  • Letzte Projekte — Quick-Open der letzten 5 Projekte
  • +
  • Einstellungen
  • +
  • Rapport beenden
  • +
+

Konfiguration +

In den Einstellungen:

+
    +
  • Beim Systemstart starten (Login-Item) — Standard: aus
  • +
  • Beim Schliessen beenden statt ins Tray — Standard: aus
  • +
  • Tray-Icon ausblenden — App läuft, aber kein Menüleisten-Icon
  • +
+

Verwandte Module +

+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/features/zeiterfassung/index.html b/public/features/zeiterfassung/index.html index 7e0b8ed..ef4d478 100644 --- a/public/features/zeiterfassung/index.html +++ b/public/features/zeiterfassung/index.html @@ -1,10 +1,26 @@ -Zeiterfassung – RAPPORT + + + + + + + + +Zeiterfassung – RAPPORT + + + + + + + + + + + + + + + + Zum Inhalt springen

Zeiterfassung

In Arbeit

Tages- und Wochenraster mit Drag & Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss.

Konzept -

Die Zeiterfassung ist das Kernmodul von RAPPORT — alle anderen Module (Rechnungen, Auswertungen, Lohnabrechnung) greifen auf die hier erfassten Stunden zu.

Eingabe -

  • Wochenraster mit den 5 (oder 7) Arbeitstagen
  • Halbstunden-Slots von 06:00 bis 22:00
  • Klick oder Drag über mehrere Slots
  • Jeder Eintrag wird einem Projekt zugewiesen (Pflichtfeld)
  • Mehrfacheinträge pro Slot möglich (z. B. parallele Telefonate)

Auswertungen -

Pro Mitarbeiter und pro Projekt:

  • Geleistete Stunden vs. Soll-Pensum
  • Ferienanspruch / -saldo (mit Prorata bei Eintritt unter Jahr)
  • Überstunden-Saldo
  • Stundenaufschlüsselung nach SIA-Phase pro Projekt

Jahresabschluss -

Am Jahresende:

  • Ferien-Restguthaben übertragen oder auszahlen
  • Überstunden ausgleichen oder vergüten
  • Neues Jahr automatisch initialisieren

Verwandte Module -

  • Rechnungen — Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung
  • Projekte — Stunden-Auswertung pro SIA-Phase
  • Mitarbeiter — Pensum, Ferienanspruch
\ No newline at end of file +Eingabe Wochenraster mit den 5 (oder 7) Arbeitstagen Halbstunden-Slots von 06:00 bis 22:00 Klick oder Drag über mehrere Slots Jeder Eintrag wird einem Projekt zugewiesen (Pflichtfeld) Mehrfacheinträge pro Slot möglich (z. B. parallele Telefonate) Auswertungen Pro Mitarbeiter und pro Projekt:"> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Zeiterfassung

+
+
+

In Arbeit

+

Tages- und Wochenraster mit Drag & Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss.

+

Konzept +

Die Zeiterfassung ist das Kernmodul von RAPPORT — alle anderen Module (Rechnungen, Auswertungen, Lohnabrechnung) greifen auf die hier erfassten Stunden zu.

+

Eingabe +

    +
  • Wochenraster mit den 5 (oder 7) Arbeitstagen
  • +
  • Halbstunden-Slots von 06:00 bis 22:00
  • +
  • Klick oder Drag über mehrere Slots
  • +
  • Jeder Eintrag wird einem Projekt zugewiesen (Pflichtfeld)
  • +
  • Mehrfacheinträge pro Slot möglich (z. B. parallele Telefonate)
  • +
+

Auswertungen +

Pro Mitarbeiter und pro Projekt:

+
    +
  • Geleistete Stunden vs. Soll-Pensum
  • +
  • Ferienanspruch / -saldo (mit Prorata bei Eintritt unter Jahr)
  • +
  • Überstunden-Saldo
  • +
  • Stundenaufschlüsselung nach SIA-Phase pro Projekt
  • +
+

Jahresabschluss +

Am Jahresende:

+
    +
  • Ferien-Restguthaben übertragen oder auszahlen
  • +
  • Überstunden ausgleichen oder vergüten
  • +
  • Neues Jahr automatisch initialisieren
  • +
+

Verwandte Module +

    +
  • Rechnungen — Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung
  • +
  • Projekte — Stunden-Auswertung pro SIA-Phase
  • +
  • Mitarbeiter — Pensum, Ferienanspruch
  • +
+ +
+
+ +
+
+
+ + + + + + + diff --git a/public/hosting-preise/index.html b/public/hosting-preise/index.html new file mode 100644 index 0000000..e624dbc --- /dev/null +++ b/public/hosting-preise/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + +Hosting-Preise – RAPPORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+
+
+ + + + + + + + diff --git a/public/hosting/index.html b/public/hosting/index.html new file mode 100644 index 0000000..43e5c22 --- /dev/null +++ b/public/hosting/index.html @@ -0,0 +1,679 @@ + + + + + + + + + + +Hosting – RAPPORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ +
+
+ +
+ Gehostet in der Schweiz · Ohne eigenen Server + +
+ +
+
+
RAPPORT
+
Hosting
+
+
+
+

+ Ihre eigene Rapport-Instanz — in Minuten startklar. Studio-Management für Architekturbüros, gehostet, gewartet und gesichert. Sie arbeiten, wir kümmern uns um den Rest. +

+ +
+ +
+ Schweizer Hosting + Tägliche Backups + Jederzeit kündbar + Keine Installation +
+
+

SO EINFACH

+

Registrieren, Abo wählen, loslegen

+

Keine Server-Administration, keine Updates, keine Sorgen um Backups. Sie bekommen eine fertige Rapport-Instanz mit eigener Adresse — wir betreiben sie für Sie in der Schweiz.

+
+ + + + +
+
+
+ + + + + + + diff --git a/public/hosting/index.xml b/public/hosting/index.xml new file mode 100644 index 0000000..9bff3ad --- /dev/null +++ b/public/hosting/index.xml @@ -0,0 +1,18 @@ + + + RAPPORT – Hosting + /hosting/ + Recent content in Hosting on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + diff --git a/public/index.html b/public/index.html index b73dd73..411ce75 100644 --- a/public/index.html +++ b/public/index.html @@ -1,41 +1,727 @@ -RAPPORT + + + + + + + + + +RAPPORT + + + + +Zum Inhalt springen
Pre-Release 0.8.2 · Aktiv in Entwicklung
RAPPORT
Studio Administration

Die Studio Management Software für Architekturbüros mit offenem Quellcode — Zeiterfassung, Rechnungen, Offerten, Projekte, Mitarbeiter und QR-Einzahlungsscheine in einer App.

AGPL-3.0 -Tauri + React -macOS (später Linux & Windows) -Lokal / Selfhosting

ZIEL

Freie Studio Managementsoftware

Rapport wurde für eigene Zwecke konzipiert — aus dem Drang heraus, möglichst viel Open-Source-Software in einem Architekturbüro zu verwenden. Die Strukturen folgen der SIA 102 (Phasen, Honorar), die Daten bleiben lokal.

Aufgebaut auf
Tauri 2 -React 19 -Vite -SIA 102 -AGPL-3.0
\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ +
+
+ +
+ Pre-Release 0.8.2 · Aktiv in Entwicklung + +
+ +
+
+
RAPPORT
+
Studio Administration
+
+
+
+

+ Die Studio Management Software für Architekturbüros mit offenem Quellcode — Zeiterfassung, Rechnungen, Offerten, Projekte, Mitarbeiter und QR-Einzahlungsscheine in einer App. +

+ +
+ +
+ AGPL-3.0 + Tauri + React + macOS (später Linux & Windows) + Lokal / Selfhosting +
+
+

ZIEL

+

Freie Studio Managementsoftware

+

Rapport wurde für eigene Zwecke konzipiert — aus dem Drang heraus, möglichst viel Open-Source-Software in einem Architekturbüro zu verwenden. Die Strukturen folgen der SIA 102 (Phasen, Honorar), die Daten bleiben lokal.

+
+
+ + + +
+

+ Zeiterfassung +

+

Tages- und Wochenraster mit Drag & Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss.

+
+ + + +
+

+ Rechnungen & Offerten +

+

QR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen. Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export.

+
+ + + +
+

+ Projekt- & Kundenverwaltung +

+

Projekte nach SIA 102 mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen.

+
+ + + +
+

+ Mitarbeiter +

+

Ferienverwaltung, interne Stunden / Absenzen und Lohnabrechnung. Jahresabschluss mit Überstundenausgleich.

+
+ + + +
+

+ Spesen & Bürobudget +

+

Spesenerfassung mit Belegupload. Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen.

+
+ + + +
+

+ Protokolle & Lieferscheine +

+

Einfache Erstellung von Sitzungsprotokollen mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild.

+
+ + + +
+

+ Auto-Updater +

+

Rapport prüft beim Start automatisch auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden.

+
+ + + +
+

+ 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.

+
+ + + +
+

+ + Rapport Server +

+

Selfhost-Stack für Studios mit mehreren Personen — Postgres, Auth, Realtime-Sync, Storage. Alles in einem Docker-Compose. Eigene Daten, eigene Domain, eigene Kontrolle.

+
+ + + +
+ +
+ Aufgebaut auf +
+ Tauri 2 + React 19 + Vite + SIA 102 + AGPL-3.0 +
+
+ +
+
+
+ + + + + + + diff --git a/public/js/hosting-app.js b/public/js/hosting-app.js new file mode 100644 index 0000000..6713ba2 --- /dev/null +++ b/public/js/hosting-app.js @@ -0,0 +1,180 @@ +/* RAPPORT Hosting — Frontend-Logik (Vanilla JS). + * + * Reine Client-Seite: spricht ausschließlich mit dem proprietären Backend + * unter /api (RAPPORT-HOST). Hier liegt KEINE Geschäftslogik, nur fetch + + * Rendering — so bleibt RAPPORT-WEBSITE sauber AGPL/öffentlich. + * + * Token im localStorage; gerendert wird in #hosting-root je nach data-page. + */ +(function () { + "use strict"; + const root = document.getElementById("hosting-root"); + if (!root) return; + const page = root.dataset.page || "login"; + + const TOKEN_KEY = "rapport_host_token"; + const tok = { + get: () => localStorage.getItem(TOKEN_KEY), + set: (t) => localStorage.setItem(TOKEN_KEY, t), + clear: () => localStorage.removeItem(TOKEN_KEY), + get isLoggedIn() { return !!localStorage.getItem(TOKEN_KEY); }, + }; + + async function api(method, path, body) { + const headers = { "Content-Type": "application/json" }; + const t = tok.get(); + if (t) headers.Authorization = "Bearer " + t; + const res = await fetch("/api" + path, { + method, headers, body: body ? JSON.stringify(body) : undefined, + }); + const data = await res.json().catch(() => ({})); + if (!res.ok) throw new Error(data.error || ("Fehler " + res.status)); + return data; + } + + const go = (p) => { window.location.href = p; }; + const esc = (s) => String(s == null ? "" : s).replace(/[&<>"]/g, (c) => + ({ "&": "&", "<": "<", ">": ">", '"': """ }[c])); + + function card(inner, wide) { + return '
' + inner + "
"; + } + function msg(el, text, kind) { + el.innerHTML = text ? '
' + esc(text) + "
" : ""; + } + + // ── Login ────────────────────────────────────────────────────────────── + function renderLogin() { + root.innerHTML = card( + '
Anmelden
' + + '
Zu Ihrer Rapport-Instanz
' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + "
" + + '
Noch kein Konto? ' + + '
' + ); + const m = root.querySelector("#m"); + root.querySelector("#toReg").onclick = () => go("/register/"); + root.querySelector("#f").onsubmit = async (e) => { + e.preventDefault(); + const sub = root.querySelector("#sub"); sub.disabled = true; msg(m, "", ""); + try { + const { token } = await api("POST", "/auth/login", { + email: root.querySelector("#email").value.trim(), + password: root.querySelector("#pw").value, + }); + tok.set(token); go("/konto/"); + } catch (err) { msg(m, err.message, "err"); sub.disabled = false; } + }; + } + + // ── Registrierung ────────────────────────────────────────────────────── + function renderRegister() { + root.innerHTML = card( + '
Konto erstellen
' + + '
In Minuten zur eigenen Instanz
' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + "
" + + '
Schon ein Konto? ' + + '
' + ); + const m = root.querySelector("#m"); + root.querySelector("#toLogin").onclick = () => go("/login/"); + root.querySelector("#f").onsubmit = async (e) => { + e.preventDefault(); + const sub = root.querySelector("#sub"); sub.disabled = true; msg(m, "", ""); + try { + const { token } = await api("POST", "/auth/register", { + email: root.querySelector("#email").value.trim(), + password: root.querySelector("#pw").value, + }); + tok.set(token); go("/konto/"); + } catch (err) { msg(m, err.message, "err"); sub.disabled = false; } + }; + } + + // ── Konto / Dashboard ────────────────────────────────────────────────── + async function renderKonto() { + if (!tok.isLoggedIn) return go("/login/"); + root.innerHTML = card('
Lädt…
', true); + let data; + try { data = await api("GET", "/account/me"); } + catch (err) { + if (/angemeldet|abgelaufen|ungültig/i.test(err.message)) { tok.clear(); return go("/login/"); } + root.innerHTML = card('
' + esc(err.message) + "
"); return; + } + const { account, subscription, instance, plans } = data; + const params = new URLSearchParams(location.search); + const justOk = params.get("provisioned") === "1"; + + let html = + '
' + + '
Konto
' + + '
' + + '
' + esc(account.email) + "
"; + + if (justOk) html += '
Zahlung erfolgreich — Ihre Instanz wird bereitgestellt.
'; + + if (subscription) { + html += '
Abo' + esc(subscription.plan) + + " · " + esc(subscription.status) + "
"; + } + if (instance) { + html += '
Instanz' + esc(instance.status) + "
" + + 'Rapport öffnen →'; + } else { + html += '
Wählen Sie ein Abo, um Ihre Instanz freizuschalten:
' + + '
' + (plans || []).map(planCard).join("") + "
"; + } + root.innerHTML = card(html, true); + root.querySelector("#logout").onclick = () => { tok.clear(); go("/"); }; + root.querySelectorAll("[data-plan]").forEach((b) => { + b.onclick = async () => { + b.disabled = true; + try { + const { url } = await api("POST", "/billing/checkout", { planId: b.dataset.plan }); + go(url); + } catch (err) { alert(err.message); b.disabled = false; } + }; + }); + } + + function planCard(p) { + return '
' + + (p.recommended ? '
Empfohlen
' : "") + + '
' + esc(p.name) + "
" + + '
CHF ' + esc(p.priceChf) + '/' + esc(p.interval) + "
" + + "" + + '
'; + } + + // ── Preise (öffentlich, mit CTA in den Flow) ─────────────────────────── + async function renderPreise() { + root.innerHTML = card('
Lädt…
', true); + let plans = []; + try { plans = (await api("GET", "/billing/plans")).plans; } catch (_) {} + const html = + '
Abo wählen
' + + '
Monatlich kündbar · Preise in CHF, exkl. MwSt.
' + + '
' + plans.map(planCard).join("") + "
"; + root.innerHTML = card(html, true); + root.querySelectorAll("[data-plan]").forEach((b) => { + b.onclick = () => go(tok.isLoggedIn ? "/konto/" : "/register/"); + }); + } + + ({ login: renderLogin, register: renderRegister, konto: renderKonto, preise: renderPreise }[page] || renderLogin)(); +})(); diff --git a/public/konto/index.html b/public/konto/index.html new file mode 100644 index 0000000..5dc61b9 --- /dev/null +++ b/public/konto/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + +Konto – RAPPORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+
+
+ + + + + + + + diff --git a/public/lizenz/index.html b/public/lizenz/index.html index 8262db8..62876a9 100644 --- a/public/lizenz/index.html +++ b/public/lizenz/index.html @@ -1,45 +1,817 @@ -Lizenz & Mitwirkende – RAPPORT + + + + + + + + +Lizenz & Mitwirkende – RAPPORT + + + + + + + + + + + + + + Zum Inhalt springen

Lizenz & Mitwirkende

Lizenz von RAPPORT, Zugehörigkeit zu OpenBureau und Attribution der verwendeten Open-Source-Software.

RAPPORT -

RAPPORT — Studio Management Software für Architekturbüros.

Quellcode: git.kgva.ch/karim/RAPPORT -Autor: Karim Gabriele Varano

Lizenz -

Lizenziert unter GNU Affero General Public License v3.0 oder höher (AGPL-3.0-or-later).

Dies bedeutet im Kern:

  • Freie Nutzung für jeden Zweck (privat, kommerziell, behördlich)
  • Freier Zugang zum Quellcode
  • Freie Modifikation und Weitergabe — unter derselben Lizenz
  • Netzwerk-Nutzung gilt als Weitergabe — wer eine modifizierte Version als Service anbietet, muss den Quellcode offenlegen

Eigene Builds, eigene Forks, eigene Anpassungen — alles erlaubt, solange Modifikationen wieder unter AGPL-3.0 veröffentlicht werden.

OpenBureau -

RAPPORT ist Teil der OpenBureau-Initiative — einer Sammlung freier Software-Werkzeuge für den Architektur-Büro-Alltag.

Die Idee: Bürowissen — Workflows, Konventionen, Vorlagen — sollte nicht in proprietären Tools eingesperrt sein. OpenBureau-Tools setzen die in der Branche etablierten Konventionen (SIA-Normen, QR-Rechnung, Plan-Verwaltung) sauber um und stehen unter freien Lizenzen zur Verfügung.

ToolZweckStatus
RAPPORTStudio-Management Desktop-App (Zeit, Rechnungen, Projekte)Pre-Release
Rapport ServerSelfhost-Stack (Postgres + Auth + Realtime + Storage)Pre-Release
DOSSIERRhino-8-Plugin für Plan- und DokumentationsausgabePre-Release

Mehr unter gabrielevarano.ch.

Verwendete Open-Source-Software -

RAPPORT baut auf freier Software auf. Diese Liste nennt die wichtigsten Komponenten und ihre jeweiligen Lizenzen.

Frontend -

SoftwareVerwendungLizenz
React 19UI-BibliothekMIT
ViteBuild-Tool, Dev-ServerMIT
swissqrbillQR-EinzahlungsscheineMIT

Desktop-Wrapper -

SoftwareVerwendungLizenz
Tauri 2Cross-Platform Desktop-WrapperMIT / Apache-2.0
WebKitWebView-Engine (macOS)LGPL-2.1 / BSD

Rapport Server (Selfhost-Stack) -

SoftwareVerwendungLizenz
PostgreSQLDatenbankPostgreSQL-Lizenz
GoTrueAuthentication-ServiceMIT
PostgRESTREST-API über Postgres-SchemaMIT
RealtimeWebSocket-SyncApache-2.0
StorageObject-Storage für Belege & LogosApache-2.0
KongAPI-GatewayApache-2.0
nginxFrontend-WebserverBSD-2-Clause
Docker ComposeOrchestrierungApache-2.0

Diese Website -

SoftwareVerwendungLizenz
HugoStatic-Site-GeneratorApache-2.0
HextraHugo-Theme (von Xin)MIT
InterUI-Schrift (Rasmus Andersson)SIL OFL 1.1
Playfair DisplayHeadingsSIL OFL 1.1

Alle Logos und Marken-Namen gehören ihren jeweiligen Eigentümern.

Lizenz-Volltexte -

Die vollständigen Lizenztexte:

Mitwirkende -

RAPPORT wird derzeit als Ein-Personen-Projekt von Karim Gabriele Varano entwickelt. Beiträge — Code, Issues, Übersetzungen, Vorlagen — sind willkommen.

Wer beitragen möchte → Gitea Issues.

Kontakt -

Fragen zur Lizenz, kommerzieller Einsatz, Spezialfälle: Issue auf Gitea oder via gabrielevarano.ch.

\ No newline at end of file +Quellcode: git.kgva.ch/karim/RAPPORT Autor: Karim Gabriele Varano Lizenz Lizenziert unter GNU Affero General Public License v3.0 oder höher (AGPL-3.0-or-later )."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Lizenz & Mitwirkende

+

Lizenz von RAPPORT, Zugehörigkeit zu OpenBureau und Attribution der verwendeten Open-Source-Software.

+

RAPPORT +

RAPPORT — Studio Management Software für Architekturbüros.

+

Quellcode: git.kgva.ch/karim/RAPPORT +Autor: Karim Gabriele Varano

+

Lizenz +

Lizenziert unter GNU Affero General Public License v3.0 oder höher (AGPL-3.0-or-later).

+
+

Dies bedeutet im Kern:

+
    +
  • Freie Nutzung für jeden Zweck (privat, kommerziell, behördlich)
  • +
  • Freier Zugang zum Quellcode
  • +
  • Freie Modifikation und Weitergabe — unter derselben Lizenz
  • +
  • Netzwerk-Nutzung gilt als Weitergabe — wer eine modifizierte Version als Service anbietet, muss den Quellcode offenlegen
  • +
+ +
+

Eigene Builds, eigene Forks, eigene Anpassungen — alles erlaubt, solange Modifikationen wieder unter AGPL-3.0 veröffentlicht werden.

+

OpenBureau +

RAPPORT ist Teil der OpenBureau-Initiative — einer Sammlung freier Software-Werkzeuge für den Architektur-Büro-Alltag.

+

Die Idee: Bürowissen — Workflows, Konventionen, Vorlagen — sollte nicht in proprietären Tools eingesperrt sein. OpenBureau-Tools setzen die in der Branche etablierten Konventionen (SIA-Normen, QR-Rechnung, Plan-Verwaltung) sauber um und stehen unter freien Lizenzen zur Verfügung.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ToolZweckStatus
RAPPORTStudio-Management Desktop-App (Zeit, Rechnungen, Projekte)Pre-Release
Rapport ServerSelfhost-Stack (Postgres + Auth + Realtime + Storage)Pre-Release
DOSSIERRhino-8-Plugin für Plan- und DokumentationsausgabePre-Release
+

Mehr unter gabrielevarano.ch.

+

Verwendete Open-Source-Software +

RAPPORT baut auf freier Software auf. Diese Liste nennt die wichtigsten Komponenten und ihre jeweiligen Lizenzen.

+

Frontend +

+ + + + + + + + + + + + + + + + + + + + + + + + +
SoftwareVerwendungLizenz
React 19UI-BibliothekMIT
ViteBuild-Tool, Dev-ServerMIT
swissqrbillQR-EinzahlungsscheineMIT
+

Desktop-Wrapper +

+ + + + + + + + + + + + + + + + + + + +
SoftwareVerwendungLizenz
Tauri 2Cross-Platform Desktop-WrapperMIT / Apache-2.0
WebKitWebView-Engine (macOS)LGPL-2.1 / BSD
+

Rapport Server (Selfhost-Stack) +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SoftwareVerwendungLizenz
PostgreSQLDatenbankPostgreSQL-Lizenz
GoTrueAuthentication-ServiceMIT
PostgRESTREST-API über Postgres-SchemaMIT
RealtimeWebSocket-SyncApache-2.0
StorageObject-Storage für Belege & LogosApache-2.0
KongAPI-GatewayApache-2.0
nginxFrontend-WebserverBSD-2-Clause
Docker ComposeOrchestrierungApache-2.0
+

Diese Website +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SoftwareVerwendungLizenz
HugoStatic-Site-GeneratorApache-2.0
HextraHugo-Theme (von Xin)MIT
InterUI-Schrift (Rasmus Andersson)SIL OFL 1.1
Playfair DisplayHeadingsSIL OFL 1.1
+

Alle Logos und Marken-Namen gehören ihren jeweiligen Eigentümern.

+

Lizenz-Volltexte +

Die vollständigen Lizenztexte:

+ +

Mitwirkende +

RAPPORT wird derzeit als Ein-Personen-Projekt von Karim Gabriele Varano entwickelt. Beiträge — Code, Issues, Übersetzungen, Vorlagen — sind willkommen.

+

Wer beitragen möchte → Gitea Issues.

+

Kontakt +

Fragen zur Lizenz, kommerzieller Einsatz, Spezialfälle: Issue auf Gitea oder via gabrielevarano.ch.

+ +
+
+
+ +
+
+
+ + + + + + + diff --git a/public/lizenz/index.xml b/public/lizenz/index.xml index e65054f..c25de89 100644 --- a/public/lizenz/index.xml +++ b/public/lizenz/index.xml @@ -1 +1,18 @@ -RAPPORT – Lizenz & Mitwirkendehttps://rapport.gabrielevarano.ch/lizenz/Recent content in Lizenz & Mitwirkende on RAPPORTHugo -- gohugo.iode \ No newline at end of file + + + RAPPORT – Lizenz & Mitwirkende + /lizenz/ + Recent content in Lizenz & Mitwirkende on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + diff --git a/public/login/index.html b/public/login/index.html new file mode 100644 index 0000000..b4eea25 --- /dev/null +++ b/public/login/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + +Anmelden – RAPPORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+
+
+ + + + + + + + diff --git a/public/register/index.html b/public/register/index.html new file mode 100644 index 0000000..fa8916d --- /dev/null +++ b/public/register/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + +Registrieren – RAPPORT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+
+
+ + + + + + + + diff --git a/public/server/index.html b/public/server/index.html index 55fa015..70e0fc0 100644 --- a/public/server/index.html +++ b/public/server/index.html @@ -1,98 +1,1089 @@ -Rapport Server – RAPPORT + + + + + + + + +Rapport Server – RAPPORT + + + + + + + + + + + + + + Zum Inhalt springen

Rapport Server

Self-Hosting

Rapport Server — der vollständige Selfhost-Stack für Rapport. Eigene Daten, eigene Domain, eigener Server. Komplett Open-Source, Docker-Compose, AGPL-3.0.

Wann brauchst du Rapport Server? -

SzenarioLösung
Ein Mensch, ein MacDesktop-App reicht — Installation
Mehrere Personen im StudioRapport Server auf einem Mac Mini oder Linux-Server
Verteiltes Team, Home-Office, Mobile-ZugriffRapport Server mit Reverse-Proxy + SSL
Cloud-Hosting bei einem AnbieterRapport Server auf VPS/Hetzner/etc.

Die Desktop-App speichert lokal als JSON. Rapport Server bringt Postgres + Multi-User + Realtime-Sync — für alle, die zu zweit oder im Team arbeiten.

Architektur -

Rapport Server bündelt sechs Open-Source-Komponenten zu einem stimmigen Stack:

┌──────────────────────────────────────────────────────┐
-│  Browser / Desktop-App                                │
-└──────────────┬───────────────────────┬───────────────┘
-               │                       │
-               ▼                       ▼
-        ┌──────────┐            ┌──────────┐
-        │  nginx   │            │   Kong   │  ← API-Gateway
-        │  (app)   │            │          │
-        └──────────┘            └──────────┘
-                                      │
-                  ┌───────────────────┼─────────────────────┐
-                  ▼                   ▼                     ▼
-              ┌────────┐         ┌──────────┐          ┌─────────┐
-              │ GoTrue │         │PostgREST │          │ Realtime│
-              │ (Auth) │         │  (API)   │          │  (WS)   │
-              └────────┘         └──────────┘          └─────────┘
-                  │                   │                     │
-                  └───────────────────┼─────────────────────┘
-                                      ▼
-                            ┌─────────────────┐
-                            │   PostgreSQL    │
-                            └─────────────────┘
-                                      │
-                                      ▼
-                            ┌─────────────────┐
-                            │     Storage     │  ← Belege, Logos
-                            └─────────────────┘
KomponenteFunktion
PostgreSQLDatenbank — alle Rapport-Daten
GoTrueAuthentication — Email/Passwort, JWT-Tokens
PostgRESTREST-API direkt aus dem Postgres-Schema
RealtimeWebSocket-Sync für Live-Updates
StorageObject-Storage für Belege & Logos
KongAPI-Gateway, routet alle Calls
app (nginx)Liefert das Rapport-Frontend (React-Build)

Alles in einem Docker-Compose. Keine Cloud-Abhängigkeit, keine Telemetrie.

Voraussetzungen -

OSContainer-Runtime
Linux (Ubuntu 22.04+, Debian 12+, …)Docker Engine + Compose v2
macOS (Mac Mini etc.)Colima + Docker CLI — voll OSS

Auf macOS funktionieren auch OrbStack oder Docker Desktop, beide sind aber proprietär. Colima ist die OSS-Alternative und für Selfhost vollkommen ausreichend.

Plus: ein DNS-Name für TLS (z. B. rapport.studio.ch), und optional ein Reverse-Proxy wie Nginx Proxy Manager oder Caddy.

Setup in 5 Schritten -

1 · Repo klonen -

git clone https://git.kgva.ch/karim/rapport-server.git
-cd rapport-server

2 · .env erstellen -

cp .env.example .env

In .env müssen mindestens diese Werte ersetzt werden:

VariableWas
POSTGRES_PASSWORDDB-Passwort (≥ 32 Zeichen, zufällig)
JWT_SECRETJWT-Signatur (≥ 32 Zeichen, zufällig)
ANON_KEY / SERVICE_ROLE_KEYaus JWT-Secret abgeleitet
SITE_URLPublic-URL der Instanz (z. B. https://app.rapport.studio.ch)

Zufallswerte generieren:

openssl rand -hex 32   # für POSTGRES_PASSWORD und JWT_SECRET
-node scripts/generate-keys.mjs   # ANON_KEY + SERVICE_ROLE_KEY aus JWT_SECRET

3 · Migrations holen -

Die SQL-Migrations stammen aus dem App-Repo. Einmal initial holen:

./scripts/sync-migrations.sh

Bei späteren Rapport-Updates erneut ausführen, dann docker compose down && docker compose up -d.

4 · Stack starten -

docker compose up -d

Erststart dauert ~1 Minute (Postgres initialisiert sich, Migrations laufen, Container starten).

5 · Health-Check -

docker compose ps

Alle Container sollten healthy zeigen. Frontend ist dann erreichbar unter http://localhost:8080.

Reverse-Proxy + HTTPS -

Für Production-Setups mit eigener Domain — Caddy ist die einfachste Variante (config-as-code, Let’s-Encrypt automatisch):

app.rapport.studio.ch {
-  reverse_proxy localhost:8080
-}
-
-api.rapport.studio.ch {
-  reverse_proxy localhost:8000
-}

In .env dann:

SITE_URL=https://app.rapport.studio.ch
-API_EXTERNAL_URL=https://api.rapport.studio.ch

Alternativ über Nginx Proxy Manager mit Web-UI — siehe Troubleshooting.

Updates -

git pull
-./scripts/sync-migrations.sh   # falls neue SQL-Migrationen
-docker compose pull             # neueste Container-Versionen
-docker compose up -d            # neu starten

Daten bleiben erhalten — das Volume postgres-data wird nicht angetastet.

Backup -

Postgres-Dump -

docker compose exec -T db pg_dumpall -U postgres > backup-$(date +%Y%m%d).sql

Empfohlen: per cron täglich + auf externe Disk / S3 / Backblaze sichern.

Storage (Belege, Logos) -

docker compose exec storage tar -czf - /var/lib/storage > storage-$(date +%Y%m%d).tar.gz

Restore -

docker compose down
-docker volume rm rapport-server_postgres-data
-docker compose up -d db
-sleep 10
-cat backup-YYYYMMDD.sql | docker compose exec -T db psql -U postgres
-docker compose up -d

Bezug Rapport ↔ Rapport Server -

KomponenteWoLizenz
Rapport Desktop-Appgit.kgva.ch/karim/RAPPORTAGPL-3.0
Rapport Servergit.kgva.ch/karim/rapport-serverAGPL-3.0

Die Desktop-App kann wahlweise im Lokal-Modus (JSON, kein Server nötig) oder im Cloud-Modus (gegen Rapport Server) betrieben werden. Wechsel erfolgt im Login-Bildschirm der App.

Häufige Fragen -

Brauche ich Supabase Cloud? -

Nein. Rapport Server ist die Selfhost-Variante derselben Komponenten (Postgres + GoTrue + PostgREST + Realtime + Storage), aber komplett auf eigener Infrastruktur. Kein Supabase-Account, keine externe Abhängigkeit.

Kann ich von der Desktop-App auf Rapport Server migrieren? -

Im Login der Desktop-App auf Cloud wechseln, Server-URL eingeben, Account erstellen, Daten manuell wieder anlegen (Bürodaten, Mitarbeiter, Kunden). Ein direkter localStorage → Postgres-Import ist geplant.

Was kostet das? -

Nichts — Rapport Server ist Open-Source (AGPL-3.0). Du brauchst nur einen Server (Mac Mini, NAS, VPS) und ggf. eine Domain.

Wieviel Server-Resourcen? -

Ein Mac Mini M1 (8 GB RAM) reicht problemlos für ein 5-Personen-Studio. Linux-VPS mit 2 GB RAM + 2 CPU reicht auch.

Quellcode -

git.kgva.ch/karim/rapport-server — Issues, Pull Requests und Forks willkommen.

\ No newline at end of file +Wann brauchst du Rapport Server? Szenario Lösung Ein Mensch, ein Mac Desktop-App reicht — Installation Mehrere Personen im Studio Rapport Server auf einem Mac Mini oder Linux-Server Verteiltes Team, Home-Office, Mobile-Zugriff Rapport Server mit Reverse-Proxy + SSL Cloud-Hosting bei einem Anbieter Rapport Server auf VPS/Hetzner/etc. Die Desktop-App speichert lokal als JSON. Rapport Server bringt Postgres + Multi-User + Realtime-Sync — für alle, die zu zweit oder im Team arbeiten."> + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+ +
+

Rapport Server

+

Self-Hosting

+

Rapport Server — der vollständige Selfhost-Stack für Rapport. Eigene Daten, eigene Domain, eigener Server. Komplett Open-Source, Docker-Compose, AGPL-3.0.

+

Wann brauchst du Rapport Server? +

+ + + + + + + + + + + + + + + + + + + + + + + + +
SzenarioLösung
Ein Mensch, ein MacDesktop-App reicht — Installation
Mehrere Personen im StudioRapport Server auf einem Mac Mini oder Linux-Server
Verteiltes Team, Home-Office, Mobile-ZugriffRapport Server mit Reverse-Proxy + SSL
Cloud-Hosting bei einem AnbieterRapport Server auf VPS/Hetzner/etc.
+
+

Die Desktop-App speichert lokal als JSON. Rapport Server bringt Postgres + Multi-User + Realtime-Sync — für alle, die zu zweit oder im Team arbeiten.

+ +
+

Architektur +

Rapport Server bündelt sechs Open-Source-Komponenten zu einem stimmigen Stack:

+
+ +
┌──────────────────────────────────────────────────────┐
+│  Browser / Desktop-App                                │
+└──────────────┬───────────────────────┬───────────────┘
+               │                       │
+               ▼                       ▼
+        ┌──────────┐            ┌──────────┐
+        │  nginx   │            │   Kong   │  ← API-Gateway
+        │  (app)   │            │          │
+        └──────────┘            └──────────┘
+                                      │
+                  ┌───────────────────┼─────────────────────┐
+                  ▼                   ▼                     ▼
+              ┌────────┐         ┌──────────┐          ┌─────────┐
+              │ GoTrue │         │PostgREST │          │ Realtime│
+              │ (Auth) │         │  (API)   │          │  (WS)   │
+              └────────┘         └──────────┘          └─────────┘
+                  │                   │                     │
+                  └───────────────────┼─────────────────────┘
+                                      ▼
+                            ┌─────────────────┐
+                            │   PostgreSQL    │
+                            └─────────────────┘
+                                      │
+                                      ▼
+                            ┌─────────────────┐
+                            │     Storage     │  ← Belege, Logos
+                            └─────────────────┘
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KomponenteFunktion
PostgreSQLDatenbank — alle Rapport-Daten
GoTrueAuthentication — Email/Passwort, JWT-Tokens
PostgRESTREST-API direkt aus dem Postgres-Schema
RealtimeWebSocket-Sync für Live-Updates
StorageObject-Storage für Belege & Logos
KongAPI-Gateway, routet alle Calls
app (nginx)Liefert das Rapport-Frontend (React-Build)
+

Alles in einem Docker-Compose. Keine Cloud-Abhängigkeit, keine Telemetrie.

+

Voraussetzungen +

+ + + + + + + + + + + + + + + + +
OSContainer-Runtime
Linux (Ubuntu 22.04+, Debian 12+, …)Docker Engine + Compose v2
macOS (Mac Mini etc.)Colima + Docker CLI — voll OSS
+
+

Auf macOS funktionieren auch OrbStack oder Docker Desktop, beide sind aber proprietär. Colima ist die OSS-Alternative und für Selfhost vollkommen ausreichend.

+ +
+

Plus: ein DNS-Name für TLS (z. B. rapport.studio.ch), und optional ein Reverse-Proxy wie Nginx Proxy Manager oder Caddy.

+

Setup in 5 Schritten +

1 · Repo klonen +

+ +
git clone https://git.kgva.ch/karim/rapport-server.git
+cd rapport-server
+ +
+
+

2 · .env erstellen +

+ +
cp .env.example .env
+ +
+
+

In .env müssen mindestens diese Werte ersetzt werden:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
VariableWas
POSTGRES_PASSWORDDB-Passwort (≥ 32 Zeichen, zufällig)
JWT_SECRETJWT-Signatur (≥ 32 Zeichen, zufällig)
ANON_KEY / SERVICE_ROLE_KEYaus JWT-Secret abgeleitet
SITE_URLPublic-URL der Instanz (z. B. https://app.rapport.studio.ch)
+

Zufallswerte generieren:

+
+ +
openssl rand -hex 32   # für POSTGRES_PASSWORD und JWT_SECRET
+node scripts/generate-keys.mjs   # ANON_KEY + SERVICE_ROLE_KEY aus JWT_SECRET
+ +
+
+

3 · Migrations holen +

Die SQL-Migrations stammen aus dem App-Repo. Einmal initial holen:

+
+ +
./scripts/sync-migrations.sh
+ +
+
+

Bei späteren Rapport-Updates erneut ausführen, dann docker compose down && docker compose up -d.

+

4 · Stack starten +

+ +
docker compose up -d
+ +
+
+

Erststart dauert ~1 Minute (Postgres initialisiert sich, Migrations laufen, Container starten).

+

5 · Health-Check +

+ +
docker compose ps
+ +
+
+

Alle Container sollten healthy zeigen. Frontend ist dann erreichbar unter http://localhost:8080.

+

Reverse-Proxy + HTTPS +

Für Production-Setups mit eigener Domain — Caddy ist die einfachste Variante (config-as-code, Let’s-Encrypt automatisch):

+
+ +
app.rapport.studio.ch {
+  reverse_proxy localhost:8080
+}
+
+api.rapport.studio.ch {
+  reverse_proxy localhost:8000
+}
+ +
+
+

In .env dann:

+
+ +
SITE_URL=https://app.rapport.studio.ch
+API_EXTERNAL_URL=https://api.rapport.studio.ch
+ +
+
+

Alternativ über Nginx Proxy Manager mit Web-UI — siehe Troubleshooting.

+

Updates +

+ +
git pull
+./scripts/sync-migrations.sh   # falls neue SQL-Migrationen
+docker compose pull             # neueste Container-Versionen
+docker compose up -d            # neu starten
+ +
+
+

Daten bleiben erhalten — das Volume postgres-data wird nicht angetastet.

+

Backup +

Postgres-Dump +

+ +
docker compose exec -T db pg_dumpall -U postgres > backup-$(date +%Y%m%d).sql
+ +
+
+

Empfohlen: per cron täglich + auf externe Disk / S3 / Backblaze sichern.

+

Storage (Belege, Logos) +

+ +
docker compose exec storage tar -czf - /var/lib/storage > storage-$(date +%Y%m%d).tar.gz
+ +
+
+

Restore +

+ +
docker compose down
+docker volume rm rapport-server_postgres-data
+docker compose up -d db
+sleep 10
+cat backup-YYYYMMDD.sql | docker compose exec -T db psql -U postgres
+docker compose up -d
+ +
+
+

Bezug Rapport ↔ Rapport Server +

+ + + + + + + + + + + + + + + + + + + +
KomponenteWoLizenz
Rapport Desktop-Appgit.kgva.ch/karim/RAPPORTAGPL-3.0
Rapport Servergit.kgva.ch/karim/rapport-serverAGPL-3.0
+

Die Desktop-App kann wahlweise im Lokal-Modus (JSON, kein Server nötig) oder im Cloud-Modus (gegen Rapport Server) betrieben werden. Wechsel erfolgt im Login-Bildschirm der App.

+

Häufige Fragen +

Brauche ich Supabase Cloud? +

Nein. Rapport Server ist die Selfhost-Variante derselben Komponenten (Postgres + GoTrue + PostgREST + Realtime + Storage), aber komplett auf eigener Infrastruktur. Kein Supabase-Account, keine externe Abhängigkeit.

+

Kann ich von der Desktop-App auf Rapport Server migrieren? +

Im Login der Desktop-App auf Cloud wechseln, Server-URL eingeben, Account erstellen, Daten manuell wieder anlegen (Bürodaten, Mitarbeiter, Kunden). Ein direkter localStorage → Postgres-Import ist geplant.

+

Was kostet das? +

Nichts — Rapport Server ist Open-Source (AGPL-3.0). Du brauchst nur einen Server (Mac Mini, NAS, VPS) und ggf. eine Domain.

+

Wieviel Server-Resourcen? +

Ein Mac Mini M1 (8 GB RAM) reicht problemlos für ein 5-Personen-Studio. Linux-VPS mit 2 GB RAM + 2 CPU reicht auch.

+

Quellcode +

git.kgva.ch/karim/rapport-server — Issues, Pull Requests und Forks willkommen.

+ +
+
+
+ +
+
+
+ + + + + + + diff --git a/public/server/index.xml b/public/server/index.xml index d637e58..45b2ed4 100644 --- a/public/server/index.xml +++ b/public/server/index.xml @@ -1 +1,18 @@ -RAPPORT – Rapport Serverhttps://rapport.gabrielevarano.ch/server/Recent content in Rapport Server on RAPPORTHugo -- gohugo.iode \ No newline at end of file + + + RAPPORT – Rapport Server + /server/ + Recent content in Rapport Server on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + diff --git a/public/sitemap.xml b/public/sitemap.xml index 2762279..9b3ea93 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1 +1,67 @@ -https://rapport.gabrielevarano.ch/docs/https://rapport.gabrielevarano.ch/docs/erste-schritte/https://rapport.gabrielevarano.ch/features/zeiterfassung/https://rapport.gabrielevarano.ch/features/https://rapport.gabrielevarano.ch/docs/installation/https://rapport.gabrielevarano.ch/features/rechnungen/https://rapport.gabrielevarano.ch/downloads/https://rapport.gabrielevarano.ch/docs/einrichtung/https://rapport.gabrielevarano.ch/features/projekte/https://rapport.gabrielevarano.ch/docs/arbeitsablauf/https://rapport.gabrielevarano.ch/faq/https://rapport.gabrielevarano.ch/features/mitarbeiter/https://rapport.gabrielevarano.ch/server/https://rapport.gabrielevarano.ch/docs/datenhaltung/https://rapport.gabrielevarano.ch/features/spesen/https://rapport.gabrielevarano.ch/features/protokolle/https://rapport.gabrielevarano.ch/docs/web-modus/https://rapport.gabrielevarano.ch/features/auto-updater/https://rapport.gabrielevarano.ch/docs/entwicklung/https://rapport.gabrielevarano.ch/features/system-tray/https://rapport.gabrielevarano.ch/docs/troubleshooting/https://rapport.gabrielevarano.ch/docs/changelog/https://rapport.gabrielevarano.ch/lizenz/https://rapport.gabrielevarano.ch/categories/https://rapport.gabrielevarano.ch/https://rapport.gabrielevarano.ch/tags/ \ No newline at end of file + + + + /docs/ + + /docs/erste-schritte/ + + /features/zeiterfassung/ + + /features/ + + /docs/installation/ + + /features/rechnungen/ + + /downloads/ + + /docs/einrichtung/ + + /features/projekte/ + + /docs/arbeitsablauf/ + + /faq/ + + /features/mitarbeiter/ + + /server/ + + /docs/datenhaltung/ + + /features/spesen/ + + /features/protokolle/ + + /docs/web-modus/ + + /features/auto-updater/ + + /docs/entwicklung/ + + /features/system-tray/ + + /docs/troubleshooting/ + + /docs/changelog/ + + /lizenz/ + + /login/ + + /categories/ + + /hosting/ + + /hosting-preise/ + + /konto/ + + / + + /register/ + + /tags/ + + diff --git a/public/tags/index.html b/public/tags/index.html index b5b9bb0..cfe5fd6 100644 --- a/public/tags/index.html +++ b/public/tags/index.html @@ -1,32 +1,560 @@ -Tags – RAPPORT + + + + + + + + +Tags – RAPPORT + + + + +Zum Inhalt springen

Tags

\ No newline at end of file + "> + + + + + + + + + + + + + + + + + + + + + + + + + + Zum Inhalt springen
+
+ + +
+ +
+ + + + + +
+
+
+

Tags

+
+
+ +
+
+ +
+
+
+
+ + + + + + + diff --git a/public/tags/index.xml b/public/tags/index.xml index 01c6562..a78f8d4 100644 --- a/public/tags/index.xml +++ b/public/tags/index.xml @@ -1 +1,18 @@ -RAPPORT – Tagshttps://rapport.gabrielevarano.ch/tags/Recent content in Tags on RAPPORTHugo -- gohugo.iode \ No newline at end of file + + + RAPPORT – Tags + /tags/ + Recent content in Tags on RAPPORT + Hugo -- gohugo.io + de + + + + + + + + + + + diff --git a/static/js/hosting-app.js b/static/js/hosting-app.js new file mode 100644 index 0000000..6713ba2 --- /dev/null +++ b/static/js/hosting-app.js @@ -0,0 +1,180 @@ +/* RAPPORT Hosting — Frontend-Logik (Vanilla JS). + * + * Reine Client-Seite: spricht ausschließlich mit dem proprietären Backend + * unter /api (RAPPORT-HOST). Hier liegt KEINE Geschäftslogik, nur fetch + + * Rendering — so bleibt RAPPORT-WEBSITE sauber AGPL/öffentlich. + * + * Token im localStorage; gerendert wird in #hosting-root je nach data-page. + */ +(function () { + "use strict"; + const root = document.getElementById("hosting-root"); + if (!root) return; + const page = root.dataset.page || "login"; + + const TOKEN_KEY = "rapport_host_token"; + const tok = { + get: () => localStorage.getItem(TOKEN_KEY), + set: (t) => localStorage.setItem(TOKEN_KEY, t), + clear: () => localStorage.removeItem(TOKEN_KEY), + get isLoggedIn() { return !!localStorage.getItem(TOKEN_KEY); }, + }; + + async function api(method, path, body) { + const headers = { "Content-Type": "application/json" }; + const t = tok.get(); + if (t) headers.Authorization = "Bearer " + t; + const res = await fetch("/api" + path, { + method, headers, body: body ? JSON.stringify(body) : undefined, + }); + const data = await res.json().catch(() => ({})); + if (!res.ok) throw new Error(data.error || ("Fehler " + res.status)); + return data; + } + + const go = (p) => { window.location.href = p; }; + const esc = (s) => String(s == null ? "" : s).replace(/[&<>"]/g, (c) => + ({ "&": "&", "<": "<", ">": ">", '"': """ }[c])); + + function card(inner, wide) { + return '
' + inner + "
"; + } + function msg(el, text, kind) { + el.innerHTML = text ? '
' + esc(text) + "
" : ""; + } + + // ── Login ────────────────────────────────────────────────────────────── + function renderLogin() { + root.innerHTML = card( + '
Anmelden
' + + '
Zu Ihrer Rapport-Instanz
' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + "
" + + '
Noch kein Konto? ' + + '
' + ); + const m = root.querySelector("#m"); + root.querySelector("#toReg").onclick = () => go("/register/"); + root.querySelector("#f").onsubmit = async (e) => { + e.preventDefault(); + const sub = root.querySelector("#sub"); sub.disabled = true; msg(m, "", ""); + try { + const { token } = await api("POST", "/auth/login", { + email: root.querySelector("#email").value.trim(), + password: root.querySelector("#pw").value, + }); + tok.set(token); go("/konto/"); + } catch (err) { msg(m, err.message, "err"); sub.disabled = false; } + }; + } + + // ── Registrierung ────────────────────────────────────────────────────── + function renderRegister() { + root.innerHTML = card( + '
Konto erstellen
' + + '
In Minuten zur eigenen Instanz
' + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + "
" + + '
Schon ein Konto? ' + + '
' + ); + const m = root.querySelector("#m"); + root.querySelector("#toLogin").onclick = () => go("/login/"); + root.querySelector("#f").onsubmit = async (e) => { + e.preventDefault(); + const sub = root.querySelector("#sub"); sub.disabled = true; msg(m, "", ""); + try { + const { token } = await api("POST", "/auth/register", { + email: root.querySelector("#email").value.trim(), + password: root.querySelector("#pw").value, + }); + tok.set(token); go("/konto/"); + } catch (err) { msg(m, err.message, "err"); sub.disabled = false; } + }; + } + + // ── Konto / Dashboard ────────────────────────────────────────────────── + async function renderKonto() { + if (!tok.isLoggedIn) return go("/login/"); + root.innerHTML = card('
Lädt…
', true); + let data; + try { data = await api("GET", "/account/me"); } + catch (err) { + if (/angemeldet|abgelaufen|ungültig/i.test(err.message)) { tok.clear(); return go("/login/"); } + root.innerHTML = card('
' + esc(err.message) + "
"); return; + } + const { account, subscription, instance, plans } = data; + const params = new URLSearchParams(location.search); + const justOk = params.get("provisioned") === "1"; + + let html = + '
' + + '
Konto
' + + '
' + + '
' + esc(account.email) + "
"; + + if (justOk) html += '
Zahlung erfolgreich — Ihre Instanz wird bereitgestellt.
'; + + if (subscription) { + html += '
Abo' + esc(subscription.plan) + + " · " + esc(subscription.status) + "
"; + } + if (instance) { + html += '
Instanz' + esc(instance.status) + "
" + + 'Rapport öffnen →'; + } else { + html += '
Wählen Sie ein Abo, um Ihre Instanz freizuschalten:
' + + '
' + (plans || []).map(planCard).join("") + "
"; + } + root.innerHTML = card(html, true); + root.querySelector("#logout").onclick = () => { tok.clear(); go("/"); }; + root.querySelectorAll("[data-plan]").forEach((b) => { + b.onclick = async () => { + b.disabled = true; + try { + const { url } = await api("POST", "/billing/checkout", { planId: b.dataset.plan }); + go(url); + } catch (err) { alert(err.message); b.disabled = false; } + }; + }); + } + + function planCard(p) { + return '
' + + (p.recommended ? '
Empfohlen
' : "") + + '
' + esc(p.name) + "
" + + '
CHF ' + esc(p.priceChf) + '/' + esc(p.interval) + "
" + + "" + + '
'; + } + + // ── Preise (öffentlich, mit CTA in den Flow) ─────────────────────────── + async function renderPreise() { + root.innerHTML = card('
Lädt…
', true); + let plans = []; + try { plans = (await api("GET", "/billing/plans")).plans; } catch (_) {} + const html = + '
Abo wählen
' + + '
Monatlich kündbar · Preise in CHF, exkl. MwSt.
' + + '
' + plans.map(planCard).join("") + "
"; + root.innerHTML = card(html, true); + root.querySelectorAll("[data-plan]").forEach((b) => { + b.onclick = () => go(tok.isLoggedIn ? "/konto/" : "/register/"); + }); + } + + ({ login: renderLogin, register: renderRegister, konto: renderKonto, preise: renderPreise }[page] || renderLogin)(); +})();