diff --git a/app/Services/PressRelease/PressReleaseService.php b/app/Services/PressRelease/PressReleaseService.php index 87be64ad..a496d898 100644 --- a/app/Services/PressRelease/PressReleaseService.php +++ b/app/Services/PressRelease/PressReleaseService.php @@ -106,6 +106,24 @@ class PressReleaseService ScorePressRelease::dispatch($pressRelease->id)->onQueue('classification'); } + /** + * Nach einer inhaltlichen Änderung (Titel/Text) einer bereits geprüften + * bzw. bewerteten PM erneut prüfen (Re-Check ohne Routing) und neu + * bewerten. Operiert auf dem frischen Modellstand. Single Source of Truth + * für die vier PM-Editoren. + */ + public function reprocessAfterContentChange(PressRelease $pressRelease): void + { + $fresh = $pressRelease->fresh(); + + if ($fresh === null) { + return; + } + + $this->reclassifyIfClassified($fresh); + $this->rescoreIfScored($fresh); + } + /** * Routet eine frisch klassifizierte PM anhand des KI-Ergebnisses * (Decision-Update §5.0, Entscheidung 12.06.2026). Wird vom diff --git a/resources/views/livewire/admin/press-releases/edit.blade.php b/resources/views/livewire/admin/press-releases/edit.blade.php index 4215f199..d43f9da0 100644 --- a/resources/views/livewire/admin/press-releases/edit.blade.php +++ b/resources/views/livewire/admin/press-releases/edit.blade.php @@ -209,10 +209,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl // Inhaltliche Änderung einer bereits geprüften/bewerteten PM → neu // prüfen (Re-Check ohne Routing) und neu bewerten. if ($contentChanged) { - $service = app(PressReleaseService::class); - $fresh = $pr->fresh(); - $service->reclassifyIfClassified($fresh); - $service->rescoreIfScored($fresh); + app(PressReleaseService::class)->reprocessAfterContentChange($pr); } Flux::toast(text: __('Pressemitteilung gespeichert.'), variant: 'success'); diff --git a/resources/views/livewire/customer/press-releases/edit.blade.php b/resources/views/livewire/customer/press-releases/edit.blade.php index def56397..ffde00b6 100644 --- a/resources/views/livewire/customer/press-releases/edit.blade.php +++ b/resources/views/livewire/customer/press-releases/edit.blade.php @@ -273,10 +273,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl [$pr, $contentChanged] = $result; if ($contentChanged) { - $service = app(PressReleaseService::class); - $fresh = $pr->fresh(); - $service->reclassifyIfClassified($fresh); - $service->rescoreIfScored($fresh); + app(PressReleaseService::class)->reprocessAfterContentChange($pr); } Flux::toast( @@ -335,10 +332,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl // prüfen (Re-Check ohne Routing) und neu bewerten. Beim Einreichen // übernimmt das submitForReview. if ($contentChanged) { - $service = app(PressReleaseService::class); - $fresh = $pr->fresh(); - $service->reclassifyIfClassified($fresh); - $service->rescoreIfScored($fresh); + app(PressReleaseService::class)->reprocessAfterContentChange($pr); } Flux::toast( diff --git a/tests/Feature/PressReleaseReclassifyTest.php b/tests/Feature/PressReleaseReclassifyTest.php index a93a584b..a435eb07 100644 --- a/tests/Feature/PressReleaseReclassifyTest.php +++ b/tests/Feature/PressReleaseReclassifyTest.php @@ -3,6 +3,7 @@ use App\Enums\PressReleaseClassification; use App\Enums\PressReleaseStatus; use App\Jobs\ClassifyPressRelease; +use App\Jobs\ScorePressRelease; use App\Models\Category; use App\Models\Company; use App\Models\PressRelease; @@ -37,6 +38,34 @@ test('reclassifyIfClassified does nothing for a never-classified press release', Queue::assertNothingPushed(); }); +test('reprocessAfterContentChange reclassifies and rescores on the fresh model state', function () { + Queue::fake(); + + $pressRelease = PressRelease::factory()->create([ + 'classification' => PressReleaseClassification::Green->value, + 'content_score' => 80, + 'status' => PressReleaseStatus::Published->value, + ]); + + app(PressReleaseService::class)->reprocessAfterContentChange($pressRelease); + + Queue::assertPushedOn('classification', ClassifyPressRelease::class); + Queue::assertPushedOn('classification', ScorePressRelease::class); +}); + +test('reprocessAfterContentChange does nothing for an unclassified, unscored press release', function () { + Queue::fake(); + + $pressRelease = PressRelease::factory()->create([ + 'classification' => null, + 'content_score' => null, + ]); + + app(PressReleaseService::class)->reprocessAfterContentChange($pressRelease); + + Queue::assertNothingPushed(); +}); + test('api update of a classified press release re-classifies when the content changes', function () { /** @var TestCase $this */ Queue::fake();