-- Миграция: создание таблицы cases согласно §10 контекста DROP TABLE IF EXISTS search_results CASCADE; DROP TABLE IF EXISTS search_cases CASCADE; CREATE TABLE IF NOT EXISTS cases ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), created_at TIMESTAMP DEFAULT NOW(), status VARCHAR(20) DEFAULT 'active', child_name VARCHAR(255), age_years INTEGER NOT NULL, gender CHAR(1), clothes_description TEXT, special_marks TEXT, phone_status VARCHAR(20), has_diagnosis BOOLEAN DEFAULT FALSE, diagnosis_type VARCHAR[], fitness_level VARCHAR(20), has_transport VARCHAR(20) DEFAULT 'none', cant_swim BOOLEAN DEFAULT FALSE, psychotype VARCHAR(50), psychotype_answers JSONB, loss_reason VARCHAR(100), loss_time TIMESTAMP, elapsed_hours FLOAT, last_seen_direction VARCHAR(10), last_seen_reliability VARCHAR(20), last_seen_description TEXT, behavior_description TEXT, familiar_places TEXT, lost_before VARCHAR(20), season VARCHAR(20), temperature_c FLOAT, precipitation VARCHAR(20), visibility VARCHAR(20), wind VARCHAR(20), terrain VARCHAR[], tnp_lat FLOAT, tnp_lon FLOAT, tnp_address TEXT, teams_count INTEGER, team_size INTEGER, has_dog BOOLEAN DEFAULT FALSE, extra_resources VARCHAR[], found_alive BOOLEAN, found_distance_km FLOAT, found_direction VARCHAR(10), found_location_type VARCHAR(50), found_lat FLOAT, found_lon FLOAT, search_duration_hours FLOAT, who_found VARCHAR(50), confidence_avg FLOAT, raw_text TEXT, analysis_log JSONB ); CREATE INDEX IF NOT EXISTS idx_cases_coords ON cases (found_lat, found_lon); CREATE INDEX IF NOT EXISTS idx_cases_age_season ON cases (age_years, season); CREATE INDEX IF NOT EXISTS idx_cases_status ON cases (status); DROP TABLE IF EXISTS raw_documents CASCADE; CREATE TABLE IF NOT EXISTS raw_documents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), filename VARCHAR(255) NOT NULL, raw_text TEXT, extracted_json JSONB, created_at TIMESTAMP DEFAULT NOW() );