├── .gitignore ├── Dadata.Test ├── CleanClientAsyncTest.cs ├── CleanClientSyncTest.cs ├── Dadata.Test.csproj ├── GeolocateClientAsyncTest.cs ├── GeolocateClientSyncTest.cs ├── IplocateClientAsyncTest.cs ├── IplocateClientSyncTest.cs ├── OutwardClientAsyncTest.cs ├── OutwardClientSyncTest.cs ├── ProfileClientAsyncTest.cs ├── ProfileClientSyncTest.cs ├── SerializeTest.cs ├── SuggestClientAsyncTest.cs └── SuggestClientSyncTest.cs ├── Dadata.nuspec ├── Dadata.sln ├── Dadata ├── CleanClient.cs ├── CleanClientAsync.cs ├── CleanClientSync.cs ├── ClientBase.cs ├── ClientBaseAsync.cs ├── ClientBaseSync.cs ├── Dadata.csproj ├── GeolocateClient.cs ├── ICleanClientAsync.cs ├── ICleanClientSync.cs ├── IOurwardClientSync.cs ├── IOutwardClientAsync.cs ├── IProfileClientAsync.cs ├── IProfileClientSync.cs ├── ISuggestClientAsync.cs ├── ISuggestClientSync.cs ├── IplocateClient.cs ├── Model │ ├── Address.cs │ ├── AsIs.cs │ ├── Bank.cs │ ├── Birthdate.cs │ ├── CarBrand.cs │ ├── CleanRequest.cs │ ├── CleanResponse.cs │ ├── CleanResponseConverter.cs │ ├── Company.cs │ ├── Country.cs │ ├── Currency.cs │ ├── DateMillisConverter.cs │ ├── DateRuConverter.cs │ ├── DeliveryCity.cs │ ├── Email.cs │ ├── FiasAddress.cs │ ├── FindAddressRequest.cs │ ├── FindAffiliatedRequest.cs │ ├── FindBankRequest.cs │ ├── FindPartyRequest.cs │ ├── FmsUnit.cs │ ├── FnsUnit.cs │ ├── FtsUnit.cs │ ├── Fullname.cs │ ├── GeolocateRequest.cs │ ├── GetBalanceResponse.cs │ ├── GetDailyStatsResponse.cs │ ├── GetVersionsResponse.cs │ ├── IDadataEntity.cs │ ├── IDadataRequest.cs │ ├── IDadataResponse.cs │ ├── IOutward.cs │ ├── IplocateResponse.cs │ ├── LocationGeo.cs │ ├── MetroStation.cs │ ├── MktuRecord.cs │ ├── OkpdRecord.cs │ ├── OktmoRecord.cs │ ├── OkvedRecord.cs │ ├── Outwards.cs │ ├── Party.cs │ ├── PartyBy.cs │ ├── PartyKz.cs │ ├── Passport.cs │ ├── Phone.cs │ ├── PostalUnit.cs │ ├── RegionCourt.cs │ ├── StructureType.cs │ ├── SuggestAddressRequest.cs │ ├── SuggestBankRequest.cs │ ├── SuggestEntity.cs │ ├── SuggestMethod.cs │ ├── SuggestNameRequest.cs │ ├── SuggestOutwardRequest.cs │ ├── SuggestPartyRequest.cs │ ├── SuggestRequest.cs │ ├── SuggestResponse.cs │ ├── Suggestion.cs │ └── Vehicle.cs ├── OutwardClient.cs ├── OutwardClientAsync.cs ├── OutwardClientSync.cs ├── ProfileClient.cs ├── ProfileClientAsync.cs ├── ProfileClientSync.cs ├── SuggestClient.cs ├── SuggestClientAsync.cs └── SuggestClientSync.cs ├── LICENSE ├── Makefile └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | 9 | # Build results 10 | [Dd]ebug/ 11 | [Dd]ebugPublic/ 12 | [Rr]elease/ 13 | [Rr]eleases/ 14 | x64/ 15 | x86/ 16 | build/ 17 | bld/ 18 | lib/ 19 | [Bb]in/ 20 | [Oo]bj/ 21 | 22 | # Roslyn cache directories 23 | *.ide/ 24 | 25 | # MSTest test Results 26 | [Tt]est[Rr]esult*/ 27 | [Bb]uild[Ll]og.* 28 | 29 | #NUNIT 30 | *.VisualState.xml 31 | TestResult.xml 32 | 33 | # Build Results of an ATL Project 34 | [Dd]ebugPS/ 35 | [Rr]eleasePS/ 36 | dlldata.c 37 | 38 | *_i.c 39 | *_p.c 40 | *_i.h 41 | *.ilk 42 | *.meta 43 | *.obj 44 | *.pch 45 | *.pdb 46 | *.pgc 47 | *.pgd 48 | *.rsp 49 | *.sbr 50 | *.tlb 51 | *.tli 52 | *.tlh 53 | *.tmp 54 | *.tmp_proj 55 | *.log 56 | *.vspscc 57 | *.vssscc 58 | .builds 59 | *.pidb 60 | *.svclog 61 | *.scc 62 | *.userprefs 63 | 64 | # Chutzpah Test files 65 | _Chutzpah* 66 | 67 | # Visual C++ cache files 68 | ipch/ 69 | *.aps 70 | *.ncb 71 | *.opensdf 72 | *.sdf 73 | *.cachefile 74 | 75 | # Visual Studio profiler 76 | *.psess 77 | *.vsp 78 | *.vspx 79 | 80 | # TFS 2012 Local Workspace 81 | $tf/ 82 | 83 | # Guidance Automation Toolkit 84 | *.gpState 85 | 86 | # ReSharper is a .NET coding add-in 87 | _ReSharper*/ 88 | *.[Rr]e[Ss]harper 89 | *.DotSettings.user 90 | 91 | # JustCode is a .NET coding addin-in 92 | .JustCode 93 | 94 | # TeamCity is a build add-in 95 | _TeamCity* 96 | 97 | # DotCover is a Code Coverage Tool 98 | *.dotCover 99 | 100 | # NCrunch 101 | _NCrunch_* 102 | .*crunch*.local.xml 103 | 104 | # MightyMoose 105 | *.mm.* 106 | AutoTest.Net/ 107 | 108 | # Web workbench (sass) 109 | .sass-cache/ 110 | 111 | # Installshield output folder 112 | [Ee]xpress/ 113 | 114 | # DocProject is a documentation generator add-in 115 | DocProject/buildhelp/ 116 | DocProject/Help/*.HxT 117 | DocProject/Help/*.HxC 118 | DocProject/Help/*.hhc 119 | DocProject/Help/*.hhk 120 | DocProject/Help/*.hhp 121 | DocProject/Help/Html2 122 | DocProject/Help/html 123 | 124 | # Click-Once directory 125 | publish/ 126 | 127 | # Publish Web Output 128 | *.[Pp]ublish.xml 129 | *.azurePubxml 130 | # TODO: Comment the next line if you want to checkin your web deploy settings 131 | # but database connection strings (with potential passwords) will be unencrypted 132 | *.pubxml 133 | 134 | # NuGet Packages 135 | *.nupkg 136 | # The packages folder can be ignored because of Package Restore 137 | **/packages/* 138 | # except build/, which is used as an MSBuild target. 139 | !**/packages/build/ 140 | # If using the old MSBuild-Integrated Package Restore, uncomment this: 141 | #!**/packages/repositories.config 142 | 143 | # Windows Azure Build Output 144 | csx/ 145 | *.build.csdef 146 | 147 | # Windows Store app package directory 148 | AppPackages/ 149 | 150 | # Others 151 | sql/ 152 | *.Cache 153 | ClientBin/ 154 | [Ss]tyle[Cc]op.* 155 | ~$* 156 | *~ 157 | *.dbmdl 158 | *.dbproj.schemaview 159 | *.pfx 160 | *.publishsettings 161 | node_modules/ 162 | 163 | # RIA/Silverlight projects 164 | Generated_Code/ 165 | 166 | # Backup & report files from converting an old project file 167 | # to a newer Visual Studio version. Backup files are not needed, 168 | # because we have git ;-) 169 | _UpgradeReport_Files/ 170 | Backup*/ 171 | UpgradeLog*.XML 172 | UpgradeLog*.htm 173 | 174 | # SQL Server files 175 | *.mdf 176 | *.ldf 177 | 178 | # Business Intelligence projects 179 | *.rdl.data 180 | *.bim.layout 181 | *.bim_*.settings 182 | 183 | # Microsoft Fakes 184 | FakesAssemblies/ 185 | 186 | .vs/ 187 | .idea 188 | -------------------------------------------------------------------------------- /Dadata.Test/CleanClientAsyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Xunit; 5 | using Dadata.Model; 6 | 7 | namespace Dadata.Test 8 | { 9 | public class CleanClientAsyncTest 10 | { 11 | public CleanClientAsync api { get; set; } 12 | 13 | public CleanClientAsyncTest() 14 | { 15 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 16 | var secret = Environment.GetEnvironmentVariable("DADATA_SECRET_KEY"); 17 | api = new CleanClientAsync(token, secret); 18 | } 19 | 20 | [Fact] 21 | public async Task CleanAsIsTest() 22 | { 23 | var cleaned = await api.Clean("Омномном"); 24 | Assert.Equal("Омномном", cleaned.source); 25 | } 26 | 27 | [Fact] 28 | public async Task CleanAddressTest() 29 | { 30 | var cleaned = await api.Clean
("москва курьяновская наб 17"); 31 | Assert.Equal("Москва", cleaned.region); 32 | Assert.Null(cleaned.city); 33 | Assert.Equal("Печатники", cleaned.city_district); 34 | Assert.Equal("Курьяновская", cleaned.settlement); 35 | Assert.Null(cleaned.street); 36 | Assert.Equal("17", cleaned.house); 37 | Assert.Equal("65", cleaned.fias_level); 38 | Assert.Equal("0", cleaned.qc); 39 | Assert.Equal(3, cleaned.metro.Count); 40 | Assert.Null(cleaned.divisions.administrative.area); 41 | Assert.Null(cleaned.divisions.administrative.city); 42 | Assert.Equal("Печатники", cleaned.divisions.administrative.city_district.name); 43 | Assert.Null(cleaned.divisions.administrative.settlement); 44 | Assert.Equal("Курьяновская", cleaned.divisions.administrative.planning_structure.name); 45 | Assert.Null(cleaned.divisions.municipal); 46 | } 47 | 48 | [Fact] 49 | public async Task CleanAddressRoomTest() 50 | { 51 | var cleaned = await api.Clean
("г Москва, Куркинское шоссе, д 17, кв 173, ком 2"); 52 | Assert.Equal("17", cleaned.house); 53 | Assert.Equal("253", cleaned.house_flat_count); 54 | Assert.Equal("173", cleaned.flat); 55 | Assert.Equal("2", cleaned.room); 56 | } 57 | 58 | [Fact] 59 | public async Task CleanBirthdateTest() 60 | { 61 | var cleaned = await api.Clean("12.03.1990"); 62 | Assert.Equal(new DateTime(1990, 3, 12), cleaned.birthdate); 63 | Assert.Equal("0", cleaned.qc); 64 | } 65 | 66 | [Fact] 67 | public async Task CleanEmailTest() 68 | { 69 | var cleaned = await api.Clean("anderson@matrix.ru"); 70 | Assert.Equal("anderson@matrix.ru", cleaned.email); 71 | Assert.Equal("CORPORATE", cleaned.type); 72 | Assert.Equal("0", cleaned.qc); 73 | 74 | } 75 | 76 | [Fact] 77 | public async Task CleanNameTest() 78 | { 79 | var cleaned = await api.Clean("Ольга Викторовна Раздербань"); 80 | Assert.Equal("Ольга", cleaned.name); 81 | Assert.Equal("0", cleaned.qc); 82 | } 83 | 84 | [Fact] 85 | public async Task CleanPhoneTest() 86 | { 87 | var cleaned = await api.Clean("89168459285"); 88 | Assert.Equal("8459285", cleaned.number); 89 | Assert.Equal("Россия", cleaned.country); 90 | Assert.Equal("0", cleaned.qc); 91 | } 92 | 93 | [Fact] 94 | public async Task CleanPassportTest() 95 | { 96 | var cleaned = await api.Clean("4506 629672"); 97 | Assert.Equal("45 06", cleaned.series); 98 | Assert.Equal("10", cleaned.qc); 99 | } 100 | 101 | [Fact] 102 | public async Task CleanTest() 103 | { 104 | var structure = new[] { StructureType.NAME, StructureType.ADDRESS }; 105 | var data = new[] { "Кузнецов Петр Алексеич", "Москва Милютинский 13" }; 106 | 107 | var cleaned = await api.Clean(structure, data); 108 | Assert.Equal(2, cleaned.Count); 109 | 110 | Assert.IsType(cleaned[0]); 111 | var firstName = (Fullname)cleaned[0]; 112 | Assert.Equal("Петр", firstName.name); 113 | Assert.Equal("Алексеевич", firstName.patronymic); 114 | Assert.Equal("Кузнецов", firstName.surname); 115 | 116 | Assert.IsType
(cleaned[1]); 117 | var address = (Address)cleaned[1]; 118 | Assert.Equal("77000000000717100", address.kladr_id); 119 | Assert.Equal("Сретенский бульвар", address.metro[0].name); 120 | } 121 | } 122 | } 123 | 124 | -------------------------------------------------------------------------------- /Dadata.Test/CleanClientSyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Xunit; 5 | using Dadata.Model; 6 | 7 | namespace Dadata.Test 8 | { 9 | public class CleanClientSyncTest 10 | { 11 | public CleanClientSync api { get; set; } 12 | 13 | public CleanClientSyncTest() 14 | { 15 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 16 | var secret = Environment.GetEnvironmentVariable("DADATA_SECRET_KEY"); 17 | api = new CleanClientSync(token, secret); 18 | } 19 | 20 | [Fact] 21 | public void CleanAsIsTest() 22 | { 23 | var cleaned = api.Clean("Омномном"); 24 | Assert.Equal("Омномном", cleaned.source); 25 | } 26 | 27 | [Fact] 28 | public void CleanAddressTest() 29 | { 30 | var cleaned = api.Clean
("Москва Милютинский 13"); 31 | Assert.Equal("Милютинский", cleaned.street); 32 | Assert.Equal("0", cleaned.qc); 33 | } 34 | 35 | [Fact] 36 | public void CleanBirthdateTest() 37 | { 38 | var cleaned = api.Clean("12.03.1990"); 39 | Assert.Equal(new DateTime(1990, 3, 12), cleaned.birthdate); 40 | Assert.Equal("0", cleaned.qc); 41 | } 42 | 43 | [Fact] 44 | public void CleanEmailTest() 45 | { 46 | var cleaned = api.Clean("anderson@matrix.ru"); 47 | Assert.Equal("anderson@matrix.ru", cleaned.email); 48 | Assert.Equal("CORPORATE", cleaned.type); 49 | Assert.Equal("0", cleaned.qc); 50 | 51 | } 52 | 53 | [Fact] 54 | public void CleanNameTest() 55 | { 56 | var cleaned = api.Clean("Ольга Викторовна Раздербань"); 57 | Assert.Equal("Ольга", cleaned.name); 58 | Assert.Equal("0", cleaned.qc); 59 | } 60 | 61 | [Fact] 62 | public void CleanPhoneTest() 63 | { 64 | var cleaned = api.Clean("89168459285"); 65 | Assert.Equal("8459285", cleaned.number); 66 | Assert.Equal("Россия", cleaned.country); 67 | Assert.Equal("0", cleaned.qc); 68 | } 69 | 70 | [Fact] 71 | public void CleanPassportTest() 72 | { 73 | var cleaned = api.Clean("4506 629672"); 74 | Assert.Equal("45 06", cleaned.series); 75 | Assert.Equal("10", cleaned.qc); 76 | } 77 | 78 | [Fact] 79 | public void CleanTest() 80 | { 81 | var structure = new[] { StructureType.NAME, StructureType.ADDRESS }; 82 | var data = new[] { "Кузнецов Петр Алексеич", "Москва Милютинский 13" }; 83 | 84 | var cleaned = api.Clean(structure, data); 85 | Assert.Equal(2, cleaned.Count); 86 | 87 | Assert.IsType(cleaned[0]); 88 | var firstName = (Fullname)cleaned[0]; 89 | Assert.Equal("Петр", firstName.name); 90 | Assert.Equal("Алексеевич", firstName.patronymic); 91 | Assert.Equal("Кузнецов", firstName.surname); 92 | 93 | Assert.IsType
(cleaned[1]); 94 | var address = (Address)cleaned[1]; 95 | Assert.Equal("77000000000717100", address.kladr_id); 96 | Assert.Equal("Сретенский бульвар", address.metro[0].name); 97 | } 98 | } 99 | } 100 | 101 | -------------------------------------------------------------------------------- /Dadata.Test/Dadata.Test.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net8.0 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Dadata.Test/GeolocateClientAsyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xunit; 4 | using Dadata.Model; 5 | 6 | namespace Dadata.Test 7 | { 8 | public class GeolocateClientAsyncTest 9 | { 10 | public SuggestClientAsync api { get; set; } 11 | 12 | public GeolocateClientAsyncTest() 13 | { 14 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 15 | this.api = new SuggestClientAsync(token); 16 | } 17 | 18 | [Fact] 19 | public async Task GeolocateTest() 20 | { 21 | var response = await api.Geolocate(lat: 55.7366021, lon: 37.597643); 22 | var address = response.suggestions[0].data; 23 | Assert.Equal("Москва", address.city); 24 | Assert.Equal("Турчанинов", address.street); 25 | } 26 | 27 | [Fact] 28 | public async Task LanguageTest() 29 | { 30 | var request = new GeolocateRequest(lat: 55.7366021, lon: 37.597643) { language = "en" }; 31 | var response = await api.Geolocate(request); 32 | var address = response.suggestions[0].data; 33 | Assert.Equal("Moscow", address.city); 34 | Assert.Equal("Turchaninov", address.street); 35 | } 36 | 37 | [Fact] 38 | public async Task NotFoundTest() 39 | { 40 | var response = await api.Geolocate(lat: 1, lon: 1); 41 | Assert.Equal(0, response.suggestions.Count); 42 | } 43 | } 44 | } 45 | 46 | -------------------------------------------------------------------------------- /Dadata.Test/GeolocateClientSyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xunit; 3 | using Dadata.Model; 4 | 5 | namespace Dadata.Test 6 | { 7 | public class GeolocateClientSyncTest 8 | { 9 | public SuggestClientSync api { get; set; } 10 | 11 | public GeolocateClientSyncTest() 12 | { 13 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 14 | this.api = new SuggestClientSync(token); 15 | } 16 | 17 | [Fact] 18 | public void GeolocateTest() 19 | { 20 | var response = api.Geolocate(lat: 55.7366021, lon: 37.597643); 21 | var address = response.suggestions[0].data; 22 | Assert.Equal("Москва", address.city); 23 | Assert.Equal("Турчанинов", address.street); 24 | } 25 | 26 | [Fact] 27 | public void LanguageTest() 28 | { 29 | var request = new GeolocateRequest(lat: 55.7366021, lon: 37.597643) { language = "en" }; 30 | var response = api.Geolocate(request); 31 | var address = response.suggestions[0].data; 32 | Assert.Equal("Moscow", address.city); 33 | Assert.Equal("Turchaninov", address.street); 34 | } 35 | 36 | [Fact] 37 | public void NotFoundTest() 38 | { 39 | var response = api.Geolocate(lat: 1, lon: 1); 40 | Assert.Equal(0, response.suggestions.Count); 41 | } 42 | } 43 | } 44 | 45 | -------------------------------------------------------------------------------- /Dadata.Test/IplocateClientAsyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xunit; 4 | 5 | namespace Dadata.Test 6 | { 7 | public class IplocateClientAsyncTest 8 | { 9 | public SuggestClientAsync api { get; set; } 10 | 11 | public IplocateClientAsyncTest() 12 | { 13 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 14 | this.api = new SuggestClientAsync(token); 15 | } 16 | 17 | [Fact] 18 | public async Task IplocateTest() 19 | { 20 | var response = await api.Iplocate("213.180.193.3"); 21 | Assert.Equal("Москва", response.location.data.city); 22 | } 23 | 24 | [Fact] 25 | public async Task LanguageTest() 26 | { 27 | var response = await api.Iplocate("213.180.193.3", language: "en"); 28 | Assert.Equal("Moscow", response.location.data.city); 29 | } 30 | 31 | [Fact] 32 | public async Task NotFoundTest() 33 | { 34 | var response = await api.Iplocate("192.168.0.1"); 35 | Assert.Null(response.location); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Dadata.Test/IplocateClientSyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xunit; 3 | 4 | namespace Dadata.Test 5 | { 6 | public class IplocateClientSyncTest 7 | { 8 | public SuggestClientSync api { get; set; } 9 | 10 | public IplocateClientSyncTest() 11 | { 12 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 13 | this.api = new SuggestClientSync(token); 14 | } 15 | 16 | [Fact] 17 | public void IplocateTest() 18 | { 19 | var response = api.Iplocate("213.180.193.3"); 20 | Assert.Equal("Москва", response.location.data.city); 21 | } 22 | 23 | [Fact] 24 | public void LanguageTest() 25 | { 26 | var response = api.Iplocate("213.180.193.3", language: "en"); 27 | Assert.Equal("Moscow", response.location.data.city); 28 | } 29 | 30 | [Fact] 31 | public void NotFoundTest() 32 | { 33 | var response = api.Iplocate("192.168.0.1"); 34 | Assert.Null(response.location); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Dadata.Test/OutwardClientAsyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Xunit; 5 | using Dadata.Model; 6 | 7 | namespace Dadata.Test 8 | { 9 | public class OutwardClientAsyncTest 10 | { 11 | public OutwardClientAsync api { get; set; } 12 | 13 | public OutwardClientAsyncTest() 14 | { 15 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 16 | api = new OutwardClientAsync(token); 17 | } 18 | 19 | [Fact] 20 | public async Task SuggestFmsUnit() 21 | { 22 | var response = await api.Suggest("772-053"); 23 | var unit = response.suggestions[0].data; 24 | Assert.Equal("772-053", unit.code); 25 | Assert.Equal("ОВД ЗЮЗИНО Г. МОСКВЫ", unit.name); 26 | } 27 | 28 | [Fact] 29 | public async Task FilterFmsUnit() 30 | { 31 | var request = new SuggestOutwardRequest("иванов") 32 | { 33 | filters = new Dictionary() { { "region_code", "37" } } 34 | }; 35 | var response = await api.Suggest(request); 36 | var unit = response.suggestions[0].data; 37 | Assert.Equal("370-000", unit.code); 38 | Assert.Equal("ОВД ЛЕНИНСКОГО РАЙОНА Г. ИВАНОВО", unit.name); 39 | } 40 | 41 | [Fact] 42 | public async Task FindFnsUnit() 43 | { 44 | var response = await api.Find("5257"); 45 | var unit = response.suggestions[0].data; 46 | Assert.Equal("5257", unit.code); 47 | Assert.Contains("Нижегородской области", unit.name); 48 | Assert.Equal("40102810445370000059", unit.bank_correspondent_account); 49 | } 50 | 51 | [Fact] 52 | public async Task SuggestPostalUnit() 53 | { 54 | var response = await api.Suggest("дежнева 2а"); 55 | var unit = response.suggestions[0].data; 56 | Assert.Equal("127642", unit.postal_code); 57 | } 58 | 59 | [Fact] 60 | public async Task FindPostalUnit() 61 | { 62 | var response = await api.Find("127642"); 63 | var unit = response.suggestions[0].data; 64 | Assert.Equal("127642", unit.postal_code); 65 | } 66 | 67 | [Fact] 68 | public async Task GeolocatePostalUnit() 69 | { 70 | var response = await api.Geolocate(lat: 55.878, lon: 37.653, radius_meters: 1000); 71 | var unit = response.suggestions[1].data; 72 | Assert.Equal("910909", unit.postal_code); 73 | } 74 | 75 | [Fact] 76 | public async Task FindDelivery() 77 | { 78 | var response = await api.Find("3100400100000"); 79 | var city = response.suggestions[0].data; 80 | Assert.Equal("01929", city.boxberry_id); 81 | Assert.Equal("344", city.cdek_id); 82 | Assert.Equal("196006461", city.dpd_id); 83 | } 84 | 85 | [Fact] 86 | public async Task SuggestMetro() 87 | { 88 | var response = await api.Suggest("александр"); 89 | var station = response.suggestions[0].data; 90 | Assert.Equal("Александровский сад", station.name); 91 | Assert.Null(station.is_closed); 92 | } 93 | 94 | [Fact] 95 | public async Task FilterMetro() 96 | { 97 | var request = new SuggestOutwardRequest("александр") 98 | { 99 | filters = new Dictionary() { { "city", "Санкт-Петербург" } } 100 | }; 101 | var response = await api.Suggest(request); 102 | var station = response.suggestions[0].data; 103 | Assert.Equal("Площадь Александра Невского 1", station.name); 104 | } 105 | 106 | [Fact] 107 | public async Task SuggestCarBrand() 108 | { 109 | var response = await api.Suggest("FORD"); 110 | var brand = response.suggestions[0].data; 111 | Assert.Equal("Форд", brand.name_ru); 112 | } 113 | 114 | [Fact] 115 | public async Task FindOktmo() 116 | { 117 | var response = await api.Find("54623425"); 118 | var record = response.suggestions[0].data; 119 | Assert.Equal("54623425", record.oktmo); 120 | } 121 | 122 | [Fact] 123 | public async Task SuggestOkved2() 124 | { 125 | var response = await api.Suggest("51.22.3"); 126 | var record = response.suggestions[0].data; 127 | Assert.Equal("H.51.22.3", record.idx); 128 | } 129 | 130 | [Fact] 131 | public async Task SuggestCountry() 132 | { 133 | var response = await api.Suggest("ru"); 134 | var country = response.suggestions[0].data; 135 | Assert.Equal("Россия", country.name_short); 136 | } 137 | 138 | [Fact] 139 | public async Task SuggestCurrency() 140 | { 141 | var response = await api.Suggest("rub"); 142 | var currency = response.suggestions[0].data; 143 | Assert.Equal("Российский рубль", currency.name); 144 | } 145 | 146 | [Fact] 147 | public async Task SuggestFtsUnit() 148 | { 149 | var response = await api.Suggest("10002000"); 150 | var unit = response.suggestions[0].data; 151 | Assert.Equal("ДОМОДЕДОВСКАЯ ТАМОЖНЯ", unit.name); 152 | } 153 | 154 | [Fact] 155 | public async Task SuggestMktu() 156 | { 157 | var response = await api.Suggest("валенки"); 158 | var record = response.suggestions[0].data; 159 | Assert.Equal("250173", record.number); 160 | Assert.Equal("25", record.@class); 161 | } 162 | 163 | [Fact] 164 | public async Task SuggestOkpd2() 165 | { 166 | var response = await api.Suggest("калоши"); 167 | var record = response.suggestions[0].data; 168 | Assert.Equal("95.23.10.133", record.kod); 169 | } 170 | 171 | [Fact] 172 | public async Task SuggestRegionCourt() 173 | { 174 | var response = await api.Suggest("52MS0022"); 175 | var court = response.suggestions[0].data; 176 | Assert.StartsWith("Судебный участок № 1", court.name); 177 | } 178 | 179 | [Fact] 180 | public async Task SuggestPartyBy() 181 | { 182 | var response = await api.Suggest("онлайнер"); 183 | var party = response.suggestions[0].data; 184 | Assert.Equal("190657494", party.unp); 185 | Assert.Equal(PartyByType.LEGAL, party.type); 186 | Assert.Equal(PartyByStatus.ACTIVE, party.status); 187 | } 188 | 189 | [Fact] 190 | public async Task SuggestPartyKz() 191 | { 192 | var response = await api.Suggest("онлайн бухгалтерия"); 193 | var party = response.suggestions[0].data; 194 | Assert.Equal("230940037236", party.bin); 195 | Assert.Equal(PartyKzType.LEGAL, party.type); 196 | Assert.Equal(PartyKzStatus.ACTIVE, party.status); 197 | } 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /Dadata.Test/OutwardClientSyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Xunit; 4 | using Dadata.Model; 5 | 6 | namespace Dadata.Test 7 | { 8 | public class OutwardClientSyncTest 9 | { 10 | public OutwardClientSync api { get; set; } 11 | 12 | public OutwardClientSyncTest() 13 | { 14 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 15 | api = new OutwardClientSync(token); 16 | } 17 | 18 | [Fact] 19 | public void SuggestFmsUnit() 20 | { 21 | var response = api.Suggest("772-053"); 22 | var unit = response.suggestions[0].data; 23 | Assert.Equal("772-053", unit.code); 24 | Assert.Equal("ОВД ЗЮЗИНО Г. МОСКВЫ", unit.name); 25 | } 26 | 27 | [Fact] 28 | public void FilterFmsUnit() 29 | { 30 | var request = new SuggestOutwardRequest("иванов") 31 | { 32 | filters = new Dictionary() { { "region_code", "37" } } 33 | }; 34 | var response = api.Suggest(request); 35 | var unit = response.suggestions[0].data; 36 | Assert.Equal("370-000", unit.code); 37 | Assert.Equal("ОВД ЛЕНИНСКОГО РАЙОНА Г. ИВАНОВО", unit.name); 38 | } 39 | 40 | [Fact] 41 | public void FindFnsUnit() 42 | { 43 | var response = api.Find("5257"); 44 | var unit = response.suggestions[0].data; 45 | Assert.Equal("5257", unit.code); 46 | Assert.Contains("Нижегородской области", unit.name); 47 | Assert.Equal("40102810445370000059", unit.bank_correspondent_account); 48 | } 49 | 50 | [Fact] 51 | public void SuggestPostalUnit() 52 | { 53 | var response = api.Suggest("дежнева 2а"); 54 | var unit = response.suggestions[0].data; 55 | Assert.Equal("127642", unit.postal_code); 56 | } 57 | 58 | [Fact] 59 | public void FindPostalUnit() 60 | { 61 | var response = api.Find("127642"); 62 | var unit = response.suggestions[0].data; 63 | Assert.Equal("127642", unit.postal_code); 64 | } 65 | 66 | [Fact] 67 | public void GeolocatePostalUnit() 68 | { 69 | var response = api.Geolocate(lat: 55.878, lon: 37.653, radius_meters: 1000); 70 | var unit = response.suggestions[1].data; 71 | Assert.Equal("910909", unit.postal_code); 72 | } 73 | 74 | [Fact] 75 | public void FindDelivery() 76 | { 77 | var response = api.Find("3100400100000"); 78 | var city = response.suggestions[0].data; 79 | Assert.Equal("01929", city.boxberry_id); 80 | Assert.Equal("344", city.cdek_id); 81 | Assert.Equal("196006461", city.dpd_id); 82 | } 83 | 84 | [Fact] 85 | public void SuggestMetro() 86 | { 87 | var response = api.Suggest("александр"); 88 | var station = response.suggestions[0].data; 89 | Assert.Equal("Александровский сад", station.name); 90 | Assert.Null(station.is_closed); 91 | } 92 | 93 | [Fact] 94 | public void FilterMetro() 95 | { 96 | var request = new SuggestOutwardRequest("александр") 97 | { 98 | filters = new Dictionary() { { "city", "Санкт-Петербург" } } 99 | }; 100 | var response = api.Suggest(request); 101 | var station = response.suggestions[0].data; 102 | Assert.Equal("Площадь Александра Невского 1", station.name); 103 | } 104 | 105 | [Fact] 106 | public void SuggestCarBrand() 107 | { 108 | var response = api.Suggest("FORD"); 109 | var brand = response.suggestions[0].data; 110 | Assert.Equal("Форд", brand.name_ru); 111 | } 112 | 113 | [Fact] 114 | public void SuggestOkved2() 115 | { 116 | var response = api.Suggest("51.22.3"); 117 | var record = response.suggestions[0].data; 118 | Assert.Equal("H.51.22.3", record.idx); 119 | } 120 | 121 | [Fact] 122 | public void SuggestCountry() 123 | { 124 | var response = api.Suggest("ru"); 125 | var country = response.suggestions[0].data; 126 | Assert.Equal("Россия", country.name_short); 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /Dadata.Test/ProfileClientAsyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xunit; 4 | 5 | namespace Dadata.Test 6 | { 7 | public class ProfileClientAsyncTest 8 | { 9 | public ProfileClientAsync api { get; set; } 10 | 11 | public ProfileClientAsyncTest() 12 | { 13 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 14 | var secret = Environment.GetEnvironmentVariable("DADATA_SECRET_KEY"); 15 | api = new ProfileClientAsync(token, secret); 16 | } 17 | 18 | [Fact] 19 | public async Task GetBalanceTest() 20 | { 21 | var response = await api.GetBalance(); 22 | Assert.True(response.balance >= 0); 23 | } 24 | 25 | [Fact] 26 | public async Task GetDailyStatsTest() 27 | { 28 | var response = await api.GetDailyStats(); 29 | Assert.Equal(DateTime.Today, response.date); 30 | } 31 | 32 | [Fact] 33 | public async Task GetVersionsTest() 34 | { 35 | var response = await api.GetVersions(); 36 | Assert.StartsWith("stable", response.dadata.version); 37 | Assert.True(response.suggestions.resources.ContainsKey("ЕГРЮЛ")); 38 | Assert.True(response.factor.resources.ContainsKey("ФИАС")); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Dadata.Test/ProfileClientSyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Xunit; 4 | 5 | namespace Dadata.Test 6 | { 7 | public class ProfileClientSyncTest 8 | { 9 | public ProfileClientSync api { get; set; } 10 | 11 | public ProfileClientSyncTest() 12 | { 13 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 14 | var secret = Environment.GetEnvironmentVariable("DADATA_SECRET_KEY"); 15 | api = new ProfileClientSync(token, secret); 16 | } 17 | 18 | [Fact] 19 | public void GetBalanceTest() 20 | { 21 | var response = api.GetBalance(); 22 | Assert.True(response.balance >= 0); 23 | } 24 | 25 | [Fact] 26 | public void GetDailyStatsTest() 27 | { 28 | var response = api.GetDailyStats(); 29 | Assert.Equal(DateTime.Today, response.date); 30 | } 31 | 32 | [Fact] 33 | public void GetVersionsTest() 34 | { 35 | var response = api.GetVersions(); 36 | Assert.StartsWith("stable", response.dadata.version); 37 | Assert.True(response.suggestions.resources.ContainsKey("ЕГРЮЛ")); 38 | Assert.True(response.factor.resources.ContainsKey("ФИАС")); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Dadata.Test/SerializeTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Newtonsoft.Json; 4 | using Xunit; 5 | 6 | namespace Dadata.Test 7 | { 8 | public class SerializeTest 9 | { 10 | public SuggestClientAsync api { get; set; } 11 | 12 | public SerializeTest() 13 | { 14 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 15 | api = new SuggestClientAsync(token); 16 | } 17 | 18 | [Fact] 19 | public async Task SerializeResponseTest() 20 | { 21 | var response = await api.FindParty("7707083893"); 22 | var json = JsonConvert.SerializeObject(response.suggestions); 23 | Assert.Contains("\"value\":\"ПАО СБЕРБАНК\"", json); 24 | Assert.Contains("\"registration_date\":677376000000", json); 25 | Assert.Contains("\"liquidation_date\":null", json); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Dadata.Test/SuggestClientAsyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using Xunit; 4 | using Dadata.Model; 5 | 6 | namespace Dadata.Test 7 | { 8 | public class SuggestClientAsyncTest 9 | { 10 | public SuggestClientAsync api { get; set; } 11 | 12 | public SuggestClientAsyncTest() 13 | { 14 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 15 | var secret = Environment.GetEnvironmentVariable("DADATA_SECRET_KEY"); 16 | this.api = new SuggestClientAsync(token, secret); 17 | } 18 | 19 | [Fact] 20 | public async Task SuggestAddressTest() 21 | { 22 | var query = "москва турчанинов 6с2"; 23 | var response = await api.SuggestAddress(query, count: 1); 24 | var address_data = response.suggestions[0].data; 25 | Assert.Equal("119034", address_data.postal_code); 26 | Assert.Equal("7704", address_data.tax_office); 27 | Assert.Equal("Парк культуры", address_data.metro[0].name); 28 | Console.WriteLine(string.Join("\n", response.suggestions)); 29 | } 30 | 31 | [Fact] 32 | public async Task SuggestAddressMunicipalTest() 33 | { 34 | var query = "самара сакко и ванцетти д 20"; 35 | var request = new SuggestAddressRequest(query) { division = AddressDivision.MUNICIPAL }; 36 | var response = await api.SuggestAddress(request); 37 | var address_data = response.suggestions[0].data; 38 | Assert.Equal("Самара", address_data.area); 39 | Assert.Equal("Железнодорожный", address_data.sub_area); 40 | Console.WriteLine(string.Join("\n", response.suggestions)); 41 | } 42 | 43 | [Fact] 44 | public async Task SuggestAddressLanguageTest() 45 | { 46 | var request = new SuggestAddressRequest("samara metallurgov") { language = "en" }; 47 | var response = await api.SuggestAddress(request); 48 | Assert.Equal("Russia, gorod Samara, prospekt Metallurgov", response.suggestions[0].value); 49 | } 50 | 51 | [Fact] 52 | public async Task SuggestAddressLocationsKladrTest() 53 | { 54 | var request = new SuggestAddressRequest("ватутина") 55 | { 56 | locations = new[] { 57 | new Address() { kladr_id = "65" }, 58 | } 59 | }; 60 | var response = await api.SuggestAddress(request); 61 | Assert.Equal("693022", response.suggestions[0].data.postal_code); 62 | Console.WriteLine(string.Join("\n", response.suggestions)); 63 | } 64 | 65 | [Fact] 66 | public async Task SuggestAddressLocationsMultipleLocationsTest() 67 | { 68 | var request = new SuggestAddressRequest("зеленоград") 69 | { 70 | locations = new[] 71 | { 72 | new Address() { kladr_id = "50" }, 73 | new Address() { kladr_id = "77" } 74 | } 75 | }; 76 | var response = await api.SuggestAddress(request); 77 | Assert.Equal("Зеленоград", response.suggestions[0].data.city); 78 | Console.WriteLine(string.Join("\n", response.suggestions)); 79 | } 80 | 81 | [Fact] 82 | public async Task SuggestAddressLocationsFiasCityTest() 83 | { 84 | var request = new SuggestAddressRequest("ватутина") 85 | { 86 | locations = new[] 87 | { 88 | // Южно-Сахалинск 89 | new Address() { city_fias_id = "44388ad0-06aa-49b0-bbf9-1704629d1d68" } 90 | } 91 | }; 92 | var response = await api.SuggestAddress(request); 93 | Assert.Equal("693022", response.suggestions[0].data.postal_code); 94 | Console.WriteLine(string.Join("\n", response.suggestions)); 95 | } 96 | 97 | [Fact] 98 | public async Task SuggestAddressLocationsGeoTest() 99 | { 100 | var request = new SuggestAddressRequest("сухонская ") 101 | { 102 | locations_geo = new[] 103 | { 104 | new LocationGeo() { lat=59.244634, lon=39.913355, radius_meters=200} 105 | } 106 | }; 107 | var response = await api.SuggestAddress(request); 108 | Assert.Equal("г Вологда, ул Сухонская", response.suggestions[0].value); 109 | Console.WriteLine(string.Join("\n", response.suggestions)); 110 | } 111 | 112 | [Fact] 113 | public async Task SuggestAddressBoundsTest() 114 | { 115 | var request = new SuggestAddressRequest("ново") 116 | { 117 | from_bound = new AddressBound("city"), 118 | to_bound = new AddressBound("city") 119 | }; 120 | var response = await api.SuggestAddress(request); 121 | Assert.Equal("Новосибирск", response.suggestions[0].data.city); 122 | Console.WriteLine(string.Join("\n", response.suggestions)); 123 | } 124 | 125 | [Fact] 126 | public async Task SuggestAddressHistoryTest() 127 | { 128 | var query = "москва хабар"; 129 | var response = await api.SuggestAddress(query); 130 | var address_data = response.suggestions[0].data; 131 | Assert.Equal("ул Черненко", address_data.history_values[0]); 132 | Console.WriteLine(string.Join("\n", response.suggestions)); 133 | } 134 | 135 | [Fact] 136 | public async Task FindAddressTest() 137 | { 138 | var response = await api.FindAddress("95dbf7fb-0dd4-4a04-8100-4f6c847564b5"); 139 | var address = response.suggestions[0].data; 140 | Assert.Equal("Москва", address.city); 141 | Assert.Equal("Сухонская", address.street); 142 | } 143 | 144 | [Fact] 145 | public async Task FindAddressMunicipalTest() 146 | { 147 | var request = new FindAddressRequest("9120b43f-2fae-4838-a144-85e43c2bfb29") 148 | { 149 | division = AddressDivision.MUNICIPAL 150 | }; 151 | var response = await api.FindAddress(request); 152 | var address = response.suggestions[0].data; 153 | Assert.Equal("Москва", address.region); 154 | Assert.Equal("муниципальный округ Свиблово", address.area); 155 | Assert.Null(address.city); 156 | Assert.Equal("Снежная", address.street); 157 | } 158 | 159 | [Fact] 160 | public async Task FindAddressLanguageTest() 161 | { 162 | var request = new FindAddressRequest("94b67f2f-f0f2-4a56-983b-90f0cec1d789") { language = "en" }; 163 | var response = await api.FindAddress(request); 164 | var address = response.suggestions[0].data; 165 | Assert.Equal("Samara", address.city); 166 | Assert.Equal("Metallurgov", address.street); 167 | } 168 | 169 | [Fact] 170 | public async Task SuggestBankTypeTest() 171 | { 172 | var request = new SuggestBankRequest("юмани") 173 | { 174 | type = new[] { BankType.NKO } 175 | }; 176 | var response = await api.SuggestBank(request); 177 | Assert.Equal("044525444", response.suggestions[0].data.bic); 178 | Assert.Equal(new DateTime(2012, 08, 02), response.suggestions[0].data.state.registration_date); 179 | Console.WriteLine(string.Join("\n", response.suggestions)); 180 | } 181 | 182 | [Fact] 183 | public async Task SuggestBankOpfTest() 184 | { 185 | var response = await api.SuggestBank("044525974"); // Тинькофф 186 | Assert.Equal(BankType.BANK, response.suggestions[0].data.opf.type); 187 | 188 | response = await api.SuggestBank("044525444"); // Юмани 189 | Assert.Equal(BankType.NKO, response.suggestions[0].data.opf.type); 190 | 191 | response = await api.SuggestBank("046577964"); // Альфа Екатеринбург 192 | Assert.Equal(BankType.BANK_BRANCH, response.suggestions[0].data.opf.type); 193 | 194 | response = await api.SuggestBank("044525000"); // ГУ Банка России по ЦФО 195 | Assert.Equal(BankType.CBR, response.suggestions[0].data.opf.type); 196 | 197 | response = await api.SuggestBank("041236100"); // УФК по Астраханской области 198 | Assert.Equal(BankType.TREASURY, response.suggestions[0].data.opf.type); 199 | 200 | response = await api.SuggestBank("044501002"); // Операционный департамент БР 201 | Assert.Equal(BankType.OTHER, response.suggestions[0].data.opf.type); 202 | } 203 | 204 | [Fact] 205 | public async Task FindBankTest() 206 | { 207 | var response = await api.FindBank("044525974"); 208 | var bank = response.suggestions[0].data; 209 | Assert.Equal("TICSRUMMXXX", bank.swift); 210 | Assert.Equal("044525000", bank.cbr.bic); 211 | 212 | response = await api.FindBank("011203901"); 213 | bank = response.suggestions[0].data; 214 | Assert.Equal("40102810445370000017", bank.treasury_accounts[0]); 215 | 216 | } 217 | 218 | [Fact] 219 | public async Task FindBankWithKppTest() 220 | { 221 | var request = new FindBankRequest(query: "7728168971", kpp: "667102002"); 222 | var response = await api.FindBank(request); 223 | var bank = response.suggestions[0].data; 224 | Assert.Equal("046577964", bank.bic); 225 | Assert.Equal("7728168971", bank.inn); 226 | Assert.Equal("667102002", bank.kpp); 227 | } 228 | 229 | [Fact] 230 | public async Task SuggestEmailTest() 231 | { 232 | var query = "anton@m"; 233 | var response = await api.SuggestEmail(query); 234 | Assert.Equal("anton@mail.ru", response.suggestions[0].value); 235 | Console.WriteLine(string.Join("\n", response.suggestions)); 236 | } 237 | 238 | [Fact] 239 | public async Task SuggestFiasTest() 240 | { 241 | var query = "москва турчанинов 6с2"; 242 | var response = await api.SuggestFias(query); 243 | var address = response.suggestions[0].data; 244 | Assert.Equal("Москва", address.region); 245 | Assert.Equal("Турчанинов", address.street); 246 | Assert.Equal("6", address.house); 247 | Assert.Equal("стр", address.building_type); 248 | Assert.Equal("2", address.building); 249 | Assert.Equal("8c925e61-9173-48b3-999e-dc85c86d89e7", address.fias_id); 250 | } 251 | 252 | [Fact] 253 | public async Task FindFiasTest() 254 | { 255 | var response = await api.FindFias("95dbf7fb-0dd4-4a04-8100-4f6c847564b5"); 256 | var address = response.suggestions[0].data; 257 | Assert.Equal("Москва", address.region); 258 | Assert.Equal("Сухонская", address.street); 259 | } 260 | 261 | [Fact] 262 | public async Task SuggestNameTest() 263 | { 264 | var query = "викт"; 265 | var response = await api.SuggestName(query); 266 | Assert.Equal("Виктор", response.suggestions[0].data.name); 267 | Console.WriteLine(string.Join("\n", response.suggestions)); 268 | } 269 | 270 | [Fact] 271 | public async Task SuggestNamePartsTest() 272 | { 273 | var request = new SuggestNameRequest("викт") 274 | { 275 | parts = new[] { FullnamePart.SURNAME } 276 | }; 277 | var response = await api.SuggestName(request); 278 | Assert.Equal("Викторова", response.suggestions[0].data.surname); 279 | Console.WriteLine(string.Join("\n", response.suggestions)); 280 | } 281 | 282 | [Fact] 283 | public async Task SuggestNameGenderTest() 284 | { 285 | var request = new SuggestNameRequest("виктор") 286 | { 287 | gender = Gender.FEMALE 288 | }; 289 | var response = await api.SuggestName(request); 290 | Assert.Equal("Виктория", response.suggestions[0].data.name); 291 | Console.WriteLine(string.Join("\n", response.suggestions)); 292 | } 293 | 294 | [Fact] 295 | public async Task SuggestPartyTest() 296 | { 297 | var query = "7707083893"; 298 | var response = await api.SuggestParty(query); 299 | var party = response.suggestions[0]; 300 | var address = response.suggestions[0].data.address; 301 | Assert.Equal("7707083893", party.data.inn); 302 | Assert.Equal("г Москва, ул Вавилова, д 19", address.value); 303 | Assert.Contains("ВАВИЛОВА", address.data.source); 304 | Assert.Equal("Вавилова", address.data.street); 305 | Console.WriteLine(string.Join("\n", response.suggestions)); 306 | } 307 | 308 | [Fact] 309 | public async Task SuggestPartyByOkvedTest() 310 | { 311 | var query = new SuggestPartyRequest("авиа") 312 | { 313 | okved = new[] { "85.22" } 314 | }; 315 | var response = await api.SuggestParty(query); 316 | var party = response.suggestions[0]; 317 | Assert.Equal("7712038455", party.data.inn); 318 | Console.WriteLine(string.Join("\n", response.suggestions)); 319 | } 320 | 321 | [Fact] 322 | public async Task SuggestPartyFioTest() 323 | { 324 | var query = "780251009376"; 325 | var response = await api.SuggestParty(query); 326 | var party = response.suggestions[0]; 327 | Assert.Equal("Кораева", party.data.fio.surname); 328 | Assert.Equal("Вероника", party.data.fio.name); 329 | Assert.Equal("Сергеевна", party.data.fio.patronymic); 330 | Console.WriteLine(string.Join("\n", response.suggestions)); 331 | } 332 | 333 | [Fact] 334 | public async Task SuggestPartyStatCodesTest() 335 | { 336 | var query = "7707083893"; 337 | var response = await api.SuggestParty(query); 338 | var party = response.suggestions[0]; 339 | Assert.Equal("45293554000", party.data.okato); 340 | Assert.Equal("45397000000", party.data.oktmo); 341 | Assert.Equal("00032537", party.data.okpo); 342 | Assert.Equal("4100104", party.data.okogu); 343 | Assert.Equal("41", party.data.okfs); 344 | Assert.Equal("2014", party.data.okved_type); 345 | Assert.Equal("64.19", party.data.okved); 346 | Console.WriteLine(string.Join("\n", response.suggestions)); 347 | } 348 | 349 | [Fact] 350 | public async Task SuggestPartyStatusTest() 351 | { 352 | var request = new SuggestPartyRequest("4713008497") 353 | { 354 | status = new[] { PartyStatus.LIQUIDATED } 355 | }; 356 | var response = await api.SuggestParty(request); 357 | Assert.Equal("4713008497", response.suggestions[0].data.inn); 358 | Console.WriteLine(string.Join("\n", response.suggestions)); 359 | } 360 | 361 | [Fact] 362 | public async Task SuggestPartyStatusBankruptTest() 363 | { 364 | var request = new SuggestPartyRequest("мир") 365 | { 366 | status = new[] { PartyStatus.BANKRUPT } 367 | }; 368 | var response = await api.SuggestParty(request); 369 | Assert.NotEqual(0, response.suggestions.Count); 370 | Console.WriteLine(string.Join("\n", response.suggestions)); 371 | } 372 | 373 | [Fact] 374 | public async Task SuggestPartyStateCodeTest() 375 | { 376 | var request = new SuggestPartyRequest("6102019481"); 377 | var response = await api.SuggestParty(request); 378 | Assert.Equal("203", response.suggestions[0].data.state.code); 379 | Console.WriteLine(string.Join("\n", response.suggestions)); 380 | } 381 | 382 | [Fact] 383 | public async Task SuggestPartyTypeTest() 384 | { 385 | var request = new SuggestPartyRequest("лаукаитис витас") 386 | { 387 | type = PartyType.INDIVIDUAL 388 | }; 389 | var response = await api.SuggestParty(request); 390 | Assert.Equal("773165008890", response.suggestions[0].data.inn); 391 | Console.WriteLine(string.Join("\n", response.suggestions)); 392 | } 393 | 394 | [Fact] 395 | public async Task FindPartyTest() 396 | { 397 | var response = await api.FindParty("7719402047"); 398 | var party = response.suggestions[0].data; 399 | Assert.Equal("МОТОРИКА", party.name.@short); 400 | Assert.Equal(PartyType.LEGAL, party.type); 401 | Assert.Equal(PartyStatus.ACTIVE, party.state.status); 402 | Assert.NotNull(party.employee_count); 403 | Assert.Null(party.invalid); 404 | Assert.NotNull(party.capital.value); 405 | Assert.NotNull(party.management.start_date); 406 | Assert.True(party.founders.Count > 0); 407 | Assert.Equal(PartyFounderShareType.PERCENT, party.founders[0].share.type); 408 | Assert.True(party.founders[0].share.value > 0); 409 | Assert.True(party.managers.Count > 0); 410 | Assert.NotNull(party.managers[0].start_date); 411 | Assert.NotNull(party.managers[0].fio.surname); 412 | Assert.True(party.okveds.Count > 0); 413 | Assert.NotNull(party.finance.revenue); 414 | Assert.NotNull(party.finance.year); 415 | Assert.NotNull(party.documents.fts_report.issue_authority); 416 | } 417 | 418 | [Fact] 419 | public async Task FindPartyWithKppTest() 420 | { 421 | var request = new FindPartyRequest(query: "7728168971", kpp: "667143001"); 422 | var response = await api.FindParty(request); 423 | var party = response.suggestions[0].data; 424 | Assert.Equal("ФИЛИАЛ \"ЕКАТЕРИНБУРГСКИЙ\" АО \"АЛЬФА-БАНК\"", party.name.full_with_opf); 425 | } 426 | 427 | [Fact] 428 | public async Task FindPartyWithBranchTypeTest() 429 | { 430 | var request = new FindPartyRequest(query: "7728168971") 431 | { 432 | branch_type = PartyBranchType.MAIN 433 | }; 434 | var response = await api.FindParty(request); 435 | var party = response.suggestions[0].data; 436 | Assert.Equal("АО \"АЛЬФА-БАНК\"", party.name.short_with_opf); 437 | } 438 | 439 | [Fact] 440 | public async Task FindPartyPredecessorsTest() 441 | { 442 | var response = await api.FindParty("7728168971"); 443 | var party = response.suggestions[0].data; 444 | var inns = new[] { party.predecessors[0].inn, party.predecessors[1].inn }; 445 | Assert.Contains("6608007160", inns); 446 | Assert.Contains("7834002576", inns); 447 | } 448 | 449 | [Fact] 450 | public async Task FindPartyLicenseTest() 451 | { 452 | var response = await api.FindParty("7704865540"); 453 | var party = response.suggestions[0].data; 454 | Assert.NotEmpty(party.licenses); 455 | Assert.Contains("лекарственных препаратов", party.licenses[0].activities[0]); 456 | } 457 | 458 | [Fact] 459 | public async Task FindPartyContactsTest() 460 | { 461 | var response = await api.FindParty("7719402047"); 462 | var party = response.suggestions[0].data; 463 | Assert.Single(party.phones); 464 | Assert.Equal("+7 911 241 0309", party.phones[0].data.source); 465 | Assert.Single(party.emails); 466 | Assert.Equal("DAP@MOTORICA.ORG", party.emails[0].data.source); 467 | } 468 | 469 | [Fact] 470 | public async Task FindPartyTaxSystemTest() 471 | { 472 | var response = await api.FindParty("5045022596"); 473 | var party = response.suggestions[0].data; 474 | Assert.Equal(PartyTaxSystem.AUSN, party.finance.tax_system); 475 | } 476 | 477 | [Fact] 478 | public async Task FindInvalidTest() 479 | { 480 | var response = await api.FindParty("7804225864"); 481 | var party = response.suggestions[0].data; 482 | Assert.True(party.invalid); 483 | Assert.True(party.managers.Count > 0); 484 | var manager = party.managers[0]; 485 | Assert.Equal(PartyInvalidityCode.FTS, manager.invalidity.code); 486 | } 487 | 488 | [Fact] 489 | public async Task FindAffiliatedTest() 490 | { 491 | var response = await api.FindAffiliated("7736207543"); 492 | Assert.Equal("ООО \"ГИС ТЕХНОЛОГИИ\"", response.suggestions[0].value); 493 | } 494 | 495 | [Fact] 496 | public async Task FindAffiliatedScopeTest() 497 | { 498 | var request = new FindAffiliatedRequest("771687831332") 499 | { 500 | scope = new[] { FindAffiliatedScope.MANAGERS } 501 | }; 502 | var response = await api.FindAffiliated(request); 503 | Assert.Equal("МКПАО \"ЯНДЕКС\"", response.suggestions[0].value); 504 | } 505 | 506 | [Fact] 507 | public async Task FindByEmailTest() 508 | { 509 | var response = await api.FindByEmail("info@dadata.ru"); 510 | var data = response.suggestions[0].data; 511 | Assert.Equal("ROLE", data.email.type); 512 | Assert.Equal("7721581040", data.company.inn); 513 | } 514 | } 515 | } 516 | -------------------------------------------------------------------------------- /Dadata.Test/SuggestClientSyncTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Xunit; 4 | using Dadata.Model; 5 | 6 | namespace Dadata.Test 7 | { 8 | public class SuggestClientSyncTest 9 | { 10 | public SuggestClientSync api { get; set; } 11 | 12 | public SuggestClientSyncTest() 13 | { 14 | var token = Environment.GetEnvironmentVariable("DADATA_API_KEY"); 15 | this.api = new SuggestClientSync(token); 16 | } 17 | 18 | [Fact] 19 | public void SuggestAddressTest() 20 | { 21 | var query = "москва турчанинов 6с2"; 22 | var response = api.SuggestAddress(query, count: 1); 23 | var address_data = response.suggestions[0].data; 24 | Assert.Equal("119034", address_data.postal_code); 25 | Assert.Equal("7704", address_data.tax_office); 26 | Assert.Equal("Парк культуры", address_data.metro[0].name); 27 | Console.WriteLine(string.Join("\n", response.suggestions)); 28 | } 29 | 30 | [Fact] 31 | public void SuggestAddressLanguageTest() 32 | { 33 | var request = new SuggestAddressRequest("samara metallurgov") { language = "en" }; 34 | var response = api.SuggestAddress(request); 35 | Assert.Equal("Russia, gorod Samara, prospekt Metallurgov", response.suggestions[0].value); 36 | } 37 | 38 | [Fact] 39 | public void SuggestAddressLocationsKladrTest() 40 | { 41 | var request = new SuggestAddressRequest("ватутина") 42 | { 43 | locations = new[] { 44 | new Address() { kladr_id = "65" }, 45 | } 46 | }; 47 | var response = api.SuggestAddress(request); 48 | Assert.Equal("693022", response.suggestions[0].data.postal_code); 49 | Console.WriteLine(string.Join("\n", response.suggestions)); 50 | } 51 | 52 | [Fact] 53 | public void SuggestAddressLocationsMultipleLocationsTest() 54 | { 55 | var request = new SuggestAddressRequest("зеленоград") 56 | { 57 | locations = new[] 58 | { 59 | new Address() { kladr_id = "50" }, 60 | new Address() { kladr_id = "77" } 61 | } 62 | }; 63 | var response = api.SuggestAddress(request); 64 | Assert.Equal("Зеленоград", response.suggestions[0].data.city); 65 | Console.WriteLine(string.Join("\n", response.suggestions)); 66 | } 67 | 68 | [Fact] 69 | public void SuggestAddressLocationsFiasCityTest() 70 | { 71 | var request = new SuggestAddressRequest("ватутина") 72 | { 73 | locations = new[] 74 | { 75 | // Южно-Сахалинск 76 | new Address() { city_fias_id = "44388ad0-06aa-49b0-bbf9-1704629d1d68" } 77 | } 78 | }; 79 | var response = api.SuggestAddress(request); 80 | Assert.Equal("693022", response.suggestions[0].data.postal_code); 81 | Console.WriteLine(string.Join("\n", response.suggestions)); 82 | } 83 | 84 | [Fact] 85 | public void SuggestAddressLocationsGeoTest() 86 | { 87 | var request = new SuggestAddressRequest("сухонская ") 88 | { 89 | locations_geo = new[] 90 | { 91 | new LocationGeo() { lat=59.244634, lon=39.913355, radius_meters=200} 92 | } 93 | }; 94 | var response = api.SuggestAddress(request); 95 | Assert.Equal("г Вологда, ул Сухонская", response.suggestions[0].value); 96 | Console.WriteLine(string.Join("\n", response.suggestions)); 97 | } 98 | 99 | [Fact] 100 | public void SuggestAddressBoundsTest() 101 | { 102 | var request = new SuggestAddressRequest("ново") 103 | { 104 | from_bound = new AddressBound("city"), 105 | to_bound = new AddressBound("city") 106 | }; 107 | var response = api.SuggestAddress(request); 108 | Assert.Equal("Новосибирск", response.suggestions[0].data.city); 109 | Console.WriteLine(string.Join("\n", response.suggestions)); 110 | } 111 | 112 | [Fact] 113 | public void SuggestAddressHistoryTest() 114 | { 115 | var query = "москва хабар"; 116 | var response = api.SuggestAddress(query); 117 | var address_data = response.suggestions[0].data; 118 | Assert.Equal("ул Черненко", address_data.history_values[0]); 119 | Console.WriteLine(string.Join("\n", response.suggestions)); 120 | } 121 | 122 | [Fact] 123 | public void FindAddressTest() 124 | { 125 | var response = api.FindAddress("95dbf7fb-0dd4-4a04-8100-4f6c847564b5"); 126 | var address = response.suggestions[0].data; 127 | Assert.Equal("Москва", address.city); 128 | Assert.Equal("Сухонская", address.street); 129 | } 130 | 131 | [Fact] 132 | public void FindAddressLanguageTest() 133 | { 134 | var request = new FindAddressRequest("94b67f2f-f0f2-4a56-983b-90f0cec1d789") { language = "en" }; 135 | var response = api.FindAddress(request); 136 | var address = response.suggestions[0].data; 137 | Assert.Equal("Samara", address.city); 138 | Assert.Equal("Metallurgov", address.street); 139 | } 140 | 141 | [Fact] 142 | public void SuggestBankTypeTest() 143 | { 144 | var request = new SuggestBankRequest("юмани") 145 | { 146 | type = new[] { BankType.NKO } 147 | }; 148 | var response = api.SuggestBank(request); 149 | Assert.Equal("044525444", response.suggestions[0].data.bic); 150 | Assert.Equal(new DateTime(2012, 08, 02), response.suggestions[0].data.state.registration_date); 151 | Console.WriteLine(string.Join("\n", response.suggestions)); 152 | } 153 | 154 | [Fact] 155 | public void FindBankTest() 156 | { 157 | var response = api.FindBank("044525974"); 158 | var bank = response.suggestions[0].data; 159 | Assert.Equal("TICSRUMMXXX", bank.swift); 160 | } 161 | 162 | [Fact] 163 | public void FindBankWithKppTest() 164 | { 165 | var request = new FindBankRequest(query: "7728168971", kpp: "667102002"); 166 | var response = api.FindBank(request); 167 | var bank = response.suggestions[0].data; 168 | Assert.Equal("046577964", bank.bic); 169 | Assert.Equal("7728168971", bank.inn); 170 | Assert.Equal("667102002", bank.kpp); 171 | } 172 | 173 | [Fact] 174 | public void SuggestEmailTest() 175 | { 176 | var query = "anton@m"; 177 | var response = api.SuggestEmail(query); 178 | Assert.Equal("anton@mail.ru", response.suggestions[0].value); 179 | Console.WriteLine(string.Join("\n", response.suggestions)); 180 | } 181 | 182 | [Fact] 183 | public void SuggestFiasTest() 184 | { 185 | var query = "москва турчанинов 6с2"; 186 | var response = api.SuggestFias(query); 187 | var address = response.suggestions[0].data; 188 | Assert.Equal("Москва", address.region); 189 | Assert.Equal("Турчанинов", address.street); 190 | Assert.Equal("6", address.house); 191 | Assert.Equal("стр", address.building_type); 192 | Assert.Equal("2", address.building); 193 | } 194 | 195 | [Fact] 196 | public void FindFiasTest() 197 | { 198 | var response = api.FindFias("95dbf7fb-0dd4-4a04-8100-4f6c847564b5"); 199 | var address = response.suggestions[0].data; 200 | Assert.Equal("Москва", address.region); 201 | Assert.Equal("Сухонская", address.street); 202 | } 203 | 204 | [Fact] 205 | public void SuggestNameTest() 206 | { 207 | var query = "викт"; 208 | var response = api.SuggestName(query); 209 | Assert.Equal("Виктор", response.suggestions[0].data.name); 210 | Console.WriteLine(string.Join("\n", response.suggestions)); 211 | } 212 | 213 | [Fact] 214 | public void SuggestNamePartsTest() 215 | { 216 | var request = new SuggestNameRequest("викт") 217 | { 218 | parts = new FullnamePart[] { FullnamePart.SURNAME } 219 | }; 220 | var response = api.SuggestName(request); 221 | Assert.Equal("Викторова", response.suggestions[0].data.surname); 222 | Console.WriteLine(string.Join("\n", response.suggestions)); 223 | } 224 | 225 | [Fact] 226 | public void SuggestNameGenderTest() 227 | { 228 | var request = new SuggestNameRequest("виктор") 229 | { 230 | gender = Gender.FEMALE 231 | }; 232 | var response = api.SuggestName(request); 233 | Assert.Equal("Виктория", response.suggestions[0].data.name); 234 | Console.WriteLine(string.Join("\n", response.suggestions)); 235 | } 236 | 237 | [Fact] 238 | public void SuggestPartyTest() 239 | { 240 | var query = "7707083893"; 241 | var response = api.SuggestParty(query); 242 | var party = response.suggestions[0]; 243 | var address = response.suggestions[0].data.address; 244 | Assert.Equal("7707083893", party.data.inn); 245 | Assert.Equal("г Москва, ул Вавилова, д 19", address.value); 246 | Assert.Contains("ВАВИЛОВА", address.data.source); 247 | Assert.Equal("Вавилова", address.data.street); 248 | Console.WriteLine(string.Join("\n", response.suggestions)); 249 | } 250 | 251 | [Fact] 252 | public void SuggestPartyStatusTest() 253 | { 254 | var request = new SuggestPartyRequest("4713008497") 255 | { 256 | status = new[] { PartyStatus.LIQUIDATED } 257 | }; 258 | var response = api.SuggestParty(request); 259 | Assert.Equal("4713008497", response.suggestions[0].data.inn); 260 | Console.WriteLine(string.Join("\n", response.suggestions)); 261 | } 262 | 263 | [Fact] 264 | public void SuggestPartyTypeTest() 265 | { 266 | var request = new SuggestPartyRequest("лаукаитис витас") 267 | { 268 | type = PartyType.INDIVIDUAL 269 | }; 270 | var response = api.SuggestParty(request); 271 | Assert.Equal("773165008890", response.suggestions[0].data.inn); 272 | Console.WriteLine(string.Join("\n", response.suggestions)); 273 | } 274 | 275 | [Fact] 276 | public void FindPartyTest() 277 | { 278 | var response = api.FindParty("7719402047"); 279 | var party = response.suggestions[0].data; 280 | Assert.Equal("МОТОРИКА", party.name.@short); 281 | } 282 | 283 | [Fact] 284 | public void FindPartyWithKppTest() 285 | { 286 | var request = new FindPartyRequest(query: "7728168971", kpp: "667143001"); 287 | var response = api.FindParty(request); 288 | var party = response.suggestions[0].data; 289 | Assert.Equal("ФИЛИАЛ \"ЕКАТЕРИНБУРГСКИЙ\" АО \"АЛЬФА-БАНК\"", party.name.full_with_opf); 290 | } 291 | 292 | [Fact] 293 | public void FindAffiliatedTest() 294 | { 295 | var response = api.FindAffiliated("7736207543"); 296 | Assert.Equal("ООО \"ГИС ТЕХНОЛОГИИ\"", response.suggestions[0].value); 297 | } 298 | 299 | [Fact] 300 | public void FindAffiliatedScopeTest() 301 | { 302 | var request = new FindAffiliatedRequest("771687831332") 303 | { 304 | scope = new[] { FindAffiliatedScope.MANAGERS } 305 | }; 306 | var response = api.FindAffiliated(request); 307 | Assert.Equal("МКПАО \"ЯНДЕКС\"", response.suggestions[0].value); 308 | } 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /Dadata.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dadata 5 | Dadata 6 | 25.7.0 7 | DaData.ru 8 | DaData.ru 9 | MIT 10 | https://github.com/hflabs/dadata-csharp 11 | 12 | false 13 | DaData.ru API client for CLR languages. 14 | DaData.ru API client for CLR languages. 15 | Supports Dadata API as of April 2025. 16 | DaData.ru 17 | DaData.ru API C# .NET 18 | README.md 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Dadata.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2012 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dadata", "Dadata\Dadata.csproj", "{30BEACDE-1B2A-498A-AA8C-5C56A92EAB51}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dadata.Test", "Dadata.Test\Dadata.Test.csproj", "{7326D3DF-0F8B-4870-8CB3-EB05D8E11C3E}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3F53C483-97CE-42F7-A843-FD764D54004C}" 9 | ProjectSection(SolutionItems) = preProject 10 | LICENSE = LICENSE 11 | README.md = README.md 12 | Dadata.nuspec = Dadata.nuspec 13 | EndProjectSection 14 | EndProject 15 | Global 16 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 17 | Debug|Any CPU = Debug|Any CPU 18 | Release|Any CPU = Release|Any CPU 19 | EndGlobalSection 20 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 21 | {30BEACDE-1B2A-498A-AA8C-5C56A92EAB51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 22 | {30BEACDE-1B2A-498A-AA8C-5C56A92EAB51}.Debug|Any CPU.Build.0 = Debug|Any CPU 23 | {30BEACDE-1B2A-498A-AA8C-5C56A92EAB51}.Release|Any CPU.ActiveCfg = Release|Any CPU 24 | {30BEACDE-1B2A-498A-AA8C-5C56A92EAB51}.Release|Any CPU.Build.0 = Release|Any CPU 25 | {7326D3DF-0F8B-4870-8CB3-EB05D8E11C3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 26 | {7326D3DF-0F8B-4870-8CB3-EB05D8E11C3E}.Debug|Any CPU.Build.0 = Debug|Any CPU 27 | {7326D3DF-0F8B-4870-8CB3-EB05D8E11C3E}.Release|Any CPU.ActiveCfg = Release|Any CPU 28 | {7326D3DF-0F8B-4870-8CB3-EB05D8E11C3E}.Release|Any CPU.Build.0 = Release|Any CPU 29 | EndGlobalSection 30 | EndGlobal 31 | -------------------------------------------------------------------------------- /Dadata/CleanClient.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata 2 | { 3 | public class CleanClient : CleanClientSync 4 | { 5 | public CleanClient(string token, string secret, string baseUrl = BASE_URL) : base(token, secret, baseUrl) { } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Dadata/CleanClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Net.Http; 5 | using System.Threading; 6 | using System.Threading.Tasks; 7 | using Newtonsoft.Json; 8 | using Newtonsoft.Json.Converters; 9 | using Dadata.Model; 10 | 11 | namespace Dadata 12 | { 13 | public class CleanClientAsync : ClientBaseAsync, ICleanClientAsync 14 | { 15 | protected const string BASE_URL = "https://cleaner.dadata.ru/api/v1"; 16 | 17 | readonly CustomCreationConverter converter; 18 | 19 | // maps concrete IDadataEntity types to corresponding structure types 20 | static Dictionary TYPE_TO_STRUCTURE = new Dictionary() 21 | { 22 | { typeof(Address), StructureType.ADDRESS }, 23 | { typeof(AsIs), StructureType.AS_IS }, 24 | { typeof(Birthdate), StructureType.BIRTHDATE }, 25 | { typeof(Email), StructureType.EMAIL }, 26 | { typeof(Fullname), StructureType.NAME }, 27 | { typeof(Passport), StructureType.PASSPORT }, 28 | { typeof(Phone), StructureType.PHONE }, 29 | { typeof(Vehicle), StructureType.VEHICLE } 30 | }; 31 | 32 | 33 | public CleanClientAsync(string token, string secret, string baseUrl = BASE_URL, HttpClient client = null) 34 | : base(token, secret, baseUrl, client) 35 | { 36 | // all response data entities look the same (IDadataEntity), 37 | // need to manually convert them to specific types (address, phone etc) 38 | this.converter = new CleanResponseConverter(); 39 | // need to serialize StructureType as string, not int 40 | serializer.Converters.Add(new StringEnumConverter()); 41 | } 42 | 43 | public async Task Clean(string source, CancellationToken cancellationToken = default) where T : IDadataEntity 44 | { 45 | // infer structure from target entity type 46 | var structure = new List( 47 | new StructureType[] { TYPE_TO_STRUCTURE[typeof(T)] } 48 | ); 49 | // transform entity list to CleanRequest data structure 50 | var data = new string[] { source }; 51 | var response = await Clean(structure, data, cancellationToken); 52 | return (T)response[0]; 53 | } 54 | 55 | public async Task> Clean(IEnumerable structure, IEnumerable data, 56 | CancellationToken cancellationToken = default) 57 | { 58 | var request = new CleanRequest(structure, data); 59 | var response = await Execute(method: "clean", entity: null, request: request, cancellationToken); 60 | return response.data[0]; 61 | } 62 | 63 | protected override async Task Deserialize(HttpResponseMessage httpResponse) 64 | { 65 | var stream = await httpResponse.Content.ReadAsStreamAsync(); 66 | using (var r = new StreamReader(stream)) 67 | { 68 | string responseText = r.ReadToEnd(); 69 | return JsonConvert.DeserializeObject(responseText, this.converter); 70 | } 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /Dadata/CleanClientSync.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Net; 5 | using Newtonsoft.Json; 6 | using Newtonsoft.Json.Converters; 7 | using Dadata.Model; 8 | 9 | namespace Dadata 10 | { 11 | public class CleanClientSync : ClientBaseSync, ICleanClientSync 12 | { 13 | protected const string BASE_URL = "https://cleaner.dadata.ru/api/v1/clean"; 14 | 15 | CustomCreationConverter converter; 16 | 17 | // maps concrete IDadataEntity types to corresponding structure types 18 | static Dictionary TYPE_TO_STRUCTURE = new Dictionary() 19 | { 20 | { typeof(Address), StructureType.ADDRESS }, 21 | { typeof(AsIs), StructureType.AS_IS }, 22 | { typeof(Birthdate), StructureType.BIRTHDATE }, 23 | { typeof(Email), StructureType.EMAIL }, 24 | { typeof(Fullname), StructureType.NAME }, 25 | { typeof(Passport), StructureType.PASSPORT }, 26 | { typeof(Phone), StructureType.PHONE }, 27 | { typeof(Vehicle), StructureType.VEHICLE } 28 | }; 29 | 30 | 31 | public CleanClientSync(string token, string secret, string baseUrl = BASE_URL) : base(token, secret, baseUrl) 32 | { 33 | // all response data entities look the same (IDadataEntity), 34 | // need to manually convert them to specific types (address, phone etc) 35 | this.converter = new CleanResponseConverter(); 36 | // need to serialize StructureType as string, not int 37 | serializer.Converters.Add(new StringEnumConverter()); 38 | } 39 | 40 | public T Clean(string source) where T : IDadataEntity 41 | { 42 | // infer structure from target entity type 43 | var structure = new List( 44 | new StructureType[] { TYPE_TO_STRUCTURE[typeof(T)] } 45 | ); 46 | // transform enity list to CleanRequest data structure 47 | var data = new string[] { source }; 48 | var response = Clean(structure, data); 49 | return (T)response[0]; 50 | } 51 | 52 | public IList Clean(IEnumerable structure, IEnumerable data) 53 | { 54 | var request = new CleanRequest(structure, data); 55 | var httpRequest = CreateHttpRequest(verb: "POST", url: baseUrl); 56 | httpRequest = Serialize(httpRequest, request); 57 | var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 58 | var response = Deserialize(httpResponse); 59 | return response.data[0]; 60 | } 61 | 62 | protected override T Deserialize(HttpWebResponse httpResponse) 63 | { 64 | using (var r = new StreamReader(httpResponse.GetResponseStream())) 65 | { 66 | string responseText = r.ReadToEnd(); 67 | return JsonConvert.DeserializeObject(responseText, this.converter); 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Dadata/ClientBase.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.Specialized; 4 | using System.Net; 5 | using Newtonsoft.Json; 6 | 7 | namespace Dadata 8 | { 9 | public abstract class ClientBase 10 | { 11 | protected string token; 12 | protected string secret; 13 | protected string baseUrl; 14 | protected JsonSerializer serializer; 15 | 16 | static ClientBase() 17 | { 18 | // Improper Handling of Exceptional Conditions in Newtonsoft.Json 19 | // https://github.com/advisories/GHSA-5crp-9r3c-p9vr 20 | JsonConvert.DefaultSettings = () => new JsonSerializerSettings { MaxDepth = 128 }; 21 | } 22 | 23 | public ClientBase(string token, string baseUrl) : this(token, null, baseUrl) { } 24 | 25 | public ClientBase(string token, string secret, string baseUrl) 26 | { 27 | this.token = token; 28 | this.secret = secret; 29 | this.baseUrl = baseUrl; 30 | this.serializer = new JsonSerializer(); 31 | } 32 | 33 | protected string BuildUrl(string method, string entity, string queryString = null) 34 | { 35 | var url = String.Format("{0}/{1}", baseUrl, method); 36 | if (!String.IsNullOrEmpty(entity)) 37 | { 38 | url = String.Format("{0}/{1}", url, entity); 39 | } 40 | if (queryString != null) 41 | { 42 | url += "?" + queryString; 43 | } 44 | return url; 45 | } 46 | 47 | protected string SerializeParameters(NameValueCollection parameters) 48 | { 49 | List parts = new List(); 50 | foreach (String key in parameters.AllKeys) 51 | parts.Add(String.Format("{0}={1}", key, parameters[key])); 52 | return String.Join("&", parts); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Dadata/ClientBaseAsync.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Specialized; 2 | using System.IO; 3 | using System.Net.Http; 4 | using System.Net.Http.Headers; 5 | using System.Text; 6 | using System.Threading; 7 | using System.Threading.Tasks; 8 | using Newtonsoft.Json; 9 | using Dadata.Model; 10 | 11 | namespace Dadata 12 | { 13 | public abstract class ClientBaseAsync : ClientBase 14 | { 15 | protected readonly HttpClient client; 16 | 17 | public ClientBaseAsync(string token, string baseUrl, HttpClient client) 18 | : this(token, null, baseUrl, client) { } 19 | 20 | public ClientBaseAsync(string token, string secret, string baseUrl, HttpClient client) 21 | : base(token, secret, baseUrl) 22 | { 23 | this.client = client ?? new HttpClient(); 24 | } 25 | 26 | protected async Task ExecuteGet(string method, string entity, CancellationToken cancellationToken) 27 | { 28 | var parameters = new NameValueCollection(); 29 | return await ExecuteGet(method, entity, parameters, cancellationToken); 30 | } 31 | 32 | protected async Task ExecuteGet(string method, string entity, NameValueCollection parameters, 33 | CancellationToken cancellationToken) 34 | { 35 | var queryString = SerializeParameters(parameters); 36 | var url = BuildUrl(method: method, entity: entity, queryString: queryString); 37 | using (var httpRequest = CreateHttpRequest(verb: HttpMethod.Get, url: url)) 38 | using (var httpResponse = await client.SendAsync(httpRequest, cancellationToken)) 39 | { 40 | httpResponse.EnsureSuccessStatusCode(); 41 | return await Deserialize(httpResponse); 42 | } 43 | } 44 | 45 | protected async Task Execute(string method, string entity, IDadataRequest request, 46 | CancellationToken cancellationToken) 47 | { 48 | var url = BuildUrl(method: method, entity: entity); 49 | using (var httpRequest = CreateHttpRequest(verb: HttpMethod.Post, url: url)) 50 | using (var httpContent = Serialize(httpRequest, request)) 51 | { 52 | httpRequest.Content = httpContent; 53 | using (var httpResponse = await client.SendAsync(httpRequest, cancellationToken)) 54 | { 55 | httpResponse.EnsureSuccessStatusCode(); 56 | return await Deserialize(httpResponse); 57 | } 58 | } 59 | } 60 | 61 | protected HttpRequestMessage CreateHttpRequest(HttpMethod verb, string url) 62 | { 63 | var request = new HttpRequestMessage(verb, url); 64 | request.Headers.Authorization = new AuthenticationHeaderValue("Token", this.token); 65 | if (this.secret != null) 66 | { 67 | request.Headers.Add("X-Secret", this.secret); 68 | } 69 | return request; 70 | } 71 | 72 | protected HttpContent Serialize(HttpRequestMessage httpRequest, IDadataRequest request) 73 | { 74 | MemoryStream stream = new MemoryStream(); 75 | using (var w = new StreamWriter(stream, encoding: new UTF8Encoding(false), bufferSize: 1024, leaveOpen: true)) 76 | using (JsonWriter writer = new JsonTextWriter(w)) 77 | { 78 | this.serializer.Serialize(writer, request); 79 | writer.Flush(); 80 | } 81 | stream.Seek(0, SeekOrigin.Begin); 82 | var httpContent = new StreamContent(stream); 83 | httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 84 | return httpContent; 85 | } 86 | 87 | protected virtual async Task Deserialize(HttpResponseMessage httpResponse) 88 | { 89 | var stream = await httpResponse.Content.ReadAsStreamAsync(); 90 | using (var r = new StreamReader(stream)) 91 | { 92 | string responseText = await r.ReadToEndAsync(); 93 | var obj = await Task.Run(() => JsonConvert.DeserializeObject(responseText)); 94 | return obj; 95 | } 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Dadata/ClientBaseSync.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.Specialized; 4 | using System.IO; 5 | using System.Net; 6 | using Newtonsoft.Json; 7 | using Dadata.Model; 8 | 9 | namespace Dadata 10 | { 11 | public abstract class ClientBaseSync : ClientBase 12 | { 13 | public ClientBaseSync(string token, string baseUrl) : this(token, null, baseUrl) { } 14 | 15 | public ClientBaseSync(string token, string secret, string baseUrl) : base(token, secret, baseUrl) { } 16 | 17 | protected T ExecuteGet(string method, string entity) 18 | { 19 | var parameters = new NameValueCollection(); 20 | return ExecuteGet(method, entity, parameters); 21 | } 22 | 23 | protected T ExecuteGet(string method, string entity, NameValueCollection parameters) 24 | { 25 | var queryString = SerializeParameters(parameters); 26 | var url = BuildUrl(method: method, entity: entity, queryString: queryString); 27 | var httpRequest = CreateHttpRequest(verb: "GET", url: url); 28 | var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 29 | return Deserialize(httpResponse); 30 | } 31 | 32 | protected T Execute(string method, string entity, IDadataRequest request) 33 | { 34 | var url = BuildUrl(method: method, entity: entity); 35 | var httpRequest = CreateHttpRequest(verb: "POST", url: url); 36 | httpRequest = Serialize(httpRequest, request); 37 | var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 38 | return Deserialize(httpResponse); 39 | } 40 | 41 | protected HttpWebRequest CreateHttpRequest(string verb, string url) 42 | { 43 | var request = (HttpWebRequest)WebRequest.Create(url); 44 | request.Method = verb; 45 | request.ContentType = "application/json"; 46 | request.Headers.Add("Authorization", "Token " + this.token); 47 | if (this.secret != null) 48 | { 49 | request.Headers.Add("X-Secret", this.secret); 50 | } 51 | return request; 52 | } 53 | 54 | protected HttpWebRequest Serialize(HttpWebRequest httpRequest, IDadataRequest request) 55 | { 56 | using (var w = new StreamWriter(httpRequest.GetRequestStream())) 57 | using (JsonWriter writer = new JsonTextWriter(w)) 58 | { 59 | this.serializer.Serialize(writer, request); 60 | } 61 | return httpRequest; 62 | } 63 | 64 | protected virtual T Deserialize(HttpWebResponse httpResponse) 65 | { 66 | using (var r = new StreamReader(httpResponse.GetResponseStream())) 67 | { 68 | string responseText = r.ReadToEnd(); 69 | return JsonConvert.DeserializeObject(responseText); 70 | } 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /Dadata/Dadata.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | netstandard2.0 4 | 25.7.0 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Dadata/GeolocateClient.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Dadata.Model; 3 | 4 | namespace Dadata 5 | { 6 | [Obsolete("Use SuggestClient instead")] 7 | public class GeolocateClient : ClientBaseSync 8 | { 9 | const string BASE_URL = "https://suggestions.dadata.ru/suggestions/api/4_1/rs"; 10 | 11 | public GeolocateClient(string token, string baseUrl = BASE_URL) : base(token, baseUrl) { } 12 | 13 | public SuggestResponse
Geolocate(double lat, double lon) 14 | { 15 | var request = new GeolocateRequest(lat, lon); 16 | return Execute>(method: "geolocate", entity: "address", request: request); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Dadata/ICleanClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | using Dadata.Model; 5 | 6 | namespace Dadata 7 | { 8 | public interface ICleanClientAsync 9 | { 10 | Task Clean(string source, CancellationToken cancellationToken = default) where T : IDadataEntity; 11 | 12 | Task> Clean(IEnumerable structure, IEnumerable data, 13 | CancellationToken cancellationToken = default); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Dadata/ICleanClientSync.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Dadata.Model; 3 | 4 | namespace Dadata 5 | { 6 | public interface ICleanClientSync 7 | { 8 | T Clean(string source) where T : IDadataEntity; 9 | IList Clean(IEnumerable structure, IEnumerable data); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Dadata/IOurwardClientSync.cs: -------------------------------------------------------------------------------- 1 | using Dadata.Model; 2 | 3 | namespace Dadata 4 | { 5 | public interface IOutwardClientSync 6 | { 7 | SuggestResponse Suggest(string query, int count = 5) where T : IOutward; 8 | SuggestResponse Suggest(SuggestOutwardRequest request) where T : IOutward; 9 | SuggestResponse Find(string query) where T : IOutward; 10 | SuggestResponse Geolocate(double lat, double lon, int radius_meters = 100, int count = 5) 11 | where T : IOutward; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Dadata/IOutwardClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using System.Threading.Tasks; 3 | using Dadata.Model; 4 | 5 | namespace Dadata 6 | { 7 | public interface IOutwardClientAsync 8 | { 9 | Task> Suggest(string query, int count = 5, CancellationToken cancellationToken = default) 10 | where T : IOutward; 11 | 12 | Task> Suggest(SuggestOutwardRequest request, 13 | CancellationToken cancellationToken = default) where T : IOutward; 14 | 15 | Task> Find(string query, CancellationToken cancellationToken = default) 16 | where T : IOutward; 17 | 18 | Task> Geolocate(double lat, double lon, int radius_meters = 100, int count = 5, 19 | CancellationToken cancellationToken = default) 20 | where T : IOutward; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Dadata/IProfileClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | using Dadata.Model; 5 | 6 | namespace Dadata 7 | { 8 | public interface IProfileClientAsync 9 | { 10 | Task GetBalance(CancellationToken cancellationToken = default); 11 | Task GetDailyStats(CancellationToken cancellationToken = default); 12 | Task GetDailyStats(DateTime date, CancellationToken cancellationToken = default); 13 | Task GetVersions(CancellationToken cancellationToken = default); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Dadata/IProfileClientSync.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Dadata.Model; 3 | 4 | namespace Dadata 5 | { 6 | public interface IProfileClientSync 7 | { 8 | GetBalanceResponse GetBalance(); 9 | GetDailyStatsResponse GetDailyStats(); 10 | GetDailyStatsResponse GetDailyStats(DateTime date); 11 | GetVersionsResponse GetVersions(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Dadata/ISuggestClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using System.Threading.Tasks; 3 | using Dadata.Model; 4 | 5 | namespace Dadata 6 | { 7 | public interface ISuggestClientAsync 8 | { 9 | Task> SuggestAddress(string query, int count = 5, CancellationToken cancellationToken = default); 10 | Task> SuggestAddress(SuggestAddressRequest request, CancellationToken cancellationToken = default); 11 | Task> FindAddress(string query, CancellationToken cancellationToken = default); 12 | Task> FindAddress(FindAddressRequest request, CancellationToken cancellationToken = default); 13 | Task> Geolocate(double lat, double lon, int radius_meters = 100, int count = 5, CancellationToken cancellationToken = default); 14 | Task> Geolocate(GeolocateRequest request, CancellationToken cancellationToken = default); 15 | Task Iplocate(string ip, string language = "ru", CancellationToken cancellationToken = default); 16 | Task> SuggestBank(string query, int count = 5, CancellationToken cancellationToken = default); 17 | Task> SuggestBank(SuggestBankRequest request, CancellationToken cancellationToken = default); 18 | Task> FindBank(string query, CancellationToken cancellationToken = default); 19 | Task> FindBank(FindBankRequest request, CancellationToken cancellationToken = default); 20 | Task> SuggestEmail(string query, int count = 5, CancellationToken cancellationToken = default); 21 | Task> SuggestEmail(SuggestRequest request, CancellationToken cancellationToken = default); 22 | Task> SuggestFias(string query, int count = 5, CancellationToken cancellationToken = default); 23 | Task> SuggestFias(SuggestAddressRequest request, CancellationToken cancellationToken = default); 24 | Task> FindFias(string query, CancellationToken cancellationToken = default); 25 | Task> FindFias(SuggestRequest request, CancellationToken cancellationToken = default); 26 | Task> SuggestName(string query, int count = 5, CancellationToken cancellationToken = default); 27 | Task> SuggestName(SuggestNameRequest request, CancellationToken cancellationToken = default); 28 | Task> SuggestParty(string query, int count = 5, CancellationToken cancellationToken = default); 29 | Task> SuggestParty(SuggestPartyRequest request, CancellationToken cancellationToken = default); 30 | Task> FindParty(string query, CancellationToken cancellationToken = default); 31 | Task> FindParty(FindPartyRequest request, CancellationToken cancellationToken = default); 32 | Task> FindAffiliated(string query, CancellationToken cancellationToken = default); 33 | Task> FindAffiliated(FindAffiliatedRequest request, CancellationToken cancellationToken = default); 34 | Task> FindByEmail(string query, CancellationToken cancellationToken = default); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Dadata/ISuggestClientSync.cs: -------------------------------------------------------------------------------- 1 | using Dadata.Model; 2 | 3 | namespace Dadata 4 | { 5 | public interface ISuggestClientSync 6 | { 7 | SuggestResponse
SuggestAddress(string query, int count = 5); 8 | SuggestResponse
SuggestAddress(SuggestAddressRequest request); 9 | SuggestResponse
FindAddress(string query); 10 | SuggestResponse
FindAddress(FindAddressRequest request); 11 | SuggestResponse
Geolocate(double lat, double lon, int radius_meters = 100, int count = 5); 12 | SuggestResponse
Geolocate(GeolocateRequest request); 13 | IplocateResponse Iplocate(string ip, string language = "ru"); 14 | SuggestResponse SuggestBank(string query, int count = 5); 15 | SuggestResponse SuggestBank(SuggestBankRequest request); 16 | SuggestResponse FindBank(string query); 17 | SuggestResponse FindBank(FindBankRequest request); 18 | SuggestResponse SuggestEmail(string query, int count = 5); 19 | SuggestResponse SuggestEmail(SuggestRequest request); 20 | SuggestResponse SuggestFias(string query, int count = 5); 21 | SuggestResponse SuggestFias(SuggestAddressRequest request); 22 | SuggestResponse FindFias(string query); 23 | SuggestResponse FindFias(SuggestRequest request); 24 | SuggestResponse SuggestName(string query, int count = 5); 25 | SuggestResponse SuggestName(SuggestNameRequest request); 26 | SuggestResponse SuggestParty(string query, int count = 5); 27 | SuggestResponse SuggestParty(SuggestPartyRequest request); 28 | SuggestResponse FindParty(string query); 29 | SuggestResponse FindParty(FindPartyRequest request); 30 | SuggestResponse FindAffiliated(string query); 31 | SuggestResponse FindAffiliated(FindAffiliatedRequest request); 32 | SuggestResponse FindByEmail(string query); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Dadata/IplocateClient.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Specialized; 3 | using Dadata.Model; 4 | 5 | namespace Dadata 6 | { 7 | [Obsolete("Use SuggestClient instead")] 8 | public class IplocateClient : ClientBaseSync 9 | { 10 | const string BASE_URL = "https://suggestions.dadata.ru/suggestions/api/4_1/rs"; 11 | 12 | public IplocateClient(string token, string baseUrl = BASE_URL) : base(token, baseUrl) { } 13 | 14 | public IplocateResponse Iplocate(string ip) 15 | { 16 | var parameters = new NameValueCollection(); 17 | parameters["ip"] = ip; 18 | return ExecuteGet(method: "iplocate", entity: "address", parameters: parameters); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Dadata/Model/Address.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class Address : IDadataEntity 6 | { 7 | public string source { get; set; } 8 | public string result { get; set; } 9 | 10 | public string postal_code { get; set; } 11 | public string country { get; set; } 12 | public string country_iso_code { get; set; } 13 | public string federal_district { get; set; } 14 | 15 | public string region_fias_id { get; set; } 16 | public string region_kladr_id { get; set; } 17 | public string region_iso_code { get; set; } 18 | public string region_with_type { get; set; } 19 | public string region_type { get; set; } 20 | public string region_type_full { get; set; } 21 | public string region { get; set; } 22 | 23 | public string area_fias_id { get; set; } 24 | public string area_kladr_id { get; set; } 25 | public string area_with_type { get; set; } 26 | public string area_type { get; set; } 27 | public string area_type_full { get; set; } 28 | public string area { get; set; } 29 | 30 | public string sub_area_fias_id { get; set; } 31 | public string sub_area_kladr_id { get; set; } 32 | public string sub_area_with_type { get; set; } 33 | public string sub_area_type { get; set; } 34 | public string sub_area_type_full { get; set; } 35 | public string sub_area { get; set; } 36 | 37 | public string city_fias_id { get; set; } 38 | public string city_kladr_id { get; set; } 39 | public string city_with_type { get; set; } 40 | public string city_type { get; set; } 41 | public string city_type_full { get; set; } 42 | public string city { get; set; } 43 | 44 | public string city_area { get; set; } 45 | 46 | public string city_district_fias_id { get; set; } 47 | public string city_district_kladr_id { get; set; } 48 | public string city_district_with_type { get; set; } 49 | public string city_district_type { get; set; } 50 | public string city_district_type_full { get; set; } 51 | public string city_district { get; set; } 52 | 53 | public string settlement_fias_id { get; set; } 54 | public string settlement_kladr_id { get; set; } 55 | public string settlement_with_type { get; set; } 56 | public string settlement_type { get; set; } 57 | public string settlement_type_full { get; set; } 58 | public string settlement { get; set; } 59 | 60 | public string street_fias_id { get; set; } 61 | public string street_kladr_id { get; set; } 62 | public string street_with_type { get; set; } 63 | public string street_type { get; set; } 64 | public string street_type_full { get; set; } 65 | public string street { get; set; } 66 | 67 | public string house_fias_id { get; set; } 68 | public string house_kladr_id { get; set; } 69 | public string house_cadnum { get; set; } 70 | public string house_flat_count { get; set; } 71 | public string house_with_type { get; set; } 72 | public string house_type { get; set; } 73 | public string house_type_full { get; set; } 74 | public string house { get; set; } 75 | 76 | public string block_type { get; set; } 77 | public string block_type_full { get; set; } 78 | public string block { get; set; } 79 | 80 | public string entrance { get; set; } 81 | public string floor { get; set; } 82 | 83 | public string flat_fias_id { get; set; } 84 | public string flat_cadnum { get; set; } 85 | public string flat_type { get; set; } 86 | public string flat_type_full { get; set; } 87 | public string flat { get; set; } 88 | 89 | public string room_fias_id { get; set; } 90 | public string room_cadnum { get; set; } 91 | public string room_type { get; set; } 92 | public string room_type_full { get; set; } 93 | public string room { get; set; } 94 | 95 | public string stead_fias_id { get; set; } 96 | public string stead_kladr_id { get; set; } 97 | public string stead_type { get; set; } 98 | public string stead_type_full { get; set; } 99 | public string stead { get; set; } 100 | 101 | public string flat_area { get; set; } 102 | public string square_meter_price { get; set; } 103 | public string flat_price { get; set; } 104 | 105 | public string postal_box { get; set; } 106 | public string fias_id { get; set; } 107 | public string fias_code { get; set; } 108 | public string fias_level { get; set; } 109 | public string fias_actuality_state { get; set; } 110 | public string kladr_id { get; set; } 111 | public string geoname_id { get; set; } 112 | public string capital_marker { get; set; } 113 | 114 | public string okato { get; set; } 115 | public string oktmo { get; set; } 116 | public string tax_office { get; set; } 117 | public string tax_office_legal { get; set; } 118 | public string timezone { get; set; } 119 | 120 | public string geo_lat { get; set; } 121 | public string geo_lon { get; set; } 122 | public string beltway_hit { get; set; } 123 | public string beltway_distance { get; set; } 124 | 125 | public string qc_geo { get; set; } 126 | public string qc_complete { get; set; } 127 | public string qc_house { get; set; } 128 | public string qc { get; set; } 129 | 130 | public string unparsed_parts { get; set; } 131 | 132 | public List history_values { get; set; } 133 | public List metro { get; set; } 134 | public AddressDivisions divisions { get; set; } 135 | 136 | public StructureType structure_type 137 | { 138 | get { return StructureType.ADDRESS; } 139 | } 140 | 141 | public override string ToString() 142 | { 143 | return string.Format( 144 | "[AddressData: source={0}, postal_code={1}, result={2}, qc={3}]", 145 | source, postal_code, result, qc 146 | ); 147 | } 148 | } 149 | 150 | public class AddressMetro 151 | { 152 | public string name { get; set; } 153 | public string line { get; set; } 154 | public decimal distance { get; set; } 155 | } 156 | 157 | public class AddressDivisions 158 | { 159 | public AddressAdministrative administrative { get; set; } 160 | public AddressMunicipal municipal { get; set; } 161 | } 162 | 163 | public class AddressAdministrative 164 | { 165 | public AddressPart area { get; set; } 166 | public AddressPart city { get; set; } 167 | public AddressPart city_district { get; set; } 168 | public AddressPart settlement { get; set; } 169 | public AddressPart planning_structure { get; set; } 170 | } 171 | 172 | public class AddressMunicipal 173 | { 174 | public AddressPart area { get; set; } 175 | public AddressPart sub_area { get; set; } 176 | public AddressPart city { get; set; } 177 | public AddressPart settlement { get; set; } 178 | public AddressPart planning_structure { get; set; } 179 | } 180 | 181 | public class AddressPart 182 | { 183 | public string fias_id { get; set; } 184 | public string kladr_id { get; set; } 185 | public string type { get; set; } 186 | public string type_full { get; set; } 187 | public string name { get; set; } 188 | public string name_with_type { get; set; } 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /Dadata/Model/AsIs.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class AsIs : IDadataEntity 4 | { 5 | public string source { get; set; } 6 | 7 | public StructureType structure_type 8 | { 9 | get { return StructureType.AS_IS; } 10 | } 11 | 12 | public override string ToString() 13 | { 14 | return string.Format("[AsIsData: source={0}]", source); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Dadata/Model/Bank.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class Bank 6 | { 7 | public string bic { get; set; } 8 | public string swift { get; set; } 9 | public string inn { get; set; } 10 | public string kpp { get; set; } 11 | public string registration_number { get; set; } 12 | public string correspondent_account { get; set; } 13 | public List treasury_accounts { get; set; } 14 | 15 | public BankName name { get; set; } 16 | public string payment_city { get; set; } 17 | public string okpo { get; set; } 18 | public BankOpf opf { get; set; } 19 | public string phone { get; set; } 20 | public string rkc { get; set; } 21 | public Bank cbr { get; set; } 22 | public PartyState state { get; set; } 23 | 24 | public Suggestion
address { get; set; } 25 | 26 | } 27 | 28 | public class BankName 29 | { 30 | public string payment { get; set; } 31 | public string full { get; set; } 32 | public string @short { get; set; } 33 | } 34 | 35 | public class BankOpf 36 | { 37 | public BankType type { get; set; } 38 | public string full { get; set; } 39 | public string @short { get; set; } 40 | } 41 | 42 | public enum BankType 43 | { 44 | BANK, 45 | NKO, 46 | BANK_BRANCH, 47 | NKO_BRANCH, 48 | RKC, 49 | CBR, 50 | TREASURY, 51 | OTHER 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Dadata/Model/Birthdate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | 4 | namespace Dadata.Model 5 | { 6 | public class Birthdate : IDadataEntity 7 | { 8 | public string source { get; set; } 9 | [JsonConverter(typeof(DateRuConverter))] 10 | public DateTime? birthdate { get; set; } 11 | public string qc { get; set; } 12 | 13 | public StructureType structure_type 14 | { 15 | get { return StructureType.BIRTHDATE; } 16 | } 17 | 18 | public override string ToString() 19 | { 20 | return string.Format("[BirthdateData: source={0}, birthdate={1}, qc={2}]", source, birthdate, qc); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Dadata/Model/CarBrand.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class CarBrand : IOutward 4 | { 5 | public string id { get; set; } 6 | public string name { get; set; } 7 | public string name_ru { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Dadata/Model/CleanRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class CleanRequest : IDadataRequest 6 | { 7 | public IEnumerable structure { get; } 8 | public IEnumerable> data { get; } 9 | 10 | public CleanRequest(IEnumerable structure, IEnumerable data) 11 | { 12 | this.structure = structure; 13 | this.data = new List> { data }; 14 | } 15 | 16 | public override string ToString() 17 | { 18 | return string.Format("[CleanQuery: structure={0}, data={1}]", string.Join(", ", structure), string.Join("\n", data)); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Dadata/Model/CleanResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class CleanResponse : IDadataResponse 6 | { 7 | public IList structure { get; set; } 8 | public IList> data { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Dadata/Model/CleanResponseConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | using Newtonsoft.Json.Converters; 4 | using Newtonsoft.Json.Linq; 5 | 6 | namespace Dadata.Model 7 | { 8 | /// 9 | /// Custom deserializer for IDadataEntity concrete types. 10 | /// 11 | internal class CleanResponseConverter : CustomCreationConverter 12 | { 13 | public override IDadataEntity Create(Type objectType) 14 | { 15 | throw new NotImplementedException(); 16 | } 17 | 18 | public IDadataEntity Create(Type objectType, JObject jObject) 19 | { 20 | StructureType type = GuessType(jObject); 21 | return CreateEntity(type); 22 | } 23 | 24 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 25 | { 26 | JObject jObject = JObject.Load(reader); 27 | var target = Create(objectType, jObject); 28 | serializer.Populate(jObject.CreateReader(), target); 29 | return target; 30 | } 31 | 32 | /// 33 | /// Guesse structure type by JSON object received as a clean result. 34 | /// 35 | /// Guessed structure type. 36 | /// JSON object. 37 | private StructureType GuessType(JObject jObject) 38 | { 39 | if (jObject.Property("kladr_id") != null) 40 | { 41 | return StructureType.ADDRESS; 42 | } 43 | else if (jObject.Property("birthdate") != null) 44 | { 45 | return StructureType.BIRTHDATE; 46 | } 47 | else if (jObject.Property("email") != null) 48 | { 49 | return StructureType.EMAIL; 50 | } 51 | else if (jObject.Property("surname") != null) 52 | { 53 | return StructureType.NAME; 54 | } 55 | else if (jObject.Property("series") != null) 56 | { 57 | return StructureType.PASSPORT; 58 | } 59 | else if (jObject.Property("phone") != null) 60 | { 61 | return StructureType.PHONE; 62 | } 63 | else if (jObject.Property("brand") != null) 64 | { 65 | return StructureType.VEHICLE; 66 | } 67 | else 68 | { 69 | return StructureType.AS_IS; 70 | } 71 | } 72 | 73 | /// 74 | /// Create entity based on its' structure type. 75 | /// 76 | /// The entity. 77 | /// Structure type. 78 | private IDadataEntity CreateEntity(StructureType type) 79 | { 80 | switch (type) 81 | { 82 | case StructureType.ADDRESS: 83 | return new Address(); 84 | case StructureType.AS_IS: 85 | return new AsIs(); 86 | case StructureType.BIRTHDATE: 87 | return new Birthdate(); 88 | case StructureType.EMAIL: 89 | return new Email(); 90 | case StructureType.NAME: 91 | return new Fullname(); 92 | case StructureType.PASSPORT: 93 | return new Passport(); 94 | case StructureType.PHONE: 95 | return new Phone(); 96 | case StructureType.VEHICLE: 97 | return new Vehicle(); 98 | default: 99 | return new AsIs(); 100 | } 101 | } 102 | } 103 | 104 | } 105 | -------------------------------------------------------------------------------- /Dadata/Model/Company.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class CompanyWithEmail 4 | { 5 | public Email email { get; set; } 6 | public Company company { get; set; } 7 | } 8 | 9 | public class Company 10 | { 11 | public string domain { get; set; } 12 | public string name { get; set; } 13 | public string inn { get; set; } 14 | public string ogrn { get; set; } 15 | public string okved { get; set; } 16 | public string okved_name { get; set; } 17 | public string employee_count { get; set; } 18 | public string income { get; set; } 19 | public string city { get; set; } 20 | public string timezone { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Dadata/Model/Country.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Country : IOutward 4 | { 5 | public string code { get; set; } 6 | public string alfa2 { get; set; } 7 | public string alfa3 { get; set; } 8 | public string name_short { get; set; } 9 | public string name { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Dadata/Model/Currency.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Currency : IOutward 4 | { 5 | public string code { get; set; } 6 | public string strcode { get; set; } 7 | public string name { get; set; } 8 | public string country { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Dadata/Model/DateMillisConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | 4 | namespace Dadata.Model 5 | { 6 | public class DateMillisConverter : JsonConverter 7 | { 8 | DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 9 | 10 | public override bool CanConvert(Type objectType) 11 | { 12 | return objectType == typeof(DateTime?); 13 | } 14 | 15 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 16 | { 17 | if (reader.Value == null) 18 | { 19 | return null; 20 | } 21 | long ticks = (long)reader.Value; 22 | return epoch.AddMilliseconds(ticks); 23 | } 24 | 25 | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 26 | { 27 | if (value == null) 28 | { 29 | writer.WriteNull(); 30 | return; 31 | } 32 | DateTime dateTime = (DateTime)value; 33 | long ticks = (long)(dateTime - epoch).TotalMilliseconds; 34 | writer.WriteValue(ticks); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Dadata/Model/DateRuConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using Newtonsoft.Json; 4 | 5 | namespace Dadata.Model 6 | { 7 | public class DateRuConverter : JsonConverter 8 | { 9 | CultureInfo culture = CultureInfo.CreateSpecificCulture("ru-RU"); 10 | 11 | public override bool CanConvert(Type objectType) 12 | { 13 | return objectType == typeof(DateTime); 14 | } 15 | 16 | public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 17 | { 18 | if (reader.Value == null) 19 | { 20 | return null; 21 | } 22 | return DateTime.Parse(reader.Value.ToString(), culture); 23 | } 24 | 25 | public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 26 | { 27 | if (value == null) 28 | { 29 | writer.WriteNull(); 30 | return; 31 | } 32 | DateTime dateTime = (DateTime)value; 33 | writer.WriteValue(dateTime.ToString(culture)); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Dadata/Model/DeliveryCity.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class DeliveryCity : IOutward 4 | { 5 | public string kladr_id { get; set; } 6 | public string fias_id { get; set; } 7 | public string boxberry_id { get; set; } 8 | public string cdek_id { get; set; } 9 | public string dpd_id { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Dadata/Model/Email.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Email : IDadataEntity 4 | { 5 | public string source { get; set; } 6 | public string local { get; set; } 7 | public string domain { get; set; } 8 | public string email { get; set; } 9 | public string type { get; set; } 10 | public string qc { get; set; } 11 | 12 | public StructureType structure_type 13 | { 14 | get { return StructureType.EMAIL; } 15 | } 16 | 17 | public override string ToString() 18 | { 19 | return string.Format("[EmailData: source={0}, email={1}, qc={2}]", source, email, qc); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Dadata/Model/FiasAddress.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class FiasAddress 6 | { 7 | public string source { get; set; } 8 | public string result { get; set; } 9 | 10 | public string postal_code { get; set; } 11 | 12 | public string region_fias_id { get; set; } 13 | public string region_kladr_id { get; set; } 14 | public string region_with_type { get; set; } 15 | public string region_type { get; set; } 16 | public string region_type_full { get; set; } 17 | public string region { get; set; } 18 | 19 | public string area_fias_id { get; set; } 20 | public string area_kladr_id { get; set; } 21 | public string area_with_type { get; set; } 22 | public string area_type { get; set; } 23 | public string area_type_full { get; set; } 24 | public string area { get; set; } 25 | 26 | public string city_fias_id { get; set; } 27 | public string city_kladr_id { get; set; } 28 | public string city_with_type { get; set; } 29 | public string city_type { get; set; } 30 | public string city_type_full { get; set; } 31 | public string city { get; set; } 32 | 33 | public string city_district_fias_id { get; set; } 34 | public string city_district_kladr_id { get; set; } 35 | public string city_district_with_type { get; set; } 36 | public string city_district_type { get; set; } 37 | public string city_district_type_full { get; set; } 38 | public string city_district { get; set; } 39 | 40 | public string settlement_fias_id { get; set; } 41 | public string settlement_kladr_id { get; set; } 42 | public string settlement_with_type { get; set; } 43 | public string settlement_type { get; set; } 44 | public string settlement_type_full { get; set; } 45 | public string settlement { get; set; } 46 | 47 | public string planning_structure_fias_id { get; set; } 48 | public string planning_structure_kladr_id { get; set; } 49 | public string planning_structure_with_type { get; set; } 50 | public string planning_structure_type { get; set; } 51 | public string planning_structure_type_full { get; set; } 52 | public string planning_structure { get; set; } 53 | 54 | public string street_fias_id { get; set; } 55 | public string street_kladr_id { get; set; } 56 | public string street_with_type { get; set; } 57 | public string street_type { get; set; } 58 | public string street_type_full { get; set; } 59 | public string street { get; set; } 60 | 61 | public string house_fias_id { get; set; } 62 | public string house_kladr_id { get; set; } 63 | public string house_type { get; set; } 64 | public string house { get; set; } 65 | 66 | public string block { get; set; } 67 | public string building_type { get; set; } 68 | public string building { get; set; } 69 | 70 | public string cadastral_number { get; set; } 71 | 72 | public string fias_id { get; set; } 73 | public string fias_code { get; set; } 74 | public string fias_level { get; set; } 75 | public string fias_actuality_state { get; set; } 76 | public string kladr_id { get; set; } 77 | public string capital_marker { get; set; } 78 | 79 | public string okato { get; set; } 80 | public string oktmo { get; set; } 81 | public string tax_office { get; set; } 82 | public string tax_office_legal { get; set; } 83 | 84 | public IList history_values { get; set; } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /Dadata/Model/FindAddressRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class FindAddressRequest : SuggestRequest 4 | { 5 | public AddressDivision division { get; set; } 6 | public string language { get; set; } 7 | 8 | public FindAddressRequest(string query, int count = 1) : base(query, count) { } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Dadata/Model/FindAffiliatedRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class FindAffiliatedRequest : SuggestRequest 4 | { 5 | public FindAffiliatedScope[] scope { get; set; } 6 | public FindAffiliatedRequest(string query, int count = 10) : base(query, count) { } 7 | } 8 | 9 | public enum FindAffiliatedScope 10 | { 11 | MANAGERS, 12 | FOUNDERS, 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Dadata/Model/FindBankRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class FindBankRequest : SuggestRequest 4 | { 5 | public string kpp { get; set; } 6 | public FindBankRequest(string query, string kpp = null, int count = 1) : base(query, count) 7 | { 8 | this.kpp = kpp; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Dadata/Model/FindPartyRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class FindPartyRequest : SuggestRequest 4 | { 5 | public string kpp { get; set; } 6 | public PartyBranchType? branch_type { get; set; } 7 | public PartyType? type { get; set; } 8 | public FindPartyRequest(string query, string kpp = null, int count = 1) : base(query, count) 9 | { 10 | this.kpp = kpp; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Dadata/Model/FmsUnit.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class FmsUnit : IOutward 4 | { 5 | public string code { get; set; } 6 | public string name { get; set; } 7 | public string region_code { get; set; } 8 | public string type { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Dadata/Model/FnsUnit.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class FnsUnit : IOutward 4 | { 5 | public string code { get; set; } 6 | public string name { get; set; } 7 | public string name_short { get; set; } 8 | public string address { get; set; } 9 | public string phone { get; set; } 10 | public string comment { get; set; } 11 | public string payment_name { get; set; } 12 | public string oktmo { get; set; } 13 | public string inn { get; set; } 14 | public string kpp { get; set; } 15 | public string bank_name { get; set; } 16 | public string bank_bic { get; set; } 17 | public string bank_account { get; set; } 18 | public string bank_correspondent_account { get; set; } 19 | public string parent_code { get; set; } 20 | public string parent_name { get; set; } 21 | public string parent_address { get; set; } 22 | public string parent_phone { get; set; } 23 | public string parent_comment { get; set; } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Dadata/Model/FtsUnit.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class FtsUnit : IOutward 4 | { 5 | public string code { get; set; } 6 | public string name { get; set; } 7 | public string name_short { get; set; } 8 | public string inn { get; set; } 9 | public string ogrn { get; set; } 10 | public string okpo { get; set; } 11 | public string osf { get; set; } 12 | public string address { get; set; } 13 | public string phone { get; set; } 14 | public string fax { get; set; } 15 | public string email { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Dadata/Model/Fullname.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Fullname : IDadataEntity 4 | { 5 | public string source { get; set; } 6 | public string result { get; set; } 7 | public string result_genitive { get; set; } 8 | public string result_dative { get; set; } 9 | public string result_ablative { get; set; } 10 | public string surname { get; set; } 11 | public string name { get; set; } 12 | public string patronymic { get; set; } 13 | public string gender { get; set; } 14 | public string qc { get; set; } 15 | 16 | public StructureType structure_type 17 | { 18 | get { return StructureType.NAME; } 19 | } 20 | 21 | public override string ToString() 22 | { 23 | return string.Format("[FioData: source={0}, surname={1}, name={2}, patronymic={3}, qc={4}]", 24 | source, surname, name, patronymic, qc); 25 | } 26 | } 27 | 28 | public enum Gender 29 | { 30 | UNKNOWN, 31 | MALE, 32 | FEMALE 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Dadata/Model/GeolocateRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class GeolocateRequest : LocationGeo, IDadataRequest 4 | { 5 | public int count { get; set; } 6 | public string language { get; set; } 7 | 8 | public GeolocateRequest(double lat, double lon, int radius_meters = 100, int count = 5) 9 | { 10 | this.lat = lat; 11 | this.lon = lon; 12 | this.radius_meters = radius_meters; 13 | this.count = count; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Dadata/Model/GetBalanceResponse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class GetBalanceResponse : IDadataResponse 6 | { 7 | public Decimal balance { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Dadata/Model/GetDailyStatsResponse.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class GetDailyStatsResponse : IDadataResponse 6 | { 7 | public DateTime date { get; set; } 8 | public ServicesStats services { get; set; } 9 | } 10 | 11 | public class ServicesStats 12 | { 13 | public int merging { get; set; } 14 | public int suggestions { get; set; } 15 | public int clean { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Dadata/Model/GetVersionsResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class GetVersionsResponse : IDadataResponse 6 | { 7 | public ProductVersion dadata { get; set; } 8 | public ProductVersion suggestions { get; set; } 9 | public ProductVersion factor { get; set; } 10 | } 11 | 12 | public class ProductVersion 13 | { 14 | public string version { get; set; } 15 | public IDictionary resources { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Dadata/Model/IDadataEntity.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public interface IDadataEntity 4 | { 5 | StructureType structure_type { get; } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Dadata/Model/IDadataRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public interface IDadataRequest 4 | { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Dadata/Model/IDadataResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public interface IDadataResponse 4 | { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Dadata/Model/IOutward.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public interface IOutward 4 | { 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Dadata/Model/IplocateResponse.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class IplocateResponse : IDadataResponse 4 | { 5 | public Suggestion
location; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Dadata/Model/LocationGeo.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class LocationGeo 4 | { 5 | public double lat { get; set; } 6 | public double lon { get; set; } 7 | public int radius_meters { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Dadata/Model/MetroStation.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class MetroStation : IOutward 4 | { 5 | public string city_kladr_id { get; set; } 6 | public string city_fias_id { get; set; } 7 | public string city { get; set; } 8 | public string name { get; set; } 9 | public string line_id { get; set; } 10 | public string line_name { get; set; } 11 | public double geo_lat { get; set; } 12 | public double geo_lon { get; set; } 13 | public string color { get; set; } 14 | public bool? is_closed { get; set; } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Dadata/Model/MktuRecord.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class MktuRecord : IOutward 4 | { 5 | public string @class { get; set; } 6 | public string number { get; set; } 7 | public string name_ru { get; set; } 8 | public string name_en { get; set; } 9 | public string name_fr { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Dadata/Model/OkpdRecord.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class OkpdRecord : IOutward 4 | { 5 | public string idx { get; set; } 6 | public string razdel { get; set; } 7 | public string kod { get; set; } 8 | public string name { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Dadata/Model/OktmoRecord.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class OktmoRecord: IOutward 4 | { 5 | public string oktmo { get; set; } 6 | public string area_type { get; set; } 7 | public string area_code { get; set; } 8 | public string area { get; set; } 9 | public string subarea_type { get; set; } 10 | public string subarea_code { get; set; } 11 | public string subarea { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Dadata/Model/OkvedRecord.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class OkvedRecord : IOutward 4 | { 5 | public string idx { get; set; } 6 | public string razdel { get; set; } 7 | public string kod { get; set; } 8 | public string name { get; set; } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Dadata/Model/Outwards.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Dadata.Model 5 | { 6 | public class Outwards 7 | { 8 | static Dictionary TYPE_TO_ENTITY = new Dictionary() { 9 | { typeof(CarBrand), SuggestionsEntity.CarBrand }, 10 | { typeof(Country), SuggestionsEntity.Country }, 11 | { typeof(Currency), SuggestionsEntity.Currency }, 12 | { typeof(DeliveryCity), SuggestionsEntity.Delivery }, 13 | { typeof(FmsUnit), SuggestionsEntity.FmsUnit }, 14 | { typeof(FnsUnit), SuggestionsEntity.FnsUnit }, 15 | { typeof(FtsUnit), SuggestionsEntity.FtsUnit }, 16 | { typeof(MetroStation), SuggestionsEntity.Metro }, 17 | { typeof(MktuRecord), SuggestionsEntity.Mktu }, 18 | { typeof(OkpdRecord), SuggestionsEntity.Okpd2 }, 19 | { typeof(OktmoRecord), SuggestionsEntity.Oktmo }, 20 | { typeof(OkvedRecord), SuggestionsEntity.Okved2 }, 21 | { typeof(PartyBy), SuggestionsEntity.PartyBy }, 22 | { typeof(PartyKz), SuggestionsEntity.PartyKz }, 23 | { typeof(PostalUnit), SuggestionsEntity.PostalUnit }, 24 | { typeof(RegionCourt), SuggestionsEntity.RegionCourt }, 25 | }; 26 | 27 | public static string GetEntityName(Type type) 28 | { 29 | return TYPE_TO_ENTITY[type]; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Dadata/Model/Party.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using Newtonsoft.Json; 4 | 5 | namespace Dadata.Model 6 | { 7 | public class Party 8 | { 9 | public string branch_count { get; set; } 10 | public PartyBranchType branch_type { get; set; } 11 | 12 | public string inn { get; set; } 13 | public string kpp { get; set; } 14 | public string kpp_largest { get; set; } 15 | public string ogrn { get; set; } 16 | [JsonConverter(typeof(DateMillisConverter))] 17 | public DateTime? ogrn_date { get; set; } 18 | public string hid { get; set; } 19 | 20 | public PartyManagement management { get; set; } 21 | public PartyName name { get; set; } 22 | public Fullname fio { get; set; } 23 | 24 | public string okato { get; set; } 25 | public string oktmo { get; set; } 26 | public string okpo { get; set; } 27 | public string okogu { get; set; } 28 | public string okfs { get; set; } 29 | public string okved { get; set; } 30 | public List okveds { get; set; } 31 | public string okved_type { get; set; } 32 | 33 | public PartyOpf opf { get; set; } 34 | public PartyState state { get; set; } 35 | public PartyType type { get; set; } 36 | 37 | public int? employee_count { get; set; } 38 | public bool? invalid { get; set; } 39 | 40 | public PartyFinance finance { get; set; } 41 | public PartyCapital capital { get; set; } 42 | public PartyAuthorities authorities { get; set; } 43 | public PartyCitizenship citizenship { get; set; } 44 | public PartyDocuments documents { get; set; } 45 | public List licenses { get; set; } 46 | 47 | public List founders { get; set; } 48 | public List managers { get; set; } 49 | 50 | public List predecessors { get; set; } 51 | public List successors { get; set; } 52 | 53 | public Suggestion
address { get; set; } 54 | 55 | public List> phones { get; set; } 56 | public List> emails { get; set; } 57 | } 58 | 59 | public class PartyReference 60 | { 61 | public string ogrn { get; set; } 62 | public string inn { get; set; } 63 | public string name { get; set; } 64 | } 65 | 66 | public class PartyAuthorities 67 | { 68 | public PartyAuthority fts_registration { get; set; } 69 | public PartyAuthority fts_report { get; set; } 70 | public PartyAuthority pf { get; set; } 71 | public PartyAuthority sif { get; set; } 72 | } 73 | 74 | public class PartyAuthority 75 | { 76 | public string type { get; set; } 77 | public string code { get; set; } 78 | public string name { get; set; } 79 | public string address { get; set; } 80 | } 81 | 82 | public enum PartyBranchType 83 | { 84 | MAIN, 85 | BRANCH 86 | } 87 | 88 | public class PartyCapital 89 | { 90 | public string type { get; set; } 91 | public decimal? value { get; set; } 92 | } 93 | 94 | public class PartyCitizenship 95 | { 96 | public PartyCodeUnit code { get; set; } 97 | public PartyNameUnit name { get; set; } 98 | } 99 | 100 | public class PartyCodeUnit 101 | { 102 | public string numeric { get; set; } 103 | public string alpha_3 { get; set; } 104 | } 105 | 106 | public class PartyDocument 107 | { 108 | public string type { get; set; } 109 | public string series { get; set; } 110 | public string number { get; set; } 111 | [JsonConverter(typeof(DateMillisConverter))] 112 | public DateTime? issue_date { get; set; } 113 | public string issue_authority { get; set; } 114 | } 115 | 116 | public class PartyDocuments 117 | { 118 | public PartyDocument fts_registration { get; set; } 119 | public PartyDocument fts_report { get; set; } 120 | public PartyDocument pf_registration { get; set; } 121 | public PartyDocument sif_registration { get; set; } 122 | public PartySmb smb { get; set; } 123 | } 124 | 125 | public class PartyNameUnit 126 | { 127 | public string full { get; set; } 128 | public string @short { get; set; } 129 | } 130 | 131 | public class PartyFinance 132 | { 133 | public PartyTaxSystem? tax_system { get; set; } 134 | public decimal? income { get; set; } 135 | public decimal? expense { get; set; } 136 | public decimal? revenue { get; set; } 137 | public decimal? debt { get; set; } 138 | public decimal? penalty { get; set; } 139 | public int? year { get; set; } 140 | } 141 | 142 | public class PartyFounder 143 | { 144 | public string hid { get; set; } 145 | public PartyFounderType type { get; set; } 146 | public PartyFounderShare share { get; set; } 147 | [JsonConverter(typeof(DateMillisConverter))] 148 | public DateTime? start_date { get; set; } 149 | public PartyInvalidity invalidity { get; set; } 150 | public string inn { get; set; } 151 | public Fullname fio { get; set; } 152 | public string ogrn { get; set; } 153 | public string name { get; set; } 154 | } 155 | 156 | public class PartyFounderShare 157 | { 158 | public PartyFounderShareType type { get; set; } 159 | public decimal value { get; set; } 160 | public long numerator { get; set; } 161 | public long denominator { get; set; } 162 | } 163 | 164 | public enum PartyFounderShareType 165 | { 166 | PERCENT, 167 | DECIMAL, 168 | FRACTION 169 | } 170 | 171 | public enum PartyFounderType 172 | { 173 | LEGAL, 174 | PHYSICAL 175 | } 176 | 177 | public class PartyInvalidity 178 | { 179 | public PartyInvalidityCode code { get; set; } 180 | public PartyCourtDecision decision { get; set; } 181 | } 182 | 183 | public enum PartyInvalidityCode 184 | { 185 | PARTY, 186 | FTS, 187 | COURT, 188 | OTHER 189 | } 190 | 191 | public class PartyCourtDecision 192 | { 193 | public string court_name { get; set; } 194 | public string number { get; set; } 195 | [JsonConverter(typeof(DateMillisConverter))] 196 | public DateTime date { get; set; } 197 | } 198 | 199 | public class PartyLicense 200 | { 201 | public string series { get; set; } 202 | public string number { get; set; } 203 | [JsonConverter(typeof(DateMillisConverter))] 204 | public DateTime? issue_date { get; set; } 205 | public string issue_authority { get; set; } 206 | [JsonConverter(typeof(DateMillisConverter))] 207 | public DateTime? suspend_date { get; set; } 208 | public string suspend_authority { get; set; } 209 | [JsonConverter(typeof(DateMillisConverter))] 210 | public DateTime? valid_from { get; set; } 211 | [JsonConverter(typeof(DateMillisConverter))] 212 | public DateTime? valid_to { get; set; } 213 | public List activities { get; set; } 214 | public List addresses { get; set; } 215 | } 216 | 217 | public class PartyManagement 218 | { 219 | public string name { get; set; } 220 | public string post { get; set; } 221 | [JsonConverter(typeof(DateMillisConverter))] 222 | public DateTime? start_date { get; set; } 223 | public string disqualified { get; set; } 224 | } 225 | 226 | public class PartyManager 227 | { 228 | public string hid { get; set; } 229 | public PartyManagerType type { get; set; } 230 | [JsonConverter(typeof(DateMillisConverter))] 231 | public DateTime? start_date { get; set; } 232 | public PartyInvalidity invalidity { get; set; } 233 | public string inn { get; set; } 234 | public Fullname fio { get; set; } 235 | public string post { get; set; } 236 | public string ogrn { get; set; } 237 | public string name { get; set; } 238 | } 239 | 240 | public enum PartyManagerType 241 | { 242 | EMPLOYEE, 243 | FOREIGNER, 244 | LEGAL 245 | } 246 | 247 | public class PartyName 248 | { 249 | public string full_with_opf { get; set; } 250 | public string short_with_opf { get; set; } 251 | public string latin { get; set; } 252 | public string full { get; set; } 253 | public string @short { get; set; } 254 | } 255 | 256 | public class PartyOkved 257 | { 258 | public bool main { get; set; } 259 | public string type { get; set; } 260 | public string code { get; set; } 261 | public string name { get; set; } 262 | } 263 | 264 | public class PartyOpf 265 | { 266 | public string code { get; set; } 267 | public string full { get; set; } 268 | public string @short { get; set; } 269 | } 270 | 271 | public class PartySmb 272 | { 273 | public string type { get; set; } 274 | public PartySmbCategory category { get; set; } 275 | [JsonConverter(typeof(DateMillisConverter))] 276 | public DateTime? issue_date { get; set; } 277 | } 278 | 279 | public enum PartySmbCategory 280 | { 281 | MICRO, 282 | SMALL, 283 | MEDIUM 284 | } 285 | 286 | public class PartyState 287 | { 288 | [JsonConverter(typeof(DateMillisConverter))] 289 | public DateTime? actuality_date { get; set; } 290 | [JsonConverter(typeof(DateMillisConverter))] 291 | public DateTime? registration_date { get; set; } 292 | [JsonConverter(typeof(DateMillisConverter))] 293 | public DateTime? liquidation_date { get; set; } 294 | public PartyStatus status { get; set; } 295 | public string code { get; set; } 296 | } 297 | 298 | public enum PartyStatus 299 | { 300 | ACTIVE, 301 | LIQUIDATING, 302 | LIQUIDATED, 303 | REORGANIZING, 304 | BANKRUPT 305 | } 306 | 307 | public enum PartyTaxSystem 308 | { 309 | AUSN, 310 | ENVD, 311 | ENVD_ESHN, 312 | ESHN, 313 | SRP, 314 | USN, 315 | USN_ENVD 316 | } 317 | 318 | public enum PartyType 319 | { 320 | LEGAL, 321 | INDIVIDUAL 322 | } 323 | } 324 | -------------------------------------------------------------------------------- /Dadata/Model/PartyBy.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class PartyBy : IOutward 4 | { 5 | public string unp { get; set; } 6 | public string registration_date { get; set; } 7 | public string removal_date { get; set; } 8 | public string actuality_date { get; set; } 9 | public PartyByStatus status { get; set; } 10 | public PartyByType type { get; set; } 11 | public string full_name_ru { get; set; } 12 | public string full_name_by { get; set; } 13 | public string short_name_ru { get; set; } 14 | public string short_name_by { get; set; } 15 | public string trade_name_ru { get; set; } 16 | public string trade_name_by { get; set; } 17 | public string fio_ru { get; set; } 18 | public string fio_by { get; set; } 19 | public string address { get; set; } 20 | public string oked { get; set; } 21 | public string oked_name { get; set; } 22 | } 23 | 24 | public enum PartyByStatus 25 | { 26 | ACTIVE, 27 | LIQUIDATING, 28 | LIQUIDATED, 29 | BANKRUPT, 30 | SUSPENDED, 31 | REORGANIZING 32 | } 33 | 34 | public enum PartyByType 35 | { 36 | INDIVIDUAL, 37 | LEGAL 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Dadata/Model/PartyKz.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class PartyKz : IOutward 4 | { 5 | public string bin { get; set; } 6 | public string registration_date { get; set; } 7 | public PartyKzStatus status { get; set; } 8 | public PartyKzType type { get; set; } 9 | public string name_ru { get; set; } 10 | public string name_kz { get; set; } 11 | public string fio { get; set; } 12 | public string kato { get; set; } 13 | public string address_ru { get; set; } 14 | public string address_kz { get; set; } 15 | public string address_settlement_ru { get; set; } 16 | public string address_settlement_kz { get; set; } 17 | public string address_local { get; set; } 18 | public string oked { get; set; } 19 | public string oked_name_ru { get; set; } 20 | public string oked_name_kz { get; set; } 21 | public string krp { get; set; } 22 | public string krp_name_ru { get; set; } 23 | public string krp_name_kz { get; set; } 24 | public string kse { get; set; } 25 | public string kse_name_ru { get; set; } 26 | public string kse_name_kz { get; set; } 27 | public string kfs { get; set; } 28 | public string kfs_name_ru { get; set; } 29 | public string kfs_name_kz { get; set; } 30 | } 31 | 32 | public enum PartyKzStatus 33 | { 34 | ACTIVE, 35 | INACTIVE, 36 | LIQUIDATING, 37 | LIQUIDATED, 38 | SUSPENDED 39 | } 40 | 41 | public enum PartyKzType 42 | { 43 | LEGAL, 44 | BRANCH, 45 | INDIVIDUAL, 46 | INDIVIDUAL_JOINT_VENTURE, 47 | FOREIGN_BRANCH 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Dadata/Model/Passport.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Passport : IDadataEntity 4 | { 5 | public string source { get; set; } 6 | public string series { get; set; } 7 | public string number { get; set; } 8 | public string qc { get; set; } 9 | 10 | public StructureType structure_type 11 | { 12 | get { return StructureType.PASSPORT; } 13 | } 14 | 15 | public override string ToString() 16 | { 17 | return string.Format("[PassportData: source={0}, series={1}, number={2}, qc={3}]", 18 | source, series, number, qc); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Dadata/Model/Phone.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Phone : IDadataEntity 4 | { 5 | public string source { get; set; } 6 | public string type { get; set; } 7 | public string phone { get; set; } 8 | public string country_code { get; set; } 9 | public string city_code { get; set; } 10 | public string number { get; set; } 11 | public string extension { get; set; } 12 | public string provider { get; set; } 13 | public string country { get; set; } 14 | public string region { get; set; } 15 | public string city { get; set; } 16 | public string timezone { get; set; } 17 | public string qc_conflict { get; set; } 18 | public string qc { get; set; } 19 | 20 | public StructureType structure_type 21 | { 22 | get { return StructureType.PHONE; } 23 | } 24 | 25 | public override string ToString() 26 | { 27 | return string.Format("[PhoneData: source={0}, phone={1}, qc={2}]", 28 | source, phone, qc); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Dadata/Model/PostalUnit.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class PostalUnit : IOutward 4 | { 5 | public string postal_code { get; set; } 6 | public bool is_closed { get; set; } 7 | public string type_code { get; set; } 8 | public string address_str { get; set; } 9 | public string address_kladr_id { get; set; } 10 | public string address_qc { get; set; } 11 | public double geo_lat { get; set; } 12 | public double geo_lon { get; set; } 13 | public string schedule_mon { get; set; } 14 | public string schedule_tue { get; set; } 15 | public string schedule_wed { get; set; } 16 | public string schedule_thu { get; set; } 17 | public string schedule_fri { get; set; } 18 | public string schedule_sat { get; set; } 19 | public string schedule_sun { get; set; } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Dadata/Model/RegionCourt.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class RegionCourt : IOutward 4 | { 5 | public string code { get; set; } 6 | public string name { get; set; } 7 | public string region_code { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Dadata/Model/StructureType.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public enum StructureType 4 | { 5 | ADDRESS, 6 | AS_IS, 7 | BIRTHDATE, 8 | EMAIL, 9 | IGNORE, 10 | NAME, 11 | PASSPORT, 12 | PHONE, 13 | VEHICLE 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestAddressRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class SuggestAddressRequest : SuggestRequest 4 | { 5 | public Address[] locations { get; set; } 6 | public Address[] locations_boost { get; set; } 7 | public LocationGeo[] locations_geo { get; set; } 8 | public AddressBound from_bound { get; set; } 9 | public AddressBound to_bound { get; set; } 10 | public bool restrict_value { get; set; } 11 | public AddressDivision division { get; set; } 12 | public string language { get; set; } 13 | 14 | public SuggestAddressRequest(string query, int count = 5) : base(query, count) { } 15 | } 16 | 17 | public class AddressBound 18 | { 19 | public string value { get; set; } 20 | public AddressBound(string name) 21 | { 22 | this.value = name; 23 | } 24 | } 25 | 26 | public enum AddressDivision 27 | { 28 | ADMINISTRATIVE, 29 | MUNICIPAL 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestBankRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class SuggestBankRequest : SuggestRequest 4 | { 5 | public Address[] locations { get; set; } 6 | public Address[] locations_boost { get; set; } 7 | public PartyStatus[] status { get; set; } 8 | public BankType[] type { get; set; } 9 | public SuggestBankRequest(string query, int count = 5) : base(query, count) { } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestEntity.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public static class SuggestionsEntity 4 | { 5 | public static readonly string Address = "address"; 6 | public static readonly string Bank = "bank"; 7 | public static readonly string CarBrand = "car_brand"; 8 | public static readonly string Company = "company"; 9 | public static readonly string Country = "country"; 10 | public static readonly string Currency = "currency"; 11 | public static readonly string Delivery = "delivery"; 12 | public static readonly string Email = "email"; 13 | public static readonly string Fias = "fias"; 14 | public static readonly string FmsUnit = "fms_unit"; 15 | public static readonly string FnsUnit = "fns_unit"; 16 | public static readonly string FtsUnit = "fts_unit"; 17 | public static readonly string Metro = "metro"; 18 | public static readonly string Mktu = "mktu"; 19 | public static readonly string Name = "fio"; 20 | public static readonly string Okpd2 = "okpd2"; 21 | public static readonly string Oktmo = "oktmo"; 22 | public static readonly string Okved2 = "okved2"; 23 | public static readonly string Party = "party"; 24 | public static readonly string PartyBy = "party_by"; 25 | public static readonly string PartyKz = "party_kz"; 26 | public static readonly string PostalUnit = "postal_unit"; 27 | public static readonly string RegionCourt = "region_court"; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestMethod.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public static class SuggestionsMethod 4 | { 5 | public static readonly string Suggest = "suggest"; 6 | public static readonly string Find = "findById"; 7 | public static readonly string FindAffiliated = "findAffiliated"; 8 | public static readonly string FindByEmail = "findByEmail"; 9 | public static readonly string Geolocate = "geolocate"; 10 | public static readonly string Iplocate = "iplocate"; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestNameRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class SuggestNameRequest : SuggestRequest 4 | { 5 | public FullnamePart[] parts { get; set; } 6 | public Gender gender { get; set; } 7 | public SuggestNameRequest(string query, int count = 5) : base(query, count) { } 8 | } 9 | 10 | public enum FullnamePart 11 | { 12 | SURNAME, 13 | NAME, 14 | PATRONYMIC 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestOutwardRequest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class SuggestOutwardRequest : SuggestRequest 6 | { 7 | public IDictionary filters; 8 | public SuggestOutwardRequest(string query, int count = 5) : base(query, count) { } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestPartyRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class SuggestPartyRequest : SuggestRequest 4 | { 5 | public Address[] locations { get; set; } 6 | public Address[] locations_boost { get; set; } 7 | public PartyStatus[] status { get; set; } 8 | public PartyType? type { get; set; } 9 | public string[] okved { get; set; } 10 | public SuggestPartyRequest(string query, int count = 5) : base(query, count) { } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestRequest.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class SuggestRequest : IDadataRequest 4 | { 5 | public string query { get; set; } 6 | public int count { get; set; } 7 | 8 | public SuggestRequest(string query, int count = 5) 9 | { 10 | this.query = query; 11 | this.count = count; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Dadata/Model/SuggestResponse.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Dadata.Model 4 | { 5 | public class SuggestResponse : IDadataResponse 6 | { 7 | public IList> suggestions; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Dadata/Model/Suggestion.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Suggestion 4 | { 5 | public string value { get; set; } 6 | public string unrestricted_value { get; set; } 7 | public T data { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Dadata/Model/Vehicle.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata.Model 2 | { 3 | public class Vehicle : IDadataEntity 4 | { 5 | public string source { get; set; } 6 | public string result { get; set; } 7 | public string brand { get; set; } 8 | public string model { get; set; } 9 | public string qc { get; set; } 10 | 11 | public StructureType structure_type 12 | { 13 | get { return StructureType.VEHICLE; } 14 | } 15 | 16 | public override string ToString() 17 | { 18 | return string.Format("[VehicleData: source={0}, result={1}, qc={2}]", 19 | source, result, qc); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Dadata/OutwardClient.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata 2 | { 3 | public class OutwardClient : OutwardClientSync 4 | { 5 | public OutwardClient(string token, string baseUrl = BASE_URL) : base(token, baseUrl) { } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Dadata/OutwardClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System.Net.Http; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | using Dadata.Model; 5 | 6 | namespace Dadata 7 | { 8 | public class OutwardClientAsync : ClientBaseAsync, IOutwardClientAsync 9 | { 10 | protected const string BASE_URL = "https://suggestions.dadata.ru/suggestions/api/4_1/rs"; 11 | 12 | public OutwardClientAsync(string token, string baseUrl = BASE_URL, HttpClient client = null) 13 | : base(token, baseUrl, client) { } 14 | 15 | public async Task> Suggest(string query, int count = 5, CancellationToken cancellationToken = default) where T : IOutward 16 | { 17 | var request = new SuggestOutwardRequest(query, count); 18 | return await Suggest(request, cancellationToken); 19 | } 20 | 21 | public async Task> Suggest(SuggestOutwardRequest request, 22 | CancellationToken cancellationToken = default) where T : IOutward 23 | { 24 | var entity = Outwards.GetEntityName(typeof(T)); 25 | return await Execute>(method: SuggestionsMethod.Suggest, entity: entity, 26 | request: request, cancellationToken: cancellationToken); 27 | } 28 | 29 | public async Task> Find(string query, CancellationToken cancellationToken = default) 30 | where T : IOutward 31 | { 32 | var request = new SuggestOutwardRequest(query); 33 | var entity = Outwards.GetEntityName(typeof(T)); 34 | return await Execute>(method: SuggestionsMethod.Find, entity: entity, request: request, 35 | cancellationToken: cancellationToken); 36 | } 37 | 38 | public async Task> Geolocate(double lat, double lon, int radius_meters = 100, 39 | int count = 5, CancellationToken cancellationToken = default) where T : IOutward 40 | { 41 | var request = new GeolocateRequest(lat, lon, radius_meters, count); 42 | var entity = Outwards.GetEntityName(typeof(T)); 43 | return await Execute>(method: SuggestionsMethod.Geolocate, entity: entity, 44 | request: request, cancellationToken: cancellationToken); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Dadata/OutwardClientSync.cs: -------------------------------------------------------------------------------- 1 | using Dadata.Model; 2 | 3 | namespace Dadata 4 | { 5 | public class OutwardClientSync : ClientBaseSync, IOutwardClientSync 6 | { 7 | protected const string BASE_URL = "https://suggestions.dadata.ru/suggestions/api/4_1/rs"; 8 | 9 | public OutwardClientSync(string token, string baseUrl = BASE_URL) : base(token, baseUrl) { } 10 | 11 | public SuggestResponse Suggest(string query, int count = 5) where T : IOutward 12 | { 13 | var request = new SuggestOutwardRequest(query, count); 14 | return Suggest(request); 15 | } 16 | 17 | public SuggestResponse Suggest(SuggestOutwardRequest request) where T : IOutward 18 | { 19 | var entity = Outwards.GetEntityName(typeof(T)); 20 | return Execute>(method: SuggestionsMethod.Suggest, entity: entity, request: request); 21 | } 22 | 23 | public SuggestResponse Find(string query) where T : IOutward 24 | { 25 | var request = new SuggestOutwardRequest(query); 26 | var entity = Outwards.GetEntityName(typeof(T)); 27 | return Execute>(method: SuggestionsMethod.Find, entity: entity, request: request); 28 | } 29 | 30 | public SuggestResponse Geolocate(double lat, double lon, int radius_meters = 100, int count = 5) where T : IOutward 31 | { 32 | var request = new GeolocateRequest(lat, lon, radius_meters, count); 33 | var entity = Outwards.GetEntityName(typeof(T)); 34 | return Execute>(method: SuggestionsMethod.Geolocate, entity: entity, request: request); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Dadata/ProfileClient.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata 2 | { 3 | public class ProfileClient : ProfileClientSync 4 | { 5 | public ProfileClient(string token, string secret, string baseUrl = BASE_URL) : base(token, secret, baseUrl) { } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Dadata/ProfileClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Specialized; 3 | using System.Net.Http; 4 | using System.Threading; 5 | using System.Threading.Tasks; 6 | using Dadata.Model; 7 | 8 | namespace Dadata 9 | { 10 | public class ProfileClientAsync : ClientBaseAsync, IProfileClientAsync 11 | { 12 | protected const string BASE_URL = "https://dadata.ru/api/v2"; 13 | 14 | public ProfileClientAsync(string token, string secret, string baseUrl = BASE_URL, HttpClient client = null) 15 | : base(token, secret, baseUrl, client) { } 16 | 17 | 18 | public async Task GetBalance(CancellationToken cancellationToken = default) 19 | { 20 | return await ExecuteGet(method: "profile", entity: "balance", cancellationToken); 21 | } 22 | 23 | public async Task GetDailyStats(CancellationToken cancellationToken = default) 24 | { 25 | return await GetDailyStats(DateTime.Today, cancellationToken); 26 | } 27 | 28 | public async Task GetDailyStats(DateTime date, CancellationToken cancellationToken) 29 | { 30 | var parameters = new NameValueCollection(1); 31 | parameters.Add("date", date.ToString("yyyy-MM-dd")); 32 | return await ExecuteGet(method: "stat", entity: "daily", parameters: parameters, 33 | cancellationToken); 34 | } 35 | 36 | public async Task GetVersions(CancellationToken cancellationToken = default) 37 | { 38 | return await ExecuteGet(method: "version", entity: null, cancellationToken); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Dadata/ProfileClientSync.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Specialized; 3 | using Dadata.Model; 4 | 5 | namespace Dadata 6 | { 7 | public class ProfileClientSync : ClientBaseSync, IProfileClientSync 8 | { 9 | protected const string BASE_URL = "https://dadata.ru/api/v2"; 10 | 11 | public ProfileClientSync(string token, string secret, string baseUrl = BASE_URL) : base(token, secret, baseUrl) { } 12 | 13 | 14 | public GetBalanceResponse GetBalance() 15 | { 16 | return ExecuteGet(method: "profile", entity: "balance"); 17 | } 18 | 19 | public GetDailyStatsResponse GetDailyStats() 20 | { 21 | return GetDailyStats(DateTime.Today); 22 | } 23 | 24 | public GetDailyStatsResponse GetDailyStats(DateTime date) 25 | { 26 | var parameters = new NameValueCollection(1); 27 | parameters.Add("date", date.ToString("yyyy-MM-dd")); 28 | return ExecuteGet(method: "stat", entity: "daily", parameters: parameters); 29 | } 30 | 31 | public GetVersionsResponse GetVersions() 32 | { 33 | return ExecuteGet(method: "version", entity: null); 34 | } 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Dadata/SuggestClient.cs: -------------------------------------------------------------------------------- 1 | namespace Dadata 2 | { 3 | public class SuggestClient : SuggestClientSync 4 | { 5 | public SuggestClient(string token, string baseUrl = BASE_URL) : base(token, baseUrl) { } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Dadata/SuggestClientAsync.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Specialized; 2 | using System.Net.Http; 3 | using System.Threading; 4 | using System.Threading.Tasks; 5 | using Dadata.Model; 6 | 7 | namespace Dadata 8 | { 9 | public class SuggestClientAsync : ClientBaseAsync, ISuggestClientAsync 10 | { 11 | protected const string BASE_URL = "https://suggestions.dadata.ru/suggestions/api/4_1/rs"; 12 | 13 | public SuggestClientAsync(string token, string secret = null, string baseUrl = BASE_URL, HttpClient client = null) 14 | : base(token, secret, baseUrl, client) { } 15 | 16 | #region Address 17 | 18 | public async Task> SuggestAddress(string query, int count = 5, 19 | CancellationToken cancellationToken = default) 20 | { 21 | var request = new SuggestAddressRequest(query, count); 22 | return await SuggestAddress(request); 23 | } 24 | 25 | public async Task> SuggestAddress(SuggestAddressRequest request, 26 | CancellationToken cancellationToken = default) 27 | { 28 | return await Execute>(method: SuggestionsMethod.Suggest, 29 | entity: SuggestionsEntity.Address, request: request, cancellationToken: cancellationToken); 30 | } 31 | 32 | public async Task> FindAddress(string query, 33 | CancellationToken cancellationToken = default) 34 | { 35 | var request = new FindAddressRequest(query); 36 | return await FindAddress(request, cancellationToken); 37 | } 38 | 39 | public async Task> FindAddress(FindAddressRequest request, 40 | CancellationToken cancellationToken = default) 41 | { 42 | return await Execute>(method: SuggestionsMethod.Find, 43 | entity: SuggestionsEntity.Address, request: request, cancellationToken: cancellationToken); 44 | } 45 | 46 | public async Task> Geolocate(double lat, double lon, int radius_meters = 100, 47 | int count = 5, CancellationToken cancellationToken = default) 48 | { 49 | var request = new GeolocateRequest(lat, lon, radius_meters, count); 50 | return await Geolocate(request, cancellationToken); 51 | } 52 | 53 | public async Task> Geolocate(GeolocateRequest request, 54 | CancellationToken cancellationToken = default) 55 | { 56 | return await Execute>(method: SuggestionsMethod.Geolocate, 57 | entity: SuggestionsEntity.Address, request: request, cancellationToken: cancellationToken); 58 | } 59 | 60 | public async Task Iplocate(string ip, string language = "ru", 61 | CancellationToken cancellationToken = default) 62 | { 63 | var parameters = new NameValueCollection 64 | { 65 | { "ip", ip }, 66 | { "language", language } 67 | }; 68 | return await ExecuteGet( 69 | method: SuggestionsMethod.Iplocate, 70 | entity: SuggestionsEntity.Address, 71 | parameters: parameters, 72 | cancellationToken: cancellationToken); 73 | } 74 | 75 | #endregion 76 | 77 | #region Bank 78 | 79 | public async Task> SuggestBank(string query, int count = 5, CancellationToken cancellationToken = default) 80 | { 81 | var request = new SuggestBankRequest(query, count); 82 | return await SuggestBank(request, cancellationToken); 83 | } 84 | 85 | public async Task> SuggestBank(SuggestBankRequest request, 86 | CancellationToken cancellationToken = default) 87 | { 88 | return await Execute>(method: SuggestionsMethod.Suggest, 89 | entity: SuggestionsEntity.Bank, request: request, cancellationToken: cancellationToken); 90 | } 91 | 92 | public async Task> FindBank(string query, CancellationToken cancellationToken = default) 93 | { 94 | var request = new FindBankRequest(query); 95 | return await FindBank(request, cancellationToken); 96 | } 97 | 98 | public async Task> FindBank(FindBankRequest request, 99 | CancellationToken cancellationToken = default) 100 | { 101 | return await Execute>(method: SuggestionsMethod.Find, entity: SuggestionsEntity.Bank, 102 | request: request, cancellationToken: cancellationToken); 103 | } 104 | 105 | #endregion 106 | 107 | #region Email 108 | 109 | public async Task> SuggestEmail(string query, int count = 5, 110 | CancellationToken cancellationToken = default) 111 | { 112 | var request = new SuggestRequest(query, count); 113 | return await SuggestEmail(request, cancellationToken); 114 | } 115 | 116 | public async Task> SuggestEmail(SuggestRequest request, 117 | CancellationToken cancellationToken = default) 118 | { 119 | return await Execute>(method: SuggestionsMethod.Suggest, 120 | entity: SuggestionsEntity.Email, request: request, cancellationToken: cancellationToken); 121 | } 122 | 123 | #endregion 124 | 125 | #region Fias 126 | 127 | public async Task> SuggestFias(string query, int count = 5, 128 | CancellationToken cancellationToken = default) 129 | { 130 | var request = new SuggestAddressRequest(query, count); 131 | return await SuggestFias(request, cancellationToken); 132 | } 133 | 134 | public async Task> SuggestFias(SuggestAddressRequest request, 135 | CancellationToken cancellationToken = default) 136 | { 137 | return await Execute>(method: SuggestionsMethod.Suggest, 138 | entity: SuggestionsEntity.Fias, request: request, cancellationToken: cancellationToken); 139 | } 140 | 141 | public async Task> FindFias(string query, CancellationToken cancellationToken = default) 142 | { 143 | var request = new SuggestRequest(query); 144 | return await FindFias(request, cancellationToken); 145 | } 146 | 147 | public async Task> FindFias(SuggestRequest request, 148 | CancellationToken cancellationToken = default) 149 | { 150 | return await Execute>(method: SuggestionsMethod.Find, 151 | entity: SuggestionsEntity.Fias, request: request, cancellationToken: cancellationToken); 152 | } 153 | 154 | #endregion 155 | 156 | #region Name 157 | 158 | public async Task> SuggestName(string query, int count = 5, 159 | CancellationToken cancellationToken = default) 160 | { 161 | var request = new SuggestNameRequest(query, count); 162 | return await SuggestName(request, cancellationToken); 163 | } 164 | 165 | public async Task> SuggestName(SuggestNameRequest request, 166 | CancellationToken cancellationToken = default) 167 | { 168 | return await Execute>(method: SuggestionsMethod.Suggest, 169 | entity: SuggestionsEntity.Name, request: request, cancellationToken: cancellationToken); 170 | } 171 | 172 | #endregion 173 | 174 | #region Party 175 | 176 | public async Task> SuggestParty(string query, int count = 5, 177 | CancellationToken cancellationToken = default) 178 | { 179 | var request = new SuggestPartyRequest(query, count); 180 | return await SuggestParty(request, cancellationToken); 181 | } 182 | 183 | public async Task> SuggestParty(SuggestPartyRequest request, 184 | CancellationToken cancellationToken = default) 185 | { 186 | return await Execute>(method: SuggestionsMethod.Suggest, 187 | entity: SuggestionsEntity.Party, request: request, cancellationToken: cancellationToken); 188 | } 189 | 190 | public async Task> FindParty(string query, CancellationToken cancellationToken = default) 191 | { 192 | var request = new FindPartyRequest(query); 193 | return await FindParty(request, cancellationToken); 194 | } 195 | 196 | public async Task> FindParty(FindPartyRequest request, 197 | CancellationToken cancellationToken = default) 198 | { 199 | return await Execute>(method: SuggestionsMethod.Find, 200 | entity: SuggestionsEntity.Party, request: request, cancellationToken: cancellationToken); 201 | } 202 | 203 | public async Task> FindAffiliated(string query, 204 | CancellationToken cancellationToken = default) 205 | { 206 | var request = new FindAffiliatedRequest(query); 207 | return await FindAffiliated(request, cancellationToken); 208 | } 209 | 210 | public async Task> FindAffiliated(FindAffiliatedRequest request, 211 | CancellationToken cancellationToken = default) 212 | { 213 | return await Execute>(method: SuggestionsMethod.FindAffiliated, 214 | entity: SuggestionsEntity.Party, request: request, cancellationToken: cancellationToken); 215 | } 216 | 217 | public async Task> FindByEmail(string query, 218 | CancellationToken cancellationToken = default) 219 | { 220 | return await Execute>(method: SuggestionsMethod.FindByEmail, 221 | entity: SuggestionsEntity.Company, request: new SuggestRequest(query), cancellationToken: cancellationToken); 222 | } 223 | 224 | #endregion 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /Dadata/SuggestClientSync.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Specialized; 2 | using Dadata.Model; 3 | 4 | namespace Dadata 5 | { 6 | public class SuggestClientSync : ClientBaseSync, ISuggestClientSync 7 | { 8 | protected const string BASE_URL = "https://suggestions.dadata.ru/suggestions/api/4_1/rs"; 9 | 10 | public SuggestClientSync(string token, string secret = null, string baseUrl = BASE_URL) : base(token, secret, baseUrl) { } 11 | 12 | #region Address 13 | 14 | public SuggestResponse
SuggestAddress(string query, int count = 5) 15 | { 16 | var request = new SuggestAddressRequest(query, count); 17 | return SuggestAddress(request); 18 | } 19 | 20 | public SuggestResponse
SuggestAddress(SuggestAddressRequest request) 21 | { 22 | return Execute>(method: SuggestionsMethod.Suggest, entity: SuggestionsEntity.Address, request: request); 23 | } 24 | 25 | public SuggestResponse
FindAddress(string query) 26 | { 27 | var request = new FindAddressRequest(query); 28 | return FindAddress(request); 29 | } 30 | 31 | public SuggestResponse
FindAddress(FindAddressRequest request) 32 | { 33 | return Execute>(method: SuggestionsMethod.Find, entity: SuggestionsEntity.Address, request: request); 34 | } 35 | 36 | public SuggestResponse
Geolocate(double lat, double lon, int radius_meters = 100, int count = 5) 37 | { 38 | var request = new GeolocateRequest(lat, lon, radius_meters, count); 39 | return Geolocate(request); 40 | } 41 | 42 | public SuggestResponse
Geolocate(GeolocateRequest request) 43 | { 44 | return Execute>(method: SuggestionsMethod.Geolocate, entity: SuggestionsEntity.Address, request: request); 45 | } 46 | 47 | public IplocateResponse Iplocate(string ip, string language = "ru") 48 | { 49 | var parameters = new NameValueCollection(); 50 | parameters.Add("ip", ip); 51 | parameters.Add("language", language); 52 | return ExecuteGet(method: SuggestionsMethod.Iplocate, entity: SuggestionsEntity.Address, parameters: parameters); 53 | } 54 | 55 | #endregion 56 | 57 | #region Bank 58 | 59 | public SuggestResponse SuggestBank(string query, int count = 5) 60 | { 61 | var request = new SuggestBankRequest(query, count); 62 | return SuggestBank(request); 63 | } 64 | 65 | public SuggestResponse SuggestBank(SuggestBankRequest request) 66 | { 67 | return Execute>(method: SuggestionsMethod.Suggest, entity: SuggestionsEntity.Bank, request: request); 68 | } 69 | 70 | public SuggestResponse FindBank(string query) 71 | { 72 | var request = new FindBankRequest(query); 73 | return FindBank(request); 74 | } 75 | 76 | public SuggestResponse FindBank(FindBankRequest request) 77 | { 78 | return Execute>(method: SuggestionsMethod.Find, entity: SuggestionsEntity.Bank, request: request); 79 | } 80 | 81 | #endregion 82 | 83 | #region Email 84 | 85 | public SuggestResponse SuggestEmail(string query, int count = 5) 86 | { 87 | var request = new SuggestRequest(query, count); 88 | return SuggestEmail(request); 89 | } 90 | 91 | public SuggestResponse SuggestEmail(SuggestRequest request) 92 | { 93 | return Execute>(method: SuggestionsMethod.Suggest, entity: SuggestionsEntity.Email, request: request); 94 | } 95 | 96 | #endregion 97 | 98 | #region Fias 99 | 100 | public SuggestResponse SuggestFias(string query, int count = 5) 101 | { 102 | var request = new SuggestAddressRequest(query, count); 103 | return SuggestFias(request); 104 | } 105 | 106 | public SuggestResponse SuggestFias(SuggestAddressRequest request) 107 | { 108 | return Execute>(method: SuggestionsMethod.Suggest, entity: SuggestionsEntity.Fias, request: request); 109 | } 110 | 111 | public SuggestResponse FindFias(string query) 112 | { 113 | var request = new SuggestRequest(query); 114 | return FindFias(request); 115 | } 116 | 117 | public SuggestResponse FindFias(SuggestRequest request) 118 | { 119 | return Execute>(method: SuggestionsMethod.Find, entity: SuggestionsEntity.Fias, request: request); 120 | } 121 | 122 | #endregion 123 | 124 | #region Name 125 | 126 | public SuggestResponse SuggestName(string query, int count = 5) 127 | { 128 | var request = new SuggestNameRequest(query, count); 129 | return SuggestName(request); 130 | } 131 | 132 | public SuggestResponse SuggestName(SuggestNameRequest request) 133 | { 134 | return Execute>(method: SuggestionsMethod.Suggest, entity: SuggestionsEntity.Name, request: request); 135 | } 136 | 137 | #endregion 138 | 139 | #region Party 140 | 141 | public SuggestResponse SuggestParty(string query, int count = 5) 142 | { 143 | var request = new SuggestPartyRequest(query, count); 144 | return SuggestParty(request); 145 | } 146 | 147 | public SuggestResponse SuggestParty(SuggestPartyRequest request) 148 | { 149 | return Execute>(method: SuggestionsMethod.Suggest, entity: SuggestionsEntity.Party, request: request); 150 | } 151 | 152 | public SuggestResponse FindParty(string query) 153 | { 154 | var request = new FindPartyRequest(query); 155 | return FindParty(request); 156 | } 157 | 158 | public SuggestResponse FindParty(FindPartyRequest request) 159 | { 160 | return Execute>(method: SuggestionsMethod.Find, entity: SuggestionsEntity.Party, request: request); 161 | } 162 | 163 | public SuggestResponse FindAffiliated(string query) 164 | { 165 | var request = new FindAffiliatedRequest(query); 166 | return FindAffiliated(request); 167 | } 168 | 169 | public SuggestResponse FindAffiliated(FindAffiliatedRequest request) 170 | { 171 | return Execute>(method: SuggestionsMethod.FindAffiliated, entity: SuggestionsEntity.Party, request: request); 172 | } 173 | 174 | public SuggestResponse FindByEmail(string query) 175 | { 176 | return Execute>(method: SuggestionsMethod.FindByEmail, entity: SuggestionsEntity.Company, request: new SuggestRequest(query)); 177 | } 178 | 179 | #endregion 180 | } 181 | } 182 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Human Factor Labs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | build: 2 | dotnet clean 3 | dotnet build 4 | 5 | release: 6 | dotnet clean 7 | dotnet build --configuration Release 8 | nuget pack Dadata.nuspec 9 | 10 | test: 11 | dotnet test --arch=arm64 --filter=FullyQualifiedName~$(filter) 12 | 13 | test-all: 14 | dotnet test --arch=arm64 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dadata API Client 2 | 3 | > Data cleansing, enrichment and suggestions via [Dadata API](https://dadata.ru/api) 4 | 5 | [![Nuget Version][nuget-image]][nuget-url] 6 | [![Downloads][downloads-image]][nuget-url] 7 | 8 | The official Dadata .NET library, supporting .NET Standard 2.0+ 9 | 10 | ## Installation 11 | 12 | Using the .NET Core command-line interface (CLI) tools: 13 | 14 | ``` 15 | dotnet add package Newtonsoft.Json 16 | dotnet add package Dadata 17 | ``` 18 | 19 | Using the NuGet Command Line Interface (CLI): 20 | 21 | ``` 22 | nuget install Newtonsoft.Json 23 | nuget install Dadata 24 | ``` 25 | 26 | Using the Package Manager Console: 27 | 28 | ``` 29 | Install-Package Newtonsoft.Json 30 | Install-Package Dadata 31 | ``` 32 | 33 | From within Visual Studio: 34 | 35 | 1. Open the Solution Explorer. 36 | 2. Right-click on a project within your solution. 37 | 3. Click on _Manage NuGet Packages..._ 38 | 4. Click on the _Browse_ tab and search for "Dadata". 39 | 5. Click on the Dadata package, select the appropriate version in the right-tab and click _Install_. 40 | 41 | ## Usage 42 | 43 | Import namespaces: 44 | 45 | ```csharp 46 | using Dadata; 47 | using Dadata.Model; 48 | ``` 49 | 50 | Create API client instance: 51 | 52 | ```csharp 53 | var token = "Replace with Dadata API key"; 54 | var secret = "Replace with Dadata secret key"; 55 | 56 | var api = new CleanClientAsync(token, secret); 57 | // or any of the following, depending on the API method 58 | api = new SuggestClientAsync(token, secret); 59 | api = new OutwardClientAsync(token); 60 | api = new ProfileClientAsync(token, secret); 61 | ``` 62 | 63 | Then call API methods as specified below. 64 | 65 | Examples use async clients: `CleanClientAsync`, `SuggestClientAsync`, `OutwardClientAsync` and `ProfileClientAsync`. There are sync alternatives with `Sync` suffixes — they exist for backward compatibility and will be removed in future releases. 66 | 67 | The library does not enforce a specific TLS version. If you need to set one, do it in your code like this: 68 | 69 | ```csharp 70 | ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 71 | ``` 72 | 73 | ## Postal Address 74 | 75 | ### [Validate and cleanse address](https://dadata.ru/api/clean/address/) 76 | 77 | ```csharp 78 | var api = new CleanClientAsync(token, secret); 79 | var address = await api.Clean
("мск сухонская 11 89"); 80 | ``` 81 | 82 | ### [Geocode address](https://dadata.ru/api/geocode/) 83 | 84 | Same API method as "validate and cleanse": 85 | 86 | ```csharp 87 | var api = new CleanClientAsync(token, secret); 88 | var address = await api.Clean
("москва сухонская 11"); 89 | ``` 90 | 91 | ### [Reverse geocode address](https://dadata.ru/api/geolocate/) 92 | 93 | ```csharp 94 | var api = new SuggestClientAsync(token); 95 | var response = await api.Geolocate(lat: 55.878, lon: 37.653); 96 | var address = response.suggestions[0].data; 97 | ``` 98 | 99 | ### [GeoIP city](https://dadata.ru/api/iplocate/) 100 | 101 | ```csharp 102 | var api = new SuggestClientAsync(token); 103 | var response = await api.Iplocate("46.226.227.20"); 104 | var address = response.location.data; 105 | ``` 106 | 107 | ### [Autocomplete (suggest) address](https://dadata.ru/api/suggest/address/) 108 | 109 | ```csharp 110 | var api = new SuggestClientAsync(token); 111 | var response = await api.SuggestAddress("самара метал"); 112 | var address = response.suggestions[0].data; 113 | ``` 114 | 115 | Show suggestions in English: 116 | 117 | ```csharp 118 | var request = new SuggestAddressRequest("samara metal") { language = "en" }; 119 | var response = await api.SuggestAddress(request); 120 | var address = response.suggestions[0].data; 121 | ``` 122 | 123 | Constrain by city (Yuzhno-Sakhalinsk): 124 | 125 | ```csharp 126 | var request = new SuggestAddressRequest("ватутина") 127 | { 128 | locations = new[] { 129 | new Address() { kladr_id = "6500000100000" }, 130 | } 131 | }; 132 | var response = await api.SuggestAddress(request); 133 | var address = response.suggestions[0].data; 134 | ``` 135 | 136 | Constrain by specific geo point and radius (in Vologda city): 137 | 138 | ```csharp 139 | var request = new SuggestAddressRequest("сухонская") 140 | { 141 | locations_geo = new[] 142 | { 143 | new LocationGeo() { lat=59.244634, lon=39.913355, radius_meters=200} 144 | } 145 | }; 146 | var response = await api.SuggestAddress(request); 147 | var address = response.suggestions[0].data; 148 | ``` 149 | 150 | Boost city to top (Toliatti): 151 | 152 | ```csharp 153 | var request = new SuggestAddressRequest("авто") 154 | { 155 | locations_boost = new[] 156 | { 157 | new Address() { kladr_id = "6300000700000" }, 158 | } 159 | }; 160 | var response = await api.SuggestAddress(request); 161 | var address = response.suggestions[0].data; 162 | ``` 163 | 164 | ### [Find address by FIAS ID](https://dadata.ru/api/find-address/) 165 | 166 | ```csharp 167 | var api = new SuggestClientAsync(token); 168 | var response = await api.FindAddress("9120b43f-2fae-4838-a144-85e43c2bfb29"); 169 | var address = response.suggestions[0].data; 170 | ``` 171 | 172 | Find by KLADR ID: 173 | 174 | ```csharp 175 | var response = await api.FindAddress("77000000000268400"); 176 | var address = response.suggestions[0].data; 177 | ``` 178 | 179 | ### [Find postal office](https://dadata.ru/api/suggest/postal_unit/) 180 | 181 | Suggest postal office by address or code: 182 | 183 | ```csharp 184 | var api = new OutwardClientAsync(token); 185 | var response = await api.Suggest("дежнева 2а"); 186 | var unit = response.suggestions[0].data; 187 | ``` 188 | 189 | Find postal office by code: 190 | 191 | ```csharp 192 | var response = await api.Find("127642"); 193 | var unit = response.suggestions[0].data; 194 | ``` 195 | 196 | Find nearest postal office: 197 | 198 | ```csharp 199 | var response = await api.Geolocate(lat: 55.878, lon: 37.653, radius_meters: 1000); 200 | var unit = response.suggestions[0].data; 201 | ``` 202 | 203 | ### [Get City ID for delivery services](https://dadata.ru/api/delivery/) 204 | 205 | ```csharp 206 | var api = new OutwardClientAsync(token); 207 | var response = await api.Find("3100400100000"); 208 | var city = response.suggestions[0].data; 209 | ``` 210 | 211 | ### [Get address strictly according to FIAS](https://dadata.ru/api/find-fias/) 212 | 213 | ```csharp 214 | var api = new SuggestClientAsync(token); 215 | var response = await api.FindFias("9120b43f-2fae-4838-a144-85e43c2bfb29"); 216 | var address = response.suggestions[0].data; 217 | ``` 218 | 219 | ### [Suggest country](https://dadata.ru/api/suggest/country/) 220 | 221 | ```csharp 222 | var api = new OutwardClientAsync(token); 223 | var response = await api.Suggest("та"); 224 | var country = response.suggestions[0].data; 225 | ``` 226 | 227 | ## Company or individual enterpreneur 228 | 229 | ### [Find company by INN](https://dadata.ru/api/find-party/) 230 | 231 | ```csharp 232 | var api = new SuggestClientAsync(token); 233 | var response = await api.FindParty("7707083893"); 234 | var party = response.suggestions[0].data; 235 | ``` 236 | 237 | Find by INN and KPP: 238 | 239 | ```csharp 240 | var request = new FindPartyRequest(query: "7707083893", kpp: "540602001"); 241 | var response = await api.FindParty(request); 242 | var party = response.suggestions[0].data; 243 | ``` 244 | 245 | ### [Suggest company](https://dadata.ru/api/suggest/party/) 246 | 247 | ```csharp 248 | var api = new SuggestClientAsync(token); 249 | var response = await api.SuggestParty("сбер"); 250 | var party = response.suggestions[0]; 251 | ``` 252 | 253 | Constrain by specific regions (Saint Petersburg and Leningradskaya oblast): 254 | 255 | ```csharp 256 | var request = new SuggestPartyRequest("сбер") 257 | { 258 | locations = new[] { 259 | new Address() { kladr_id = "7800000000000" }, 260 | new Address() { kladr_id = "4700000000000" }, 261 | } 262 | }; 263 | var response = await api.SuggestParty(request); 264 | var party = response.suggestions[0]; 265 | ``` 266 | 267 | Constrain by active companies: 268 | 269 | ```csharp 270 | var request = new SuggestPartyRequest("сбер") 271 | { 272 | status = new[] { PartyStatus.ACTIVE } 273 | }; 274 | var response = await api.SuggestParty(request); 275 | var party = response.suggestions[0]; 276 | ``` 277 | 278 | Constrain by individual entrepreneurs: 279 | 280 | ```csharp 281 | var request = new SuggestPartyRequest("сбер") 282 | { 283 | type = PartyType.INDIVIDUAL 284 | }; 285 | var response = await api.SuggestParty(request); 286 | var party = response.suggestions[0]; 287 | ``` 288 | 289 | ### [Find affiliated companies](https://dadata.ru/api/find-affiliated/) 290 | 291 | ```csharp 292 | var api = new SuggestClientAsync(token); 293 | var response = await api.FindAffiliated("7736207543"); 294 | var party = response.suggestions[0].data; 295 | ``` 296 | 297 | Search only by manager INN: 298 | 299 | ```csharp 300 | var request = new FindAffiliatedRequest("773006366201") 301 | { 302 | scope = new[] { FindAffiliatedScope.MANAGERS } 303 | }; 304 | var response = await api.FindAffiliated(request); 305 | var party = response.suggestions[0].data; 306 | ``` 307 | 308 | ## Bank 309 | 310 | ### [Find bank by BIC, SWIFT or INN](https://dadata.ru/api/find-bank/) 311 | 312 | ```csharp 313 | var api = new SuggestClientAsync(token); 314 | var response = await api.FindBank("044525225"); 315 | var bank = response.suggestions[0].data; 316 | ``` 317 | 318 | Find by SWIFT code: 319 | 320 | ```csharp 321 | var response = await api.FindBank("SABRRUMM"); 322 | var bank = response.suggestions[0].data; 323 | ``` 324 | 325 | Find by INN: 326 | 327 | ```csharp 328 | var response = await api.FindBank("7728168971"); 329 | var bank = response.suggestions[0].data; 330 | ``` 331 | 332 | Find by INN and KPP: 333 | 334 | ```csharp 335 | var request = new FindBankRequest(query: "7728168971", kpp: "667102002"); 336 | var response = await api.FindBank(request); 337 | var bank = response.suggestions[0].data; 338 | ``` 339 | 340 | Find by registration number: 341 | 342 | ```csharp 343 | var response = await api.FindBank("1481"); 344 | var bank = response.suggestions[0].data; 345 | ``` 346 | 347 | ### [Suggest bank](https://dadata.ru/api/suggest/bank/) 348 | 349 | ```csharp 350 | var api = new SuggestClientAsync(token); 351 | var response = await api.SuggestBank("ти"); 352 | var bank = response.suggestions[0].data; 353 | ``` 354 | 355 | ## Personal name 356 | 357 | ### [Validate and cleanse name](https://dadata.ru/api/clean/name/) 358 | 359 | ```csharp 360 | var api = new CleanClientAsync(token, secret); 361 | var fullname = await api.Clean("Срегей владимерович иванов"); 362 | ``` 363 | 364 | ### [Suggest name](https://dadata.ru/api/suggest/name/) 365 | 366 | ```csharp 367 | var api = new SuggestClientAsync(token); 368 | var response = await api.SuggestName("викт"); 369 | var fullname = response.suggestions[0].data; 370 | ``` 371 | 372 | Suggest female first name: 373 | 374 | ```csharp 375 | var request = new SuggestNameRequest("викт") 376 | { 377 | parts = new[] { FullnamePart.NAME }, 378 | gender = Gender.FEMALE 379 | }; 380 | var response = await api.SuggestName(request); 381 | var fullname = response.suggestions[0].data; 382 | ``` 383 | 384 | ## Phone 385 | 386 | ### [Validate and cleanse phone](https://dadata.ru/api/clean/phone/) 387 | 388 | ```csharp 389 | var api = new CleanClientAsync(token, secret); 390 | var phone = await api.Clean("9168-233-454"); 391 | ``` 392 | 393 | ## Passport 394 | 395 | ### [Validate passport](https://dadata.ru/api/clean/passport/) 396 | 397 | ```csharp 398 | var api = new CleanClientAsync(token, secret); 399 | var passport = await api.Clean("4509 235857"); 400 | ``` 401 | 402 | ### [Suggest issued by](https://dadata.ru/api/suggest/fms_unit/) 403 | 404 | ```csharp 405 | var api = new OutwardClientAsync(token); 406 | var response = await api.Suggest("772 053"); 407 | var unit = response.suggestions[0].data; 408 | ``` 409 | 410 | ## Email 411 | 412 | ### [Validate email](https://dadata.ru/api/clean/email/) 413 | 414 | ```csharp 415 | var api = new CleanClientAsync(token, secret); 416 | var email = await api.Clean("serega@yandex/ru"); 417 | ``` 418 | 419 | ### [Suggest email](https://dadata.ru/api/suggest/email/) 420 | 421 | ```csharp 422 | var api = new SuggestClientAsync(token); 423 | var response = await api.SuggestEmail("maria@"); 424 | var email = response.suggestions[0].data; 425 | ``` 426 | 427 | ## Other datasets 428 | 429 | ### [Tax office](https://dadata.ru/api/suggest/fns_unit/) 430 | 431 | ```csharp 432 | var api = new OutwardClientAsync(token); 433 | var response = await api.Find("5257"); 434 | var unit = response.suggestions[0].data; 435 | ``` 436 | 437 | ### [Metro station](https://dadata.ru/api/suggest/metro/) 438 | 439 | ```csharp 440 | var api = new OutwardClientAsync(token); 441 | var response = await api.Suggest("алек"); 442 | var station = response.suggestions[0].data; 443 | ``` 444 | 445 | Constrain by city (Saint Petersburg): 446 | 447 | ```csharp 448 | var request = new SuggestOutwardRequest("алек") 449 | { 450 | filters = new Dictionary() { { "city", "Санкт-Петербург" } } 451 | }; 452 | var response = await api.Suggest(request); 453 | var station = response.suggestions[0].data; 454 | ``` 455 | 456 | ### [Car brand](https://dadata.ru/api/suggest/car_brand/) 457 | 458 | ```csharp 459 | var api = new OutwardClientAsync(token); 460 | var response = await api.Suggest("фо"); 461 | var brand = response.suggestions[0].data; 462 | ``` 463 | 464 | ### [OKTMO](https://dadata.ru/api/suggest/oktmo/) 465 | 466 | ```csharp 467 | var api = new OutwardClientAsync(token); 468 | var response = await api.Find("54623425"); 469 | var record = response.suggestions[0].data; 470 | ``` 471 | 472 | ### [OKVED 2](https://dadata.ru/api/suggest/okved2/) 473 | 474 | ```csharp 475 | var api = new OutwardClientAsync(token); 476 | var response = await api.Suggest("космических"); 477 | var record = response.suggestions[0].data; 478 | ``` 479 | 480 | ## Profile API 481 | 482 | ```csharp 483 | var api = new ProfileClientAsync(token, secret); 484 | ``` 485 | 486 | Balance: 487 | 488 | ```csharp 489 | var response = await api.GetBalance(); 490 | var balance = response.balance; 491 | ``` 492 | 493 | Usage stats: 494 | 495 | ```csharp 496 | var response = await api.GetDailyStats(); 497 | var cleanCount = response.services.clean; 498 | var suggestionsCount = response.services.suggestions; 499 | var mergingCount = response.services.merging; 500 | ``` 501 | 502 | Dataset versions: 503 | 504 | ```csharp 505 | var response = await api.GetVersions(); 506 | var egrulVersion = response.suggestions.resources["ЕГРЮЛ"]; 507 | var geoVersion = response.factor.resources["Геокоординаты"]; 508 | ``` 509 | 510 | ## Contributing 511 | 512 | This project only accepts bug fixes. 513 | 514 | ## [Changelog](https://github.com/hflabs/dadata-csharp/releases) 515 | 516 | This project uses [CalVer](https://calver.org/) with YY.MM.MICRO schema. See changelog for details specific to each release. 517 | 518 | ## License 519 | 520 | [MIT](https://choosealicense.com/licenses/mit/) 521 | 522 | 523 | 524 | [nuget-image]: https://img.shields.io/nuget/v/dadata?style=flat-square 525 | [nuget-url]: https://www.nuget.org/packages/dadata/ 526 | [downloads-image]: https://img.shields.io/nuget/dt/dadata?style=flat-square 527 | --------------------------------------------------------------------------------