web: Erstquelle-Absatz in der Veröffentlichungsmail, vierte Transparenzseite „kostenlos veröffentlichen" (Anhang 1: 1d, 2.4, E7)

Meldungen, die über die API eingegangen sind, bekommen in der
Veröffentlichungsmail einen Absatz zum Unterschied Erstquelle/Kopie —
technische Tatsache, ohne Preis und Angebot; direkt eingereichte nicht.

/pressemitteilung-kostenlos-veroeffentlichen beantwortet die Suche nach
„kostenlos" ehrlich: kein kostenloser Weg (E7), was kostenlose Portale
leisten, warum Links aus Presseportalen kaum tragen (auch bei uns
sponsored nofollow), warum Annahme ohne Gegenwert und Prüfung sich
ausschließen, wer am Ende zahlt. Die Liste kostenloser Portale ist in
config/transparency.php vorbereitet und bleibt leer, bis geprüfte
Einträge mit Prüfdatum vorliegen.

Unter-Navigation, Hilfe, Sitemaps, llms.txt und die Modelltabelle der
Kostenseite verlinken die neue Seite. Anhang 1 und Protokoll Teil 6.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-17 14:22:05 +00:00
parent 6c4618afed
commit f1648a05b0
21 changed files with 597 additions and 12 deletions

View file

@ -50,6 +50,7 @@ class LlmsTxtController extends Controller
'- [Richtlinien]('.$base.'/de/richtlinien): Was veröffentlicht wird und was nicht',
'- [Was kostet eine Pressemitteilung?]('.$base.'/de/was-kostet-eine-pressemitteilung): Abrechnungsmodelle, Prüfliste für Folgekosten, Rechenbeispiel',
'- [Pressemitteilung löschen oder ändern lassen]('.$base.'/de/pressemitteilung-loeschen-oder-aendern-lassen)',
'- [Pressemitteilung kostenlos veröffentlichen?]('.$base.'/de/pressemitteilung-kostenlos-veroeffentlichen): Warum es hier keine kostenlose Einreichung gibt, was kostenlose Portale leisten',
'- [API]('.$base.'/de/api): Einlieferung per REST-API; OpenAPI-Spezifikation unter '.$base.'/docs/api/v1',
'',
'## Portale',
@ -111,6 +112,7 @@ class LlmsTxtController extends Controller
'- [Was kostet eine Pressemitteilung?]('.$base.'/de/was-kostet-eine-pressemitteilung): Abrechnungsmodelle, Prüfliste für Folgekosten, Rechenbeispiel',
'- [Pressemitteilung veröffentlichen ohne Abo]('.$base.'/de/pressemitteilung-veroeffentlichen-ohne-abo)',
'- [Pressemitteilung löschen oder ändern lassen]('.$base.'/de/pressemitteilung-loeschen-oder-aendern-lassen): Korrektur, Änderung, DSGVO, Depublikation',
'- [Pressemitteilung kostenlos veröffentlichen?]('.$base.'/de/pressemitteilung-kostenlos-veroeffentlichen): Warum es hier keine kostenlose Einreichung gibt, was kostenlose Portale leisten',
'- [Was eine gute Pressemitteilung ausmacht]('.$base.'/de/gute-pressemitteilung)',
'- [Hilfe]('.$base.'/de/hilfe)',
'- [API]('.$base.'/de/api): Einlieferung per REST-API über den Publisher-Bereich '.$hub,

View file

@ -26,14 +26,14 @@ class SitemapController extends Controller
/** @var list<string> */
private const HUB_PAGES = [
'faq', 'hilfe', 'gute-pressemitteilung', 'api', 'kuendigung',
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen',
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen', 'pressemitteilung-kostenlos-veroeffentlichen',
'impressum', 'datenschutz', 'agb', 'richtlinien', 'melden',
];
/** @var list<string> */
private const PORTAL_PAGES = [
'preise', 'veroeffentlichen', 'newsrooms', 'faq', 'hilfe', 'gute-pressemitteilung', 'api',
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen',
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen', 'pressemitteilung-kostenlos-veroeffentlichen',
'impressum', 'datenschutz', 'agb', 'richtlinien', 'melden',
];

View file

@ -8,7 +8,7 @@ use Illuminate\Contracts\View\View;
use Illuminate\Http\Request;
/**
* Transparenzseiten (Roadmap 2.4): drei Seiten mit unterschiedlicher
* Transparenzseiten (Roadmap 2.4): vier Seiten mit unterschiedlicher
* Suchintention, alle mit denselben Zahlen aus PricingTransparencyData.
*/
class TransparencyPageController extends Controller
@ -28,6 +28,11 @@ class TransparencyPageController extends Controller
return view('web.pressemitteilung-loeschen-oder-aendern-lassen', $this->pageData($request, $data));
}
public function free(Request $request, PricingTransparencyData $data): View
{
return view('web.pressemitteilung-kostenlos-veroeffentlichen', $this->pageData($request, $data));
}
/**
* Markenname aus dem Host (wie /melden) — der Theme-Provider ist in
* Tests noch nicht auf den Request-Host gelaufen.

View file

@ -44,6 +44,12 @@ class PressReleasePublished extends Mailable
public readonly PressRelease $pressRelease,
?string $recipientName = null,
?string $recipientEmail = null,
/**
* Über einen Verteiler (API) eingegangen: dann erklärt die Mail den
* Unterschied Erstquelle/Kopie (Roadmap 1d, Anhang 17.09.2026) —
* eine technische Tatsache, kein Angebot.
*/
public readonly bool $viaSyndication = false,
) {
$this->recipientName = $recipientName ?? $user->name;
$this->showUrl = self::tagged(

View file

@ -799,7 +799,7 @@ class PressReleaseService
}
$mailable = match ($event) {
'published' => new PressReleasePublished($user, $pressRelease, $recipientName, $recipient),
'published' => new PressReleasePublished($user, $pressRelease, $recipientName, $recipient, $isApiSubmitter),
'held' => new PressReleaseHeldForReview($user, $pressRelease, $automationExhausted, $recipientName, $recipient),
default => new PressReleaseRejected($user, $pressRelease, $reason, $recipientName, $recipient),
};