Ablehnungskategorien live aus der DB (rejection_categories)

/richtlinien rendert jetzt alle aktiven Kategorien aus der neuen
rejection_categories-Tabelle (stabiler code als Anker, public_label/desc,
optionale Beispiele) statt der statischen K1-K6-Liste. Kategorien werden
nie geloescht, nur deaktiviert; neue Kategorien erscheinen ohne
Textaenderung und ohne neue AGB-Version (AGB par. 7 Abs. 3 verweist nicht
abschliessend). Seeder legt K1-K6 idempotent an; Versionszeile der Seite
kommt aus legal_documents. Go-Live-Checkliste um beide Seeder ergaenzt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-06 09:25:16 +00:00
parent 196f83a377
commit c54c6943b7
8 changed files with 213 additions and 18 deletions

View file

@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Ablehnungskategorien (Rechtstexte-Architektur E3, Richtlinien v0.1):
* Die öffentliche Richtlinien-Seite rendert alle aktiven Kategorien live;
* Ablehnungs-Mails referenzieren den stabilen `code` (AGB § 7 Abs. 3).
* Kategorien werden nie gelöscht, nur deaktiviert — Ablehnungen der
* Vergangenheit müssen referenzierbar bleiben.
*/
return new class extends Migration
{
public function up(): void
{
Schema::create('rejection_categories', function (Blueprint $table) {
$table->id();
$table->string('code', 20)->unique(); // z. B. "K1", stabil
$table->string('public_label');
$table->text('public_desc');
$table->text('examples')->nullable(); // optional, öffentlich
$table->string('severity', 20)->default('rot'); // rot | gelb_hinweis
$table->string('rubric_ref', 80)->nullable(); // interne Rubrik, nie öffentlich
$table->boolean('active')->default(true);
$table->unsignedInteger('sort_order')->default(0);
$table->timestamps();
$table->index(['active', 'sort_order']);
});
}
public function down(): void
{
Schema::dropIfExists('rejection_categories');
}
};