DataFlex
DataFlex
Hungary NAV Manage Annulment Request
See more Hungary NAV Invoicing Examples
Demonstrates the manageAnnulment request for the Hungarian NAV Online Invoicing System REST API v2.0.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoCrypt
Handle hoDtNow
String sMyPassword
String sPasswordHash
Handle hoPrng
Handle hoSbRequestId
String sSignatureKey
Handle hoSbFinalHashBase
Integer iNumReplaced
String sInvoiceOperation
String sInvoiceData
Handle hoSbHashBase
String sFirstHash
String sRequestSignature
ExchangeToken Handle hoXmlExchangeToken
String sEncodedEncryptedExchangeToken
Variant vBdExchangeToken
Handle hoBdExchangeToken
String sExchangeToken
Handle hoXml
Handle hoHttp
String sEndpoint
Variant vResp
Handle hoResp
Variant vResp
Xml Handle hoRespXml
String sManageAnnulmentResponse_xmlns
String sManageAnnulmentResponse_xmlns_ns2
String sRequestId
String sTimestamp
String sRequestVersion
String sHeaderVersion
String sFuncCode
String sSoftwareId
String sSoftwareName
String sSoftwareOperation
String sSoftwareMainVersion
String sSoftwareDevName
String sSoftwareDevContact
String sSoftwareDevCountryCode
String sSoftwareDevTaxNumber
String sTransactionId
String sTemp1
Integer iTemp1
Move False To iSuccess
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// Build the following XML:
// Use this online tool to generate code from sample XML:
// Generate Code to Create XML
// <?xml version="1.0" encoding="UTF-8"?>
// <ManageAnnulmentRequest xmlns="http://schemas.nav.gov.hu/OSA/2.0/api">
// <header>
// <requestId>RID338592103413</requestId>
// <timestamp>2019-09-11T13:37:09.385Z</timestamp>
// <requestVersion>2.0</requestVersion>
// <headerVersion>1.0</headerVersion>
// </header>
// <user>
// <login>lwilsmn0uqdxe6u</login>
// <passwordHash>2F43840A882CFDB7DB0 ... F6CA57FE8CD74DC28E</passwordHash>
// <taxNumber>11111111</taxNumber>
// <requestSignature>A297E3BD9 ... 1959ADFAF5</requestSignature>
// </user>
// <software>
// <softwareId>123456789123456789</softwareId>
// <softwareName>string</softwareName>
// <softwareOperation>LOCAL_SOFTWARE</softwareOperation>
// <softwareMainVersion>string</softwareMainVersion>
// <softwareDevName>string</softwareDevName>
// <softwareDevContact>string</softwareDevContact>
// <softwareDevCountryCode>HU</softwareDevCountryCode>
// <softwareDevTaxNumber>string</softwareDevTaxNumber>
// </software>
// <exchangeToken>dbd03076-3a9b-4312-bbbb-0cee3a6472572P11CS49ASIL</exchangeToken>
// <annulmentOperations>
// <annulmentOperation>
// <index>1</index>
// <annulmentOperation>ANNUL</annulmentOperation>
// <invoiceAnnulment>PD94bWwgdm ... ubnVsbWVudD4=</invoiceAnnulment>
// </annulmentOperation>
// </annulmentOperations>
// </ManageAnnulmentRequest>
Get Create (RefClass(cComChilkatCrypt2)) To hoCrypt
If (Not(IsComObjectCreated(hoCrypt))) Begin
Send CreateComObject of hoCrypt
End
Get Create (RefClass(cComCkDateTime)) To hoDtNow
If (Not(IsComObjectCreated(hoDtNow))) Begin
Send CreateComObject of hoDtNow
End
Get ComSetFromCurrentSystemTime Of hoDtNow To iSuccess
Get ComGetAsTimestamp Of hoDtNow False To sTemp1
Showln sTemp1
// The hash algorithm for the password is SHA512 (not SHA3-512).
Set ComHashAlgorithm Of hoCrypt To "sha512"
Set ComEncodingMode Of hoCrypt To "hex"
Move "my-password" To sMyPassword
Get ComHashStringENC Of hoCrypt sMyPassword To sPasswordHash
// Generate a random request ID like "RID215118906689"
Get Create (RefClass(cComChilkatPrng)) To hoPrng
If (Not(IsComObjectCreated(hoPrng))) Begin
Send CreateComObject of hoPrng
End
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbRequestId
If (Not(IsComObjectCreated(hoSbRequestId))) Begin
Send CreateComObject of hoSbRequestId
End
Get ComAppend Of hoSbRequestId "RID" To iSuccess
Get ComRandomString Of hoPrng 12 True False False To sTemp1
Get ComAppend Of hoSbRequestId sTemp1 To iSuccess
Get ComGetAsString Of hoSbRequestId To sTemp1
Showln "generated requestId = " sTemp1
// Calculate the requestSignature
Set ComHashAlgorithm Of hoCrypt To "sha3-512"
Move "ce-8f5e-215119fa7dd621DLMRHRLH2S" To sSignatureKey
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbFinalHashBase
If (Not(IsComObjectCreated(hoSbFinalHashBase))) Begin
Send CreateComObject of hoSbFinalHashBase
End
// First append the timestamp because we are going to remove certain chars/parts.
Get ComGetAsTimestamp Of hoDtNow False To sTemp1
Get ComAppend Of hoSbFinalHashBase sTemp1 To iSuccess
Get ComReplace Of hoSbFinalHashBase "Z" "" To iNumReplaced
Get ComReplace Of hoSbFinalHashBase "-" "" To iNumReplaced
Get ComReplace Of hoSbFinalHashBase ":" "" To iNumReplaced
Get ComReplace Of hoSbFinalHashBase "T" "" To iNumReplaced
// Prepend the requestId and append the signatureKey
Get ComGetAsString Of hoSbRequestId To sTemp1
Get ComPrepend Of hoSbFinalHashBase sTemp1 To iSuccess
Get ComAppend Of hoSbFinalHashBase sSignatureKey To iSuccess
// Calculate first (and only) index hash.
Move "ANNUL" To sInvoiceOperation
Move "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KPEludm9pY2VBbm51bG1lbnQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm5hdi5nb3YuaHUvT1NBLzIuMC9hbm51bCI+DQoJCTxhbm51bG1lbnRSZWZlcmVuY2U+MjIyMjIyMjI8L2FubnVsbWVudFJlZmVyZW5jZT4NCgkJPGFubnVsbWVudFRpbWVzdGFtcD4yMDE4LTA2LTE4VDA5OjEwOjQ1LjMwOVo8L2FubnVsbWVudFRpbWVzdGFtcD4NCgkJPGFubnVsbWVudENvZGU+RVJSQVRJQ19EQVRBPC9hbm51bG1lbnRDb2RlPg0KCQk8YW5udWxtZW50UmVhc29uPmNyZWF0ZSBzemFtbGEgYW5udWw8L2FubnVsbWVudFJlYXNvbj4NCjwvSW52b2ljZUFubnVsbWVudD4=" To sInvoiceData
Get Create (RefClass(cComChilkatStringBuilder)) To hoSbHashBase
If (Not(IsComObjectCreated(hoSbHashBase))) Begin
Send CreateComObject of hoSbHashBase
End
Get ComAppend Of hoSbHashBase sInvoiceOperation To iSuccess
Get ComAppend Of hoSbHashBase sInvoiceData To iSuccess
Get ComGetAsString Of hoSbHashBase To sTemp1
Get ComHashStringENC Of hoCrypt sTemp1 To sFirstHash
// Append the index hash to the final hash base.
Get ComAppend Of hoSbFinalHashBase sFirstHash To iSuccess
// Get our request signature (using sha3-512 because our HashAlgorithm was set to "sha3-512" up above...)
Get ComGetAsString Of hoSbFinalHashBase To sTemp1
Get ComHashStringENC Of hoCrypt sTemp1 To sRequestSignature
// Load our recently obtained exchange token.
// See Hungary NAV Invoicing Token Exchange Sample Code
Get Create (RefClass(cComChilkatXml)) To hoXmlExchangeToken
If (Not(IsComObjectCreated(hoXmlExchangeToken))) Begin
Send CreateComObject of hoXmlExchangeToken
End
Get ComLoadXmlFile Of hoXmlExchangeToken "qa_data/tokens/nav_exchange_token.xml" To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoXmlExchangeToken To sTemp1
Showln sTemp1
Procedure_Return
End
// Get the base64 encoded/encrypted exchange token.
// IMPORTANT: Make sure to use the exchange token before it expires.
// If it expired, then get a new one..
Get ComGetChildContent Of hoXmlExchangeToken "encodedExchangeToken" To sEncodedEncryptedExchangeToken
// Decode to binary.
Get Create (RefClass(cComChilkatBinData)) To hoBdExchangeToken
If (Not(IsComObjectCreated(hoBdExchangeToken))) Begin
Send CreateComObject of hoBdExchangeToken
End
Get ComAppendEncoded Of hoBdExchangeToken sEncodedEncryptedExchangeToken "base64" To iSuccess
// Decrypt using your 16-digit replacement key:
Set ComCryptAlgorithm Of hoCrypt To "aes"
Set ComCipherMode Of hoCrypt To "ecb"
Set ComKeyLength Of hoCrypt To 128
Set ComEncodingMode Of hoCrypt To "base64"
// Pass your 16-digit replacement key here:
Send ComSetEncodedKey To hoCrypt "99952BBAAAAA8XYZ" "ascii"
Get pvComObject of hoBdExchangeToken to vBdExchangeToken
Get ComDecryptBd Of hoCrypt vBdExchangeToken To iSuccess
Get ComGetString Of hoBdExchangeToken "utf-8" To sExchangeToken
Showln "exchange token = " sExchangeToken
// Now build the XML..
Get Create (RefClass(cComChilkatXml)) To hoXml
If (Not(IsComObjectCreated(hoXml))) Begin
Send CreateComObject of hoXml
End
Set ComTag Of hoXml To "ManageAnnulmentRequest"
Get ComAddAttribute Of hoXml "xmlns" "http://schemas.nav.gov.hu/OSA/2.0/api" To iSuccess
Get ComGetAsString Of hoSbRequestId To sTemp1
Send ComUpdateChildContent To hoXml "header|requestId" sTemp1
Get ComGetAsTimestamp Of hoDtNow False To sTemp1
Send ComUpdateChildContent To hoXml "header|timestamp" sTemp1
Send ComUpdateChildContent To hoXml "header|requestVersion" "2.0"
Send ComUpdateChildContent To hoXml "header|headerVersion" "1.0"
Send ComUpdateChildContent To hoXml "user|login" "lwilsmn0uqdxe6u"
Send ComUpdateChildContent To hoXml "user|passwordHash" sPasswordHash
Send ComUpdateChildContent To hoXml "user|taxNumber" "11111111"
Send ComUpdateChildContent To hoXml "user|requestSignature" sRequestSignature
Send ComUpdateChildContent To hoXml "software|softwareId" "123456789123456789"
Send ComUpdateChildContent To hoXml "software|softwareName" "string"
Send ComUpdateChildContent To hoXml "software|softwareOperation" "LOCAL_SOFTWARE"
Send ComUpdateChildContent To hoXml "software|softwareMainVersion" "string"
Send ComUpdateChildContent To hoXml "software|softwareDevName" "string"
Send ComUpdateChildContent To hoXml "software|softwareDevContact" "string"
Send ComUpdateChildContent To hoXml "software|softwareDevCountryCode" "HU"
Send ComUpdateChildContent To hoXml "software|softwareDevTaxNumber" "string"
Send ComUpdateChildContent To hoXml "exchangeToken" sExchangeToken
Send ComUpdateChildContent To hoXml "annulmentOperations|annulmentOperation|index" "1"
Send ComUpdateChildContent To hoXml "annulmentOperations|annulmentOperation|annulmentOperation" sInvoiceOperation
Send ComUpdateChildContent To hoXml "annulmentOperations|annulmentOperation|invoiceAnnulment" sInvoiceData
// POST the XML to https://api-test.onlineszamla.nav.gov.hu/invoiceService/v2/manageAnnulment
Get Create (RefClass(cComChilkatHttp)) To hoHttp
If (Not(IsComObjectCreated(hoHttp))) Begin
Send CreateComObject of hoHttp
End
Set ComAccept Of hoHttp To "application/xml"
Move "https://api-test.onlineszamla.nav.gov.hu/invoiceService/v2/manageAnnulment" To sEndpoint
Get Create (RefClass(cComChilkatHttpResponse)) To hoResp
If (Not(IsComObjectCreated(hoResp))) Begin
Send CreateComObject of hoResp
End
Get ComGetXml Of hoXml To sTemp1
Get pvComObject of hoResp to vResp
Get ComHttpStr Of hoHttp "POST" sEndpoint sTemp1 "utf-8" "application/xml" vResp To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoHttp To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComStatusCode Of hoResp To iTemp1
Showln "Response status code = " iTemp1
Get Create (RefClass(cComChilkatXml)) To hoRespXml
If (Not(IsComObjectCreated(hoRespXml))) Begin
Send CreateComObject of hoRespXml
End
Get ComBodyStr Of hoResp To sTemp1
Get ComLoadXml Of hoRespXml sTemp1 To iSuccess
Showln "Response body:"
Get ComGetXml Of hoRespXml To sTemp1
Showln sTemp1
// The result looks like this:
// <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
// <ManageAnnulmentResponse xmlns="http://schemas.nav.gov.hu/OSA/2.0/api" xmlns:ns2="http://schemas.nav.gov.hu/OSA/2.0/data">
// <header>
// <requestId>RID465317110495</requestId>
// <timestamp>2020-03-25T15:08:40Z</timestamp>
// <requestVersion>2.0</requestVersion>
// <headerVersion>1.0</headerVersion>
// </header>
// <result>
// <funcCode>OK</funcCode>
// </result>
// <software>
// <softwareId>123456789123456789</softwareId>
// <softwareName>string</softwareName>
// <softwareOperation>LOCAL_SOFTWARE</softwareOperation>
// <softwareMainVersion>string</softwareMainVersion>
// <softwareDevName>string</softwareDevName>
// <softwareDevContact>string</softwareDevContact>
// <softwareDevCountryCode>HU</softwareDevCountryCode>
// <softwareDevTaxNumber>string</softwareDevTaxNumber>
// </software>
// <transactionId>2WT6XG9LQ0U9VQNA</transactionId>
// </ManageAnnulmentResponse>
// Use this online tool to generate parsing code from sample XML:
// Generate Parsing Code from XML
Get ComGetAttrValue Of hoRespXml "xmlns" To sManageAnnulmentResponse_xmlns
Get ComGetAttrValue Of hoRespXml "xmlns:ns2" To sManageAnnulmentResponse_xmlns_ns2
Get ComGetChildContent Of hoRespXml "header|requestId" To sRequestId
Get ComGetChildContent Of hoRespXml "header|timestamp" To sTimestamp
Get ComGetChildContent Of hoRespXml "header|requestVersion" To sRequestVersion
Get ComGetChildContent Of hoRespXml "header|headerVersion" To sHeaderVersion
Get ComGetChildContent Of hoRespXml "result|funcCode" To sFuncCode
Get ComGetChildContent Of hoRespXml "software|softwareId" To sSoftwareId
Get ComGetChildContent Of hoRespXml "software|softwareName" To sSoftwareName
Get ComGetChildContent Of hoRespXml "software|softwareOperation" To sSoftwareOperation
Get ComGetChildContent Of hoRespXml "software|softwareMainVersion" To sSoftwareMainVersion
Get ComGetChildContent Of hoRespXml "software|softwareDevName" To sSoftwareDevName
Get ComGetChildContent Of hoRespXml "software|softwareDevContact" To sSoftwareDevContact
Get ComGetChildContent Of hoRespXml "software|softwareDevCountryCode" To sSoftwareDevCountryCode
Get ComGetChildContent Of hoRespXml "software|softwareDevTaxNumber" To sSoftwareDevTaxNumber
Get ComGetChildContent Of hoRespXml "transactionId" To sTransactionId
End_Procedure