# NextJobs

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 NextJobs 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
- Entwurf
- Gesendet
- Eingangsbestätigung
- In Bearbeitung
- Interessiert
- Warten auf Rückmeldung
- Warten auf meine Antwort
- Vorstellungsgespräch
- Vertragsverhandlung
- Absage
- Absage von meiner Seite
- 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

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