- config/logging.php: Themen-Channels billing, ki, monitoring, market als daily-Dateien mit gemeinsamer Aufbewahrung (LOG_DAILY_DAYS), Stack-Default auf daily; Channel `testing` für die Suite. - Fachliche Log-Aufrufe in Billing, KI-Jobs, OperationalAlert und Kursdaten auf Log::channel() umgestellt. - phpunit.xml + TestCase: Suite schreibt ausschließlich nach testing-YYYY-MM-DD.log; LogChannelsTest sichert die Konfiguration. - docs/weiteres: Decision-Update Duplicate-Content entfernt (überholt durch Roadmap-Anhang 2), Decision-Update Verlinkung & Backlinks als Referenz wieder abgelegt, README-Index nachgezogen. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
53 lines
1.9 KiB
PHP
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::channel('ki')->warning('Profilprüfung (Rot-Ebene) fehlgeschlagen — deterministischer Fallback.', [
|
|
'company_id' => $company->getKey(),
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
|
|
return $this->classification->driver('deterministic')->classify($proposed);
|
|
}
|
|
}
|
|
}
|