feat(scanner): Ausschluss-Unternehmen je Suchagent

Neues Feld exclude_companies: steht ein Eintrag im Firmennamen der
Anzeige (z. B. "Hays"), verwirft der Agent sie. Beim Speichern werden
vorhandene Treffer dieser Firmen gelöscht (außer "in Bearbeitung").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
schakal00783
2026-10-20 14:41:47 +02:00
co-authored by Claude Opus 5.5
parent a24fd938a2
commit 1969d0b77a
9 changed files with 94 additions and 14 deletions
+4 -2
View File
@@ -217,8 +217,10 @@ freelancermap) nach offenen Stellen in DACH – jedes Alter; im Dashboard grenze
siehe [12 Scanner](12-scanner.md).
1. **Scanner → Suchagenten → + Neuer Suchagent.** Name, Schlagwörter (Enter
oder Komma trennt), Ausschlussbegriffe und Börsen wählen. Jedes Schlagwort
ist eine eigene Suche.
oder Komma trennt), Ausschlussbegriffe, Ausschluss-Unternehmen und Börsen
wählen. Jedes Schlagwort ist eine eigene Suche. Unter
**Ausschluss Unternehmen** z. B. „Hays" eintragen – dann zeigt dieser Agent
keine Anzeigen von Hays mehr; schon vorhandene verschwinden beim Speichern.
2. **Scanner (Dashboard).** Die Treffer erscheinen nach dem nächsten Lauf –
automatisch nach Zeitplan oder sofort über **Jetzt scannen**.
3. Die **Quote** zeigt, wie viele Schlagwörter in der Anzeige stehen; ein
+10 -3
View File
@@ -79,7 +79,7 @@ sequenceDiagram
loop je Anzeige
P->>DB: speichern (eindeutig je Börse + Kennung), Firma abgleichen
loop je Agent, der diese Börse durchsucht
P->>P: Ausschlussbegriff? weiter
P->>P: Ausschlussbegriff oder Ausschluss-Unternehmen? weiter
P->>P: Schlagwörter zählen → Quote
P->>DB: Treffer (eindeutig je Agent + Anzeige)
end
@@ -111,6 +111,12 @@ mit „SAP FI" im Text → (2 + 1 + 0) / 6 = **50 %**.
(„Projektleiter" in „IT-Projektleiterin").
- Ein Ausschlussbegriff in Titel, Firma oder Text verwirft die Anzeige für
diesen Agenten.
- **Ausschluss-Unternehmen** (seit 20.10.2026, Spalte `exclude_companies`):
steht ein Eintrag im **Firmennamen** der Anzeige, verwirft der Agent sie –
„Hays" blendet „Hays Professional Solutions GmbH" aus, nicht aber eine
Anzeige, die Hays nur im Text erwähnt. Gleiche Wortregel wie oben (≤ 3
Zeichen nur als ganzes Wort). Beim Speichern des Agenten werden schon
vorhandene Treffer dieser Firmen gelöscht, außer Status „in Bearbeitung".
- Kein Schlagwort gefunden → kein Treffer.
Das kostet nichts und ist nachvollziehbar; OpenAI wird vom Scanner nicht
@@ -219,6 +225,7 @@ erDiagram
text keywords "JSON-Array"
text sources "JSON-Array der Quellen-Ids"
text excludes "JSON-Array"
text exclude_companies "JSON-Array, Abgleich mit Firmenname"
text alarm_keywords "JSON-Array, Ton + Pop-up"
tinyint is_active
}
@@ -274,8 +281,8 @@ Alle unter `/api/scanner`, alle hinter `requireAuth`.
| --- | --- | --- | --- |
| GET | `/overview` | alle | Kennzahlen, Quellen samt Ergebnis des letzten Laufs, Zeitplan, läuft gerade ein Lauf |
| GET | `/agents` | alle | Suchagenten mit Trefferzahl |
| 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) |
| POST | `/agents` | alle | anlegen `{ name, keywords[], alarm_keywords[], sources[], excludes[], exclude_companies[], is_active }` – Schlagwort oder Alarm-Schlagwort Pflicht |
| PUT | `/agents/:id` | alle | ändern (gleicher Körper); löscht vorhandene Treffer von Ausschluss-Unternehmen (außer „in Bearbeitung“) |
| DELETE | `/agents/:id` | alle | löschen, Treffer gehen mit |
| 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) |