Selbstdeklaration des KI-Einsatzes je PM (Text) und je Bild inkl. Submit-Gate im PressReleaseService, versioniertem Audit-Trail (press_release_ai_declarations) und öffentlichem KI-Label in Einreicher-Stimme. Bestätigung im Submit-Modal ist Pflicht. Co-authored-by: Cursor <cursoragent@cursor.com>
70 lines
2.2 KiB
PHP
70 lines
2.2 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):
|
|
* 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.
|
|
*/
|
|
enum AiTextDeclaration: string
|
|
{
|
|
case None = 'none';
|
|
case Assisted = 'assisted';
|
|
case MostlyAi = 'mostly_ai';
|
|
case FullyAi = 'fully_ai';
|
|
|
|
/**
|
|
* Wortlaut der Auswahloption im Submit-Flow.
|
|
*/
|
|
public function label(): string
|
|
{
|
|
return match ($this) {
|
|
self::None => __('Ohne generative KI erstellt'),
|
|
self::Assisted => __('Mit KI als Formulierungshilfe erstellt und redaktionell überarbeitet'),
|
|
self::MostlyAi => __('Überwiegend mit generativer KI erstellt und anschließend geprüft'),
|
|
self::FullyAi => __('Vollständig KI-generiert (ohne wesentliche menschliche Bearbeitung)'),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Ö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 => __('Nach Angaben des einreichenden Unternehmens wurde diese Pressemitteilung überwiegend mit generativer KI erstellt.'),
|
|
self::FullyAi => __('Nach Angaben des einreichenden Unternehmens wurde diese Pressemitteilung vollständig mit generativer KI erstellt.'),
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 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');
|
|
}
|
|
}
|