- number-поля теперь рендерятся как text + inputMode=numeric, чтобы браузер не округлял значения через input type=number - пробелы при вставке в number-поля удаляются - бэкенд нормализует значения number-полей в строку перед сохранением - добавлен хелпер normalizeFieldValueForStorage Closes: искажение расчётного счёта и других длинных числовых полей
31 lines
1.2 KiB
SQL
31 lines
1.2 KiB
SQL
-- User statuses per organization
|
|
CREATE TABLE IF NOT EXISTS "user_statuses" (
|
|
"id" SERIAL PRIMARY KEY,
|
|
"organization_id" INTEGER NOT NULL REFERENCES "organizations"("id") ON DELETE CASCADE,
|
|
"name" VARCHAR(100) NOT NULL,
|
|
"color" VARCHAR(7) DEFAULT '#e5e7eb',
|
|
"is_default" BOOLEAN DEFAULT FALSE,
|
|
"position" INTEGER DEFAULT 0,
|
|
"created_at" TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS "idx_user_statuses_organization_id" ON "user_statuses"("organization_id");
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "idx_user_statuses_organization_default" ON "user_statuses"("organization_id") WHERE "is_default" = TRUE;
|
|
|
|
ALTER TABLE "users" ADD COLUMN IF NOT EXISTS "status_id" INTEGER REFERENCES "user_statuses"("id") ON DELETE SET NULL;
|
|
CREATE INDEX IF NOT EXISTS "idx_users_status_id" ON "users"("status_id");
|
|
|
|
-- Backfill default status for existing organizations
|
|
INSERT INTO "user_statuses" ("organization_id", "name", "color", "is_default", "position")
|
|
SELECT id, 'Зарегистрирован', '#e5e7eb', TRUE, 0
|
|
FROM "organizations"
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
UPDATE "users" u
|
|
SET "status_id" = (
|
|
SELECT s.id FROM "user_statuses" s
|
|
WHERE s.organization_id = u.organization_id AND s.is_default = TRUE
|
|
LIMIT 1
|
|
)
|
|
WHERE u.status_id IS NULL;
|