-- Отчёты админки: задание, его этапы и готовый файл. Исходный файл не храним — -- после обработки он не нужен. Результат сопоставления номеров содержит телефоны пациентов -- (персональные данные), поэтому готовые отчёты хранятся 30 дней и удаляются. CREATE TABLE reports ( id bigserial PRIMARY KEY, kind text NOT NULL CHECK (kind IN ('phone_match', 'doctors', 'leads_summary')), title text NOT NULL, status text NOT NULL DEFAULT 'running' CHECK (status IN ('running', 'done', 'failed', 'cancelled')), stage int NOT NULL DEFAULT 0, -- номер текущего этапа, 0..4 progress int NOT NULL DEFAULT 0, -- 0..100 stages jsonb NOT NULL DEFAULT '[]', -- длительность завершённых этапов, мс source_name text NOT NULL DEFAULT '', source_size bigint NOT NULL DEFAULT 0, summary jsonb NOT NULL DEFAULT '{}', -- итоги: сколько совпало, отличается и т. п. result bytea, result_name text NOT NULL DEFAULT '', error text NOT NULL DEFAULT '', admin_id bigint REFERENCES admin_users (id) ON DELETE SET NULL, created_at timestamptz NOT NULL DEFAULT now(), finished_at timestamptz ); CREATE INDEX reports_created_idx ON reports (created_at DESC);