-- PHASE 58: menu de IVR (autoria por cima do dialplan genérico) CREATE TABLE "ivr_menus" ( "id" UUID NOT NULL, "tenant_id" UUID NOT NULL, "name" TEXT NOT NULL, "context" TEXT NOT NULL, "greeting" TEXT, "enabled" BOOLEAN NOT NULL DEFAULT true, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, "deleted_at" TIMESTAMP(3), CONSTRAINT "ivr_menus_pkey" PRIMARY KEY ("id") ); CREATE TABLE "ivr_menu_options" ( "id" UUID NOT NULL, "tenant_id" UUID NOT NULL, "ivr_menu_id" UUID NOT NULL, "digit" TEXT NOT NULL, "destination_number" TEXT NOT NULL, "destination_context" TEXT NOT NULL DEFAULT 'default', "label" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "ivr_menu_options_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE INDEX "ivr_menus_tenant_id_idx" ON "ivr_menus"("tenant_id"); CREATE UNIQUE INDEX "ivr_menus_tenant_id_context_key" ON "ivr_menus"("tenant_id", "context"); CREATE INDEX "ivr_menu_options_tenant_id_idx" ON "ivr_menu_options"("tenant_id"); CREATE UNIQUE INDEX "ivr_menu_options_ivr_menu_id_digit_key" ON "ivr_menu_options"("ivr_menu_id", "digit"); -- AddForeignKey ALTER TABLE "ivr_menus" ADD CONSTRAINT "ivr_menus_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "ivr_menu_options" ADD CONSTRAINT "ivr_menu_options_tenant_id_fkey" FOREIGN KEY ("tenant_id") REFERENCES "tenants"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "ivr_menu_options" ADD CONSTRAINT "ivr_menu_options_ivr_menu_id_fkey" FOREIGN KEY ("ivr_menu_id") REFERENCES "ivr_menus"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- Tabelas de negocio tenant-scoped: RLS obrigatorio (ver docs/TENANT_ISOLATION.md). ALTER TABLE "ivr_menus" ENABLE ROW LEVEL SECURITY; ALTER TABLE "ivr_menus" FORCE ROW LEVEL SECURITY; CREATE POLICY "tenant_isolation" ON "ivr_menus" USING (tenant_id = NULLIF(current_setting('app.current_tenant_id', true), '')::uuid); ALTER TABLE "ivr_menu_options" ENABLE ROW LEVEL SECURITY; ALTER TABLE "ivr_menu_options" FORCE ROW LEVEL SECURITY; CREATE POLICY "tenant_isolation" ON "ivr_menu_options" USING (tenant_id = NULLIF(current_setting('app.current_tenant_id', true), '')::uuid);