Files
Paperless-Contracts/README.md
2025-10-11 14:02:20 +02:00

195 lines
8.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Paperless Contract Companion
Begleitdienst zur Verwaltung von Vertragsmetadaten (Laufzeiten, Kündigungsfristen, Kosten) mit moderner Weboberfläche, Terminüberwachung und Benachrichtigungen. Der Service ist in TypeScript geschrieben (Express + React) und kann eigenständig oder als Ergänzung zu [paperless-ngx](https://github.com/paperless-ngx/paperless-ngx) betrieben werden.
---
## Highlights
-**Eigenständige Vertragsdatenbank** auf SQLite (`better-sqlite3`) mit REST-API (Express).
-**Paperless-Integration (optional):** Verknüpft Verträge mit Dokumenten, zieht Metadaten per Token, durchsucht paperless direkt aus der UI.
-**Kategorie-Verwaltung:** Dropdown mit Vorschlägen, Inline-Neuanlage im Formular & Verwaltung unter Einstellungen.
-**Modernes React-Frontend** (Vite + MUI) mit Dashboard, Vertragsliste, Kalender, Detailansicht und umfangreichen Einstellungen.
-**Benachrichtigungen & Automatisierung:** Scheduler prüft Deadlines, optionaler Mailversand, ntfy-Push, iCal-Feed zum Abonnieren.
-**Konfigurierbare Authentifizierung:** Optionales Login mit JWT, Benutzername/Passwort verwaltbar in den Settings.
-**Mehrsprachigkeit:** UI derzeit auf Deutsch und Englisch lokalisiert.
-**Docker-ready:** Backend und Frontend als Container, Konfiguration via `docker-compose.yml`.
---
## Projektüberblick
```
backend/ (TypeScript)
src/
index.ts # Express-Server, Routing, Auth, Settings, Calendar, Paperless-Suche
contractsStore.ts # CRUD auf SQLite
scheduler.ts # Deadline-Monitor
paperlessClient.ts # Paperless-Proxy mit Korrespondenten/Tag-Anreicherung
notifications.ts # SMTP & ntfy-Tests, Benachrichtigungen
runtimeSettings.ts # Persistente Einstellungen (z.B. Mail, ntfy, Paperless)
validators.ts # Zod-Schemas
frontend/ (React + Vite)
src/
routes/ # Dashboard, Contracts, Calendar, Settings, Login
components/ # Listen, Dialoge, Layout, Snackbar etc.
api/ # REST-Client (fetch)
locales/ # de/en Übersetzungen
```
---
## Getting Started
### Voraussetzungen
- Node.js ≥ 20.x (Backend & Frontend)
- npm oder pnpm
- optional Docker / Docker Compose
### Lokale Entwicklung
```bash
# Backend
npm install
npm run dev # startet Express per tsx (Hot-Reload)
# Frontend
cd frontend
npm install
npm run dev # http://localhost:5173 (Proxy auf http://localhost:8000/api)
```
> **Hinweis:** Die `node_modules` Verzeichnisse sind aus dem Repository ausgenommen. Vor jedem Build/Start zunächst `npm install` im jeweiligen Ordner ausführen, damit TypeScript (`tsc`) verfügbar ist.
### Docker Compose
```bash
docker compose up --build
```
- API: `http://localhost:8112` (siehe Compose)
- Frontend: `http://localhost:8113`
- SQLite-Datenbank: Volume `contracts-data``/app/data/contracts.db`
---
## Konfiguration
| Variable | Standard | Beschreibung |
| --- | --- | --- |
| `PORT` | `8000` | Port des Express-Servers. |
| `LOG_LEVEL` | `info` | `debug`, `info`, `warn`, `error`. |
| `DATABASE_PATH` | `/app/data/contracts.db` | Pfad zur SQLite-Datei (Volume mounten). |
| `SCHEDULER_INTERVAL_MINUTES` | `60` | Intervall für Deadline-Checks (51440). |
| `ALERT_DAYS_BEFORE` | `30` | Vorlauf in Tagen für Warnungen. |
| `AUTH_USERNAME` / `AUTH_PASSWORD` | *(leer)* | Aktiviert JWT-Login, wenn beide gesetzt sind. |
| `AUTH_JWT_SECRET` | *(leer)* | Signatur-Secret (Pflicht bei aktivem Login). |
| `AUTH_TOKEN_EXPIRES_IN_HOURS` | `12` | Lebensdauer der Tokens. |
| `PAPERLESS_BASE_URL` | *(leer)* | API-URL deiner paperless-ngx Instanz. |
| `PAPERLESS_EXTERNAL_URL` | *(leer)* | Optionale externe URL für Direktlinks im Browser. |
| `PAPERLESS_TOKEN` | *(leer)* | API-Token aus paperless-ngx. |
| `NTFY_SERVER_URL` / `NTFY_TOPIC` | *(leer)* | Aktiviert ntfy-Push-Benachrichtigungen. |
| `NTFY_TOKEN` / `NTFY_PRIORITY` | *(leer)* | Optionaler Bearer-Token & Priorität. |
| `MAIL_SERVER` / `MAIL_PORT` / `MAIL_USERNAME` / `MAIL_PASSWORD` | *(leer)* | SMTP-Settings (TLS optional über `MAIL_USE_TLS`). |
| `MAIL_FROM` / `MAIL_TO` | *(leer)* | Absender/Empfänger für Mail-Benachrichtigungen. |
| `ICAL_SECRET` | *(leer)* | Optional vorgegebenes Token für den iCal-Feed. |
### Paperless optional nutzen
Paperless ist **nicht verpflichtend**. Lässt du `PAPERLESS_*` leer, bleibt die Vertragsverwaltung voll funktionsfähig (Deadlines, Benachrichtigungen, iCal, ntfy, etc.). Die UI blendet paperless-spezifische Funktionen aus bzw. deaktiviert Buttons und zeigt Hinweise an. Sobald du später eine URL/Token hinterlegst, werden Suche und Direktlinks automatisch freigeschaltet.
---
## API-Übersicht
- `GET /contracts` Liste aller Verträge (`skip` / `limit`).
- `POST /contracts` Vertrag anlegen.
- `GET /contracts/:id` Einzelvertrag abrufen.
- `PUT /contracts/:id` Vertrag aktualisieren.
- `DELETE /contracts/:id` Vertrag löschen.
- `GET /contracts/:id/paperless-document` Verknüpftes Paperless-Dokument laden.
- `GET /categories` Alle Kategorien.
- `POST /categories` Neue Kategorie (legt an oder liefert vorhandene).
- `DELETE /categories/:id` Kategorie entfernen.
- `GET /integrations/paperless/search?q=` Paperless-Dokumente per Text oder ID finden.
- `GET /reports/upcoming?days=` Deadlines innerhalb der nächsten `days` Tage.
- `GET /calendar/feed.ics?token=` iCal-Feed für Kündigungsfristen.
---
## Integrationen
### Bereits vorhanden
- **paperless-ngx (optional):** Sucht Dokumente, verknüpft sie mit Verträgen, zeigt Metadaten und öffnet Direktlinks zur paperless-Oberfläche.
- **SMTP-Mail:** Verschickt Erinnerungen sowie Testmails aus den Einstellungen.
- **ntfy:** Sendet Push-Alerts (Test-Button in den Settings).
- **iCal-Feed:** Kündigungsfristen abonnierbar in gängigen Kalendern.
### Perspektivische Erweiterungen
Einige sinnvolle Ergänzungen, falls du die Plattform weiter denkst:
- **Nextcloud / ownCloud** Dokumentenverknüpfung oder Dateiimporte via WebDAV/REST.
- **Seafile / S3 (MinIO, Wasabi)** Ablage von Vertrags-PDFs in einem Objektspeicher.
- **Slack / Microsoft Teams / Mattermost** Deadlines als Channel-Notifications.
- **Jira / Asana / Trello** Automatische Tasks zur Kündigung bzw. Verlängerung.
- **Banking / Finance APIs** Abgleich von Zahlungen oder Lastschriften mit Vertragskosten.
- **CRM-Integration (HubSpot, Salesforce, Pipedrive)** Verträge direkt im Kundenkontext.
Diese Ideen sind in diesem Repository noch **nicht umgesetzt**, aber durch die REST-Architektur vergleichsweise leicht nachrüstbar.
---
## Status & Roadmap
### Erledigt
- Backend-API mit Contracts CRUD, Settings-Storage und optionaler Authentifizierung.
- Scheduler + Notification-Pipeline (Mail, ntfy).
- Paperless-Integration inkl. Suchdialog, Dokumentdetail, Metadaten-Anreicherung.
- React-UI mit Dashboard, Kalender, Vertragsliste/-details, Settings.
- Mehrsprachigkeit (Deutsch/Englisch) inkl. Language Switch.
- iCal-Feed mit granularen Einträgen und Direktlinks zu Verträgen.
- Docker-Setup für Backend und Frontend.
### In Arbeit / Offene Punkte
- Opt-in/Opt-out-Schalter für Paperless in der Oberfläche (UI zeigt bereits Hinweise).
- Additional Integrations (z.B. Nextcloud, Slack) Konzept klar, Implementation offen.
- Weitere Automatisierungen (z.B. automatische Erstellung von Tasks/Kalendereinträgen).
- Testsuite / CI-Pipeline (derzeit keine automatisierten Tests).
- Mehrbenutzer-Unterstützung & Rechteverwaltung (derzeit Single-User + optionaler Login).
Fühle dich frei, Pull Requests oder Issues mit neuen Ideen zu eröffnen.
---
## Entwicklung & Beiträge
1. Repository klonen, `npm install` im Root und in `frontend/`.
2. Backend mit `npm run dev`, Frontend mit `npm run dev` starten.
3. Die jeweiligen `.env` Dateien (oder Docker-Compose Variablen) für deine Umgebung setzen.
4. Änderungen strukturieren, `npm run build` im Root und im Frontend ausführen, um Typfehler zu erkennen (TypeScript läuft nur mit installierten Modulen).
5. Pull Request eröffnen.
**Coding Guidelines**
- TypeScript überall (Backend & Frontend).
- Zod-Schemas für Request-Validierung.
- Lass `paperlessClient` die einzige Stelle sein, an der Paperless-HTTP-Aufrufe passieren.
- UI nutzt React Query + React Hook Form, MUI-Komponenten (Varianten/Theme konsistent halten).
- Lokalisierte Strings über `react-i18next`.
---
## Lizenz
Noch keine Lizenz festgelegt bei Bedarf ergänzen (z.B. MIT). Bis dahin gelten die Standardrechte des Autoren.
---
Viel Spaß mit dem Paperless Contract Companion! Wenn du Feedback oder Integrationsideen hast, gerne melden.