-- ========= ДАННЫЕ ОТЧЕТОВ ДЛЯ ЖИТЕЛЕЙ ========= -- Одна запись на дом + период (например: дом 12, январь 2026). -- Все собранные данные отчета сохраняются здесь. CREATE TABLE IF NOT EXISTS resident_report_data ( id BIGSERIAL PRIMARY KEY, building_id VARCHAR(50) NOT NULL REFERENCES buildings(id) ON DELETE CASCADE, period_start DATE NOT NULL, period_end DATE NOT NULL, period_month INTEGER NOT NULL, -- 1-12 period_year INTEGER NOT NULL, -- NPS nps_score INTEGER NOT NULL DEFAULT 0, nps_total_responses INTEGER NOT NULL DEFAULT 0, nps_avg_score NUMERIC(4,2) DEFAULT 0, nps_promoters INTEGER NOT NULL DEFAULT 0, nps_passives INTEGER NOT NULL DEFAULT 0, nps_detractors INTEGER NOT NULL DEFAULT 0, -- Заявки apps_total INTEGER NOT NULL DEFAULT 0, apps_completed INTEGER NOT NULL DEFAULT 0, apps_quality INTEGER NOT NULL DEFAULT 0, -- Задачи (календарный план) tasks_total INTEGER NOT NULL DEFAULT 0, tasks_completed INTEGER NOT NULL DEFAULT 0, -- Финансы funds_collected NUMERIC(14,2) NOT NULL DEFAULT 0, funds_spent NUMERIC(14,2) NOT NULL DEFAULT 0, funds_balance NUMERIC(14,2) NOT NULL DEFAULT 0, -- Долги debt_cases_won INTEGER NOT NULL DEFAULT 0, debt_collected NUMERIC(14,2) NOT NULL DEFAULT 0, -- Расходы (итог и по категориям — JSON) expenses_total NUMERIC(14,2) NOT NULL DEFAULT 0, expenses_by_category JSONB, -- Доп. данные в JSON (мероприятия, фото, план) events JSONB, work_photos JSONB, plan_items JSONB, -- Полный снимок отчета (как в content) — на случай расширения snapshot JSONB, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(building_id, period_start, period_end) ); CREATE INDEX IF NOT EXISTS idx_resident_report_data_building ON resident_report_data(building_id); CREATE INDEX IF NOT EXISTS idx_resident_report_data_period ON resident_report_data(period_year, period_month); COMMENT ON TABLE resident_report_data IS 'Собранные данные отчетов для жителей: дом + период (напр. дом 12, январь)';