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