Files
alla-tms/drizzle/0003_unify_users_training.sql
2026-07-16 09:53:14 +07:00

104 lines
3.6 KiB
SQL

ALTER TABLE "users" ADD COLUMN "employee_code" text;--> statement-breakpoint
ALTER TABLE "users" ADD COLUMN "department_id" integer;--> statement-breakpoint
ALTER TABLE "users" ADD COLUMN "position_id" integer;--> statement-breakpoint
ALTER TABLE "users" ADD COLUMN "company_name" text;--> statement-breakpoint
ALTER TABLE "users" ADD COLUMN "hired_at" timestamp with time zone;--> statement-breakpoint
ALTER TABLE "training_records" ADD COLUMN "user_id" text;--> statement-breakpoint
UPDATE "users" AS "u"
SET
"employee_code" = "e"."employee_code",
"department_id" = "e"."department_id",
"position_id" = "e"."position_id",
"company_name" = COALESCE("e"."company", "o"."name"),
"hired_at" = "e"."hired_at",
"updated_at" = NOW()
FROM "employees" AS "e"
INNER JOIN "organizations" AS "o" ON "o"."id" = "e"."organization_id"
WHERE "u"."email" IS NOT NULL
AND "e"."email" IS NOT NULL
AND LOWER("u"."email") = LOWER("e"."email");--> statement-breakpoint
INSERT INTO "users" (
"id",
"name",
"email",
"password_hash",
"system_role",
"is_active",
"employee_code",
"department_id",
"position_id",
"company_name",
"hired_at",
"active_organization_id"
)
SELECT
CONCAT('legacy-employee-', "e"."id", '-', "e"."organization_id") AS "id",
"e"."full_name",
COALESCE(LOWER("e"."email"), CONCAT('employee-', "e"."id", '@training-system.local')),
'$2b$10$sl8.hKi0l/KXnouzGgiRvOpNgZ9TT8RFvdPjQbgxCV5WirdWv1uBq',
'standard',
false,
"e"."employee_code",
"e"."department_id",
"e"."position_id",
COALESCE("e"."company", "o"."name"),
"e"."hired_at",
"e"."organization_id"
FROM "employees" AS "e"
INNER JOIN "organizations" AS "o" ON "o"."id" = "e"."organization_id"
LEFT JOIN "users" AS "u"
ON (
("e"."email" IS NOT NULL AND LOWER("u"."email") = LOWER("e"."email"))
OR ("u"."employee_code" IS NOT NULL AND "u"."employee_code" = "e"."employee_code")
)
WHERE "u"."id" IS NULL;--> statement-breakpoint
INSERT INTO "memberships" (
"id",
"user_id",
"organization_id",
"role",
"permissions"
)
SELECT
CONCAT('legacy-membership-', "e"."id", '-', "e"."organization_id"),
CONCAT('legacy-employee-', "e"."id", '-', "e"."organization_id"),
"e"."organization_id",
'member',
ARRAY['products:read']::text[]
FROM "employees" AS "e"
LEFT JOIN "memberships" AS "m"
ON "m"."user_id" = CONCAT('legacy-employee-', "e"."id", '-', "e"."organization_id")
AND "m"."organization_id" = "e"."organization_id"
WHERE "m"."id" IS NULL
AND EXISTS (
SELECT 1
FROM "users" AS "u"
WHERE "u"."id" = CONCAT('legacy-employee-', "e"."id", '-', "e"."organization_id")
);--> statement-breakpoint
UPDATE "training_records" AS "tr"
SET "user_id" = COALESCE(
(
SELECT "u"."id"
FROM "users" AS "u"
INNER JOIN "employees" AS "e" ON LOWER("u"."email") = LOWER("e"."email")
WHERE "e"."id" = "tr"."employee_id"
LIMIT 1
),
CONCAT(
'legacy-employee-',
"tr"."employee_id",
'-',
"tr"."organization_id"
)
)
WHERE "tr"."user_id" IS NULL;--> statement-breakpoint
ALTER TABLE "training_records" ALTER COLUMN "user_id" SET NOT NULL;--> statement-breakpoint
ALTER TABLE "training_records" ADD CONSTRAINT "training_records_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "training_records" DROP CONSTRAINT "training_records_employee_id_employees_id_fk";--> statement-breakpoint
ALTER TABLE "training_records" ADD CONSTRAINT "training_records_employee_id_employees_id_fk" FOREIGN KEY ("employee_id") REFERENCES "public"."employees"("id") ON DELETE set null ON UPDATE no action;