-- 91_engineering_networks_191fz.sql
-- Engineering Networks schema по 191-ФЗ (Сводный план наземных и подземных коммуникаций)
-- Source: QGIS.zip Минстроя Свердл (https://old-minstroy.midural.ru/uploads/2021/05/QGIS.zip)
-- Extracted: 2026-05-12 (via Communication.qgz reverse-engineering)
-- See vault/research/Engineering_Networks_Schema_191FZ_May12.md
--
-- Deploy order: apply after 90_user_weight_profiles.sql
-- Renumbered 87→91 due to NN collision with existing 87_on_demand_indexes.sql
-- Dependencies: PostGIS extension, spatial_ref_sys table

BEGIN;

-- ============ МСК-66 — официальная проекция Свердловской области ============
-- Извлечена из <projectCrs> в Communication.qgs (Минстрой Свердл)
-- Описание: Местная Система Координат Свердловской области (МСК-66)
-- Эллипсоид: Krassovsky 1942
-- Центральный меридиан: 60.05° E
-- Используется для ВСЕХ кадастровых/градостроительных документов Свердл
INSERT INTO spatial_ref_sys (srid, auth_name, auth_srid, proj4text, srtext)
VALUES (
  100000,
  'USER',
  100000,
  '+proj=tmerc +lat_0=0 +lon_0=60.05 +k=1 +x_0=1500000 +y_0=-5911057.63 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs',
  'PROJCS["MSK-66",GEOGCS["Krassovsky 1942",DATUM["D_Krassovsky_1942",SPHEROID["Krassovsky_1942",6378245,298.3],TOWGS84[23.92,-141.27,-80.9,0,0.35,0.82,-0.12]],PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",60.05],PARAMETER["scale_factor",1],PARAMETER["false_easting",1500000],PARAMETER["false_northing",-5911057.63],UNIT["metre",1,AUTHORITY["EPSG","9001"]]]'
)
ON CONFLICT (srid) DO UPDATE SET
  proj4text = EXCLUDED.proj4text,
  srtext = EXCLUDED.srtext;
-- Usage: ST_Transform(geom, 100000) для МСК-66, или ST_Transform(geom_msk66, 4326) обратно в WGS84

-- ============ ENUMs ============
DO $$ BEGIN
  CREATE TYPE network_category AS ENUM ('thermal','water','sewerage','gas','electricity','transport','auxiliary');
EXCEPTION WHEN duplicate_object THEN NULL; END $$;

DO $$ BEGIN
  CREATE TYPE network_object_kind AS ENUM ('pipeline','facility_point','facility_polygon','aux_object','building');
EXCEPTION WHEN duplicate_object THEN NULL; END $$;

DO $$ BEGIN
  CREATE TYPE ground_position AS ENUM ('on_ground','above','underground','embanked','underwater');
EXCEPTION WHEN duplicate_object THEN NULL; END $$;

-- ============ REFERENCE TABLES ============

CREATE TABLE IF NOT EXISTS eng_ref_classid (
  classid CHAR(9) PRIMARY KEY,
  category network_category NOT NULL,
  kind network_object_kind NOT NULL,
  name TEXT NOT NULL,
  description TEXT
);

CREATE TABLE IF NOT EXISTS eng_ref_material (
  id SMALLINT PRIMARY KEY,
  name TEXT NOT NULL,
  is_plastic BOOLEAN NOT NULL DEFAULT FALSE
);

CREATE TABLE IF NOT EXISTS eng_ref_insulation (
  id SMALLINT PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS eng_ref_ground_pos (
  id SMALLINT PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS eng_ref_pline_type (
  id SMALLINT PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS eng_ref_gas_type (
  id SMALLINT PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS eng_ref_elline_type (
  id SMALLINT PRIMARY KEY,
  name TEXT NOT NULL,
  voltage_v INTEGER,
  is_weak_current BOOLEAN NOT NULL DEFAULT FALSE
);

-- ============ MAIN FEATURES TABLE ============
CREATE TABLE IF NOT EXISTS engineering_networks (
  id BIGSERIAL PRIMARY KEY,
  global_id UUID NOT NULL DEFAULT gen_random_uuid(),
  category network_category NOT NULL,
  kind network_object_kind NOT NULL,
  classid CHAR(9) REFERENCES eng_ref_classid(classid),
  classid_name TEXT,
  name TEXT,
  address TEXT,

  owner TEXT,
  balance_holder TEXT,
  exploiter TEXT,

  length_m REAL,
  wear_percent REAL,
  diameter_1_mm INTEGER,
  diameter_2_mm INTEGER,
  material_id SMALLINT REFERENCES eng_ref_material(id),
  insulation_id SMALLINT REFERENCES eng_ref_insulation(id),
  pline_type_id SMALLINT REFERENCES eng_ref_pline_type(id),
  ground_pos_id SMALLINT REFERENCES eng_ref_ground_pos(id),
  voltage_v INTEGER,
  elline_type_id SMALLINT REFERENCES eng_ref_elline_type(id),

  power_mw REAL,
  fuel_type INTEGER,
  gas_type_id SMALLINT REFERENCES eng_ref_gas_type(id),
  facility_subtype_1 INTEGER,
  facility_subtype_2 INTEGER,

  status INTEGER,
  is_planned BOOLEAN NOT NULL DEFAULT FALSE,
  source_type INTEGER,
  source TEXT,
  source_municipality TEXT,
  source_dataset_id TEXT,

  geom GEOMETRY(Geometry, 4326),
  note TEXT,
  fetched_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  UNIQUE(global_id)
);

CREATE INDEX IF NOT EXISTS gist_eng_networks_geom ON engineering_networks USING GIST(geom);
CREATE INDEX IF NOT EXISTS idx_eng_networks_category ON engineering_networks(category);
CREATE INDEX IF NOT EXISTS idx_eng_networks_classid ON engineering_networks(classid);
CREATE INDEX IF NOT EXISTS idx_eng_networks_municipality ON engineering_networks(source_municipality);

-- ============ SEED DATA ============
-- CLASSID NSI classifiers (extracted from official Минстрой Свердл шаблон)
INSERT INTO eng_ref_classid (classid, category, kind, name) VALUES
  ('901010100', 'thermal', 'facility_point', 'Источник тепловой энергии'),
  ('901010200', 'thermal', 'facility_point', 'Центральный тепловой пункт (ЦТП)'),
  ('901010300', 'thermal', 'facility_point', 'Индивидуальный тепловой пункт (ИТП)'),
  ('901010400', 'thermal', 'facility_point', 'Тепловая перекачивающая насосная станция (ТПНС)'),
  ('901010500', 'thermal', 'facility_point', 'Стационарная модульная котельная'),
  ('901020100', 'thermal', 'pipeline', 'Теплопровод магистральный'),
  ('901020200', 'thermal', 'pipeline', 'Теплопровод распределительный (квартальный)'),
  ('901020300', 'thermal', 'pipeline', 'Ответвления теплопровода'),
  ('901020400', 'thermal', 'pipeline', 'Байпасные трубопроводы'),
  ('901020500', 'thermal', 'pipeline', 'Паропровод'),
  ('901020600', 'thermal', 'pipeline', 'Конденсатопровод'),
  ('901020700', 'thermal', 'pipeline', 'Попутный дренаж'),
  ('902010100', 'water', 'facility_point', 'Водозаборное сооружение'),
  ('902010200', 'water', 'facility_point', 'Очистное сооружение'),
  ('902010300', 'water', 'facility_point', 'Насосная станция'),
  ('902010400', 'water', 'facility_point', 'Водонапорная башня'),
  ('902010500', 'water', 'facility_point', 'Резервуар'),
  ('902010600', 'water', 'facility_point', 'Пневматическая установка'),
  ('902010700', 'water', 'facility_point', 'Распределительные пункты (на водоводах)'),
  ('902020100', 'water', 'pipeline', 'Хозяйственно-питьевой'),
  ('902020200', 'water', 'pipeline', 'Производственный'),
  ('902020300', 'water', 'pipeline', 'Противопожарный'),
  ('902020400', 'water', 'pipeline', 'Объединенный'),
  ('903010100', 'sewerage', 'facility_point', 'Очистные сооружения'),
  ('903010200', 'sewerage', 'facility_point', 'Канализационная насосная станция'),
  ('903010300', 'sewerage', 'facility_point', 'Подземный резервуар'),
  ('903010400', 'sewerage', 'facility_point', 'Разделительная камера'),
  ('903020100', 'sewerage', 'pipeline', 'Хозяйственно-бытовая'),
  ('903020200', 'sewerage', 'pipeline', 'Производственная'),
  ('903020300', 'sewerage', 'pipeline', 'Дождевая открытая'),
  ('903020400', 'sewerage', 'pipeline', 'Дождевая закрытая'),
  ('903020500', 'sewerage', 'pipeline', 'Производственно-дождевая'),
  ('903020600', 'sewerage', 'pipeline', 'Производственно- бытовая'),
  ('903020700', 'sewerage', 'pipeline', 'Дренажная'),
  ('904010100', 'gas', 'facility_point', 'Источник газа'),
  ('904010200', 'gas', 'facility_point', 'Сепаратор'),
  ('904010300', 'gas', 'facility_point', 'Компрессорная станция'),
  ('904010400', 'gas', 'facility_point', 'ГРС (газорегуляторная станция)'),
  ('904010500', 'gas', 'facility_point', 'ГРП (газорегуляторные пункты)'),
  ('904010600', 'gas', 'facility_point', 'КИП (контрольно-измерительные пункты)'),
  ('904010700', 'gas', 'facility_point', 'Катодные станции электрохимзащиты'),
  ('904010800', 'gas', 'facility_point', 'Газгольдерная станция'),
  ('904010900', 'gas', 'facility_point', 'Подземные хранилища газа'),
  ('904020100', 'gas', 'pipeline', 'Газопровод высокого давления I категории (от 0,6 до 1,2 МПа)'),
  ('904020200', 'gas', 'pipeline', 'Газопровод высокого давления II категории (выше 0,3 до 0,6 МПа)'),
  ('904030300', 'gas', 'pipeline', 'Газопровод среднего давления (выше 0,005 до 0,3 МПа),'),
  ('904040400', 'gas', 'pipeline', 'Газопровод низкого давления (до 0,005 МПа);'),
  ('905010100', 'electricity', 'facility_point', 'Трансформаторная подстанция (ТП)'),
  ('905010200', 'electricity', 'facility_point', 'Распределительный пункт (РП)'),
  ('905010300', 'electricity', 'facility_point', 'Распределительное устройство (РУ)'),
  ('905010400', 'electricity', 'facility_point', 'АВР (автоматический ввод резерва)'),
  ('905010500', 'electricity', 'facility_point', 'Резервный источник питания (КТП –комплектная ТП)'),
  ('905010600', 'electricity', 'facility_point', 'Базовая станция сети подвижной связи'),
  ('905010700', 'electricity', 'facility_point', 'Узел телефонной связи'),
  ('905010800', 'electricity', 'facility_point', 'Телефонная станция'),
  ('905010900', 'electricity', 'facility_point', 'Радиорелейная вышка'),
  ('905011000', 'electricity', 'facility_point', 'Узел автоматической коммутации'),
  ('905011100', 'electricity', 'facility_point', 'Радиостанция'),
  ('905020100', 'electricity', 'pipeline', 'Сети сильных токов высокого напряжения (>1000В)'),
  ('905020200', 'electricity', 'pipeline', 'Сети сильных токов низкого напряжения (≤1000В)'),
  ('905020300', 'electricity', 'pipeline', 'Слаботочные сети (информационные)(телеграф, автоматические телефонные станции,): бытового назначения, коммерческие'),
  ('906010100', 'transport', 'pipeline', 'Нефтепроводы'),
  ('906010200', 'transport', 'pipeline', 'Нефтепродуктопроводы'),
  ('906010300', 'transport', 'pipeline', 'Трубопроводы для транспортировки твердых материалов'),
  ('906010400', 'transport', 'pipeline', 'Трубопроводы специального назначения'),
  ('907040100', 'auxiliary', 'building', 'Контуры зданий и сооружений'),
  ('907010100', 'auxiliary', 'aux_object', 'Аппаратура, от повышения давления (на водоводах)'),
  ('907010200', 'auxiliary', 'aux_object', 'Водонапорная колонн'),
  ('907010300', 'auxiliary', 'aux_object', 'Водоразборная колонка'),
  ('907010400', 'auxiliary', 'aux_object', 'Воздуходувная станция'),
  ('907010500', 'auxiliary', 'aux_object', 'Воздушный колпак'),
  ('907010600', 'auxiliary', 'aux_object', 'Выпуск'),
  ('907010700', 'auxiliary', 'aux_object', 'Гильза'),
  ('907010800', 'auxiliary', 'aux_object', 'Грозозащитный трос'),
  ('907010900', 'auxiliary', 'aux_object', 'Дождеприемник'),
  ('907011000', 'auxiliary', 'aux_object', 'Дюкер'),
  ('907011100', 'auxiliary', 'aux_object', 'Зажимы изолированные'),
  ('907011200', 'auxiliary', 'aux_object', 'Заземление'),
  ('907011300', 'auxiliary', 'aux_object', 'Камера'),
  ('907011400', 'auxiliary', 'aux_object', 'Ковер'),
  ('907011500', 'auxiliary', 'aux_object', 'Кожух для наземного размещения арматуры'),
  ('907011600', 'auxiliary', 'aux_object', 'Колодец'),
  ('907011700', 'auxiliary', 'aux_object', 'Компенсатор'),
  ('907011800', 'auxiliary', 'aux_object', 'Конденсатосборник'),
  ('907011900', 'auxiliary', 'aux_object', 'Лазы ( при d > 800мм)'),
  ('907012000', 'auxiliary', 'aux_object', 'Лестницы'),
  ('907012100', 'auxiliary', 'aux_object', 'Ливнеотвод'),
  ('907012200', 'auxiliary', 'aux_object', 'Ливнеспуск (общесплавная система)'),
  ('907012300', 'auxiliary', 'aux_object', 'Металлический ковер'),
  ('907012400', 'auxiliary', 'aux_object', 'Металлический кожух для наружного размещения запорной арматуры'),
  ('907012500', 'auxiliary', 'aux_object', 'Мостики'),
  ('907012600', 'auxiliary', 'aux_object', 'Несгораемый шкаф'),
  ('907012700', 'auxiliary', 'aux_object', 'Ниша компенсатора'),
  ('907012800', 'auxiliary', 'aux_object', 'Опознавательные и сигнальные знаки местонахождения трубопроводов, указатели и предупредительные знаки.'),
  ('907012900', 'auxiliary', 'aux_object', 'Опора'),
  ('907013000', 'auxiliary', 'aux_object', 'Опора в канале'),
  ('907013100', 'auxiliary', 'aux_object', 'Павильон'),
  ('907013200', 'auxiliary', 'aux_object', 'Пескоуловитель'),
  ('907013300', 'auxiliary', 'aux_object', 'Плавучая опора'),
  ('907013400', 'auxiliary', 'aux_object', 'Подвесные переходы'),
  ('907013500', 'auxiliary', 'aux_object', 'Подпиточный пункт'),
  ('907013600', 'auxiliary', 'aux_object', 'Пожарный гидрант'),
  ('907013700', 'auxiliary', 'aux_object', 'Поливочный кран'),
  ('907013800', 'auxiliary', 'aux_object', 'Противопожарные средства'),
  ('907013900', 'auxiliary', 'aux_object', 'Противоэрозионные и защитные сооружения трубопроводов'),
  ('907014000', 'auxiliary', 'aux_object', 'Разгрузочная камера'),
  ('907014100', 'auxiliary', 'aux_object', 'Разрядник'),
  ('907014200', 'auxiliary', 'aux_object', 'Ревизионный люк'),
  ('907014300', 'auxiliary', 'aux_object', 'Роликовые дорожки с якорями'),
  ('907014400', 'auxiliary', 'aux_object', 'Сигнальная лента'),
  ('907014500', 'auxiliary', 'aux_object', 'Сливная станция'),
  ('907014600', 'auxiliary', 'aux_object', 'Снегоплавильный пункт'),
  ('907014700', 'auxiliary', 'aux_object', 'Средства телемеханики трубопроводов'),
  ('907014800', 'auxiliary', 'aux_object', 'Стационарная площадка для обслуживания'),
  ('907014900', 'auxiliary', 'aux_object', 'Стояка с пожарными кранами'),
  ('907015000', 'auxiliary', 'aux_object', 'Теплофикационная камера'),
  ('907015100', 'auxiliary', 'aux_object', 'Упоры'),
  ('907015200', 'auxiliary', 'aux_object', 'Установка электрохимической защиты газопроводов от коррозии'),
  ('907015300', 'auxiliary', 'aux_object', 'Футляр'),
  ('907015400', 'auxiliary', 'aux_object', 'Канал для прокладки коммуникаций'),
  ('907015500', 'auxiliary', 'aux_object', 'Опоры линий электропередач'),
  ('907015501', 'auxiliary', 'aux_object', 'Опора деревянная (столб)'),
  ('907015502', 'auxiliary', 'aux_object', 'Опора деревянная (ферма)'),
  ('907015503', 'auxiliary', 'aux_object', 'Опора деревянная с подкосинами или оттяжками'),
  ('907015504', 'auxiliary', 'aux_object', 'Опора металлическая (столб)'),
  ('907015505', 'auxiliary', 'aux_object', 'Опора металлическая (ферма)'),
  ('907015506', 'auxiliary', 'aux_object', 'Опора металлическая (фермовый столб))'),
  -- TODO(NSI-verify): 'Опора железобетонная (столб)' — отсутствует в исходном QGIS dump.
  --   Провизорное назначение 907015507 (review May 14) убрано из seed до подтверждения
  --   против официальной NSI-таблицы Минстроя. Не вставляем в eng_ref_classid пока
  --   не верифицировано — иначе ON CONFLICT DO UPDATE name перетрёт корректное значение.
  --   ('907015507', 'auxiliary', 'aux_object', 'Опора железобетонная (столб)'),
  ('907015508', 'auxiliary', 'aux_object', 'Опора железобетонная (ферма)'),
  ('907015600', 'auxiliary', 'aux_object', 'Дополнительные объекты на на опорах линии электропередач'),
  ('907015601', 'auxiliary', 'aux_object', 'Молниеотводы (на столбах)'),
  ('907015602', 'auxiliary', 'aux_object', 'Фонари электрические (на столбах)'),
  ('907015603', 'auxiliary', 'aux_object', 'Часы электрические (на столбах)'),
  ('907015604', 'auxiliary', 'aux_object', 'Прожекторы (на столбах)'),
  ('907015605', 'auxiliary', 'aux_object', 'Трансформаторы (на столбах)???'),
  ('907015606', 'auxiliary', 'aux_object', 'Мачты и башни радио и телевизионные, вышки радиорелейные и ретрансляторы'),
  ('907020000', 'auxiliary', 'aux_object', 'Особая точка')
ON CONFLICT (classid) DO UPDATE SET name=EXCLUDED.name;

-- Pipe materials (13 types)
INSERT INTO eng_ref_material (id, name, is_plastic) VALUES
  (1, 'Сталь', FALSE),
  (2, 'Чугун', FALSE),
  (3, 'Высокопрочный чугун с шаровидным графитом', FALSE),
  (4, 'Металлополимер', TRUE),
  (5, 'Стеклопластик', TRUE),
  (6, 'Асбоцемент', FALSE),
  (7, 'Железобетонные напорные', FALSE),
  (8, 'Пластиковые (ПВХ, ПЭ, ПП)', TRUE),
  (9, 'Хризотилцемент', FALSE),
  (10, 'Металлопластик', TRUE),
  (11, 'Керамика', FALSE),
  (12, 'Пластмасса', TRUE),
  (13, 'Резиноткатевые трубы', FALSE)
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name;

-- Insulation types (23 types)
INSERT INTO eng_ref_insulation (id, name) VALUES
  (1, 'Стекловата'),
  (2, 'Базальтовый утеплитель'),
  (3, 'Пенополистирол (пенопласт)'),
  (4, 'Пенополиуретан'),
  (5, 'Сшитый полиэтилен'),
  (6, 'Монолитная оболочка'),
  (7, 'Литая оболочка'),
  (8, 'Засыпные порошки'),
  (9, 'Армопенобетон'),
  (10, 'Минеральная вата'),
  (11, 'Керамзитобетон'),
  (12, 'Перлит'),
  (13, 'Нагревательный кабель'),
  (14, 'Технологическая труба'),
  (15, 'Вспененный полиэтилен'),
  (16, 'Пеноплекс'),
  (17, 'Изопон'),
  (18, 'Керамзит'),
  (19, 'Базальт'),
  (20, 'Фольгоизол'),
  (21, 'Вспененный синтетический каучук'),
  (22, 'Битумная мастика'),
  (23, 'Ленточные из ПВХ и полиэтилена')
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name;

-- Ground positions (3 types)
INSERT INTO eng_ref_ground_pos (id, name) VALUES
  (1, 'Наземное'),
  (2, 'Надземное'),
  (3, 'Подземное')
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name;

-- Pipeline placement (5 types)
INSERT INTO eng_ref_pline_type (id, name) VALUES
  (1, 'Надземный'),
  (2, 'Подземный'),
  (3, 'Наземный'),
  (4, 'Наземный в обваловании'),
  (5, 'Подводный')
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name;

-- Gas types (10 types)
INSERT INTO eng_ref_gas_type (id, name) VALUES
  (1, 'Природный газ'),
  (2, 'Попутный нефтяной газ (ПНГ)'),
  (3, 'Смесь природного газа и попутного нефтяного газа (ПНГ)'),
  (4, 'Доменный газ'),
  (5, 'Коксовый газ'),
  (7, 'Сжиженный  углеводородный'),
  (8, 'искусственный'),
  (9, 'Сланцевый'),
  (10, 'Генераторный'),
  (11, 'Сухой отбензиненный')
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name;

-- Electricity line types (18 voltage levels + signal)
INSERT INTO eng_ref_elline_type (id, name, voltage_v, is_weak_current) VALUES
  (1, 'Сеть Ультравысокого напряжения 750, 1150,1500кВ', 1500000, FALSE),
  (2, 'Сеть Сверхвысокого напряжения 750,500,330кВ', 750000, FALSE),
  (3, 'Сеть Высокого напряжения (ВН) 220,150,110 кВ', 220000, FALSE),
  (4, 'Сеть Среднего первого напряжения (СН-1) 35кВ', 35000, FALSE),
  (5, 'Сеть Среднего второго напряжения (СН-2) 20,10,6,1 кВ', 20000, FALSE),
  (6, 'Сеть напряжения 0,38кВ', 380, FALSE),
  (7, 'Сеть напряжения  0,2кВ', 200, FALSE),
  (8, 'Сеть напряжения  0,11кВ', 110, FALSE),
  (9, 'Телефонная линия (бытовая)', NULL, TRUE),
  (10, 'Интернет (бытовая)', NULL, TRUE),
  (11, 'Теле-радиовещание (бытовая)', NULL, TRUE),
  (12, 'Домофония (бытовая)', NULL, TRUE),
  (13, 'Сигнализация (бытовая)', NULL, TRUE),
  (14, 'Стереосистемы (бытовая)', NULL, TRUE),
  (15, 'Пожарная безопасность (коммерческая)', NULL, TRUE),
  (16, 'Локально-вычислительная сеть ЛВС(коммерческая)', NULL, TRUE),
  (17, 'Автоматизация подсчета энергоресурсов. (коммерческая)', NULL, TRUE),
  (18, 'Внутрипроизводственная система оповещения. (коммерческая)', NULL, TRUE)
ON CONFLICT (id) DO UPDATE SET name=EXCLUDED.name;

COMMIT;

-- Migration complete:
--   • МСК-66 (SRID 100000) для PostGIS ST_Transform
--   • 137 NSI CLASSID classifiers
--   • 13 pipe materials
--   • 23 insulation types
--   • 5 pipeline placements (включая подводный)
--   • 10 gas types
--   • 18 ЛЭП voltage levels (8 power + 10 weak-current)
--   • 3 ground positions
--   • main engineering_networks table + GIST + BTREE indexes
--
-- Following NSI hierarchy:
--   901xxxxxxx — Тепло (5 facility + 7 pipeline types)
--   902xxxxxxx — Вода (7 facility + 4 pipeline)
--   903xxxxxxx — Канализация (4 facility + 7 pipeline)
--   904xxxxxxx — Газ (9 facility + 4 pipeline)
--   905xxxxxxx — Электро + связь (11 facility + 3 line types)
--   906xxxxxxx — Транспорт жидкостей (4 pipeline)
--   907xxxxxxx — Допобъекты (80+ subtypes) + здания
