presseportale/app/Services/Company/CompanyProfileCheck.php
Kevin Adametz 87f95fb7a7 newsroom: Beschreibung pflegen, durch die Rot-Ebene geprüft (Roadmap 1b.3)
Die Firmenseite im Kundenbereich bekommt den Beschreibungstext (max.
2 000 Zeichen, reiner Text). Er läuft durch dieselbe Klassifikation wie
eine Meldung (CompanyProfileCheck, KI mit deterministischem Fallback);
Rot wird abgewiesen. Links im Profiltext gibt es nicht — die Website ist
das eine Link-Feld. Bilder zurückgestellt (BALD-Platzhalter), bis die
Bild-Kennzeichnung angepasst ist.

Stufe 3 der Konversionsleiter (newsroom_edited) wird hier geschrieben,
einmal je Firma, mit der Herkunft des zuletzt eingelösten Magic Links.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 13:04:12 +00:00

53 lines
1.9 KiB
PHP

<?php
namespace App\Services\Company;
use App\Enums\PressReleaseClassification;
use App\Models\Company;
use App\Models\PressRelease;
use App\Services\PressRelease\Classification\ClassificationManager;
use App\Services\PressRelease\Classification\ClassificationResult;
use Illuminate\Support\Facades\Log;
/**
* Prüfung des Beschreibungstexts eines Newsrooms (Roadmap 1b.3, Leitplanke
* „mindestens durch die Rot-Ebene der bestehenden Prüfung").
*
* Kein eigenes Regelwerk: Der Text läuft durch dieselbe Klassifikation wie
* eine Meldung — KI-Treiber, bei Ausfall die deterministische Blacklist,
* genau wie die Vorprüfung einer kostenpflichtigen Änderung (Spur D). Nur
* das Ergebnis Rot zählt hier; Gelb ist für ein Firmenprofil kein Grund,
* den Text abzuweisen.
*
* Geprüft wird auf einer NICHT gespeicherten Meldung mit Firmenname als
* Titel und Beschreibung als Text — die Treiber kennen nur Meldungen, und
* mehr als Titel und Text lesen sie nicht.
*/
class CompanyProfileCheck
{
public function __construct(private readonly ClassificationManager $classification) {}
public function isRed(Company $company, string $description): bool
{
return $this->check($company, $description)->classification === PressReleaseClassification::Red;
}
public function check(Company $company, string $description): ClassificationResult
{
$proposed = new PressRelease([
'title' => (string) $company->name,
'text' => $description,
]);
try {
return $this->classification->driver()->classify($proposed);
} catch (\Throwable $e) {
Log::warning('Profilprüfung (Rot-Ebene) fehlgeschlagen — deterministischer Fallback.', [
'company_id' => $company->getKey(),
'error' => $e->getMessage(),
]);
return $this->classification->driver('deterministic')->classify($proposed);
}
}
}