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>
94 lines
2.8 KiB
PHP
94 lines
2.8 KiB
PHP
<?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');
|
||
}
|
||
}
|