import { MigrateUpArgs, MigrateDownArgs, sql } from "@payloadcms/db-postgres"; export async function up({ db, payload, req }: MigrateUpArgs): Promise { await db.execute(sql` CREATE TYPE "public"."enum_crm_topics_status" AS ENUM('active', 'paused', 'won', 'lost'); CREATE TYPE "public"."enum_crm_topics_stage" AS ENUM('discovery', 'proposal', 'negotiation', 'implementation'); CREATE TYPE "public"."enum_projects_milestones_status" AS ENUM('todo', 'in_progress', 'done'); CREATE TYPE "public"."enum_projects_milestones_priority" AS ENUM('low', 'medium', 'high'); CREATE TYPE "public"."enum_projects_status" AS ENUM('draft', 'in_progress', 'review', 'completed'); ALTER TYPE "public"."enum_crm_accounts_status" ADD VALUE 'partner' BEFORE 'lost'; ALTER TYPE "public"."enum_crm_interactions_type" ADD VALUE 'whatsapp' BEFORE 'note'; ALTER TYPE "public"."enum_crm_interactions_type" ADD VALUE 'social' BEFORE 'note'; ALTER TYPE "public"."enum_crm_interactions_type" ADD VALUE 'document' BEFORE 'note'; CREATE TABLE "crm_topics" ( "id" serial PRIMARY KEY NOT NULL, "title" varchar NOT NULL, "account_id" integer NOT NULL, "status" "enum_crm_topics_status" DEFAULT 'active' NOT NULL, "stage" "enum_crm_topics_stage", "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL ); CREATE TABLE "crm_interactions_rels" ( "id" serial PRIMARY KEY NOT NULL, "order" integer, "parent_id" integer NOT NULL, "path" varchar NOT NULL, "media_id" integer ); CREATE TABLE "projects_milestones" ( "_order" integer NOT NULL, "_parent_id" integer NOT NULL, "id" varchar PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "status" "enum_projects_milestones_status" DEFAULT 'todo' NOT NULL, "priority" "enum_projects_milestones_priority" DEFAULT 'medium', "start_date" timestamp(3) with time zone, "target_date" timestamp(3) with time zone, "assignee_id" integer ); CREATE TABLE "projects" ( "id" serial PRIMARY KEY NOT NULL, "title" varchar NOT NULL, "account_id" integer NOT NULL, "status" "enum_projects_status" DEFAULT 'draft' NOT NULL, "start_date" timestamp(3) with time zone, "target_date" timestamp(3) with time zone, "value_min" numeric, "value_max" numeric, "briefing" jsonb, "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL ); CREATE TABLE "projects_rels" ( "id" serial PRIMARY KEY NOT NULL, "order" integer, "parent_id" integer NOT NULL, "path" varchar NOT NULL, "crm_contacts_id" integer, "media_id" integer ); ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DEFAULT 'note'; ALTER TABLE "inquiries" ADD COLUMN "processed" boolean DEFAULT false; ALTER TABLE "crm_contacts" ADD COLUMN "full_name" varchar; ALTER TABLE "crm_interactions" ADD COLUMN "topic_id" integer; ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "crm_topics_id" integer; ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "projects_id" integer; ALTER TABLE "crm_topics" ADD CONSTRAINT "crm_topics_account_id_crm_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "public"."crm_accounts"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "crm_interactions_rels" ADD CONSTRAINT "crm_interactions_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."crm_interactions"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "crm_interactions_rels" ADD CONSTRAINT "crm_interactions_rels_media_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "projects_milestones" ADD CONSTRAINT "projects_milestones_assignee_id_users_id_fk" FOREIGN KEY ("assignee_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "projects_milestones" ADD CONSTRAINT "projects_milestones_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "projects" ADD CONSTRAINT "projects_account_id_crm_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "public"."crm_accounts"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "projects_rels" ADD CONSTRAINT "projects_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "projects_rels" ADD CONSTRAINT "projects_rels_crm_contacts_fk" FOREIGN KEY ("crm_contacts_id") REFERENCES "public"."crm_contacts"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "projects_rels" ADD CONSTRAINT "projects_rels_media_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action; CREATE INDEX "crm_topics_account_idx" ON "crm_topics" USING btree ("account_id"); CREATE INDEX "crm_topics_updated_at_idx" ON "crm_topics" USING btree ("updated_at"); CREATE INDEX "crm_topics_created_at_idx" ON "crm_topics" USING btree ("created_at"); CREATE INDEX "crm_interactions_rels_order_idx" ON "crm_interactions_rels" USING btree ("order"); CREATE INDEX "crm_interactions_rels_parent_idx" ON "crm_interactions_rels" USING btree ("parent_id"); CREATE INDEX "crm_interactions_rels_path_idx" ON "crm_interactions_rels" USING btree ("path"); CREATE INDEX "crm_interactions_rels_media_id_idx" ON "crm_interactions_rels" USING btree ("media_id"); CREATE INDEX "projects_milestones_order_idx" ON "projects_milestones" USING btree ("_order"); CREATE INDEX "projects_milestones_parent_id_idx" ON "projects_milestones" USING btree ("_parent_id"); CREATE INDEX "projects_milestones_assignee_idx" ON "projects_milestones" USING btree ("assignee_id"); CREATE INDEX "projects_account_idx" ON "projects" USING btree ("account_id"); CREATE INDEX "projects_updated_at_idx" ON "projects" USING btree ("updated_at"); CREATE INDEX "projects_created_at_idx" ON "projects" USING btree ("created_at"); CREATE INDEX "projects_rels_order_idx" ON "projects_rels" USING btree ("order"); CREATE INDEX "projects_rels_parent_idx" ON "projects_rels" USING btree ("parent_id"); CREATE INDEX "projects_rels_path_idx" ON "projects_rels" USING btree ("path"); CREATE INDEX "projects_rels_crm_contacts_id_idx" ON "projects_rels" USING btree ("crm_contacts_id"); CREATE INDEX "projects_rels_media_id_idx" ON "projects_rels" USING btree ("media_id"); ALTER TABLE "crm_interactions" ADD CONSTRAINT "crm_interactions_topic_id_crm_topics_id_fk" FOREIGN KEY ("topic_id") REFERENCES "public"."crm_topics"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_crm_topics_fk" FOREIGN KEY ("crm_topics_id") REFERENCES "public"."crm_topics"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_projects_fk" FOREIGN KEY ("projects_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action; CREATE INDEX "crm_interactions_topic_idx" ON "crm_interactions" USING btree ("topic_id"); CREATE INDEX "payload_locked_documents_rels_crm_topics_id_idx" ON "payload_locked_documents_rels" USING btree ("crm_topics_id"); CREATE INDEX "payload_locked_documents_rels_projects_id_idx" ON "payload_locked_documents_rels" USING btree ("projects_id");`); } export async function down({ db, payload, req, }: MigrateDownArgs): Promise { await db.execute(sql` ALTER TABLE "crm_topics" DISABLE ROW LEVEL SECURITY; ALTER TABLE "crm_interactions_rels" DISABLE ROW LEVEL SECURITY; ALTER TABLE "projects_milestones" DISABLE ROW LEVEL SECURITY; ALTER TABLE "projects" DISABLE ROW LEVEL SECURITY; ALTER TABLE "projects_rels" DISABLE ROW LEVEL SECURITY; DROP TABLE "crm_topics" CASCADE; DROP TABLE "crm_interactions_rels" CASCADE; DROP TABLE "projects_milestones" CASCADE; DROP TABLE "projects" CASCADE; DROP TABLE "projects_rels" CASCADE; ALTER TABLE "crm_interactions" DROP CONSTRAINT "crm_interactions_topic_id_crm_topics_id_fk"; ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_crm_topics_fk"; ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_projects_fk"; ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DATA TYPE text; ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DEFAULT 'lead'::text; DROP TYPE "public"."enum_crm_accounts_status"; CREATE TYPE "public"."enum_crm_accounts_status" AS ENUM('lead', 'client', 'lost'); ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DEFAULT 'lead'::"public"."enum_crm_accounts_status"; ALTER TABLE "crm_accounts" ALTER COLUMN "status" SET DATA TYPE "public"."enum_crm_accounts_status" USING "status"::"public"."enum_crm_accounts_status"; ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DATA TYPE text; ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DEFAULT 'email'::text; DROP TYPE "public"."enum_crm_interactions_type"; CREATE TYPE "public"."enum_crm_interactions_type" AS ENUM('email', 'call', 'meeting', 'note'); ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DEFAULT 'email'::"public"."enum_crm_interactions_type"; ALTER TABLE "crm_interactions" ALTER COLUMN "type" SET DATA TYPE "public"."enum_crm_interactions_type" USING "type"::"public"."enum_crm_interactions_type"; DROP INDEX "crm_interactions_topic_idx"; DROP INDEX "payload_locked_documents_rels_crm_topics_id_idx"; DROP INDEX "payload_locked_documents_rels_projects_id_idx"; ALTER TABLE "inquiries" DROP COLUMN "processed"; ALTER TABLE "crm_contacts" DROP COLUMN "full_name"; ALTER TABLE "crm_interactions" DROP COLUMN "topic_id"; ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "crm_topics_id"; ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "projects_id"; DROP TYPE "public"."enum_crm_topics_status"; DROP TYPE "public"."enum_crm_topics_stage"; DROP TYPE "public"."enum_projects_milestones_status"; DROP TYPE "public"."enum_projects_milestones_priority"; DROP TYPE "public"."enum_projects_status";`); }