presseportale/app/Enums/AiTextDeclaration.php
Kevin Adametz 0cda19458d KI-Kennzeichnung: 2 Optionen im Submit-Modal + Labels auf Detailseite
Submit-Modal auf zwei Auswahloptionen reduziert (kein Label vs.
"Ganz oder ueberwiegend mit generativer KI erstellt"); alle vier
Enum-Werte bleiben fuer API/Bestand gueltig und mappen per formOption()
auf die zwei Gruppen. Oeffentliche Detailseite rendert jetzt Text-Label
("KI-generiert: Nach Angaben ...") und Bild-Badge (KI-generiert/
KI-bearbeitet, abgedunkelter Hintergrund) — fehlte dort bisher komplett.
Bildnachweis-Vorschlag ohne "Foto:"-Praefix (stand sonst doppelt).
Einreich-Toast + FAQ: automatische Pruefung in Minuten statt 24 h.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-10 16:51:23 +00:00

94 lines
2.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Enums;
/**
* Selbst-Deklaration des KI-Einsatzes beim PM-Text (Art. 50 Abs. 4 KI-VO).
*
* Pflichtauswahl im Submit-Flow (Decision-Update KI-Kennzeichnung, 08.07.2026;
* vereinfacht auf zwei Auswahloptionen, 10.07.2026): gelabelt wird allein nach
* dem deklarierten KI-Grad, nicht nach der Public-Interest-Frage — bewusste
* Über-Erfüllung. Das öffentliche Label spricht in Einreicher-Stimme, nie in
* Portalstimme.
*
* Alle vier Werte bleiben gültig (API-Vertrag v1 + Bestandsdaten); UI und
* Label-Logik fassen sie zu zwei Gruppen zusammen: None/Assisted = kein Label,
* MostlyAi/FullyAi = KI-Label.
*/
enum AiTextDeclaration: string
{
case None = 'none';
case Assisted = 'assisted';
case MostlyAi = 'mostly_ai';
case FullyAi = 'fully_ai';
/**
* Wortlaut der Auswahloption im Submit-Flow (zwei Gruppen).
*/
public function label(): string
{
return match ($this) {
self::None, self::Assisted => __('Ohne generative KI erstellt – oder KI nur als Formulierungshilfe, mit anschließender menschlicher Überarbeitung und Verantwortung.'),
self::MostlyAi, self::FullyAi => __('Ganz oder überwiegend mit generativer KI erstellt.'),
};
}
/**
* Öffentliches Label in Einreicher-Stimme — null, wenn kein Pflicht-Label
* fällig ist ("Ohne KI" wird bewusst nicht als Portal-Aussage zertifiziert,
* die Formulierungshilfe entspricht dem Entlastungsfall).
*/
public function publicLabel(): ?string
{
return match ($this) {
self::None, self::Assisted => null,
self::MostlyAi, self::FullyAi => __('KI-generiert: Nach Angaben des einreichenden Unternehmens wurde diese Pressemitteilung ganz oder überwiegend mit generativer KI erstellt.'),
};
}
/**
* Kanonische Formular-Option der Gruppe — mappt Alt-/API-Werte
* (assisted, fully_ai) auf die zwei im Modal angebotenen Radios.
*/
public function formOption(): self
{
return match ($this) {
self::None, self::Assisted => self::None,
self::MostlyAi, self::FullyAi => self::MostlyAi,
};
}
/**
* Die zwei im Submit-Modal angebotenen Auswahloptionen.
*
* @return list<self>
*/
public static function formCases(): array
{
return [self::None, self::MostlyAi];
}
/**
* Optionsliste für Radios/Selects: value => label.
*
* @return array<string, string>
*/
public static function options(): array
{
$options = [];
foreach (self::cases() as $case) {
$options[$case->value] = $case->label();
}
return $options;
}
/**
* @return list<string>
*/
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}