-- CreateTable CREATE TABLE "ActivityBoard" ( "id" TEXT NOT NULL, "organizationId" TEXT NOT NULL, "name" TEXT NOT NULL, "isDefault" BOOLEAN NOT NULL DEFAULT false, "position" INTEGER NOT NULL DEFAULT 0, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL, CONSTRAINT "ActivityBoard_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "ActivityBoard_organizationId_name_key" ON "ActivityBoard"("organizationId", "name"); -- CreateIndex CREATE INDEX "ActivityBoard_organizationId_position_idx" ON "ActivityBoard"("organizationId", "position"); -- AddForeignKey ALTER TABLE "ActivityBoard" ADD CONSTRAINT "ActivityBoard_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "Organization"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- Backfill: one default board per organization that already has activity stages INSERT INTO "ActivityBoard" ("id", "organizationId", "name", "isDefault", "position", "createdAt", "updatedAt") SELECT 'actb_' || md5(s."organizationId" || clock_timestamp()::text), s."organizationId", 'کارهای اصلی', true, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP FROM (SELECT DISTINCT "organizationId" FROM "ActivityStage") AS s; -- AlterTable: stages belong to a board ALTER TABLE "ActivityStage" ADD COLUMN "boardId" TEXT; UPDATE "ActivityStage" AS st SET "boardId" = b."id" FROM "ActivityBoard" AS b WHERE b."organizationId" = st."organizationId" AND b."isDefault" = true; ALTER TABLE "ActivityStage" ALTER COLUMN "boardId" SET NOT NULL; -- Stage names are unique per board (not per organization) DROP INDEX "ActivityStage_organizationId_name_key"; -- CreateIndex CREATE UNIQUE INDEX "ActivityStage_boardId_name_key" ON "ActivityStage"("boardId", "name"); -- CreateIndex CREATE INDEX "ActivityStage_boardId_position_idx" ON "ActivityStage"("boardId", "position"); -- AddForeignKey ALTER TABLE "ActivityStage" ADD CONSTRAINT "ActivityStage_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "ActivityBoard"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AlterTable: activities optionally point at a board (null = default board) ALTER TABLE "Activity" ADD COLUMN "boardId" TEXT; -- CreateIndex CREATE INDEX "Activity_boardId_idx" ON "Activity"("boardId"); -- AddForeignKey ALTER TABLE "Activity" ADD CONSTRAINT "Activity_boardId_fkey" FOREIGN KEY ("boardId") REFERENCES "ActivityBoard"("id") ON DELETE SET NULL ON UPDATE CASCADE;