Files
iistwin/migrations/0001_sync_missing_columns.sql
Ильяс Султанов 1f5ecb6da4 fix(number-fields): избегаем потери точности длинных чисел
- number-поля теперь рендерятся как text + inputMode=numeric,
  чтобы браузер не округлял значения через input type=number
- пробелы при вставке в number-поля удаляются
- бэкенд нормализует значения number-полей в строку перед сохранением
- добавлен хелпер normalizeFieldValueForStorage

Closes: искажение расчётного счёта и других длинных числовых полей
2026-07-07 21:03:40 +03:00

94 lines
5.4 KiB
SQL

-- Idempotent column sync for existing databases
-- Adds columns that may be absent if the production DB was bootstrapped from an older schema.
-- Safe to run multiple times: all statements use ADD COLUMN IF NOT EXISTS.
-- ============================================================
-- forms table: columns added after initial deployment
-- ============================================================
ALTER TABLE forms ADD COLUMN IF NOT EXISTS chat_layout varchar(20) DEFAULT 'default';
ALTER TABLE forms ADD COLUMN IF NOT EXISTS chat_enabled boolean DEFAULT true;
ALTER TABLE forms ADD COLUMN IF NOT EXISTS system_fields_tab_id integer;
ALTER TABLE forms ADD COLUMN IF NOT EXISTS default_tab_id integer;
ALTER TABLE forms ADD COLUMN IF NOT EXISTS detail_layout_code text;
ALTER TABLE forms ADD COLUMN IF NOT EXISTS title_template text;
ALTER TABLE forms ADD COLUMN IF NOT EXISTS hidden_system_fields text[] DEFAULT '{}'::text[];
ALTER TABLE forms ADD COLUMN IF NOT EXISTS ai_summary text;
--> statement-breakpoint
-- ============================================================
-- organizations table: billing_blocked flag
-- ============================================================
ALTER TABLE organizations ADD COLUMN IF NOT EXISTS billing_blocked boolean DEFAULT false;
--> statement-breakpoint
-- ============================================================
-- tasks table: subtask and completion columns
-- ============================================================
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS is_completed boolean DEFAULT false;
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS completed_at timestamp;
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS due_date timestamp;
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS parent_task_id integer;
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS depth integer DEFAULT 0;
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS position integer DEFAULT 0;
ALTER TABLE tasks ADD COLUMN IF NOT EXISTS organization_id integer;
--> statement-breakpoint
-- ============================================================
-- form_tabs table: type column
-- ============================================================
ALTER TABLE form_tabs ADD COLUMN IF NOT EXISTS type varchar(20) DEFAULT 'fields';
ALTER TABLE form_tabs ADD COLUMN IF NOT EXISTS table_columns jsonb;
--> statement-breakpoint
-- ============================================================
-- form_statuses table: isFinal flag
-- ============================================================
ALTER TABLE form_statuses ADD COLUMN IF NOT EXISTS is_final boolean DEFAULT false;
--> statement-breakpoint
-- ============================================================
-- form_fields table: newer field type columns
-- ============================================================
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS tab_id integer;
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS button_action_type varchar(20);
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS button_url text;
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS button_form_id integer;
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS company_autofill jsonb;
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS task_relation_type varchar(10);
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS max_file_count integer;
ALTER TABLE form_fields ADD COLUMN IF NOT EXISTS max_file_size_mb integer;
--> statement-breakpoint
-- ============================================================
-- task_messages table: bot support columns
-- ============================================================
ALTER TABLE task_messages ADD COLUMN IF NOT EXISTS bot_id integer;
ALTER TABLE task_messages ADD COLUMN IF NOT EXISTS reply_to_message_id integer;
ALTER TABLE task_messages ADD COLUMN IF NOT EXISTS bot_buttons jsonb;
ALTER TABLE task_messages ADD COLUMN IF NOT EXISTS attachments jsonb;
--> statement-breakpoint
-- ============================================================
-- users table: password reset columns
-- ============================================================
ALTER TABLE users ADD COLUMN IF NOT EXISTS reset_password_token varchar(255);
ALTER TABLE users ADD COLUMN IF NOT EXISTS reset_password_expires timestamp;
--> statement-breakpoint
-- ============================================================
-- user_notifications table: message_id column
-- ============================================================
ALTER TABLE user_notifications ADD COLUMN IF NOT EXISTS message_id integer;
--> statement-breakpoint
-- ============================================================
-- Indexes that may be missing on existing installations
-- ============================================================
CREATE INDEX IF NOT EXISTS "users_org_role_idx" ON "users" USING btree ("organization_id", "role");
CREATE INDEX IF NOT EXISTS "tasks_org_id_form_id_idx" ON "tasks" USING btree ("organization_id", "form_id");
CREATE INDEX IF NOT EXISTS "tasks_org_id_status_idx" ON "tasks" USING btree ("organization_id", "current_status_id");
CREATE INDEX IF NOT EXISTS "tasks_org_id_assigned_idx" ON "tasks" USING btree ("organization_id", "assigned_to");
CREATE INDEX IF NOT EXISTS "task_messages_task_created_idx" ON "task_messages" USING btree ("task_id", "created_at" DESC);
CREATE INDEX IF NOT EXISTS "task_field_values_task_field_idx" ON "task_field_values" USING btree ("task_id", "field_id");
CREATE UNIQUE INDEX IF NOT EXISTS "one_initial_status_per_form" ON "form_statuses" ("form_id") WHERE (is_initial = true);