From ba080b074a9187473685b2852bcf40672af75a8f Mon Sep 17 00:00:00 2001 From: FH Date: Mon, 21 Feb 2022 18:08:26 +0100 Subject: [PATCH] Initial Commit --- .gitignore | 3 ++ CvrModels/CvrCompany.cs | 58 +++++++++++++++++++++++ CvrModels/CvrPeriod.cs | 32 +++++++++++++ CvrModels/CvrStatus.cs | 37 +++++++++++++++ FCS.Virk.csproj | 18 ++++++++ FCS.Virk.csproj.DotSettings | 2 + VrCvrMapper.cs | 37 +++++++++++++++ VrHttpRequest.cs | 30 ++++++++++++ VrModels/NyesteBeliggenhedsadresse.cs | 12 +++++ VrModels/NyesteNavn.cs | 7 +++ VrModels/Periode.cs | 8 ++++ VrModels/VirksomhedMetadata.cs | 8 ++++ VrModels/VirksomhedsStatus.cs | 9 ++++ VrModels/VrVirksomhed.cs | 10 ++++ VrQuery.cs | 10 ++++ VrQueryMapper.cs | 66 +++++++++++++++++++++++++++ VrQueryValidator.cs | 15 ++++++ VrResponseParser.cs | 36 +++++++++++++++ VrResponseView.cs | 11 +++++ 19 files changed, 409 insertions(+) create mode 100644 .gitignore create mode 100644 CvrModels/CvrCompany.cs create mode 100644 CvrModels/CvrPeriod.cs create mode 100644 CvrModels/CvrStatus.cs create mode 100644 FCS.Virk.csproj create mode 100644 FCS.Virk.csproj.DotSettings create mode 100644 VrCvrMapper.cs create mode 100644 VrHttpRequest.cs create mode 100644 VrModels/NyesteBeliggenhedsadresse.cs create mode 100644 VrModels/NyesteNavn.cs create mode 100644 VrModels/Periode.cs create mode 100644 VrModels/VirksomhedMetadata.cs create mode 100644 VrModels/VirksomhedsStatus.cs create mode 100644 VrModels/VrVirksomhed.cs create mode 100644 VrQuery.cs create mode 100644 VrQueryMapper.cs create mode 100644 VrQueryValidator.cs create mode 100644 VrResponseParser.cs create mode 100644 VrResponseView.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea85d98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/bin/**/** +/obj/**/** +/App_Data/**/** diff --git a/CvrModels/CvrCompany.cs b/CvrModels/CvrCompany.cs new file mode 100644 index 0000000..c473b60 --- /dev/null +++ b/CvrModels/CvrCompany.cs @@ -0,0 +1,58 @@ +// *********************************************************************** +// Assembly : Inno.Api +// Author : FH +// Created : 01-01-2022 +// +// Last Modified By : FH +// Last Modified On : 01-31-2022 +// *********************************************************************** +// +// Copyright © FCS 2015-2022 +// +// +// *********************************************************************** + +namespace FCS.Virk.CvrModels +{ + /// + /// Class CvrCompany. + /// + public class CvrCompany + { + /// + /// Gets or sets the vat number. + /// + /// The vat number. + public string VatNumber { get; set; } = ""; + /// + /// Gets or sets the name. + /// + /// The name. + public string Name { get; set; } = ""; + /// + /// Gets or sets the name of the co. + /// + /// The name of the co. + public string CoName { get; set; } = ""; + /// + /// Gets or sets the address. + /// + /// The address. + public string Address { get; set; } = ""; + /// + /// Gets or sets the city. + /// + /// The city. + public string City { get; set; } = ""; + /// + /// Gets or sets the zip code. + /// + /// The zip code. + public string ZipCode { get; set; } = ""; + /// + /// Gets or sets the status. + /// + /// The status. + public List Status { get; set; } = new(); + } +} \ No newline at end of file diff --git a/CvrModels/CvrPeriod.cs b/CvrModels/CvrPeriod.cs new file mode 100644 index 0000000..8bc9421 --- /dev/null +++ b/CvrModels/CvrPeriod.cs @@ -0,0 +1,32 @@ +// *********************************************************************** +// Assembly : Inno.Api +// Author : FH +// Created : 01-01-2022 +// +// Last Modified By : FH +// Last Modified On : 01-09-2022 +// *********************************************************************** +// +// Copyright © FCS 2015-2022 +// +// +// *********************************************************************** +namespace FCS.Virk.CvrModels +{ + /// + /// Class CvrPeriod. + /// + public class CvrPeriod + { + /// + /// Gets or sets the start date. + /// + /// The start date. + public string StartDate { get; set; } = ""; + /// + /// Gets or sets the end date. + /// + /// The end date. + public string EndDate { get; set; } = ""; + } +} \ No newline at end of file diff --git a/CvrModels/CvrStatus.cs b/CvrModels/CvrStatus.cs new file mode 100644 index 0000000..cf6b6f6 --- /dev/null +++ b/CvrModels/CvrStatus.cs @@ -0,0 +1,37 @@ +// *********************************************************************** +// Assembly : Inno.Api +// Author : FH +// Created : 01-01-2022 +// +// Last Modified By : FH +// Last Modified On : 01-31-2022 +// *********************************************************************** +// +// Copyright © FCS 2015-2022 +// +// +// *********************************************************************** +namespace FCS.Virk.CvrModels +{ + /// + /// Class CvrStatus. + /// + public class CvrStatus + { + /// + /// Gets or sets the last update. + /// + /// The last update. + public string LastUpdate { get; set; } = ""; + /// + /// Gets or sets the status. + /// + /// The status. + public string Status { get; set; } = "LUKKET"; + /// + /// Gets or sets the period. + /// + /// The period. + public CvrPeriod Period { get; set; } = new(); + } +} \ No newline at end of file diff --git a/FCS.Virk.csproj b/FCS.Virk.csproj new file mode 100644 index 0000000..13c906f --- /dev/null +++ b/FCS.Virk.csproj @@ -0,0 +1,18 @@ + + + 10.0 + + + net48 + enable + enable + + + + + + + + + + diff --git a/FCS.Virk.csproj.DotSettings b/FCS.Virk.csproj.DotSettings new file mode 100644 index 0000000..6162834 --- /dev/null +++ b/FCS.Virk.csproj.DotSettings @@ -0,0 +1,2 @@ + + CSharp90 \ No newline at end of file diff --git a/VrCvrMapper.cs b/VrCvrMapper.cs new file mode 100644 index 0000000..c9a9fb0 --- /dev/null +++ b/VrCvrMapper.cs @@ -0,0 +1,37 @@ +using FCS.Virk.CvrModels; +using FCS.Virk.VrModels; + +namespace FCS.Virk +{ + public class VrCvrMapper + { + public CvrCompany MapVrToCvr(VrVirksomhed vrVirk) + { + var c = new CvrCompany + { + Name = vrVirk.VirksomhedMetadata.NyesteNavn.Navn, + Address = + $"{vrVirk.VirksomhedMetadata.NyesteBeliggenhedsadresse.Vejnavn} {vrVirk.VirksomhedMetadata.NyesteBeliggenhedsadresse.HusnummerFra}", + CoName = vrVirk.VirksomhedMetadata.NyesteBeliggenhedsadresse.CoNavn, + ZipCode = vrVirk.VirksomhedMetadata.NyesteBeliggenhedsadresse.Postnummer.ToString(), + City = vrVirk.VirksomhedMetadata.NyesteBeliggenhedsadresse.PostDistrikt, + VatNumber = vrVirk.CvrNummer + }; + + foreach (var cs in vrVirk.VirksomhedsStatus.Select(vrStatus => new CvrStatus + { + Status = vrStatus.Status, + LastUpdate = vrStatus.SidstOpdateret, + Period = new CvrPeriod + { + StartDate = vrStatus.Periode.GyldigFra, + EndDate = vrStatus.Periode.GyldigTil + } + })) + { + c.Status.Add(cs); + } + return c; + } + } +} \ No newline at end of file diff --git a/VrHttpRequest.cs b/VrHttpRequest.cs new file mode 100644 index 0000000..ec9b6d7 --- /dev/null +++ b/VrHttpRequest.cs @@ -0,0 +1,30 @@ +using System.Net.Http.Headers; +using System.Text; + +namespace FCS.Virk +{ + public class VrHttpRequest + { + public async Task GetResponseAsync(string endpoint, string jsonData, string auth) + { + using var content = new StringContent(jsonData, Encoding.UTF8, "application/json"); + using var client = new HttpClient(); + using var vrRequest = new HttpRequestMessage(HttpMethod.Post, endpoint); + + vrRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", $"{auth}"); + vrRequest.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + vrRequest.Content = content; + + var response = await client.SendAsync(vrRequest).ConfigureAwait(true); + var jsonResult = await response.Content.ReadAsStringAsync().ConfigureAwait(true); + + return new VrResponseView + { + Code = response.StatusCode, + IsSuccessStatusCode = response.IsSuccessStatusCode, + Message = jsonResult + }; + } + } +} + diff --git a/VrModels/NyesteBeliggenhedsadresse.cs b/VrModels/NyesteBeliggenhedsadresse.cs new file mode 100644 index 0000000..f7c71d7 --- /dev/null +++ b/VrModels/NyesteBeliggenhedsadresse.cs @@ -0,0 +1,12 @@ +namespace FCS.Virk.VrModels +{ + public class NyesteBeliggenhedsadresse + { + public int? HusnummerFra { get; set; } + public int? HusnummerTil { get; set; } + public int? Postnummer { get; set; } + public string Vejnavn { get; set; } = ""; + public string CoNavn { get; set; } = ""; + public string PostDistrikt { get; set; } = ""; + } +} \ No newline at end of file diff --git a/VrModels/NyesteNavn.cs b/VrModels/NyesteNavn.cs new file mode 100644 index 0000000..1e7c93e --- /dev/null +++ b/VrModels/NyesteNavn.cs @@ -0,0 +1,7 @@ +namespace FCS.Virk.VrModels +{ + public class NyesteNavn + { + public string Navn { get; set; } = ""; + } +} \ No newline at end of file diff --git a/VrModels/Periode.cs b/VrModels/Periode.cs new file mode 100644 index 0000000..0d53eeb --- /dev/null +++ b/VrModels/Periode.cs @@ -0,0 +1,8 @@ +namespace FCS.Virk.VrModels +{ + public class Periode + { + public string GyldigFra { get; set; } = ""; + public string GyldigTil { get; set; } = ""; + } +} \ No newline at end of file diff --git a/VrModels/VirksomhedMetadata.cs b/VrModels/VirksomhedMetadata.cs new file mode 100644 index 0000000..f28e329 --- /dev/null +++ b/VrModels/VirksomhedMetadata.cs @@ -0,0 +1,8 @@ +namespace FCS.Virk.VrModels +{ + public class VirksomhedMetadata + { + public NyesteNavn NyesteNavn { get; set; } = new(); + public NyesteBeliggenhedsadresse NyesteBeliggenhedsadresse { get; set; } = new(); + } +} \ No newline at end of file diff --git a/VrModels/VirksomhedsStatus.cs b/VrModels/VirksomhedsStatus.cs new file mode 100644 index 0000000..eb9eca0 --- /dev/null +++ b/VrModels/VirksomhedsStatus.cs @@ -0,0 +1,9 @@ +namespace FCS.Virk.VrModels +{ + public class VirksomhedsStatus + { + public string SidstOpdateret { get; set; } = ""; + public string Status { get; set; } = ""; + public Periode Periode { get; set; } = new(); + } +} \ No newline at end of file diff --git a/VrModels/VrVirksomhed.cs b/VrModels/VrVirksomhed.cs new file mode 100644 index 0000000..331e012 --- /dev/null +++ b/VrModels/VrVirksomhed.cs @@ -0,0 +1,10 @@ +namespace FCS.Virk.VrModels +{ + public class VrVirksomhed + { + public string CvrNummer { get; set; } = ""; + public List VirksomhedsStatus { get; set; } = new (); + public VirksomhedMetadata VirksomhedMetadata { get; set; } = new(); + + } +} \ No newline at end of file diff --git a/VrQuery.cs b/VrQuery.cs new file mode 100644 index 0000000..411366e --- /dev/null +++ b/VrQuery.cs @@ -0,0 +1,10 @@ +namespace FCS.Virk +{ + public class VrQuery + { + public string VatNumber { get; set; } = ""; + public string StreetName { get; set; } = ""; + public string HouseNumber { get; set; } = ""; + public string ZipCode { get; set; } = ""; + } +} \ No newline at end of file diff --git a/VrQueryMapper.cs b/VrQueryMapper.cs new file mode 100644 index 0000000..b87b03f --- /dev/null +++ b/VrQueryMapper.cs @@ -0,0 +1,66 @@ +using Newtonsoft.Json.Linq; + +namespace FCS.Virk +{ + public class VrQueryMapper + { + public JObject VrMapQuery(VrQuery query) + { + if (string.IsNullOrWhiteSpace(query.VatNumber)) + { + return new JObject( + new JProperty("_source", + new JArray( + "Vrvirksomhed.cvrNummer", + "Vrvirksomhed.virksomhedMetadata.nyesteNavn.navn", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.conavn", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.vejnavn", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.husnummerFra", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.husnummerTil", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.postnummer", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.postdistrikt", + "Vrvirksomhed.virksomhedsstatus") + ), + new JProperty("query", + new JObject(new JProperty("bool", + new JObject(new JProperty("must", + new JArray( + new JObject(new JProperty("match", + new JObject(new JProperty( + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.postnummer", + new JObject(new JProperty("query", query.ZipCode), + new JProperty("_name", "postnummer")))))), + new JObject(new JProperty("match", + new JObject(new JProperty( + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.vejnavn", + new JObject(new JProperty("query", query.StreetName), + new JProperty("_name", "vejnavn")))))), + new JObject(new JProperty("match", + new JObject(new JProperty( + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.husnummerFra", + new JObject(new JProperty("query", query.HouseNumber), + new JProperty("_name", "husnummerFra")))))) + )))))), + new JProperty("size", 50)); + } + + return new JObject( + new JProperty("_source", + new JArray( + "Vrvirksomhed.cvrNummer", + "Vrvirksomhed.virksomhedMetadata.nyesteNavn.navn", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.conavn", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.vejnavn", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.husnummerFra", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.husnummerTil", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.postnummer", + "Vrvirksomhed.virksomhedMetadata.nyesteBeliggenhedsadresse.postdistrikt", + "Vrvirksomhed.virksomhedsstatus") + ), + new JProperty("query", + new JObject(new JProperty("term", + new JObject(new JProperty("Vrvirksomhed.cvrNummer", query.VatNumber)))))); + + } + } +} \ No newline at end of file diff --git a/VrQueryValidator.cs b/VrQueryValidator.cs new file mode 100644 index 0000000..979f995 --- /dev/null +++ b/VrQueryValidator.cs @@ -0,0 +1,15 @@ +namespace FCS.Virk +{ + public static class VrQueryValidator + { + public static bool ValidateVrQuery(VrQuery query) + { + // Precise lookup + if (!string.IsNullOrEmpty(query.VatNumber)) return true; + // Search lookup + return !string.IsNullOrWhiteSpace(query.StreetName) + && !string.IsNullOrWhiteSpace(query.HouseNumber) + && !string.IsNullOrEmpty(query.ZipCode); + } + } +} \ No newline at end of file diff --git a/VrResponseParser.cs b/VrResponseParser.cs new file mode 100644 index 0000000..b6e1aa3 --- /dev/null +++ b/VrResponseParser.cs @@ -0,0 +1,36 @@ +using FCS.Virk.VrModels; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace FCS.Virk +{ + public class VrResponseParser + { + public List ParseVrResponse(string jsonData) + { + var result = new List(); + + var cvrObject = JObject.Parse(jsonData); + + var numHits = (int) cvrObject.SelectToken("hits")?.SelectToken("total")!; + + if (numHits == 0) + return result; + + var cvrHits = cvrObject.SelectToken("hits")?.SelectToken("hits"); + + for (var i = 0; i < numHits; i++) + { + var cObject = cvrHits?[i]?["_source"] != null ? (JObject?)cvrHits[i]?["_source"]?["Vrvirksomhed"] : null; + + var jsonString = JsonConvert.SerializeObject(cObject); + + var o = JsonConvert.DeserializeObject(jsonString); + + result.Add(o); + } + + return result; + } + } +} \ No newline at end of file diff --git a/VrResponseView.cs b/VrResponseView.cs new file mode 100644 index 0000000..e4bf1a1 --- /dev/null +++ b/VrResponseView.cs @@ -0,0 +1,11 @@ +using System.Net; + +namespace FCS.Virk +{ + public class VrResponseView + { + public HttpStatusCode Code { get; set; } + public bool IsSuccessStatusCode { get; set; } + public string Message { get; set; } = ""; + } +} \ No newline at end of file