-- ============================================================================ -- Миграция 002: Добавление проверки соответствия документов -- ============================================================================ -- Цель: Хранить результат проверки AI — соответствует ли загруженный документ -- запрошенному типу (договор, чек, переписка и т.д.) -- ============================================================================ -- Добавляем колонки в clpr_claim_documents ALTER TABLE clpr_claim_documents ADD COLUMN IF NOT EXISTS document_type VARCHAR(50), -- ожидаемый тип: contract, payment, correspondence, evidence_photo ADD COLUMN IF NOT EXISTS document_label VARCHAR(255), -- читаемое название: "Договор или заказ" ADD COLUMN IF NOT EXISTS match_score INT, -- процент соответствия 0-100 ADD COLUMN IF NOT EXISTS match_status VARCHAR(20) DEFAULT 'pending', -- pending/passed/failed/skipped ADD COLUMN IF NOT EXISTS match_reason TEXT, -- пояснение от AI почему такой score ADD COLUMN IF NOT EXISTS match_checked_at TIMESTAMP; -- когда проверено -- Комментарии к колонкам COMMENT ON COLUMN clpr_claim_documents.document_type IS 'Ожидаемый тип документа: contract, payment, correspondence, evidence_photo, other'; COMMENT ON COLUMN clpr_claim_documents.document_label IS 'Читаемое название типа документа: "Договор или заказ", "Чек", "Переписка"'; COMMENT ON COLUMN clpr_claim_documents.match_score IS 'Процент соответствия документа ожидаемому типу (0-100). NULL = не проверено'; COMMENT ON COLUMN clpr_claim_documents.match_status IS 'Статус проверки: pending (ждёт), passed (ок), failed (не соответствует), skipped (пропущено)'; COMMENT ON COLUMN clpr_claim_documents.match_reason IS 'Пояснение от AI: почему документ соответствует/не соответствует'; COMMENT ON COLUMN clpr_claim_documents.match_checked_at IS 'Когда была выполнена проверка соответствия'; -- Индекс для быстрого поиска непроверенных и проблемных документов CREATE INDEX IF NOT EXISTS idx_claim_docs_match_status ON clpr_claim_documents(claim_id, match_status); -- Заполняем document_type и document_label из payload для существующих документов UPDATE clpr_claim_documents cd SET document_type = du.doc_type, document_label = dm.field_label FROM clpr_claims c, LATERAL ( SELECT x->>'field_label' AS field_label FROM jsonb_array_elements(COALESCE(c.payload->'documents_meta', '[]'::jsonb)) x WHERE x->>'field_name' = cd.field_name LIMIT 1 ) dm, LATERAL ( SELECT x->>'type' AS doc_type FROM jsonb_array_elements(COALESCE(c.payload->'documents_uploaded', '[]'::jsonb)) x WHERE x->>'file_name' = cd.file_name OR x->>'file_id' LIKE '%' || cd.file_name LIMIT 1 ) du WHERE cd.claim_id::text = c.id::text AND cd.document_type IS NULL; -- Статистика после миграции DO $$ DECLARE total_docs INT; with_type INT; with_label INT; BEGIN SELECT COUNT(*) INTO total_docs FROM clpr_claim_documents; SELECT COUNT(*) INTO with_type FROM clpr_claim_documents WHERE document_type IS NOT NULL; SELECT COUNT(*) INTO with_label FROM clpr_claim_documents WHERE document_label IS NOT NULL; RAISE NOTICE '=== Document Match Migration Complete ==='; RAISE NOTICE 'Total documents: %', total_docs; RAISE NOTICE 'With document_type: %', with_type; RAISE NOTICE 'With document_label: %', with_label; END $$;