- Datenmodell: Testphasen-Lebenszyklus am Mandanten (plan, trialEndsAt, readOnlySince, deletionDueAt, Versandmarker), TrialSignup (Plattform, Hashes statt Klartext), TenantExport (RLS), Onboarding-Status - /testen: 5-Schritte-Wizard (Betrieb, Admin-Konto, Enddatum, Einrichtung, Zusammenfassung), Bestätigung per POST, direkte Anmeldung über login-ticket; Rate-Limit je IP/E-Mail, Honeypot, Enumeration-Schutz, Slug-Kollisionen - Plattform: Wizard „Testmandant anlegen“ mit Einladung, Badges/Filter, Enddatum ändern, umwandeln, beenden, Löschung vormerken/abbrechen (Bestätigung + Audit) - Schreibsperre nach Ablauf zentral in moduleGuard und requireApiContext (non-GET über withApi), Upload-Routen, Einstellungen/Nutzerverwaltung, Worker-Jobs; Banner Backoffice + mobil - Datenexport (ZIP mit CSV/JSON + Dateien) als Worker-Job, auch im Nur-Lesen-Zustand - Täglicher Job trial-lifecycle: Erinnerungen 7/3/1, Ablauf, Löschhinweis, Löschung über das Offboarding - Erste-Schritte-Checkliste im Dashboard, Mail-Vorlagen de/en, Tests + Smoke, Betriebsdoku Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
84 lines
2.8 KiB
SQL
84 lines
2.8 KiB
SQL
-- 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');
|