Coverage Summary for Class: Oktmo11Generator (ru.eda.plgn.bizgen.core.generator.impl)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| Oktmo11Generator |
100%
(1/1)
|
100%
(2/2)
|
|
100%
(3/3)
|
100%
(13/13)
|
package ru.eda.plgn.bizgen.core.generator.impl
import ru.eda.plgn.bizgen.core.generator.GeneratorResult
import ru.eda.plgn.bizgen.core.generator.GeneratorResultWithEscape
import ru.eda.plgn.bizgen.core.generator.GeneratorStr
import ru.eda.plgn.bizgen.core.generator.impl.OktmoGenerator.randomOktmo11
import ru.eda.plgn.bizgen.core.generator.impl.OktmoGenerator.randomOktmo8
import kotlin.random.Random
/**
* Общероссийский классификатор территорий муниципальных образований (ОКТМО).
*
* ОКТМО будет состоять из 8 цифр.
*
* Код ОКТМО состоит из 8 или 11 цифр, в зависимости от уровня классификации:
* - *Первые 2 цифры – субъект РФ (республика, край, область, город федерального значения).*
* - *Следующие 3 цифры (3–5 позиции) – район, город областного подчинения.*
* - *Последние 3 цифры (6–8 позиции) – город, посёлок, сельсовет и т. д.*
* - *Дополнительные 3 цифры (9–11 позиции, если есть) – населённый пункт, микрорайон.*
*
* **See Also:**
* [Общероссийский классификатор территорий муниципальных образований (сокр. ОКТМО)](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B5%D1%80%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D1%80%D1%80%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9_%D0%BC%D1%83%D0%BD%D0%B8%D1%86%D0%B8%D0%BF%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9)
*
* @author Dmitry_Emelyanenko
*/
class Oktmo8Generator : GeneratorStr {
override val uniqueDistance: Int = 4
override fun generate(): GeneratorResult<String> = GeneratorResultWithEscape(data = randomOktmo8())
}
/**
* Общероссийский классификатор территорий муниципальных образований (ОКТМО).
*
* ОКТМО будет состоять из 11 цифр.
*
* Код ОКТМО состоит из 8 или 11 цифр, в зависимости от уровня классификации:
* - *Первые 2 цифры – субъект РФ (республика, край, область, город федерального значения).*
* - *Следующие 3 цифры (3–5 позиции) – район, город областного подчинения.*
* - *Последние 3 цифры (6–8 позиции) – город, посёлок, сельсовет и т. д.*
* - *Дополнительные 3 цифры (9–11 позиции, если есть) – населённый пункт, микрорайон.*
*
* **See Also:**
* [Общероссийский классификатор территорий муниципальных образований (сокр. ОКТМО)](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B5%D1%80%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D1%80%D1%80%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9_%D0%BC%D1%83%D0%BD%D0%B8%D1%86%D0%B8%D0%BF%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9)
*
* @author Dmitry_Emelyanenko
*/
class Oktmo11Generator : GeneratorStr {
override val uniqueDistance: Int = 5
override fun generate(): GeneratorResult<String> = GeneratorResultWithEscape(data = randomOktmo11())
}
/**
* Общероссийский классификатор территорий муниципальных образований (ОКТМО).
*
* Код ОКТМО состоит из 8 или 11 цифр, в зависимости от уровня классификации:
* - *Первые 2 цифры – субъект РФ (республика, край, область, город федерального значения).*
* - *Следующие 3 цифры (3–5 позиции) – район, город областного подчинения.*
* - *Последние 3 цифры (6–8 позиции) – город, посёлок, сельсовет и т. д.*
* - *Дополнительные 3 цифры (9–11 позиции, если есть) – населённый пункт, микрорайон.*
*
* **See Also:**
* [Общероссийский классификатор территорий муниципальных образований (сокр. ОКТМО)](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B5%D1%80%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D1%82%D0%B5%D1%80%D1%80%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9_%D0%BC%D1%83%D0%BD%D0%B8%D1%86%D0%B8%D0%BF%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9)
*
* @author Dmitry_Emelyanenko
*/
private object OktmoGenerator {
fun randomOktmo8(): String = findOKTMO(null, false) ?: ""
fun randomOktmo11(): String = findOKTMO(null, true) ?: ""
// База данных ОКТМО: 50 городов с 8-значными кодами и 50 - с 11-значными
private val OKTMO_8_DATABASE = mapOf(
"Москва" to "45300000",
"Санкт-Петербург" to "40300000",
"Новосибирск" to "50401000",
"Екатеринбург" to "65401000",
"Казань" to "92401000",
"Нижний Новгород" to "22401000",
"Челябинск" to "75401000",
"Самара" to "36401000",
"Омск" to "52401000",
"Ростов-на-Дону" to "60401000",
"Уфа" to "80401000",
"Красноярск" to "04401000",
"Пермь" to "57401000",
"Воронеж" to "20401000",
"Волгоград" to "18401000",
"Краснодар" to "03401000",
"Саратов" to "63401000",
"Тюмень" to "71401000",
"Тольятти" to "36405000",
"Ижевск" to "94401000",
"Барнаул" to "01401000",
"Ульяновск" to "73401000",
"Иркутск" to "25401000",
"Хабаровск" to "08401000",
"Ярославль" to "78401000",
"Владивосток" to "05401000",
"Махачкала" to "82401000",
"Томск" to "69401000",
"Оренбург" to "53401000",
"Кемерово" to "32401000",
"Новокузнецк" to "32404000",
"Рязань" to "61401000",
"Астрахань" to "12401000",
"Набережные Челны" to "92403000",
"Пенза" to "56401000",
"Липецк" to "42401000",
"Киров" to "33401000",
"Чебоксары" to "97401000",
"Тула" to "70401000",
"Калининград" to "27401000",
"Балашиха" to "45404000",
"Курск" to "38401000",
"Ставрополь" to "07401000",
"Улан-Удэ" to "81401000",
"Сочи" to "03426000",
"Магнитогорск" to "75438000",
"Тверь" to "28401000",
"Севастополь" to "67300000",
"Иваново" to "24401000",
"Брянск" to "15401000",
// --- дальнейшие 100+ городов, реалистичные, но не обязательно актуальные ---
"Кострома" to "44401000",
"Белгород" to "14401000",
"Смоленск" to "66401000",
"Орёл" to "57402000",
"Мурманск" to "47401000",
"Архангельск" to "29401000",
"Псков" to "58401000",
"Вологда" to "35401000",
"Череповец" to "35402000",
"Калуга" to "40401000",
"Обнинск" to "40402000",
"Тамбов" to "68401000",
"Муром" to "33402000",
"Ковров" to "33403000",
"Подольск" to "46401000",
"Королёв" to "46402000",
"Мытищи" to "46403000",
"Химки" to "46404000",
"Красногорск" to "46405000",
"Жуковский" to "46406000",
"Сергиев Посад" to "46407000",
"Коломна" to "46408000",
"Елец" to "42402000",
"Домодедово" to "46409000",
"Орехово-Зуево" to "46410000",
"Березники" to "57402000",
"Соликамск" to "57403000",
"Нижнекамск" to "92404000",
"Альметьевск" to "92405000",
"Зеленодольск" to "92406000",
"Сургут" to "70801000",
"Нижневартовск" to "70802000",
"Ноябрьск" to "70803000",
"Надым" to "70804000",
"Салехард" to "70805000",
"Ханты-Мансийск" to "70806000",
"Тобольск" to "71402000",
"Ишим" to "71403000",
"Каменск-Уральский" to "65402000",
"Новоуральск" to "65403000",
"Первоуральск" to "65404000",
"Алапаевск" to "65405000",
"Невьянск" to "65406000",
"Каменск-Шахтинский" to "60402000",
"Таганрог" to "60403000",
"Батайск" to "60404000",
"Новочеркасск" to "60405000",
"Шахты" to "60406000",
"Владикавказ" to "90401000",
"Грозный" to "20402000",
"Нальчик" to "83401000",
"Черкесск" to "91401000",
"Майкоп" to "79401000",
"Йошкар-Ола" to "86401000",
"Саранск" to "88401000",
"Петрозаводск" to "86402000",
"Сыктывкар" to "86403000",
"Курган" to "65407000",
"Петропавловск-Камчатский" to "04402000",
"Южно-Сахалинск" to "65409000",
"Комсомольск-на-Амуре" to "08402000",
"Благовещенск" to "10401000",
"Анжеро-Судженск" to "32405000",
"Прокопьевск" to "32406000",
"Бийск" to "01402000",
"Рубцовск" to "01403000",
"Кисловодск" to "07402000",
"Ессентуки" to "07403000",
"Пятигорск" to "07404000",
"Минеральные Воды" to "07405000",
"Геленджик" to "03402000",
"Анапа" to "03403000",
"Армавир" to "03404000",
"Новошахтинск" to "60407000",
"Азов" to "60408000",
"Ленинск-Кузнецкий" to "32407000",
"Копейск" to "75402000",
"Златоуст" to "75403000",
"Миасс" to "75404000",
"Глазов" to "94402000",
"Воткинск" to "94403000",
"Салават" to "80402000",
"Стерлитамак" to "80403000",
"Нефтекамск" to "80404000",
"Бердск" to "50402000",
"Куйбышев" to "50403000",
"Рубцовск" to "01404000",
"Темрюк" to "03405000"
)
private val OKTMO_11_DATABASE = mapOf(
// Крупные города (1-50)
"Москва" to "45000000001",
"Санкт-Петербург" to "47000000002",
"Новосибирск" to "50000000003",
"Екатеринбург" to "65000000004",
"Нижний Новгород" to "52000000005",
"Казань" to "92000000006",
"Челябинск" to "75000000007",
"Омск" to "52000000008",
"Самара" to "36000000009",
"Ростов-на-Дону" to "60000000010",
"Уфа" to "80000000011",
"Красноярск" to "04000000012",
"Пермь" to "57000000013",
"Воронеж" to "20000000014",
"Волгоград" to "18000000015",
"Краснодар" to "03000000016",
"Саратов" to "63000000017",
"Тюмень" to "71000000018",
"Тольятти" to "36000000019",
"Ижевск" to "94000000020",
"Барнаул" to "01000000021",
"Иркутск" to "25000000022",
"Ульяновск" to "73000000023",
"Хабаровск" to "08000000024",
"Владивосток" to "05000000025",
"Ярославль" to "78000000026",
"Махачкала" to "82000000027",
"Томск" to "69000000028",
"Оренбург" to "53000000029",
"Кемерово" to "32000000030",
"Новокузнецк" to "32000000031",
"Рязань" to "61000000032",
"Астрахань" to "12000000033",
"Пенза" to "56000000034",
"Липецк" to "42000000035",
"Киров" to "33000000036",
"Чебоксары" to "97000000037",
"Тула" to "70000000038",
"Калининград" to "27000000039",
"Брянск" to "15000000040",
"Курск" to "38000000041",
"Иваново" to "24000000042",
"Магнитогорск" to "75000000043",
"Тверь" to "28000000044",
"Ставрополь" to "07000000045",
"Севастополь" to "67000000046",
"Белгород" to "14000000047",
"Сочи" to "03000000048",
"Нижний Тагил" to "65000000049",
"Владикавказ" to "90000000050",
"Архангельск" to "11000000051",
"Вологда" to "19000000052",
"Мурманск" to "47000000053",
"Петрозаводск" to "86000000054",
"Сыктывкар" to "87000000055",
"Йошкар-Ола" to "88000000056",
"Саранск" to "89000000057",
"Калуга" to "29000000058",
"Кострома" to "34000000059",
"Орел" to "54000000060",
"Смоленск" to "66000000061",
"Тамбов" to "68000000062",
"Улан-Удэ" to "81000000063",
"Чита" to "76000000064",
"Абакан" to "95000000065",
"Грозный" to "96000000066",
"Нальчик" to "83000000067",
"Элиста" to "85000000068",
"Петропавловск-Камчатский" to "30000000069",
"Южно-Сахалинск" to "64000000070",
"Благовещенск" to "10000000071",
"Ханты-Мансийск" to "71100000072",
"Анадырь" to "77000000073",
"Нарьян-Мар" to "11100000074",
"Салехард" to "71100000075",
"Магас" to "26000000076",
"Майкоп" to "79000000077",
"Черкесск" to "91000000078",
"Псков" to "58000000079",
"Великий Новгород" to "49000000080",
"Курган" to "37000000081",
"Симферополь" to "35000000082",
"Якутск" to "98000000083",
"Владимир" to "17000000084",
"Костомукша" to "86000000085",
"Кировск" to "47000000086",
"Апатиты" to "47000000087",
"Мончегорск" to "47000000088",
"Оленегорск" to "47000000089",
"Полярные Зори" to "47000000090",
"Северодвинск" to "11000000091",
"Котлас" to "11000000092",
"Новодвинск" to "11000000093",
"Михайловск" to "07000000094",
"Невинномысск" to "07000000095",
"Кисловодск" to "07000000096",
"Ессентуки" to "07000000097",
"Пятигорск" to "07000000098",
"Железноводск" to "07000000099",
"Лермонтов" to "07000000100",
"Подольск" to "46000000101",
"Химки" to "46000000102",
"Балашиха" to "46000000103",
"Королев" to "46000000104",
"Мытищи" to "46000000105",
"Люберцы" to "46000000106",
"Красногорск" to "46000000107",
"Электросталь" to "46000000108",
"Коломна" to "46000000109",
"Одинцово" to "46000000110",
"Домодедово" to "46000000111",
"Щелково" to "46000000112",
"Раменское" to "46000000113",
"Серпухов" to "46000000114",
"Долгопрудный" to "46000000115",
"Жуковский" to "46000000116",
"Реутов" to "46000000117",
"Видное" to "46000000118",
"Лобня" to "46000000119",
"Клин" to "46000000120",
"Солнечногорск" to "46000000121",
"Дубна" to "46000000122",
"Чехов" to "46000000123",
"Ногинск" to "46000000124",
"Сергиев Посад" to "46000000125",
"Воскресенск" to "46000000126",
"Егорьевск" to "46000000127",
"Павловский Посад" to "46000000128",
"Орехово-Зуево" to "46000000129",
"Железнодорожный" to "46000000130",
"Зеленоград" to "45000000131",
"Троицк" to "45000000132",
"Щербинка" to "45000000133",
"Московский" to "45000000134",
"Апрелевка" to "46000000135",
"Бронницы" to "46000000136",
"Верея" to "46000000137",
"Волоколамск" to "46000000138",
"Высоковск" to "46000000139",
"Голицыно" to "46000000140",
"Дедовск" to "46000000141",
"Дзержинский" to "46000000142",
"Дмитров" to "46000000143",
"Дрезна" to "46000000144",
"Зарайск" to "46000000145",
"Звенигород" to "46000000146",
"Ивантеевка" to "46000000147",
"Истра" to "46000000148",
"Краснозаводск" to "46000000149",
"Куровское" to "46000000150",
"Лосино-Петровский" to "46000000151",
"Луховицы" to "46000000152",
"Лыткарино" to "46000000153",
"Можайск" to "46000000154",
"Наро-Фоминск" to "46000000155",
"Ногинск" to "46000000156",
"Ожерелье" to "46000000157",
"Озеры" to "46000000158",
"Пересвет" to "46000000159",
"Протвино" to "46000000160",
"Пушкино" to "46000000161",
"Пущино" to "46000000162",
"Рошаль" to "46000000163",
"Руза" to "46000000164",
"Сергиев Посад" to "46000000165",
"Серебряные Пруды" to "46000000166",
"Солнечногорск" to "46000000167",
"Ступино" to "46000000168",
"Талдом" to "46000000169",
"Фрязино" to "46000000170",
"Хотьково" to "46000000171",
"Черноголовка" to "46000000172",
"Чехов" to "46000000173",
"Шатура" to "46000000174",
"Щербинка" to "46000000175",
"Электрогорск" to "46000000176",
"Электроугли" to "46000000177",
"Юбилейный" to "46000000178",
"Яхрома" to "46000000179",
"Ангарск" to "25000000180",
"Братск" to "25000000181",
"Усть-Илимск" to "25000000182",
"Усолье-Сибирское" to "25000000183",
"Черемхово" to "25000000184",
"Шелехов" to "25000000185",
"Зима" to "25000000186",
"Саянск" to "25000000187",
"Тайшет" to "25000000188",
"Тулун" to "25000000189",
"Усть-Кут" to "25000000190",
"Биробиджан" to "99000000191",
"Артем" to "05000000192",
"Уссурийск" to "05000000193",
"Находка" to "05000000194",
"Арсеньев" to "05000000195",
"Дальнегорск" to "05000000196",
"Дальнереченск" to "05000000197",
"Лесозаводск" to "05000000198",
"Спасск-Дальний" to "05000000199",
"Белогорск" to "10000000200",
"Свободный" to "10000000201",
"Тында" to "10000000202",
"Зея" to "10000000203",
"Райчихинск" to "10000000204",
"Шимановск" to "10000000205",
"Нерюнгри" to "98000000206",
"Мирный" to "98000000207",
"Ленск" to "98000000208",
"Алдан" to "98000000209",
"Удачный" to "98000000210",
"Верхоянск" to "98000000211",
"Вилюйск" to "98000000212",
"Нюрба" to "98000000213",
"Олекминск" to "98000000214",
"Покровск" to "98000000215",
"Среднеколымск" to "98000000216",
"Томмот" to "98000000217",
"Хандыга" to "98000000218",
"Черский" to "98000000219",
"Жатай" to "98000000220",
"Магадан" to "49000000221",
"Ола" to "49000000222",
"Сусуман" to "49000000223",
"Усть-Омчуг" to "49000000224",
"Ягодное" to "49000000225",
"Сеймчан" to "49000000226",
"Палатка" to "49000000227",
"Миасс" to "75000000228",
"Златоуст" to "75000000229",
"Копейск" to "75000000230",
"Озерск" to "75000000231",
"Снежинск" to "75000000232",
"Трехгорный" to "75000000233",
"Южноуральск" to "75000000234",
"Кыштым" to "75000000235",
"Катав-Ивановск" to "75000000236",
"Куса" to "75000000237",
"Миньяр" to "75000000238",
"Сим" to "75000000239",
"Аша" to "75000000240",
"Верхний Уфалей" to "75000000241",
"Нязепетровск" to "75000000242",
"Карталы" to "75000000243",
"Бреды" to "75000000244",
"Варна" to "75000000245",
"Агаповка" to "75000000246",
"Нагайбакский" to "75000000247",
"Коркино" to "75000000248",
"Еманжелинск" to "75000000249",
"Аргаяш" to "75000000250",
"Сосновка" to "75000000251",
"Еткуль" to "75000000252",
"Октябрьское" to "75000000253",
"Увельский" to "75000000254",
"Чесма" to "75000000255",
"Березовский" to "65000000256",
"Верхняя Пышма" to "65000000257",
"Каменск-Уральский" to "65000000258",
"Первоуральск" to "65000000259",
"Серов" to "65000000260",
"Новоуральск" to "65000000261",
"Асбест" to "65000000262",
"Полевской" to "65000000263",
"Ревда" to "65000000264",
"Краснотурьинск" to "65000000265",
"Лесной" to "65000000266",
"Нижняя Салда" to "65000000267",
"Красноуфимск" to "65000000268",
"Алапаевск" to "65000000269",
"Ирбит" to "65000000270",
"Качканар" to "65000000271",
"Кировград" to "65000000272",
"Невьянск" to "65000000273",
"Нижняя Тура" to "65000000274",
"Североуральск" to "65000000275",
"Талица" to "65000000276",
"Туринск" to "65000000277",
"Энгельс" to "63000000278",
"Балаково" to "63000000279",
"Вольск" to "63000000280",
"Ртищево" to "63000000281",
"Пугачев" to "63000000282",
"Маркс" to "63000000283",
"Петровск" to "63000000284",
"Аткарск" to "63000000285",
"Красноармейск" to "63000000286",
"Новоузенск" to "63000000287",
"Ершов" to "63000000288",
"Калининск" to "63000000289",
"Красный Кут" to "63000000290",
"Хвалынск" to "63000000291",
"Шиханы" to "63000000292",
"Балей" to "75000000293",
"Борзя" to "75000000294",
"Краснокаменск" to "75000000295",
"Нерчинск" to "75000000296",
"Петровск-Забайкальский" to "75000000297",
"Сретенск" to "75000000298",
"Хилок" to "75000000299",
"Шилка" to "75000000300"
)
/**
* Поиск ОКТМО по названию города или случайный выбор.
*
* @param cityName Название города (регистр не важен). Если null, выбирается случайный город.
* @param fullCode Если true, возвращает 11-значный код; если false — 8-значный; если null — случайный выбор (50/50).
* @return Код ОКТМО или null, если город не найден (или база пуста).
*/
private fun findOKTMO(@Suppress("SameParameterValue") cityName: String? = null, fullCode: Boolean? = null): String? {
return when {
// Если город указан, ищем его в базе
cityName != null -> {
when (fullCode) {
true -> 11
false -> 8
null -> if (Random.nextBoolean()) 11 else 8
}.let { chooseByLength(it) }
.entries
.find { it.key.equals(cityName, ignoreCase = true) }
?.value
}
else -> {
when (fullCode) {
true -> 11
false -> 8
null -> if (Random.nextBoolean()) 11 else 8
}.let { chooseByLength(it) }.values.random()
}
}
}
private fun chooseByLength(targetLength: Int): Map<String, String> {
return when (targetLength) {
11 -> OKTMO_11_DATABASE
8 -> OKTMO_8_DATABASE
else -> throw IllegalArgumentException("Invalid length $targetLength")
}
}
}