Merge lane/testphase in feature/craftvia-mvp

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

# Conflicts:
#	prisma/schema.prisma
#	scripts/test-e2e-tenant-isolation.ts
#	src/server/backup/topology.ts
#	src/server/db.ts
#	src/server/dsgvo/pii-fields.ts
This commit is contained in:
2026-09-15 19:16:19 +02:00
83 changed files with 4703 additions and 23 deletions
@@ -0,0 +1,83 @@
-- L15 Testphase & Onboarding: Testphasen-Lebenszyklus am Mandanten, Onboarding-Checkliste,
-- Selbstanmeldungen (Plattform-Tabelle, ohne RLS) und Mandanten-Datenexporte (RLS).
-- CreateEnum
CREATE TYPE "TenantPlan" AS ENUM ('FULL', 'TRIAL');
-- AlterTable
ALTER TABLE "tenant_settings" ADD COLUMN "onboarding" JSONB NOT NULL DEFAULT '{}';
-- AlterTable
ALTER TABLE "tenants" ADD COLUMN "converted_at" TIMESTAMP(3),
ADD COLUMN "deletion_due_at" TIMESTAMP(3),
ADD COLUMN "plan" "TenantPlan" NOT NULL DEFAULT 'FULL',
ADD COLUMN "read_only_since" TIMESTAMP(3),
ADD COLUMN "trial_deleted_at" TIMESTAMP(3),
ADD COLUMN "trial_deletion_notice_at" TIMESTAMP(3),
ADD COLUMN "trial_ends_at" TIMESTAMP(3),
ADD COLUMN "trial_expired_notice_at" TIMESTAMP(3),
ADD COLUMN "trial_reminder_1_at" TIMESTAMP(3),
ADD COLUMN "trial_reminder_3_at" TIMESTAMP(3),
ADD COLUMN "trial_reminder_7_at" TIMESTAMP(3),
ADD COLUMN "trial_source" TEXT,
ADD COLUMN "trial_started_at" TIMESTAMP(3);
-- CreateTable
CREATE TABLE "trial_signups" (
"id" TEXT NOT NULL,
"status" TEXT NOT NULL DEFAULT 'pending',
"company_name" TEXT NOT NULL,
"sector" TEXT,
"company_size" TEXT,
"admin_name" TEXT NOT NULL,
"email" TEXT NOT NULL,
"password_hash" TEXT NOT NULL,
"trial_end_date" TEXT NOT NULL,
"sample_data" BOOLEAN NOT NULL DEFAULT true,
"modules" TEXT[] DEFAULT ARRAY[]::TEXT[],
"locale" TEXT NOT NULL DEFAULT 'de',
"token_hash" TEXT NOT NULL,
"expires_at" TIMESTAMP(3) NOT NULL,
"ip_hash" TEXT,
"accepted_terms_at" TIMESTAMP(3) NOT NULL,
"confirmed_at" TIMESTAMP(3),
"provisioned_tenant_id" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "trial_signups_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "tenant_exports" (
"id" TEXT NOT NULL,
"tenant_id" TEXT NOT NULL,
"requested_by_id" TEXT,
"status" TEXT NOT NULL DEFAULT 'queued',
"storage_key" TEXT,
"file_name" TEXT,
"bytes" INTEGER,
"summary" JSONB,
"error" TEXT,
"expires_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "tenant_exports_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "trial_signups_token_hash_key" ON "trial_signups"("token_hash");
-- CreateIndex
CREATE INDEX "trial_signups_email_idx" ON "trial_signups"("email");
-- CreateIndex
CREATE INDEX "trial_signups_status_expires_at_idx" ON "trial_signups"("status", "expires_at");
-- CreateIndex
CREATE INDEX "tenant_exports_tenant_id_created_at_idx" ON "tenant_exports"("tenant_id", "created_at");
-- Mandanten-Tabelle: Row Level Security (docs/craftvia/MIGRATIONS.md)
SELECT enable_tenant_rls('tenant_exports');