From 73c84ae27ea43b4ac2e9c656bf79babd789eaeb8 Mon Sep 17 00:00:00 2001 From: GitLab-Admin Date: Tue, 31 Mar 2026 08:33:56 +0500 Subject: [PATCH] First try --- .gitignore | 4 + ConsoleApp1/ConsoleApp1.sln | 25 ++ ConsoleApp1/ConsoleApp1/App.config | 6 + ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj | 57 ++++ ConsoleApp1/ConsoleApp1/Program.cs | 82 ++++++ .../ConsoleApp1/Properties/AssemblyInfo.cs | 33 +++ VIN-LIB/ConsoleApp1/App.config | 6 + VIN-LIB/ConsoleApp1/ConsoleApp1.csproj | 57 ++++ VIN-LIB/ConsoleApp1/Program.cs | 23 ++ .../ConsoleApp1/Properties/AssemblyInfo.cs | 33 +++ VIN-LIB/VIN-LIB.sln | 31 ++ VIN-LIB/VIN-LIB/Properties/AssemblyInfo.cs | 33 +++ VIN-LIB/VIN-LIB/VIN-LIB.csproj | 48 +++ VIN-LIB/VIN-LIB/VIN.cs | 276 ++++++++++++++++++ 14 files changed, 714 insertions(+) create mode 100644 .gitignore create mode 100644 ConsoleApp1/ConsoleApp1.sln create mode 100644 ConsoleApp1/ConsoleApp1/App.config create mode 100644 ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj create mode 100644 ConsoleApp1/ConsoleApp1/Program.cs create mode 100644 ConsoleApp1/ConsoleApp1/Properties/AssemblyInfo.cs create mode 100644 VIN-LIB/ConsoleApp1/App.config create mode 100644 VIN-LIB/ConsoleApp1/ConsoleApp1.csproj create mode 100644 VIN-LIB/ConsoleApp1/Program.cs create mode 100644 VIN-LIB/ConsoleApp1/Properties/AssemblyInfo.cs create mode 100644 VIN-LIB/VIN-LIB.sln create mode 100644 VIN-LIB/VIN-LIB/Properties/AssemblyInfo.cs create mode 100644 VIN-LIB/VIN-LIB/VIN-LIB.csproj create mode 100644 VIN-LIB/VIN-LIB/VIN.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7279f31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.vs/ +[Bb]in/ +[Oo]bj/ +*.user \ No newline at end of file diff --git a/ConsoleApp1/ConsoleApp1.sln b/ConsoleApp1/ConsoleApp1.sln new file mode 100644 index 0000000..3b72d4f --- /dev/null +++ b/ConsoleApp1/ConsoleApp1.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35919.96 d17.13 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8F1FCDD4-4F57-428F-AC1D-917430EFC911} + EndGlobalSection +EndGlobal diff --git a/ConsoleApp1/ConsoleApp1/App.config b/ConsoleApp1/ConsoleApp1/App.config new file mode 100644 index 0000000..193aecc --- /dev/null +++ b/ConsoleApp1/ConsoleApp1/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj b/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj new file mode 100644 index 0000000..6d463eb --- /dev/null +++ b/ConsoleApp1/ConsoleApp1/ConsoleApp1.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {F7BBFFB9-4067-4AE0-9E6D-88C23E7B6A78} + Exe + ConsoleApp1 + ConsoleApp1 + v4.8 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + False + ..\..\VIN-LIB\VIN-LIB\bin\Debug\VIN-LIB.dll + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp1/ConsoleApp1/Program.cs b/ConsoleApp1/ConsoleApp1/Program.cs new file mode 100644 index 0000000..bbfdf78 --- /dev/null +++ b/ConsoleApp1/ConsoleApp1/Program.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using VIN_LIB; + +namespace ConsoleApp1 +{ + internal class Program + { + static void Main(string[] args) + { + string[] testVins = new string[] + { + // РОССИЯ (XTA - АвтоВАЗ, X7L - Renault) + "XTA210700L1234567", "XTA211400M1234567", "X7LHSR450J1234567", "XTA11183091234567", "XTA210900V1234567", + + // ГЕРМАНИЯ (WBA - BMW, WVG - VW, WDC - Mercedes) + "WBA316000K1234567", "WVWZZZ1JZ1W123456", "WDC1690311J123456", "WBA530D00L1234567", "WVGZZZ5NZCW123456", + + // США (1FA - Ford, 1GC - Chevrolet) + "1FA6P8CF0E1234567", "1G6AF57V041234567", "1FMEU34E071234567", "1GCGK23G0B1234567", "1FM5K8GT0H1234567", + + // ЯПОНИЯ (JTD - Toyota, JHM - Honda) + "JTD12345678123456", "JHMRE485081234567", "JTDKB22U001234567", "JHMCV1650C1234567", "JTDGX31P0E1234567", + + // ЮЖНАЯ КОРЕЯ (KNA - Kia, KMH - Hyundai) + "KNAJP241261234567", "KMHCT41M0A1234567", "KNAKU4120D1234567", "KMHSH51J0B1234567", "KNAJX5240L1234567", + + // МАЛЫЕ ПРОИЗВОДИТЕЛИ (3-й символ '9') + // Здесь страна определяется по 12-14 символам (в примерах это X39 - Россия) + "X3912345678X39456", "W0912345678W09123", "Y9912345678Y99123", "Z9912345678Z99123", "99912345678999123", + + // ФРАНЦИЯ И ИТАЛИЯ (VF3 - Peugeot, ZFA - Fiat) + "VF3CC8HZB81234567", "ZFA18200001234567", "VF7LC5FW091234567", "ZAR93900001234567", "VF32CKFVC21234567", + + // РАЗНЫЕ РЕГИОНЫ (Китай, Великобритания, Швеция) + "LSV12345678123456", "SAL12345678123456", "YS312345678123456", "LNV12345678123456", "SAB12345678123456", + + // ДОПОЛНИТЕЛЬНЫЕ (Казахстан, Узбекистан, Чехия) + "KS112345678123456", "XWB12345678123456", "TMB12345678123456", "KZC12345678123456", "XW812345678123456", + "3HG12345678123456", "8AW12345678123456", "6AB12345678123456", "VSS12345678123456", "Y3B12345678123456" + }; + /* + string vin = "Z9111070060057018"; + string Euvin = "XW8AG4NH7KK108004"; + if (VIN_LIB.VIN.CheckVIN(Euvin)) + Console.WriteLine("Вин годен"); + else + Console.WriteLine("Вин не годен"); + + Console.WriteLine(VIN_LIB.VIN.GetVINCountry(vin)); + + Console.WriteLine(VIN_LIB.VIN.GetTransportYear(vin)); + + var a = VIN_LIB.VIN.GetVinCountries(); + int i = 0; + foreach ( var c in a) + { + i++; + Console.WriteLine($"Ключ: {c.Key} Страна: {c.Value} Строка: {i}"); + }*/ + int i = 0; + int j = 0; + foreach (string v in testVins) + { + if (VIN_LIB.VIN.CheckVIN(v)) + i++; + else + j++; + Console.WriteLine($"Страна: {VIN_LIB.VIN.GetVINCountry(v)}"); + Console.WriteLine($"Вин номер: {(VIN_LIB.VIN.CheckVIN(v) ? "Верный" : "Не верный")}"); + Console.WriteLine($"Год: {VIN_LIB.VIN.GetTransportYear(v)}"); + } + Console.WriteLine($"Успешно: {i}"); + Console.WriteLine($"Не успешно: {j}"); + Console.ReadLine(); + + } + } +} diff --git a/ConsoleApp1/ConsoleApp1/Properties/AssemblyInfo.cs b/ConsoleApp1/ConsoleApp1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0dff2dc --- /dev/null +++ b/ConsoleApp1/ConsoleApp1/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Общие сведения об этой сборке предоставляются следующим набором +// набора атрибутов. Измените значения этих атрибутов для изменения сведений, +// связанные с этой сборкой. +[assembly: AssemblyTitle("ConsoleApp1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("HP Inc.")] +[assembly: AssemblyProduct("ConsoleApp1")] +[assembly: AssemblyCopyright("Copyright © HP Inc. 2026")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми +// для компонентов COM. Если необходимо обратиться к типу в этой сборке через +// из модели COM задайте для атрибута ComVisible этого типа значение true. +[assembly: ComVisible(false)] + +// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM +[assembly: Guid("f7bbffb9-4067-4ae0-9e6d-88c23e7b6a78")] + +// Сведения о версии сборки состоят из указанных ниже четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер сборки +// Номер редакции +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/VIN-LIB/ConsoleApp1/App.config b/VIN-LIB/ConsoleApp1/App.config new file mode 100644 index 0000000..193aecc --- /dev/null +++ b/VIN-LIB/ConsoleApp1/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/VIN-LIB/ConsoleApp1/ConsoleApp1.csproj b/VIN-LIB/ConsoleApp1/ConsoleApp1.csproj new file mode 100644 index 0000000..91ffb59 --- /dev/null +++ b/VIN-LIB/ConsoleApp1/ConsoleApp1.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {714254CA-DDE4-42B2-8077-38D9F565C70F} + Exe + ConsoleApp1 + ConsoleApp1 + v4.8 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + False + ..\VIN-LIB\bin\Release\VIN-LIB.dll + + + + + + + + + + + \ No newline at end of file diff --git a/VIN-LIB/ConsoleApp1/Program.cs b/VIN-LIB/ConsoleApp1/Program.cs new file mode 100644 index 0000000..133a332 --- /dev/null +++ b/VIN-LIB/ConsoleApp1/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using VIN_LIB; + +namespace ConsoleApp1 +{ + internal class Program + { + static void Main(string[] args) + { + + string vin = "Z9MCM56557C404453"; + if (VIN_LIB.VIN.CheckVIN(vin)) + Console.WriteLine("Вин годен"); + VIN_LIB.VIN.GetVINCountry(vin); + Console.ReadLine(); + + } + } +} diff --git a/VIN-LIB/ConsoleApp1/Properties/AssemblyInfo.cs b/VIN-LIB/ConsoleApp1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..faea254 --- /dev/null +++ b/VIN-LIB/ConsoleApp1/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Общие сведения об этой сборке предоставляются следующим набором +// набора атрибутов. Измените значения этих атрибутов для изменения сведений, +// связанные с этой сборкой. +[assembly: AssemblyTitle("ConsoleApp1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("HP Inc.")] +[assembly: AssemblyProduct("ConsoleApp1")] +[assembly: AssemblyCopyright("Copyright © HP Inc. 2026")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми +// для компонентов COM. Если необходимо обратиться к типу в этой сборке через +// из модели COM задайте для атрибута ComVisible этого типа значение true. +[assembly: ComVisible(false)] + +// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM +[assembly: Guid("714254ca-dde4-42b2-8077-38d9f565c70f")] + +// Сведения о версии сборки состоят из указанных ниже четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер сборки +// Номер редакции +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/VIN-LIB/VIN-LIB.sln b/VIN-LIB/VIN-LIB.sln new file mode 100644 index 0000000..c2fe958 --- /dev/null +++ b/VIN-LIB/VIN-LIB.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35919.96 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VIN-LIB", "VIN-LIB\VIN-LIB.csproj", "{78203663-3306-4E81-922F-1A5A939A22BC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{714254CA-DDE4-42B2-8077-38D9F565C70F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78203663-3306-4E81-922F-1A5A939A22BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78203663-3306-4E81-922F-1A5A939A22BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78203663-3306-4E81-922F-1A5A939A22BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78203663-3306-4E81-922F-1A5A939A22BC}.Release|Any CPU.Build.0 = Release|Any CPU + {714254CA-DDE4-42B2-8077-38D9F565C70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {714254CA-DDE4-42B2-8077-38D9F565C70F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {714254CA-DDE4-42B2-8077-38D9F565C70F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {714254CA-DDE4-42B2-8077-38D9F565C70F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {309FDFE6-0A5F-4D5A-93A0-87FF7F7F2348} + EndGlobalSection +EndGlobal diff --git a/VIN-LIB/VIN-LIB/Properties/AssemblyInfo.cs b/VIN-LIB/VIN-LIB/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..76cdbb5 --- /dev/null +++ b/VIN-LIB/VIN-LIB/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Общие сведения об этой сборке предоставляются следующим набором +// набора атрибутов. Измените значения этих атрибутов для изменения сведений, +// связанные со сборкой. +[assembly: AssemblyTitle("VIN-LIB")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("HP Inc.")] +[assembly: AssemblyProduct("VIN-LIB")] +[assembly: AssemblyCopyright("Copyright © HP Inc. 2026")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми +// для компонентов COM. Если необходимо обратиться к типу в этой сборке через +// COM, задайте атрибуту ComVisible значение TRUE для этого типа. +[assembly: ComVisible(false)] + +// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM +[assembly: Guid("78203663-3306-4e81-922f-1a5a939a22bc")] + +// Сведения о версии сборки состоят из указанных ниже четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер сборки +// Редакция +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/VIN-LIB/VIN-LIB/VIN-LIB.csproj b/VIN-LIB/VIN-LIB/VIN-LIB.csproj new file mode 100644 index 0000000..f75d0b0 --- /dev/null +++ b/VIN-LIB/VIN-LIB/VIN-LIB.csproj @@ -0,0 +1,48 @@ + + + + + Debug + AnyCPU + {78203663-3306-4E81-922F-1A5A939A22BC} + Library + Properties + VIN_LIB + VIN-LIB + v4.8 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VIN-LIB/VIN-LIB/VIN.cs b/VIN-LIB/VIN-LIB/VIN.cs new file mode 100644 index 0000000..e051726 --- /dev/null +++ b/VIN-LIB/VIN-LIB/VIN.cs @@ -0,0 +1,276 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VIN_LIB +{ + public class VIN + { + public static Dictionary GetVinCountries() + { + var countries = new Dictionary(); + //Африка + SdelatInterval(countries, "AA", "AH", "ЮАР"); + SdelatInterval(countries, "AJ", "AN", "Кот-д’Ивуар"); + SdelatInterval(countries, "BA", "BE", "Ангола"); + SdelatInterval(countries, "BF", "BK", "Кения"); + SdelatInterval(countries, "BL", "BR", "Танзания"); + SdelatInterval(countries, "CA", "CE", "Бенин"); + SdelatInterval(countries, "CF", "CK", "Мадагаскар"); + SdelatInterval(countries, "CL", "CR", "Тунис"); + SdelatInterval(countries, "DA", "DE", "Египет"); + SdelatInterval(countries, "DF", "DK", "Марокко"); + SdelatInterval(countries, "DL", "DR", "Замбия"); + SdelatInterval(countries, "EA", "EE", "Эфиопия"); + SdelatInterval(countries, "EF", "EK", "Мозамбик"); + SdelatInterval(countries, "FA", "FE", "Гана"); + SdelatInterval(countries, "FF", "FK", "Нигерия"); + + //Азия + SdelatInterval(countries, "JA", "JT", "Япония"); + SdelatInterval(countries, "KA", "KE", "Шри Ланка"); + SdelatInterval(countries, "KF", "KK", "Израиль"); + SdelatInterval(countries, "KL", "KR", "Южная Корея"); + SdelatInterval(countries, "KS", "K0", "Казахстан"); + SdelatInterval(countries, "LA", "L0", "Китай"); + SdelatInterval(countries, "MA", "ME", "Индия"); + SdelatInterval(countries, "MF", "MK", "Индонезия"); + SdelatInterval(countries, "ML", "MR", "Таиланд"); + SdelatInterval(countries, "NF", "NK", "Пакистан"); + SdelatInterval(countries, "NL", "NR", "Турция"); + SdelatInterval(countries, "PA", "PE", "Филиппины"); + SdelatInterval(countries, "PF", "PK", "Сингапур"); + SdelatInterval(countries, "PL", "PR", "Малайзия"); + SdelatInterval(countries, "RA", "RE", "ОАЭ"); + SdelatInterval(countries, "RF", "RK", "Тайвань"); + SdelatInterval(countries, "RL", "RR", "Вьетнам"); + SdelatInterval(countries, "RS", "R0", "Саудовская Аравия"); + + // Европа + SdelatInterval(countries, "SA", "SM", "Великобритания"); + SdelatInterval(countries, "SN", "ST", "Германия"); + SdelatInterval(countries, "SU", "SZ", "Польша"); + SdelatInterval(countries, "S1", "S4", "Латвия"); + SdelatInterval(countries, "TA", "TH", "Швейцария"); + SdelatInterval(countries, "TJ", "TP", "Чехия"); + SdelatInterval(countries, "TR", "TV", "Венгрия"); + SdelatInterval(countries, "TW", "T1", "Португалия"); + SdelatInterval(countries, "UH", "UM", "Дания"); + SdelatInterval(countries, "UN", "UT", "Ирландия"); + SdelatInterval(countries, "UU", "UZ", "Румыния"); + SdelatInterval(countries, "U5", "U7", "Словакия"); + SdelatInterval(countries, "VA", "VE", "Австрия"); + SdelatInterval(countries, "VF", "VR", "Франция"); + SdelatInterval(countries, "VS", "VW", "Испания"); + SdelatInterval(countries, "VX", "V2", "Сербия"); + SdelatInterval(countries, "V3", "V5", "Хорватия"); + SdelatInterval(countries, "V6", "V0", "Эстония"); + SdelatInterval(countries, "WA", "W0", "Германия"); + SdelatInterval(countries, "XA", "XE", "Болгария"); + SdelatInterval(countries, "XF", "XK", "Греция"); + SdelatInterval(countries, "XL", "XR", "Нидерланды"); + SdelatInterval(countries, "XS", "XW", "СССР/СНГ"); + SdelatInterval(countries, "XX", "X2", "Люксембург"); + SdelatInterval(countries, "X3", "X0", "Россия"); + SdelatInterval(countries, "YA", "YE", "Бельгия"); + SdelatInterval(countries, "YF", "YK", "Финляндия"); + SdelatInterval(countries, "YL", "YR", "Мальта"); + SdelatInterval(countries, "YS", "YW", "Швеция"); + SdelatInterval(countries, "YX", "Y2", "Норвегия"); + SdelatInterval(countries, "Y3", "Y5", "Беларусь"); + SdelatInterval(countries, "Y6", "Y0", "Украина"); + SdelatInterval(countries, "ZA", "ZR", "Италия"); + SdelatInterval(countries, "ZX", "Z2", "Словения"); + SdelatInterval(countries, "Z3", "Z5", "Литва"); + SdelatInterval(countries, "Z6", "Z0", "Россия"); + + // Америка + SdelatInterval(countries, "1A", "10", "США"); + SdelatInterval(countries, "2A", "20", "Канада"); + SdelatInterval(countries, "3A", "3W", "Мексика"); + SdelatInterval(countries, "3X", "37", "Коста-Рика"); + SdelatInterval(countries, "38", "30", "Каймановы острова"); + SdelatInterval(countries, "4A", "40", "США"); + SdelatInterval(countries, "5A", "50", "США"); + + // Океания + SdelatInterval(countries, "6A", "6W", "Австралия"); + SdelatInterval(countries, "7A", "7E", "Новая Зеландия"); + + // Юж Америка + SdelatInterval(countries, "8A", "8E", "Аргентина"); + SdelatInterval(countries, "8F", "8K", "Чили"); + SdelatInterval(countries, "8L", "8R", "Эквадор"); + SdelatInterval(countries, "8S", "8W", "Перу"); + SdelatInterval(countries, "8X", "82", "Венесуэла"); + SdelatInterval(countries, "9A", "9E", "Бразилия"); + SdelatInterval(countries, "9F", "9K", "Колумбия"); + SdelatInterval(countries, "9L", "9R", "Парагвай"); + SdelatInterval(countries, "9S", "9W", "Уругвай"); + SdelatInterval(countries, "9X", "92", "Тринидад и Тобаго"); + SdelatInterval(countries, "93", "99", "Бразилия"); + + return countries; + } + public static char[] allowedChars = "ABCDEFGHJKLMNPRSTUVWXYZ1234567890".ToCharArray(); + private static void SdelatInterval(Dictionary dict, string start, string end, string country) + { + bool started = false; + + // Перебираем все возможные комбинации из двух символов + foreach (char c1 in allowedChars) + { + foreach (char c2 in allowedChars) + { + string current = $"{c1}{c2}"; + + if (current == start) started = true; + + if (started) + { + if (!dict.ContainsKey(current)) + dict.Add(current, country); + + if (current == end) return; + } + } + } + } + public static string GetVINCountry(string vin) + { + if (string.IsNullOrEmpty(vin) || vin.Length < 17) + return "Некорректный VIN"; + + string countryCode; + + // Проверка правила "менее 500 автомобилей в год" + if (vin[2] == '9') + { + countryCode = vin.Substring(11, 2); + } + else + { + countryCode = vin.Substring(0, 2); + } + + if (GetVinCountries().TryGetValue(countryCode, out string countryName)) + { + return countryName; + } + + return "Страна не определена"; + } + public static bool CheckWMI(string vin) + { + string code = vin.Substring(0, 2); + + if (GetVinCountries().TryGetValue(code, out string country)) + { + return true; + } + return false; + } + public static bool CheckVDS(string vin) + { + if (vin[8] == CalculateCheckDigit(vin)) + return true; + return false; + } + public static char CalculateCheckDigit(string vin) + { + int GetValue(char c) + { + if (char.IsDigit(c)) return c - '0'; + switch (c) + { + case 'A': case 'J': return 1; + case 'B': case 'K': case 'S': return 2; + case 'C': case 'L': case 'T': return 3; + case 'D': case 'M': case 'U': return 4; + case 'E': case 'N': case 'V': return 5; + case 'F': case 'P': case 'W': return 6; + case 'G': case 'R': case 'X': return 7; + case 'H': case 'Y': return 8; + case 'Z': return 9; + default: return 0; + } + } + + int[] weights = { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 }; + + int sum = 0; + for (int i = 0; i < 17; i++) + { + sum += GetValue(vin[i]) * weights[i]; + } + + + int remainder = sum % 11; + + if (remainder == 10) return 'X'; + return (char)(remainder + '0'); + } + + private static readonly Dictionary YearCodes = new Dictionary + { + {'A', 1980}, {'B', 1981}, {'C', 1982}, {'D', 1983}, {'E', 1984}, {'F', 1985}, {'G', 1986}, {'H', 1987}, {'J', 1988}, {'K', 1989}, + {'L', 1990}, {'M', 1991}, {'N', 1992}, {'P', 1993}, {'R', 1994}, {'S', 1995}, {'T', 1996}, {'V', 1997}, {'W', 1998}, {'X', 1999}, + {'Y', 2000}, {'1', 2001}, {'2', 2002}, {'3', 2003}, {'4', 2004}, {'5', 2005}, {'6', 2006}, {'7', 2007}, {'8', 2008}, {'9', 2009} + }; + + public static int GetTransportYear(string vin) + { + if (string.IsNullOrEmpty(vin) || vin.Length < 10) + return 0; + + // Год — это всегда 10-й символ VIN (индекс 9) + char yearCode = char.ToUpper(vin[9]); + + if (YearCodes.TryGetValue(yearCode, out int baseYear)) + { + // Поскольку коды повторяются каждые 30 лет (A было в 1980 и снова в 2010), + // нужно определить, к какому периоду относится авто. + // Современные системы обычно проверяют текущий год. + + int currentYear = DateTime.Now.Year; + int year = baseYear; + + // Если машина из будущего (например, код 'A' и сейчас 2024 год), + // значит это 2010 год, а не 1980. + while (year + 30 <= currentYear + 1) // +1, так как модельный год может обгонять календарный + { + year += 30; + } + + return year; + } + + return 0; + } + public static bool CheckVIS(string vin) + { + if (string.IsNullOrEmpty(vin) || vin.Length < 17) + return false; + + for (int i = 13; i < 17; i++) + { + if (!char.IsDigit(vin[i])) return false; + } + return true; + } + public static bool CheckVIN(string vin) + { + if (string.IsNullOrEmpty(vin) || vin.Length < 17) + return false; + if(!CheckWMI(vin)) + return false; + if (!CheckVDS(vin)) + return false; + if (!CheckVIS(vin)) + return false; + return true; + } + } +}