Files
SDL/SDL/Classes/cFiskaltrustClient_chilkat.vb

930 lines
32 KiB
VB.net
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Imports Chilkat
Imports io.konik.zugferd.unqualified
Imports QRCoder
Imports VERAG_PROG_ALLGEMEIN
Public Class FtReceiptCases
' Normaler Verkauf
Public Const PosReceipt As Long = &H4445000000000001L
' Test-/Nullbeleg
Public Const ZeroReceipt As Long = &H4445000000000002L
' Kassenlebenszyklus
Public Const InitialOperation As Long = &H4445000000000003L
Public Const OutOfOperation As Long = &H4445000000000004L
' Tagesabschluss (Z-Bericht)
Public Const MonthlyClosing As Long = &H4445000000000005L
Public Const YearlyClosing As Long = &H4445000000000006L
Public Const DailyClosing As Long = &H4445000000000007L
' Kasseneinzahlung / Kassenauszahlung / Geldtransfer
Public Const CashDepositOrWithdrawal As Long = &H4445000000000011L
' Flags
Public Const ImplicitTransaction As Long = &H100000000L
Public Const ReversalReceipt As Long = &H40000L
Public Const TrainingReceipt As Long = &H20000L
' aktiviert den Late-Signing-Modus
Public Const FailedReceipt As Long = &H10000L
' Receipt-Request:
' bereits verarbeiteten Beleg anhand cbReceiptReference abrufen
Public Const ReceiptRequest As Long = &H800000000000L
End Class
Public Class FtChargeItemCase
' DE – Verkaufsbelege
Public Const RevenueNormal As Long = &H4445000000000001L ' 19 % Regelsteuersatz
Public Const RevenueReduced As Long = &H4445000000000002L ' 7 % ermäßigter Steuersatz
Public Const RevenueNotTaxable As Long = &H4445000000000005L ' Nicht steuerbar
Public Const RevenueTaxFree As Long = &H4445000000000006L ' Umsatzsteuerfrei, 0 %
' DE – Kassenbewegungen
Public Const Anfangsbestand As Long = &H4445000000000090L ' Anfangsbestand
Public Const Privatentnahme As Long = &H4445000000000091L ' Privatentnahme
Public Const Privateinlage As Long = &H4445000000000092L ' Privateinlage
Public Const Geldtransit As Long = &H4445000000000093L ' Geldtransit
Public Const Lohnzahlung As Long = &H4445000000000094L ' Lohnzahlung
Public Const Einzahlung As Long = &H4445000000000095L ' Einzahlung
Public Const Auszahlung As Long = &H4445000000000096L ' Auszahlung
End Class
Public Class FtJournalType
Public Const VersionInformation As Integer = 0
Public Const ActionJournal As Integer = 1
Public Const ReceiptJournal As Integer = 2
Public Const QueueItemJournal As Integer = 3
End Class
Public Class ReceiptCaseIntern
Public Const STORNO As String = "Storno"
Public Const VERKAUF As String = "Verkauf"
Public Const EINGANG As String = "Eingang"
Public Const AUSGANG As String = "Ausgang"
Public Const WIEDERHOLUNG As String = "Retry"
Public Const NULLBELEG As String = "NULL-BELEG"
Public Const STARTBELEG As String = "START-BELEG"
Public Const OUTOFOPERATIONBELEG As String = "END-BELEG"
Public Const TEMP_OUTOFOPERATIONBELEG As String = "TEMP-AUSFALL"
Public Const DAILYCLOSING As String = "TAGESABSCHLUSS"
End Class
Public Class PayItemCasesIntern
Public Const Cash As String = "Cash"
Public Const DebitCard As String = "DebitCard"
Public Const Kasseneinzahlungen_Auszahlungen As String = "Kasseneinzahlungen_Auszahlungen"
End Class
Public Class FtPayItemCases
'DE
' Barzahlung
Public Const Cash As Long = &H4445000000000001L
' EC-/Girokarte
Public Const DebitCard As Long = &H4445000000000004L
' Kreditkarte
Public Const CreditCard As Long = &H4445000000000005L
' Online-Zahlung (PayPal, Klarna, etc.)
Public Const OnlinePayment As Long = &H4445000000000006L
' Gutschein
Public Const Voucher As Long = &H4445000000000007L
'Cash transfer from/to cash book
Public Const Kasseineinzahlung_Auszahlung As Long = &H4445000000000016L
End Class
Public Class cFiskaltrustClient_chilkat
Private ReadOnly _baseUrl As String
Private ReadOnly _cashboxId As String
Private ReadOnly _accessToken As String
Private ReadOnly _country As String
Private ReadOnly _isFiskaltrust As Boolean = False
Public Sub New(baseUrl As String, cashboxId As String, accessToken As String, country As String)
_baseUrl = baseUrl.TrimEnd("/"c)
_cashboxId = cashboxId
_accessToken = accessToken
_country = country
If _cashboxId <> "" AndAlso baseUrl <> "" AndAlso _accessToken <> "" AndAlso _country <> "" Then
_isFiskaltrust = True
Else
_isFiskaltrust = False
End If
End Sub
Public Function isFiskaltrust() As Boolean
Return _isFiskaltrust
End Function
Public Function SignReceipt_test(posSystemId As String, TSEisOnline As Boolean) As String
Dim LIST = New List(Of EABelegPositionen)
Dim p = New EABelegPositionen
p.Mandant = "VERA"
p.Niederlassung = "SUB"
p.Benutzer = 74
p.BelegDat = Now
p.BelegNr = 1
p.PreislistenNr = 1
p.PreislistenPos = 1
p.LeistungsNr = 300
p.LeistungsBez = "TEST"
p.Preis = 10
p.Anzahl = 10
LIST.Add(p)
Dim amount = 100
Dim vat = 0
Dim POS = LIST
Dim kindOfPayment = "Cash"
Try
Dim payload As JsonObject = BuildPayloadReceipt(amount, vat, POS, kindOfPayment, posSystemId, "Verkauf", "", TSEisOnline)
Return SendChilkat(GetEndpoint("payment"), payload.Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function ChancelReceipt_test(reference As String, posSystemId As String, TSEisOnline As Boolean) As String
Try
Dim LIST = New List(Of EABelegPositionen)
Dim p = New EABelegPositionen
p.Mandant = "VERA"
p.Niederlassung = "SUB"
p.Benutzer = 74
p.BelegDat = Now
p.BelegNr = 1
p.PreislistenNr = 1
p.PreislistenPos = 1
p.LeistungsNr = 300
p.LeistungsBez = "TEST"
p.Preis = 10
p.Anzahl = 1
LIST.Add(p)
Dim amount = 100
Dim vat = 0
Dim POS = LIST
Dim kindOfPayment = "Cash"
Dim payload As JsonObject = BuildPayloadReceipt(amount, vat, POS, kindOfPayment, posSystemId, "Storno", reference, TSEisOnline)
Return SendChilkat(GetEndpoint("storno"), payload.Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function SignReceipt(amount As Decimal, vat As Decimal, POS As List(Of EABelegPositionen), kindOfPayment As String, posSystemId As String, typOfReceiptCase As String, reference As String, TESisOnline As Boolean) As String
Try
Dim payload As JsonObject = BuildPayloadReceipt(amount, vat, POS, kindOfPayment, posSystemId, typOfReceiptCase, reference, TESisOnline)
Return SendChilkat(GetEndpoint("payment"), payload.Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function SignNullReceipt(posSystemId As String) As String
Try
Return SendChilkat(GetEndpoint("payment"), BuildPayloadNullReceipt(posSystemId, _country).Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function ChancelReceipt(reference As String, amount As Decimal, vat As Decimal, POS As List(Of EABelegPositionen), kindOfPayment As String, posSystemId As String, TSEisOnline As Boolean) As String
Try
Dim payload As JsonObject = BuildPayloadReceipt(amount, vat, POS, kindOfPayment, posSystemId, "Storno", reference, TSEisOnline)
Return SendChilkat(GetEndpoint("storno"), payload.Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function SignOutOfOrderReceipt(posSystemId As String) As String
Try
Return SendChilkat(GetEndpoint("payment"), BuildPayloadOutOfOperationReceipt(posSystemId, _country).Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function SignTempOutOfOrderReceipt(posSystemId As String) As String
Try
Return SendChilkat(GetEndpoint("payment"), BuildPayloadOutOfOperationReceipt(posSystemId, _country).Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function SignInitialOperationReceipt(posSystemId As String) As String
Try
Return SendChilkat(GetEndpoint("payment"), BuildPayloadInitialOperationReceipt(posSystemId, _country).Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function SignClosingReceipt(receiptType As String, posSystemId As String, kind As String) As String
Try
Return SendChilkat(GetEndpoint("payment"), BuildPayloadClosingReceipt(receiptType, posSystemId, kind).Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function Echo(kassenName As String) As String
Try
Dim json As New JsonObject()
json.UpdateString("Message", kassenName & " - VERBINDUNG OK")
Return SendChilkat(GetEndpoint("test"), json.Emit())
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Public Function Journal(ftJournalType As Integer) As String
Try
Dim endpoint = GetEndpoint("journal")
endpoint &= "?type=" & ftJournalType
Return SendChilkat(endpoint, "")
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Function
Private Function SendChilkat(endpoint As String, payload As String, Optional isGet As Boolean = False) As String
Dim retries As Integer = 3
Dim lastEx As Exception = Nothing
VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat()
Dim rest As New Chilkat.Rest
rest.VerboseLogging = True
For i As Integer = 1 To retries
Try
Dim uri As New Uri(_baseUrl)
If Not rest.Connect(uri.Host, uri.Port, uri.Scheme = "https", True) Then
Throw New Exception(rest.LastErrorText)
End If
rest.AddHeader("cashboxid", _cashboxId)
rest.AddHeader("accesstoken", _accessToken)
Dim response As String
If isGet Then
response = rest.FullRequestNoBody(
"GET",
uri.AbsoluteUri & endpoint
)
Else
If _country = "AT" Then
rest.AddHeader("Content-Type", "text/plain")
Else
rest.AddHeader("Content-Type", "application/json")
End If
response = rest.FullRequestString("POST", uri.AbsoluteUri & endpoint, payload)
End If
Dim statusCode As Integer = rest.ResponseStatusCode
' SUCCESS
If statusCode >= 200 AndAlso statusCode < 300 Then
Return response
End If
' 4xx = client/request error -> DO NOT RETRY
If statusCode >= 400 AndAlso statusCode < 500 Then
Throw New Exception(
"HTTP " & statusCode & ": " & response
)
End If
' 5xx = server error -> retry
If statusCode >= 500 AndAlso statusCode < 600 Then
lastEx = New Exception(
"HTTP " & statusCode & ": " & response
)
If i < retries Then
Threading.Thread.Sleep(500)
Continue For
End If
Throw lastEx
End If
' Unexpected status code
Throw New Exception(
"HTTP " & statusCode & ": " & response
)
Catch ex As Exception
lastEx = ex
' If this was an HTTP 4xx, don't retry.
If rest.ResponseStatusCode >= 400 AndAlso
rest.ResponseStatusCode < 500 Then
Throw
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name, ERROR_OP.MAIL)
End If
' Connection/transport error -> retry
If i < retries Then
Threading.Thread.Sleep(500)
End If
End Try
Next
Throw lastEx
End Function
Private Function BuildPayloadReceipt(amount As Decimal, vat As Decimal, POS As List(Of EABelegPositionen), kindOfPayment As String, posSystemId As String, _receiptCase As String, _reference As String, TSEisOnline As Boolean) As JsonObject
Dim json As New JsonObject()
json.UpdateString("ftCashBoxID", _cashboxId)
json.UpdateString("ftPosSystemId", getVersion(posSystemId))
json.UpdateString("cbTerminalID", posSystemId)
If _reference <> "" Then
json.UpdateString("cbReceiptReference", _reference)
Else
json.UpdateString("cbReceiptReference", Guid.NewGuid().ToString())
End If
json.UpdateString("cbReceiptMoment", DateTime.UtcNow.ToString("o"))
Dim receiptCaseValue As Long
If _receiptCase = ReceiptCaseIntern.STORNO Then
' Neue Referenz für den Stornobeleg
json.UpdateString("cbReceiptReference", Guid.NewGuid().ToString())
' Referenz auf den ursprünglichen Beleg
json.UpdateString("cbPreviousReceiptReference", _reference)
If TSEisOnline Then
receiptCaseValue = FtReceiptCases.PosReceipt Or FtReceiptCases.ReversalReceipt Or FtReceiptCases.ImplicitTransaction
Else
receiptCaseValue = FtReceiptCases.PosReceipt Or FtReceiptCases.ReversalReceipt Or FtReceiptCases.FailedReceipt Or FtReceiptCases.ImplicitTransaction
End If
json.UpdateString("cbUser", VERAG_PROG_ALLGEMEIN.cAllgemein.USRKURZNAME)
ElseIf _receiptCase = ReceiptCaseIntern.WIEDERHOLUNG Then
'Receipt-Request nach Kommunikationsfehler
'dieselbe cbReceiptReference verwenden
'dieselben cbChargeItems und cbPayItems mitsenden
'optional dieselbe cbTerminalID
json.UpdateString("cbReceiptReference", _reference)
receiptCaseValue = FtReceiptCases.PosReceipt Or FtReceiptCases.ReceiptRequest
' Kasseneinzahlung (ohne Positionen) / Kassenauszahlung (ohne Positionen)
ElseIf (_receiptCase = ReceiptCaseIntern.EINGANG OrElse _receiptCase = ReceiptCaseIntern.AUSGANG) Then
kindOfPayment = PayItemCasesIntern.Kasseneinzahlungen_Auszahlungen
json.UpdateString("cbReceiptReference", Guid.NewGuid().ToString())
If TSEisOnline Then
receiptCaseValue = FtReceiptCases.CashDepositOrWithdrawal Or FtReceiptCases.ImplicitTransaction
Else
receiptCaseValue = FtReceiptCases.CashDepositOrWithdrawal Or FtReceiptCases.FailedReceipt Or FtReceiptCases.ImplicitTransaction
End If
Else
' New reference for a normal receipt
json.UpdateString("cbReceiptReference", Guid.NewGuid().ToString())
If TSEisOnline Then
receiptCaseValue = FtReceiptCases.PosReceipt Or FtReceiptCases.ImplicitTransaction
Else
receiptCaseValue = FtReceiptCases.PosReceipt Or FtReceiptCases.FailedReceipt Or FtReceiptCases.ImplicitTransaction
End If
End If
json.UpdateString("ftReceiptCase", receiptCaseValue.ToString())
Dim chargeItems = json.AppendArray("cbChargeItems")
If POS.Count > 0 Then
For Each p In POS
If chargeItems.AddObjectAt(-1) Then
Dim quantity As Double = p.Anzahl
Dim unitPrice As Double = p.Preis
Dim lineAmount As Double = p.Betrag
'bei Storno negieren (BEI DE nur einen Teil)! -> im V1 Beispiel sind beide negativ!!!
'To cancel a receipt, resend it with this flag added to the ftReceiptCase and inverse the cbPayItems OR cbChargeItems (This is not the same behavior as described in the general part — in Germany, this flag requires only one of cbPayItems or cbChargeItems to be negative, and both must not be negative at the same time)'
'https://docs.fiskaltrust.cloud/docs/poscreators/middleware-doc/germany/reference-tables/ftreceiptcase
If _receiptCase = ReceiptCaseIntern.STORNO Then
quantity = quantity * -1
lineAmount = lineAmount * -1
End If
Dim item As Chilkat.JsonObject = chargeItems.ObjectAt(chargeItems.Size - 1)
item.UpdateInt("Quantity", quantity)
item.UpdateNumber("Amount", lineAmount)
item.UpdateNumber("VATRate", vat)
item.UpdateString("Description", p.LeistungsBez)
Dim ChargeItemCase As Long
Select Case vat
Case 19D
ChargeItemCase = FtChargeItemCase.RevenueNormal
Case 7D
ChargeItemCase = FtChargeItemCase.RevenueReduced
Case 0D
ChargeItemCase = FtChargeItemCase.RevenueTaxFree
Case Else
Throw New Exception("Unbekannter Steuersatz")
End Select
item.UpdateString("ftChargeItemCase", ChargeItemCase)
End If
Next
End If
Dim paidAmount As Double = amount
Dim paidQuantity As Integer = 1
'bei Storno negieren (BEI DE nur einen Teil)! -> im V1 Beispiel sind beide negativ!!!
'To cancel a receipt, resend it with this flag added to the ftReceiptCase and inverse the cbPayItems OR cbChargeItems (This is not the same behavior as described in the general part — in Germany, this flag requires only one of cbPayItems or cbChargeItems to be negative, and both must not be negative at the same time)'
'https://docs.fiskaltrust.cloud/docs/poscreators/middleware-doc/germany/reference-tables/ftreceiptcase
If PayItemCasesIntern.Kasseneinzahlungen_Auszahlungen Then
End If
If _receiptCase = ReceiptCaseIntern.STORNO Then
paidAmount = paidAmount * -1
paidQuantity = paidQuantity * -1
End If
Dim payItems = json.AppendArray("cbPayItems")
payItems.AddObjectAt(-1)
Dim pay As Chilkat.JsonObject = payItems.ObjectAt(payItems.Size - 1)
pay.UpdateInt("Quantity", paidQuantity)
pay.UpdateNumber("Amount", paidAmount)
Dim Description As String = ""
Select Case kindOfPayment
Case PayItemCasesIntern.Cash
pay.UpdateString("ftPayItemCase", FtPayItemCases.Cash)
Description = "Bar"
Case PayItemCasesIntern.DebitCard
pay.UpdateString("ftPayItemCase", FtPayItemCases.DebitCard)
Description = "ECKarte"
Case PayItemCasesIntern.Kasseneinzahlungen_Auszahlungen
pay.UpdateString("ftPayItemCase", FtPayItemCases.Kasseineinzahlung_Auszahlung)
If amount > 0 Then
Description = "Kasseneingang"
ElseIf amount < 0 Then
Description = "Kassenausgang"
End If
End Select
pay.UpdateString("Description", Description)
Return json
End Function
Private Function BuildPayloadNullReceipt(posSystemId As String, country As String) As JsonObject
Dim json As New JsonObject()
json.UpdateString("ftCashBoxID", _cashboxId)
json.UpdateString("ftPosSystemId", getVersion(posSystemId))
json.UpdateString("cbTerminalID", posSystemId)
json.UpdateString("cbReceiptMoment", DateTime.UtcNow.ToString("o"))
json.UpdateString("ftReceiptCase", (FtReceiptCases.ZeroReceipt Or FtReceiptCases.ImplicitTransaction).ToString())
json.UpdateString("cbReceiptReference", "ZeroReceiptAfterFailure")
Dim chargeItems = json.AppendArray("cbChargeItems")
Dim payItems = json.AppendArray("cbPayItems")
Return json
End Function
Private Function BuildPayloadInitialOperationReceipt(posSystemId As String, country As String) As JsonObject
Dim json As New JsonObject()
json.UpdateString("ftCashBoxID", _cashboxId)
json.UpdateString("ftPosSystemId", getVersion(posSystemId))
json.UpdateString("cbTerminalID", posSystemId)
json.UpdateString("cbReceiptMoment", DateTime.UtcNow.ToString("o"))
json.UpdateString("ftReceiptCase", (FtReceiptCases.InitialOperation Or FtReceiptCases.ImplicitTransaction).ToString())
json.UpdateString("cbReceiptReference", "INIT")
json.UpdateString("cbUser", "Admin")
json.UpdateString("ftReceiptCaseData", "")
Dim chargeItems = json.AppendArray("cbChargeItems")
Dim payItems = json.AppendArray("cbPayItems")
Return json
End Function
Private Function BuildPayloadOutOfOperationReceipt(posSystemId As String, country As String) As JsonObject
Dim json As New JsonObject()
json.UpdateString("ftCashBoxID", _cashboxId)
json.UpdateString("ftPosSystemId", getVersion(posSystemId))
json.UpdateString("cbTerminalID", posSystemId)
json.UpdateString("cbReceiptMoment", DateTime.UtcNow.ToString("o"))
json.UpdateString("ftReceiptCase", (FtReceiptCases.OutOfOperation Or FtReceiptCases.ImplicitTransaction).ToString())
json.UpdateString("cbReceiptReference", "OutOfOperation")
json.UpdateString("cbUser", "Admin")
json.UpdateString("ftReceiptCaseData", "")
Dim chargeItems = json.AppendArray("cbChargeItems")
Dim payItems = json.AppendArray("cbPayItems")
Return json
End Function
Private Function BuildPayloadClosingReceipt(receiptType As String, posSystemId As String, kind As String) As JsonObject
Dim json As New JsonObject()
json.UpdateString("ftCashBoxID", _cashboxId)
json.UpdateString("ftPosSystemId", getVersion(posSystemId))
json.UpdateString("cbTerminalID", posSystemId)
json.UpdateString("cbReceiptMoment", DateTime.UtcNow.ToString("o"))
Dim chargeItems = json.AppendArray("cbChargeItems")
Dim payItems = json.AppendArray("cbPayItems")
Select Case kind
Case "yearly"
json.UpdateString("cbReceiptReference", "yearly-closing-" & DateTime.UtcNow.ToString("o"))
json.UpdateString("ftReceiptCase", (FtReceiptCases.YearlyClosing Or FtReceiptCases.ImplicitTransaction).ToString())
Case "monthly"
json.UpdateString("cbReceiptReference", "monthly-closing-" & DateTime.UtcNow.ToString("o"))
json.UpdateString("ftReceiptCase", (FtReceiptCases.MonthlyClosing Or FtReceiptCases.ImplicitTransaction).ToString())
Case Else 'daily
json.UpdateString("cbReceiptReference", "daily-closing-" & DateTime.UtcNow.ToString("o"))
json.UpdateString("ftReceiptCase", (FtReceiptCases.DailyClosing Or FtReceiptCases.ImplicitTransaction).ToString())
End Select
Return json
End Function
Private Function GetEndpoint(type As String) As String
Select Case type
Case "payment"
Select Case _country
Case "DE" : Return "/json/v1/Sign"
Case "AT" : Return "/json/Sign"
End Select
Case "test"
Select Case _country
Case "DE" : Return "/json/v1/Echo"
Case "AT" : Return "/json/Echo"
End Select
Case "journal"
Select Case _country
Case "DE" : Return "/json/v1/Journal"
Case "AT" : Return "/json/Journal"
End Select
Case "storno"
Select Case _country
Case "DE" : Return "/json/v1/Sign"
Case "AT" : Return "/json/Sign"
End Select
End Select
Throw New Exception("Unsupported country")
End Function
Private Function getVersion(Terminal_ID As String) As String
Return Terminal_ID '& "_" & Application.ProductVersion
End Function
Public Function saveRKSV_FT(ByRef result_zahlung As String, ByRef QR_CodeString As String, ByRef beleg_temp As EABeleg, ByRef isStorno As Boolean) As Boolean
If String.IsNullOrWhiteSpace(result_zahlung) Then
Return False
End If
Dim json As New Chilkat.JsonObject
Dim success As Boolean = json.Load(result_zahlung)
If (success <> True) Then
Debug.WriteLine(json.LastErrorText)
Return False
End If
Dim saved As Boolean = False
Dim ftSig As New cFiskaltrustSignatures()
Dim ftReceiptMoment As New Chilkat.CkDateTime
Dim dt As New Chilkat.DtObj
Dim getAsLocal As Boolean = False
Dim ftID As Integer = -1
success = json.DateOf("ftReceiptMoment", ftReceiptMoment)
Debug.WriteLine(ftReceiptMoment.GetAsTimestamp(getAsLocal))
With ftSig
.ftCashBoxID = json.StringOf("ftCashBoxID")
.ftQueueID = json.StringOf("ftQueueID")
.ftQueueItemID = json.StringOf("ftQueueItemID")
.ftQueueRow = json.IntOf("ftQueueRow")
.cbTerminalID = json.StringOf("cbTerminalID")
.cbReceiptReference = json.StringOf("cbReceiptReference")
.ftCashBoxIdentification = json.StringOf("ftCashBoxIdentification")
.ftReceiptIdentification = json.StringOf("ftReceiptIdentification")
.ftReceiptMoment = ftReceiptMoment.GetAsTimestamp(getAsLocal)
.ftState = json.StringOf("ftState")
If beleg_temp Is Nothing Then
.ftBeleg_ID = -1
Else
.ftBeleg_ID = beleg_temp.BelegNr
End If
saved = .SAVE()
If saved AndAlso beleg_temp IsNot Nothing Then
If isStorno Then
beleg_temp.FT_ReceiptReference_Storno = .cbReceiptReference
beleg_temp.SAVE()
Else
beleg_temp.FT_ReceiptReference = .cbReceiptReference
beleg_temp.SAVE()
End If
End If
End With
Dim num As Integer = json.SizeOfArray("ftSignatures")
If num = 0 Then
MsgBox("Signatureinheit liefert keine (gültige) Signatur, Signatureinheit ausgefallen" & vbNewLine & "Beleg kann nachträglich signiert werden!")
Return False
End If
Dim Signatures As Chilkat.JsonArray = json.ArrayOf("ftSignatures")
If (json.LastMethodSuccess = False) Then
Return False
End If
Dim numSignatures As Integer = Signatures.Size
For i = 0 To numSignatures - 1
Dim SignObj As Chilkat.JsonObject = Signatures.ObjectAt(i)
Dim ftSigPos As New cFiskaltrustSignaturPositions()
With ftSigPos
.ftSignatures = ftSig.ft_id
.ftData = SignObj.StringOf("Data")
.ftSignatureFormat = SignObj.StringOf("ftSignatureFormat")
.ftSignatureType = SignObj.StringOf("ftSignatureType")
saved = .SAVE()
End With
Next
'https://receipts.fiskaltrust.eu/{ftQueueID}/{ftQueueItemID}
Dim URL_FT As String = ""
If Not String.IsNullOrWhiteSpace(ftSig.ftQueueID) AndAlso Not String.IsNullOrWhiteSpace(ftSig.ftQueueItemID) Then
URL_FT = $"https://receipts.fiskaltrust.eu/{ftSig.ftQueueID}/{ftSig.ftQueueItemID}"
Using qrGenerator As New QRCodeGenerator()
Using qrData As QRCodeData = qrGenerator.CreateQrCode(URL_FT, QRCodeGenerator.ECCLevel.Q)
Dim qrCode As New PngByteQRCode(qrData)
Dim qrBytes As Byte() = qrCode.GetGraphic(20)
Dim qrBase64 As String = Convert.ToBase64String(qrBytes)
QR_CodeString = qrBase64
End Using
End Using
End If
Return saved
End Function
Public Function exportJournal(ByRef result_Journal As String) As Boolean
If result_Journal <> "" Then
Dim jsonArr As New Chilkat.JsonArray
Dim success As Boolean = jsonArr.Load(result_Journal)
If (success <> True) Then
Debug.WriteLine(jsonArr.LastErrorText)
Return False
End If
Dim dt As New DataTable
dt.Columns.Add("ftReceiptJournalId", GetType(String))
dt.Columns.Add("ftReceiptMoment", GetType(String))
dt.Columns.Add("ftReceiptNumber", GetType(String))
dt.Columns.Add("ftReceiptTotal", GetType(String))
dt.Columns.Add("ftQueueId", GetType(String))
dt.Columns.Add("ftReceiptHash", GetType(String))
dt.Columns.Add("ftQueueItemId", GetType(String))
dt.Columns.Add("TimeStamp", GetType(String))
Dim i = 0
Dim num As Integer = jsonArr.Size
If num = 0 Then
Return False
End If
Dim tmstmp As New Chilkat.CkDateTime
Dim getAsLocal As Boolean = False
While i < num
Dim SignObj As Chilkat.JsonObject = jsonArr.ObjectAt(i)
Dim R As DataRow = dt.NewRow
With SignObj
R("ftReceiptJournalId") = .StringOf("ftReceiptJournalId")
R("ftReceiptMoment") = .StringOf("ftReceiptMoment")
R("ftReceiptNumber") = .IntOf("ftReceiptNumber")
R("ftReceiptTotal") = .StringOf("ftReceiptTotal")
R("ftQueueId") = .StringOf("ftQueueId")
R("ftQueueItemId") = .StringOf("ftQueueItemId")
R("ftReceiptHash") = .StringOf("ftReceiptHash")
R("TimeStamp") = .StringOf("ftReceiptMoment")
End With
dt.Rows.Add(R)
i = i + 1
End While
If dt.Rows.Count > 0 Then
Dim Path = VERAG_PROG_ALLGEMEIN.cProgramFunctions.genExcelFromDT_NEW(dt)
End If
End If
End Function
Public Function PrettyPrintJson(jsonText As String) As String
Dim json As New Chilkat.JsonObject()
If Not json.Load(jsonText) Then
Return jsonText
End If
json.EmitCompact = False
Return json.Emit()
End Function
End Class