-- 296_fns_legal_entity_facts.sql -- ФНС open data по юрлицам: доходы/расходы, среднесписочная численность, недоимка, -- спецрежимы (issue: bulk-дампы ФНС → lookup по ИНН, PR "feat/fns-legal-entities"). -- -- ПОЧЕМУ ЭТОТ ИСТОЧНИК -- Открытых данных ЕГРН по правообладателям-физлицам не существует (218-ФЗ ст. 62). -- По ЮРЛИЦАМ данные открыты, лицензия ФНС (nalog.gov.ru/opendata) разрешает -- переработку и перераспределение. Наборы (все по маске 7707329152-): -- revexp (доходы и расходы), sshr2019 (среднесписочная численность), debtam -- (недоимка и задолженность), snr (спецрежимы). ЕГРЮЛ (адрес/ОКВЭД/учредители) в -- этих наборах НЕТ — только ИНН + наименование + показатели набора. -- -- ЭТОТ PR — ТОЛЬКО ЗАГРУЗКА И LOOKUP ПО ИНН. Потребителя (скоринг застройщика/УК в -- оценке) здесь нет и не планируется в рамках этого PR — подключение отдельной -- задачей, если решение об этом будет принято отдельно. -- -- ФОРМА ХРАНЕНИЯ: одна узкая long-format таблица на все 4 набора, а не таблица на -- набор. Наборы различаются только НАБОРОМ показателей (атрибутов XML), сама форма -- «ИНН + показатель + период + значение» у всех одинаковая — long-format не плодит -- 4 почти идентичные таблицы и не требует миграции при добавлении 5-го набора в -- будущем (не в этом PR). -- -- PRIMARY KEY (inn, dataset, series, period), А НЕ (inn, series, period) — так -- предлагал скелет задачи, но series здесь = имя XML-атрибута источника, и без -- dataset в ключе одноимённые атрибуты в двух разных наборах молча схлопнутся в -- одну строку (мы НЕ проверяли по XSD, что имена атрибутов между revexp/sshr2019/ -- debtam/snr не пересекаются, поэтому закладываемся на худший случай). -- -- Идемпотентно: CREATE TABLE/INDEX IF NOT EXISTS. lock_timeout — на случай, если -- таблицы уже существуют от прогона на другой ветке (ALTER не планируется, но -- дисциплина сохраняется). BEGIN; SET LOCAL lock_timeout = '5s'; CREATE TABLE IF NOT EXISTS fns_legal_entity_facts ( inn text NOT NULL, dataset text NOT NULL, -- 'revexp' | 'sshr2019' | 'debtam' | 'snr' series text NOT NULL, -- имя показателя (атрибут XML источника) period date NOT NULL, -- период показателя; см. fns_opendata_loader.py value numeric NOT NULL, org_name text, -- наименование юрлица на момент загрузки (не ЕГРЮЛ, provenance) loaded_at timestamptz NOT NULL DEFAULT now(), PRIMARY KEY (inn, dataset, series, period) ); COMMENT ON TABLE fns_legal_entity_facts IS 'ФНС opendata (nalog.gov.ru/opendata/7707329152-*) по юрлицам: показатели наборов ' 'revexp/sshr2019/debtam/snr. Long-format: одна строка = один показатель одного ИНН ' 'за один период. ЕГРЮЛ-данных (адрес/ОКВЭД/учредители) здесь нет. Без потребителя ' 'на момент создания — см. app/services/fns_lookup.py.'; COMMENT ON COLUMN fns_legal_entity_facts.inn IS 'ИНН юрлица (10 цифр), как в XML источника'; COMMENT ON COLUMN fns_legal_entity_facts.dataset IS 'slug набора ФНС opendata: revexp/sshr2019/debtam/snr'; COMMENT ON COLUMN fns_legal_entity_facts.series IS 'имя показателя = имя XML-атрибута источника (не переименовываем)'; COMMENT ON COLUMN fns_legal_entity_facts.period IS 'период показателя: дата публикации набора (см. fns_dataset_versions.published_on)'; COMMENT ON COLUMN fns_legal_entity_facts.value IS 'значение показателя как есть из XML (numeric — источник не различает валюту/единицы в атрибуте)'; COMMENT ON COLUMN fns_legal_entity_facts.org_name IS 'наименование юрлица на момент загрузки, provenance only — НЕ авторитетный источник (используй ЕГРЮЛ)'; CREATE TABLE IF NOT EXISTS fns_dataset_versions ( dataset text PRIMARY KEY, -- 'revexp' | 'sshr2019' | 'debtam' | 'snr' file_url text NOT NULL, -- прямая ссылка на .zip, снятая со страницы каталога published_on date, -- дата публикации, распарсенная из имени файла (data-YYYYMMDD-...) loaded_at timestamptz NOT NULL DEFAULT now() ); COMMENT ON TABLE fns_dataset_versions IS 'Последняя загруженная версия каждого набора ФНС opendata — гейт от перекачки ' 'уже загруженной версии (URL меняется с каждой публикацией, дата в имени файла).'; COMMENT ON COLUMN fns_dataset_versions.file_url IS 'резолвится динамически со страницы каталога набора — НЕ хардкодить, протухает'; COMMENT ON COLUMN fns_dataset_versions.published_on IS 'дата публикации из имени файла (data-YYYYMMDD-structure-...)'; COMMIT;