Configuring access rights in the CRM Super Admin

This commit is contained in:
2026-09-20 11:24:14 +03:30
parent 04d37a9d12
commit 4a9fe0b07c
29 changed files with 1235 additions and 35 deletions
@@ -0,0 +1,64 @@
-- AlterTable
ALTER TABLE "Organization" ADD COLUMN IF NOT EXISTS "enabledModules" TEXT[] DEFAULT ARRAY[]::TEXT[];
-- CreateTable
CREATE TABLE IF NOT EXISTS "BillingAccount" (
"id" TEXT NOT NULL,
"ownerUserId" TEXT NOT NULL,
"planCode" TEXT NOT NULL DEFAULT 'trial',
"status" TEXT NOT NULL DEFAULT 'active',
"startsAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"expiresAt" TIMESTAMP(3) NOT NULL,
"maxOrganizations" INTEGER NOT NULL DEFAULT 1,
"externalPaymentRef" TEXT,
"notes" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "BillingAccount_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX IF NOT EXISTS "BillingAccount_ownerUserId_key" ON "BillingAccount"("ownerUserId");
CREATE INDEX IF NOT EXISTS "BillingAccount_status_idx" ON "BillingAccount"("status");
CREATE INDEX IF NOT EXISTS "BillingAccount_expiresAt_idx" ON "BillingAccount"("expiresAt");
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint WHERE conname = 'BillingAccount_ownerUserId_fkey'
) THEN
ALTER TABLE "BillingAccount"
ADD CONSTRAINT "BillingAccount_ownerUserId_fkey"
FOREIGN KEY ("ownerUserId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
END IF;
END $$;
-- Backfill: full module catalog for existing orgs (empty → all)
UPDATE "Organization"
SET "enabledModules" = ARRAY[
'customers','pipeline','products','invoices','quotes','commissions','sales_forecast',
'activities','tickets','workflow_automations','message_automations','lead_forms',
'project_boards','inventory','cheques','attachments','loyalty','reports','notes',
'tahesab','custom_fields','currencies','team_settings','faq'
]::TEXT[]
WHERE cardinality("enabledModules") = 0;
-- Backfill BillingAccount for every active owner membership (15-day trial)
INSERT INTO "BillingAccount" (
"id", "ownerUserId", "planCode", "status", "startsAt", "expiresAt",
"maxOrganizations", "createdAt", "updatedAt"
)
SELECT
md5(random()::text || clock_timestamp()::text || m."userId"),
m."userId",
'trial',
'active',
NOW(),
NOW() + INTERVAL '15 days',
GREATEST(1, COUNT(*)::int),
NOW(),
NOW()
FROM "Membership" m
WHERE m."role" = 'owner' AND m."isActive" = true
GROUP BY m."userId"
ON CONFLICT ("ownerUserId") DO NOTHING;