- What is the VAT Information Exchange System (VIES)?
- It is an electronic means of transmitting information relating to VAT-registration (= validity of VAT-numbers) of companies registered in EU. Furthermore, information relating to (tax exempt) intra-Community supplies between Member States' administrations is also transmitted via VIES.
Code: Select all
XIncludeFile("WebServices.pbi")
EnableExplicit
#SOAP_INVALID_INPUT = "The provided CountryCode is invalid or the VAT number is empty."
#SOAP_SERVICE_UNAVAILABLE = "The SOAP service is unavailable, try again later."
#SOAP_MS_UNAVAILABLE = "The Member State service is unavailable, try again later or with another Member State."
#SOAP_TIMEOUT = "The Member State service could not be reach in time, try again later or with another Member Stat."
#SOAP_SERVER_BUSY = "The service can't process your request. Try again latter."
Structure VIESReturn
countryCode.s
vatNumber.s
requestDate.s
valid.b
name.s
address.s
faultString.s
EndStructure
Declare.s Post(Payload.s, URL.s)
Declare.i CheckVIES(countryCode.s, vatNumber.s, *struct.VIESReturn)
Procedure.s Post(Payload.s, URL.s)
Protected.i curl, res
Protected.s CURLData, header
Protected *header.Curl_Slist
InitializeStructure(*header, Curl_Slist)
curl = curl_easy_init()
If curl
curl_easy_setopt(curl, #CURLOPT_VERBOSE, #True)
curl_easy_setopt(curl, #CURLOPT_URL, str2curl(URLEncoder(URL)))
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYPEER, #False)
curl_easy_setopt(curl, #CURLOPT_SSL_VERIFYHOST, #False)
header = ~"SOAPAction: \"checkVAT\""
*header = curl_slist_append(*header, header)
header = "Content-Type: text/xml;charset=UTF-8"
*header = curl_slist_append(*header, header)
curl_easy_setopt(curl, #CURLOPT_HTTPHEADER, *header)
curl_easy_setopt(curl, #CURLOPT_POST, #True)
curl_easy_setopt(curl, #CURLOPT_USERAGENT, str2curl(PeekS(curl_version(), -1, #PB_UTF8)))
curl_easy_setopt(curl, #CURLOPT_POSTFIELDSIZE_LARGE, Len(Payload))
curl_easy_setopt(curl, #CURLOPT_POSTFIELDS, str2curl(Payload))
curl_easy_setopt(curl, #CURLOPT_WRITEFUNCTION, @LibCurl_WriteFunction())
curl_easy_setopt(curl, #CURLOPT_READDATA, @Payload);
res = curl_easy_perform(curl)
CURLData = LibCurl_GetData()
curl_slist_free_all(*header)
curl_easy_cleanup(curl)
ProcedureReturn CURLData
Else
ProcedureReturn #Null$
EndIf
EndProcedure
Procedure.i CheckVIES(countryCode.s, vatNumber.s, *struct.VIESReturn)
Protected.s SOAPRequest, SOAPServer, POSTReturn
Protected.i XML
Protected *MainNode, *ChildNode, *ChildNode2, *ChildNode3
SOAPRequest = ~"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"
SOAPRequest + ~"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\""
SOAPRequest + ~"xmlns:tns1=\"urn:ec.europa.eu:taxud:vies:services:checkVat:types\""
SOAPRequest + ~"xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\""
SOAPRequest + ~"xmlns:impl=\"urn:ec.europa.eu:taxud:vies:services:checkVat\""
SOAPRequest + ~"xmlns:apachesoap=\"http://xml.apache.org/xml-soap\" "
SOAPRequest + ~"xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\""
SOAPRequest + ~"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""
SOAPRequest + ~"xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\""
SOAPRequest + ~"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
SOAPRequest + ~"<SOAP-ENV:Body>"
SOAPRequest + ~"<tns1:checkVat xmlns:tns1=\"urn:ec.europa.eu:taxud:vies:services:checkVat:types\">"
SOAPRequest + ~"<tns1:countryCode>" + countryCode + "</tns1:countryCode>"
SOAPRequest + ~"<tns1:vatNumber>" + vatNumber + "</tns1:vatNumber>"
SOAPRequest + ~"</tns1:checkVat>"
SOAPRequest + ~"</SOAP-ENV:Body>"
SOAPRequest + ~"</SOAP-ENV:Envelope>"
SOAPServer = "http://ec.europa.eu/taxation_customs/vies/services/checkVatService"
POSTReturn = Post(SOAPRequest, SOAPServer)
XML = ParseXML(#PB_Any, POSTReturn)
If XML
If XMLStatus(XML) <> #PB_XML_Success
MessageRequester("Warning","There was an error processing the XML File.",#MB_ICONERROR)
Else
*MainNode = MainXMLNode(XML)
*ChildNode = ChildXMLNode(*MainNode)
While *ChildNode <> 0
Select GetXMLNodeName(*ChildNode)
Case "soap:Body"
*ChildNode2 = ChildXMLNode(*ChildNode)
Select GetXMLNodeName(*ChildNode2)
Case "checkVatResponse"
*ChildNode3 = ChildXMLNode(*ChildNode2)
While *ChildNode3 <> 0
Select GetXMLNodeName(*ChildNode3)
Case "countryCode"
*struct\countryCode = GetXMLNodeText(*ChildNode3)
Case "vatNumber"
*struct\vatNumber = GetXMLNodeText(*ChildNode3)
Case "requestDate"
*struct\requestDate = GetXMLNodeText(*ChildNode3)
Case "valid"
If GetXMLNodeText(*ChildNode3) = "true"
*struct\valid = #True
Else
*struct\valid = #False
EndIf
Case "name"
*struct\name = GetXMLNodeText(*ChildNode3)
Case "address"
*struct\address = GetXMLNodeText(*ChildNode3)
EndSelect
*ChildNode3 = NextXMLNode(*ChildNode3)
Wend
Case "soap:Fault"
*ChildNode3 = ChildXMLNode(*ChildNode2)
While *ChildNode3 <> 0
Select GetXMLNodeName(*ChildNode3)
Case "faultstring"
Select GetXMLNodeText(*ChildNode3)
Case "INVALID_INPUT"
*struct\faultString = #SOAP_INVALID_INPUT
Case "SERVICE_UNAVAILABLE"
*struct\faultString = #SOAP_SERVICE_UNAVAILABLE
Case "MS_UNAVAILABLE"
*struct\faultString = #SOAP_MS_UNAVAILABLE
Case "TIMEOUT"
*struct\faultString = #SOAP_TIMEOUT
Case "SERVER_BUSY"
*struct\faultString = #SOAP_SERVER_BUSY
EndSelect
EndSelect
*ChildNode3 = NextXMLNode(*ChildNode3)
Wend
EndSelect
EndSelect
*ChildNode = NextXMLNode(*ChildNode)
Wend
EndIf
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Define VATInfo.VIESReturn
CheckVIES("HR", "87932892185", @VATInfo.VIESReturn) ;Valid VAT
ClearStructure(@VATInfo, VIESReturn)
CheckVIES("HR", "00000000000", @VATInfo.VIESReturn) ;Invalid VAT
ClearStructure(@VATInfo, VIESReturn)
CheckVIES("XX", "", @VATInfo.VIESReturn) ;Improper request
ClearStructure(@VATInfo, VIESReturn)
Output wrote:HR
87932892185
2016-07-26+02:00
1
B A N E L L I D.O.O.
P A V L A H A T Z A 23 2, ZAGREB, 10000 ZAGREB
----------------------------------------
HR
00000000000
2016-07-26+02:00
0
---
---
----------------------------------------
0
The provided CountryCode is invalid or the VAT number is empty.
----------------------------------------