presseportale/app/Models/LegalDocument.php
Kevin Adametz 7510e7633e E3: Rechtstext-Versionierung in der DB (legal_documents)
Jede veroeffentlichte Fassung eines Rechtstexts ist eine Zeile mit
type/version/effective_from — alte Fassungen sind unloeschbar, zukuenftige
werden erst ab Stichtag wirksam (LegalDocument::current). Seeder legt die
fuenf aktuellen Fassungen an (AGB 0.6, Datenschutz 0.3, Richtlinien 0.1,
Meldeverfahren 0.1, Impressum 0.1). Die Unternehmer-Bestaetigung (T1neu)
referenziert jetzt die konkrete Fassung (legal_document_id am
Buchungsdatensatz, restrictOnDelete); AGB-Seite und Buchungs-Modal ziehen
Version/Stand aus der DB. config/legal.php bleibt reiner Fallback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 09:21:52 +00:00

75 lines
2.1 KiB
PHP

<?php
namespace App\Models;
use Database\Factories\LegalDocumentFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
/**
* Veröffentlichte Fassung eines Rechtstexts (E3-Versionierung).
*
* Fassungen werden nie gelöscht oder überschrieben — eine neue Fassung ist
* eine neue Zeile mit späterem `effective_from`. `current()` liefert die
* heute gültige Fassung; config/legal.php bleibt Fallback für Umgebungen,
* in denen der Seeder (noch) nicht gelaufen ist.
*/
class LegalDocument extends Model
{
/** @use HasFactory<LegalDocumentFactory> */
use HasFactory;
public const TYPE_AGB = 'agb';
public const TYPE_DATENSCHUTZ = 'datenschutz';
public const TYPE_RICHTLINIEN = 'richtlinien';
public const TYPE_MELDEVERFAHREN = 'meldeverfahren';
public const TYPE_IMPRESSUM = 'impressum';
protected $fillable = [
'type',
'version',
'effective_from',
'note',
];
protected function casts(): array
{
return [
'effective_from' => 'date',
];
}
/**
* Die heute gültige Fassung eines Rechtstexts (jüngstes effective_from
* in der Vergangenheit; zukünftige Fassungen zählen noch nicht).
*/
public static function current(string $type): ?self
{
return static::query()
->where('type', $type)
->where('effective_from', '<=', today())
->orderByDesc('effective_from')
->orderByDesc('id')
->first();
}
/**
* Versionsstring der gültigen AGB-Fassung — mit config/legal.php als
* Fallback (Übergangslösung, bis der Seeder überall gelaufen ist).
*/
public static function currentAgbVersion(): string
{
return static::current(self::TYPE_AGB)?->version
?? (string) config('legal.agb_version');
}
public function effectiveFromFormatted(): string
{
return Carbon::parse($this->effective_from)->locale('de')->isoFormat('D. MMMM YYYY');
}
}