Scanner: Altersfenster "älter als / jünger als" (Tage)

Ersetzt die feste Auswahl bis/über 21 Tage durch zwei freie Felder,
einzeln oder kombiniert (z. B. älter 14, jünger 30). API: olderThan,
youngerThan; age=recent|old bleibt für Altaufrufe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
schakal00783
2026-09-29 17:34:59 +02:00
co-authored by Claude Opus 5.5
parent 651ad2b954
commit 1e273ddd92
4 changed files with 54 additions and 17 deletions
+2 -2
View File
@@ -212,8 +212,8 @@ Kontakt (*Kontakt → Stundensatz vor Ort / remote*).
## Scanner
Sucht in Jobbörsen (Agentur für Arbeit, StepStone, karriere.at, Adzuna,
freelancermap) nach offenen Stellen in DACH – jedes Alter; im Dashboard filtert
*Anzeigenalter* nach „bis 21 Tage“ oder „älter als 21 Tage“. Technik
freelancermap) nach offenen Stellen in DACH – jedes Alter; im Dashboard grenzen
*Älter als* und *Jünger als* (Tage) das Alter ein, z. B. älter 14, jünger 30. Technik
siehe [12 Scanner](12-scanner.md).
1. **Scanner → Suchagenten → + Neuer Suchagent.** Name, Schlagwörter (Enter
+5 -4
View File
@@ -4,9 +4,10 @@ Der Scanner durchsucht Jobbörsen nach offenen Stellen, die ICON besetzen kann
Festanstellungen ebenso wie Projekte. Region immer DACH. Eingeführt am 29.09.2026.
Gesucht wird **ohne Altersgrenze** (Änderung vom 29.09.2026, vorher höchstens
21 Tage): auch ältere Anzeigen kommen herein. Im Dashboard filtert
**Anzeigenalter** nach „bis 21 Tage" bzw. „älter als 21 Tage", die Sortierung
kennt „älteste Anzeige".
21 Tage): auch ältere Anzeigen kommen herein. Im Dashboard grenzen die Felder
**Älter als** und **Jünger als** (Tage) das Alter frei ein – z. B. älter 14,
jünger 30. Leer heißt keine Grenze; Anzeigen ohne Datum fallen heraus, sobald
eines der Felder gesetzt ist. Die Sortierung kennt „älteste Anzeige".
Menü: **Scanner** (Dashboard) mit dem Unterpunkt **Suchagenten**; Zeitplan und
API-Schlüssel unter **Einstellungen → Scanner** (nur Administratoren).
@@ -276,7 +277,7 @@ Alle unter `/api/scanner`, alle hinter `requireAuth`.
| POST | `/agents` | alle | anlegen `{ name, keywords[], alarm_keywords[], sources[], excludes[], is_active }` – Schlagwort oder Alarm-Schlagwort Pflicht |
| PUT | `/agents/:id` | alle | ändern (gleicher Körper) |
| DELETE | `/agents/:id` | alle | löschen, Treffer gehen mit |
| GET | `/matches` | alle | Filter `hours` (gefunden), `age` (`recent`/`old`, Grenze 21 Tage ab Veröffentlichung), `agentId`, `source`, `known=1`, `alarm=1`, `status` (`alle` zeigt auch Verworfene), `minScore`, `q`, `sort` (`known`/`score`/`agent`/`title`/`company`/`source`/`published`/`status`/`created`; `oldest` = `published` aufsteigend) mit `dir` (`asc`/`desc`), `limit` |
| GET | `/matches` | alle | Filter `hours` (gefunden), `olderThan` / `youngerThan` (Tage ab Veröffentlichung, einzeln oder zusammen; `age=recent|old` = feste 21-Tage-Grenze, aus der ersten Fassung), `agentId`, `source`, `known=1`, `alarm=1`, `status` (`alle` zeigt auch Verworfene), `minScore`, `q`, `sort` (`known`/`score`/`agent`/`title`/`company`/`source`/`published`/`status`/`created`; `oldest` = `published` aufsteigend) mit `dir` (`asc`/`desc`), `limit` |
| GET | `/alarms` | alle | unquittierte Alarm-Treffer (höchstens 50) |
| POST | `/alarms/ack` | alle | `{ ids: [] }` – quittiert für alle Benutzer |
| PATCH | `/matches/:id` | alle | `{ status }` |