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>
75 lines
2.1 KiB
PHP
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');
|
|
}
|
|
}
|