Neue /einstellungen-Seite (Zahnrad im Header) mit allen bisherigen .env-Werten (Ollama, E-Mail, CalDAV, REST-API), gespeichert in SQLite (app_state, cfg:-Prefix). Libs lesen per lib/config.js zur Laufzeit statt beim Start -> Aenderungen wirken sofort, kein Neustart. Bestehende .env wird beim ersten Start einmalig migriert. Co-Authored-By: Claude <noreply@anthropic.com>
297 lines
9.4 KiB
Markdown
297 lines
9.4 KiB
Markdown
# Bewerbungs-Tracker
|
||
|
||
Ein professioneller Job Application Tracker für Jobcenter Grundsicherung Monatsberichte.
|
||
|
||
## Features
|
||
|
||
- **Benutzerprofile**: Speichern Sie Name, Adresse und Jobcenter Kundennummer
|
||
- **Dunkler Modus**: Vollständige Dark Mode Unterstützung mit lokaler Speicherung
|
||
- **CRUD-Operationen**: Komplette Verwaltung von Bewerbungen (Hinzufügen, Bearbeiten, Löschen)
|
||
- **Filterfunktion**: Filterung nach Monat und Jahr
|
||
- **Statistiken**: Übersicht über Gesamtbewerbungen, nach Art und Status
|
||
- **PDF-Export**: Professionelle PDF-Generierung für Jobcenter-Berichte
|
||
- **KI-Bewerbungsassistent**: Indeed-Stellen per Browser-Erweiterung importieren,
|
||
Status „Entwurf", und automatisch zugeschnittene Bewerbungsunterlagen (Anschreiben
|
||
& Lebenslauf als PDF) auf Basis eigener Vorlagen erstellen lassen
|
||
- **Responsive Design**: Optimiert für Desktop und Mobile Geräte
|
||
|
||
## KI-Bewerbungsassistent (Indeed → Entwurf mit Unterlagen)
|
||
|
||
Ablauf:
|
||
|
||
1. **Vorlagen hinterlegen** – Unter **Vorlagen** (Kopfzeile) das eigene
|
||
Standard-Anschreiben und den Lebenslauf als Text einfügen. Diese Basis-Unterlagen
|
||
sind die Faktengrundlage; die KI erfindet nichts hinzu.
|
||
2. **Stelle importieren** – Mit der Browser-Erweiterung (`extension/`) auf Indeed den
|
||
Button **„An Bewerbungs-Tracker senden"** klicken.
|
||
3. **Automatische Verarbeitung** – Der Tracker legt die Bewerbung mit Status
|
||
**Entwurf** an und generiert im Hintergrund über die **Ollama Cloud API**
|
||
zugeschnittene Bewerbungsunterlagen, die als PDF-Anhänge an der Bewerbung hängen.
|
||
|
||
### Konfiguration
|
||
|
||
Alle Einstellungen (Ollama, E-Mail, Kalender, REST-API) werden in der Weboberfläche
|
||
unter **„Einstellungen“** (`/einstellungen`, Zahnrad-Symbol im Header) gepflegt und
|
||
in der Datenbank gespeichert. Änderungen wirken sofort, ein Neustart ist nicht nötig.
|
||
|
||
Für die KI-Generierung wird ein Ollama-Cloud-API-Schlüssel benötigt
|
||
([ollama.com/settings/keys](https://ollama.com/settings/keys)) – trage ihn nach dem
|
||
ersten Start unter **Einstellungen → Ollama Cloud** ein.
|
||
|
||
```bash
|
||
npm start
|
||
# dann im Browser http://localhost:3000/einstellungen öffnen
|
||
```
|
||
|
||
Bestehende Installationen, die bisher eine `.env`-Datei nutzen, werden beim ersten
|
||
Start einmalig in die Datenbank migriert; danach wird `.env` nicht mehr benötigt.
|
||
|
||
Ohne Schlüssel wird die Bewerbung trotzdem als Entwurf angelegt; die Generierung
|
||
schlägt dann kontrolliert mit einem Hinweis fehl und kann später per
|
||
**„Neu generieren"** wiederholt werden.
|
||
|
||
Details zur Erweiterung: siehe [`extension/README.md`](extension/README.md).
|
||
|
||
## Technologien
|
||
|
||
- **Backend**: Node.js + Express.js
|
||
- **Datenbank**: SQLite
|
||
- **Frontend**: EJS Template Engine, Tailwind CSS (CDN)
|
||
- **PDF-Generierung**: jsPDF + jspdf-autotable (CDN)
|
||
|
||
## Installation
|
||
|
||
### Voraussetzungen
|
||
|
||
- Node.js (Version 14 oder höher)
|
||
- npm oder yarn
|
||
|
||
### Schritte
|
||
|
||
1. **Projekt klonen**
|
||
```bash
|
||
cd bewerbungs-tracker
|
||
```
|
||
|
||
2. **Abhängigkeiten installieren**
|
||
```bash
|
||
npm install
|
||
```
|
||
|
||
3. **Datenbank-Verzeichnis erstellen**
|
||
```bash
|
||
mkdir -p data
|
||
```
|
||
|
||
Die SQLite-Datenbank wird automatisch beim ersten Start erstellt.
|
||
|
||
4. **Server starten**
|
||
```bash
|
||
npm start
|
||
```
|
||
|
||
Für Entwicklung mit automatischem Neuladen:
|
||
```bash
|
||
npm run dev
|
||
```
|
||
|
||
5. **Anwendung öffnen**
|
||
|
||
Öffnen Sie Ihren Browser und navigieren Sie zu:
|
||
```
|
||
http://localhost:3000
|
||
```
|
||
|
||
## Projektstruktur
|
||
|
||
```
|
||
bewerbungs-tracker/
|
||
├── server.js # Express Server mit API-Routen
|
||
├── package.json # Projektabhängigkeiten und Skripte
|
||
├── views/
|
||
│ ├── index.ejs # Hauptseite
|
||
│ └── partials/
|
||
│ ├── header.ejs # Kopfzeile mit Dark Mode Toggle
|
||
│ └── footer.ejs # Fußzeile
|
||
├── public/
|
||
│ ├── css/
|
||
│ │ └── styles.css # Benutzerdefinierte Styles
|
||
│ └── js/
|
||
│ └── main.js # Client-seitige Logik
|
||
├── data/
|
||
│ └── bewerbungen.db # SQLite Datenbank (wird automatisch erstellt)
|
||
└── README.md # Dokumentation
|
||
```
|
||
|
||
## Datenbank-Schema
|
||
|
||
### Bewerbungen
|
||
|
||
| Feld | Typ | Beschreibung |
|
||
|------|-----|--------------|
|
||
| id | INTEGER PRIMARY KEY | Eindeutige ID |
|
||
| datum | DATE | Bewerbungsdatum |
|
||
| firma | TEXT | Firmenname |
|
||
| stelle | TEXT | Stellenbezeichnung |
|
||
| art | TEXT | Art der Bewerbung |
|
||
| status | TEXT | Status der Bewerbung |
|
||
| notizen | TEXT | Zusätzliche Notizen |
|
||
| created_at | DATETIME | Erstellungsdatum |
|
||
| updated_at | DATETIME | Letztes Update |
|
||
|
||
### Einstellungen
|
||
|
||
| Feld | Typ | Beschreibung |
|
||
|------|-----|--------------|
|
||
| id | INTEGER | Immer 1 (Single Row) |
|
||
| name | TEXT | Benutzername |
|
||
| adresse | TEXT | Benutzeradresse |
|
||
| kundennummer | TEXT | Jobcenter Kundennummer |
|
||
|
||
## Verwendbare Optionen
|
||
|
||
### Art der Bewerbung
|
||
- E-Mail
|
||
- Online-Portal
|
||
- Indeed
|
||
- StepStone
|
||
- Firmenwebsite
|
||
- Post
|
||
- Initiativbewerbung
|
||
- Arbeitsagentur
|
||
- Sonstiges
|
||
|
||
### Status
|
||
- Gesendet
|
||
- Eingangsbestätigung
|
||
- Vorstellungsgespräch
|
||
- Absage
|
||
- Einstellung
|
||
- Keine Rückmeldung
|
||
|
||
## API-Endpunkte
|
||
|
||
### GET /
|
||
Hauptseite mit allen Bewerbungen
|
||
|
||
### GET /api/settings
|
||
Benutzereinstellungen abrufen
|
||
|
||
### POST /api/settings
|
||
Benutzereinstellungen speichern
|
||
|
||
### GET /api/bewerbungen
|
||
Alle Bewerbungen abrufen (mit Filter: ?month=MM&year=YYYY)
|
||
|
||
### POST /api/bewerbungen
|
||
Neue Bewerbung erstellen
|
||
|
||
### PUT /api/bewerbungen/:id
|
||
Bewerbung aktualisieren
|
||
|
||
### DELETE /api/bewerbungen/:id
|
||
Bewerbung löschen
|
||
|
||
### POST /api/indeed-import
|
||
Stelle importieren (von der Browser-Erweiterung genutzt): legt einen Entwurf an und
|
||
startet die KI-Generierung der Unterlagen. CORS ist für diesen Endpunkt aktiviert.
|
||
|
||
### GET /api/bewerbungen/:id/generierung
|
||
Generierungsstatus und aktuelle Anhänge einer Bewerbung abfragen (Polling).
|
||
|
||
### GET /api/basis-dokumente
|
||
Hinterlegte Basis-Unterlagen (Vorlagen) abrufen
|
||
|
||
### GET /anhaenge/:id/download
|
||
Generierten Anhang (PDF) herunterladen
|
||
|
||
### GET /api/bewerbungen/filter
|
||
Bewerbungen mit Filter abrufen
|
||
|
||
## REST-API für Drittanbietersoftware (`/api/v1`)
|
||
|
||
Zusätzlich zu den internen Endpunkten gibt es eine eigenständige, versionierte
|
||
REST-API unter `/api/v1` für externe Software. Sie ist vollständig mit
|
||
OpenAPI 3.0 dokumentiert; eine interaktive Swagger-UI läuft unter **`/swagger`**,
|
||
das Rohdokument unter **`/swagger.json`**.
|
||
|
||
### Authentifizierung
|
||
|
||
Jeder Endpunkt (außer `GET /api/v1/health`) erfordert einen API-Key im Header
|
||
`X-API-Key`. Der Schlüssel wird unter **Einstellungen → REST-API** (`API_TOKEN`)
|
||
konfiguriert. Ist `API_TOKEN` nicht gesetzt, antwortet die API mit `503` – sie gibt
|
||
nie ungeschützt Daten heraus. Swagger/UI sind auch ohne Token erreichbar (die
|
||
Dokumentation enthält keine sensiblen Daten).
|
||
|
||
```bash
|
||
curl -H "X-API-Key: $API_TOKEN" http://localhost:3000/api/v1/applications
|
||
```
|
||
|
||
### Endpunkte
|
||
|
||
| Methode | Pfad | Beschreibung |
|
||
|---------|------|--------------|
|
||
| GET | `/api/v1/health` | Verfügbarkeit (ohne Auth) |
|
||
| GET | `/api/v1/applications` | Bewerbungen auflisten (Filter: `month`, `year`, `status`, `art`, `search`, `limit`, `offset`) |
|
||
| POST | `/api/v1/applications` | Bewerbung anlegen (Duplicate-Guard via `force`) |
|
||
| GET | `/api/v1/applications/{id}` | Einzelne Bewerbung |
|
||
| PUT | `/api/v1/applications/{id}` | Bewerbung aktualisieren |
|
||
| DELETE | `/api/v1/applications/{id}` | Bewerbung löschen |
|
||
| GET | `/api/v1/applications/{id}/timeline` | Statusverlauf |
|
||
| POST | `/api/v1/applications/{id}/timeline` | Status-Eintrag hinzufügen |
|
||
| DELETE | `/api/v1/applications/{id}/timeline/{eintragId}` | Status-Eintrag löschen |
|
||
| GET | `/api/v1/applications/{id}/attachments` | Generierte Anhänge auflisten |
|
||
| GET | `/api/v1/applications/{id}/attachments/{attachmentId}` | Anhang (PDF) herunterladen |
|
||
| GET | `/api/v1/applications/{id}/emails` | E-Mail-Korrespondenz |
|
||
| GET | `/api/v1/emails/{emailId}/attachments/{attachmentId}` | E-Mail-Anhang herunterladen |
|
||
| POST | `/api/v1/applications/{id}/generate` | KI-Generierung anstoßen (async, `202`) |
|
||
| GET | `/api/v1/applications/{id}/generation-status` | Generierungsstatus abfragen |
|
||
| GET | `/api/v1/settings` | Einstellungen abrufen |
|
||
| PUT | `/api/v1/settings` | Einstellungen speichern |
|
||
| GET | `/api/v1/statistics` | Statistiken (Gesamt, nach Art/Status) |
|
||
| GET | `/api/v1/export` | Bewerbungen exportieren (ohne interne Notizen) |
|
||
| GET | `/api/v1/templates` | Basis-Unterlagen (Vorlagen) |
|
||
|
||
Die vollständige, maschinenlesbare Dokumentation (Parameter, Schemas,
|
||
Fehlerantworten) liegt unter `/swagger.json` und ist in der Swagger-UI unter
|
||
`/swagger` interaktiv bedienbar (inkl. „Authorize“ zum Eintragen des API-Keys
|
||
für Test-Requests).
|
||
|
||
## PDF-Export
|
||
|
||
Der PDF-Export generiert ein professionelles Dokument mit:
|
||
- Benutzerdaten (Name, Adresse, Kundennummer)
|
||
- Überschrift mit Monat und Jahr
|
||
- Zusammenfassung der Bewerbungsaktivitäten
|
||
- Tabelle mit allen Bewerbungen
|
||
- Bestätigungstext und Datum
|
||
|
||
## Browser-Unterstützung
|
||
|
||
- Chrome (empfohlen)
|
||
- Firefox
|
||
- Safari
|
||
- Edge
|
||
|
||
## Dark Mode
|
||
|
||
Der Dark Mode kann manuell über den Toggle-Button in der Kopfzeile aktiviert werden. Die Einstellung wird in localStorage gespeichert und bleibt beim nächsten Besuch erhalten.
|
||
|
||
## Sicherheit
|
||
|
||
- Eingabefelder werden gegen XSS geschützt
|
||
- SQL-Injection wird durch parametrisierte Abfragen verhindert
|
||
- Formulare validieren Pflichtfelder
|
||
|
||
## Lizenz
|
||
|
||
MIT
|
||
|
||
## Autor
|
||
|
||
Bewerbungs-Tracker für Jobcenter Grundsicherung
|
||
|
||
---
|
||
|
||
**Hinweis**: Diese Anwendung ist speziell für die Anforderungen des deutschen Jobcenters (Grundsicherung) entwickelt worden. Sie hilft bei der Dokumentation von Bewerbungsaktivitäten für die monatlichen Berichte.
|