From 390d5353f2aaa413a89579c6d52bc01254ce70bd Mon Sep 17 00:00:00 2001 From: Andreas Luxbauer Date: Fri, 7 Feb 2025 08:08:08 +0100 Subject: [PATCH] HMRC --- Aviso/CHMRC.vb | 176 +++++++++++++++++++++++++++++++++++++-- Aviso/frmHauptfenster.vb | 22 ++++- 2 files changed, 191 insertions(+), 7 deletions(-) diff --git a/Aviso/CHMRC.vb b/Aviso/CHMRC.vb index 210b5a0..2d392eb 100644 --- a/Aviso/CHMRC.vb +++ b/Aviso/CHMRC.vb @@ -11,6 +11,7 @@ Imports Microsoft.Extensions.Hosting Imports System.Collections.Specialized Imports System.Text Imports System.IO +Imports VERAG_PROG_ALLGEMEIN Public Class cHMRC @@ -436,6 +437,77 @@ Public Class cHMRC End Sub + Shared Sub HMRC_RefreshToken(ByVal TOKEN As cHMRCToken) + + If DateDiff(DateInterval.Minute, TOKEN.token_refresh_datetime, Now) < 230 Then 'bis 240 MIN / 4hr + 'Token ist noch frisch + Exit Sub + End If + + ' Chilkat Lizenz aktivieren (falls benötigt) + VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat() + + ' HTTP-Objekt für API-Request erstellen + Dim http As New Chilkat.Http() + + ' URL für HMRC Token Refresh + Dim url As String = "https://api.service.hmrc.gov.uk/oauth/token" + + ' HTTP-Request-Objekt für POST-Anfrage + Dim req As New Chilkat.HttpRequest() + req.HttpVerb = "POST" + req.Path = "/oauth/token" + req.ContentType = "application/x-www-form-urlencoded" + + ' OAuth2 Credentials einfügen + + Dim TOKEN_NEW = "" + req.AddParam("client_secret", CLIENT_SECRET) + req.AddParam("client_id", CLIENT_ID) + req.AddParam("grant_type", "client_credentials") + req.AddParam("refresh_token", TOKEN_NEW) + + + + ' rest.AddQueryParam("scope", scope) + + + ' Anfrage senden + Dim resp As Chilkat.HttpResponse = http.PostUrlEncoded(url, req) + + ' Fehlerprüfung + If resp Is Nothing Then + Console.WriteLine("Fehler: " & http.LastErrorText) + Exit Sub + End If + + ' API-Antwort ausgeben + Dim json As New Chilkat.JsonObject() + json.Load(resp.BodyStr) + + ' Neuer Access Token + Dim accessToken As String = json.StringOf("access_token") + Dim newRefreshToken As String = json.StringOf("refresh_token") + Dim expiresIn As String = json.StringOf("expires_in") + + Console.WriteLine("Neuer Access Token: " & accessToken) + Console.WriteLine("Neuer Refresh Token: " & newRefreshToken) + Console.WriteLine("Gültigkeit (Sekunden): " & expiresIn) + + ' Optional: Tokens in einer Datei speichern + 'Dim tokenFile As String = "token.json" + 'json.EmitCompact = False + 'json.WriteFile(tokenFile) + + TOKEN.token_BEARER_TOKEN = newRefreshToken + TOKEN.token_refresh_datetime = Now + TOKEN.SAVE() + + Console.WriteLine("Tokens wurden in '" & tokenFile & "' gespeichert.") + + End Sub + + Shared Function grantAccessApplication(ByRef AccessToken, scope) As String Try VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat() @@ -1273,7 +1345,7 @@ Public Class cHMRC outgoingQueryString.Add("grant_type", "client_credentials") ' outgoingQueryString.Add("refresh_token", refreshToken) outgoingQueryString.Add("client_id", CLIENT_ID) - outgoingQueryString.Add("client_secret", CLIENT_Secret) + outgoingQueryString.Add("client_secret", CLIENT_SECRET) outgoingQueryString.Add("scope", scope) '"write:goods-movement-system") Dim postBytes As Byte() = New ASCIIEncoding().GetBytes(outgoingQueryString.ToString()) @@ -1284,15 +1356,15 @@ Public Class cHMRC Try Using response As System.Net.WebResponse = request.GetResponse() - Using streamReader As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream()) - ' Parse the JSON the way you prefer - Dim jsonResult As RefreshTokenResultJSON = New System.Web.Script.Serialization.JavaScriptSerializer().Deserialize(streamReader.ReadToEnd(), GetType(RefreshTokenResultJSON)) - AccessToken = jsonResult.access_token + Using streamReader As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream()) + ' Parse the JSON the way you prefer + Dim jsonResult As RefreshTokenResultJSON = New System.Web.Script.Serialization.JavaScriptSerializer().Deserialize(streamReader.ReadToEnd(), GetType(RefreshTokenResultJSON)) + AccessToken = jsonResult.access_token ' For more information, refer to the documentation End Using - End Using + End Using Catch ex As Exception MsgBox(ex.Message & ex.StackTrace) @@ -1361,8 +1433,100 @@ Public Class cHMRC ' ' For more information, refer to the documentation ' End Using 'End Using + + + + + End Sub + + + Shared Function getTOKEN(APPLICATION) As cHMRCToken + Dim TOKEN = New cHMRCToken(VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA, APPLICATION) + If TOKEN.hasEntry = False OrElse TOKEN.token_BEARER_TOKEN = "" Then + Dim AccessToken = "" + Dim appl = "" + Select Case APPLICATION + Case "GVMS" + appl = "write:goods-movement-system+read:pull-notifications" + Case "VAT_CHECK" '"EORI_CHECK" + appl = "read:vat write:vat" + End Select + grantAccess(AccessToken, appl) + TOKEN.token_BEARER_TOKEN = AccessToken + TOKEN.token_refresh_datetime = Now + TOKEN.SAVE() + Else + HMRC_RefreshToken(TOKEN) + End If + Return TOKEN + End Function + + + Shared Function checkEORI_UK(eoriNumber As String, ByVal response As String) As Boolean + ' Chilkat-Objekt initialisieren + Dim http As New Chilkat.Http + + http.SetRequestHeader("Accept", "application/x-www-form-urlencoded") + + ' EORI-Nummer für die Überprüfung + 'Dim eoriNumber As String = "GB123456789000" + Dim url As String = "https://api.service.hmrc.gov.uk/customs/eori/lookup/check-multiple-eori" + + + Dim requestBody As New Chilkat.JsonObject + requestBody.AppendArray("eoris").AddStringAt(-1, eoriNumber) + requestBody.AppendArray("eoris").AddStringAt(-1, "GB8392848394939") + + + + ' HTTP GET-Anfrage senden + Dim responseHttp = http.PostJson2(url, "application/json", requestBody.Emit()) + + ' Fehlerprüfung + If http.LastMethodSuccess <> True Then + Console.WriteLine("Fehler: " & http.LastErrorText) + Return False + End If + response = responseHttp.BodyStr + ' Antwort ausgeben + Console.WriteLine("API Antwort: " & responseHttp.BodyStr) + Return True + End Function + + Shared Function checkVAT_UK(VATNumber As String, ByVal response As String) As Boolean + ' Chilkat-Objekt initialisieren + Dim http As New Chilkat.Http + + ' Falls API-Schlüssel oder Authentifizierung erforderlich ist, hinzufügen + ' Beispiel: http.SetRequestHeader("Authorization", "Bearer YOUR_ACCESS_TOKEN") + + VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat() + + Dim TOKEN = getTOKEN("VAT_CHECK") + + If TOKEN.hasEntry Then + http.SetRequestHeader("Authorization", "Bearer " & accessToken) + http.SetRequestHeader("Accept", "application/x-www-form-urlencoded") + + ' EORI-Nummer für die Überprüfung + Dim url As String = "https://api.service.hmrc.gov.uk/organisations/vat/check-vat-number/lookup/" & VATNumber + + response = http.QuickGetStr(url) + + If http.LastMethodSuccess <> True Then + Console.WriteLine("Fehler: " & http.LastErrorText) + Return False + End If + + ' Antwort ausgeben + Console.WriteLine("API Antwort: " & response) + Return True + End If + Return False + End Function + Public Class RefreshTokenResultJSON Public Property access_token As String End Class diff --git a/Aviso/frmHauptfenster.vb b/Aviso/frmHauptfenster.vb index 4ab4f85..9be4cca 100644 --- a/Aviso/frmHauptfenster.vb +++ b/Aviso/frmHauptfenster.vb @@ -5065,7 +5065,27 @@ ELSE_ATILLA: End Sub Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click - VERAG_PROG_ALLGEMEIN.cOpenAI.doFirstAI() + + + MsgBox(VERAG_PROG_ALLGEMEIN.cOpenAI.askAI_TruckPlate("AW: Kennzeichen: CB4178EB | Grenze SUB DE007701 Suben | Absender CEMOBSAN;TEKIRDAG | Gewicht: 7.200,0")) + MsgBox(VERAG_PROG_ALLGEMEIN.cOpenAI.askAI_TruckPlate("*00*Fwd: Abgabenbescheid 5003/25001269 T31M492")) + MsgBox(VERAG_PROG_ALLGEMEIN.cOpenAI.askAI_TruckPlate("AW: Warenbeschreibung in T1-Dokumenten - 5003/25000389")) + MsgBox(VERAG_PROG_ALLGEMEIN.cOpenAI.askAI_TruckPlate("Kennzeichen: 06CLS811 | Grenze WAI DE008904 Waidhaus | Absender VAMET | Gewicht: 1.689,0")) + MsgBox(VERAG_PROG_ALLGEMEIN.cOpenAI.askAI_TruckPlate("*00*RE: 16 ALF 807 AVIS/ GERMANY")) + + + Exit Sub + + + + Dim resp = "" + cHMRC.checkEORI_UK("GB078068385000", resp) + MsgBox(resp) + + 'resp = "" + 'cHMRC.checkVAT_UK("389356931", resp) + 'MsgBox(resp) + 'VERAG_PROG_ALLGEMEIN.cOpenAI.doFirstAI() 'saveLukowaPDFsFromTherefore() ' MsgBox(VERAG_PROG_ALLGEMEIN.cATEZ_Tariff.GetTariffInfo_SingleOrEmpty("6207220000"))