{"id":516,"date":"2020-04-16T11:13:30","date_gmt":"2020-04-16T09:13:30","guid":{"rendered":"https:\/\/drinkits.optimisti.lv\/?p=516"},"modified":"2020-04-16T11:13:30","modified_gmt":"2020-04-16T09:13:30","slug":"simple-php-script-for-vies-vat-number-validation","status":"publish","type":"post","link":"https:\/\/www.drinkits.lv\/en\/2020\/04\/16\/simple-php-script-for-vies-vat-number-validation\/","title":{"rendered":"Simple PHP script for VIES VAT number validation"},"content":{"rendered":"<p><a href=\"https:\/\/www.drinkits.lv\/wp-content\/uploads\/2020\/04\/exampl.jpg\" data-lbwps-width=\"513\" data-lbwps-height=\"356\" data-lbwps-srcsmall=\"https:\/\/www.drinkits.lv\/wp-content\/uploads\/2020\/04\/exampl.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-530\" src=\"https:\/\/www.drinkits.lv\/wp-content\/uploads\/2020\/04\/exampl-300x208.jpg\" alt=\"\" width=\"300\" height=\"208\" srcset=\"https:\/\/www.drinkits.lv\/wp-content\/uploads\/2020\/04\/exampl-300x208.jpg 300w, https:\/\/www.drinkits.lv\/wp-content\/uploads\/2020\/04\/exampl.jpg 513w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>I have created simple VIES VAT number validation script. Script allows to upload previously prepared CSV with <em>countryCode<\/em> and\u00a0<em>vatNumber\u00a0<\/em>and creates HTML table with validation results.<\/p>\n<p><!--more--><\/p>\n<p>&nbsp;<\/p>\n<p>CSV example:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">countryCode;vatNumber\nAT;U20557305\nAT;U55343505\nAT;U63017835\nAT;U63091969\nAT;U67414700\nAT;U68575437\nAT;U73556289\nBE;0502674883\nBG;106030859\nBG;115100705<\/pre>\n<p>PHP script:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\">&lt;!-- \n  Author: Karlis Rozenbergs\n  Blog: drinkits.optimisti.lv\n  Based on http:\/\/stackoverflow.com\/a\/29955950\n--&gt;\n&lt;html&gt;\n  &lt;head&gt;\n    &lt;script type=\"text\/javascript\" src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.4.4\/jquery.js\"&gt;&lt;\/script&gt;\n    &lt;style&gt;\n      html, body {\n        width: 100%;\n    }\n\n    \/* Tables *\/\n    table {\n        position: relative;\n        \/\/display: block;\n        margin: 10px auto;\n        padding: 0;\n        width: 100%;\n        height: auto;\n        border-collapse: collapse;\n        text-align: center;\n    }\n\n    table thead tr {\n        background-color: green;\n        font-weight: bold;\n    }\n\n    table tr {\n        margin: 0;\n        padding: 0;\n        border: 0;\n        border: 1px solid #999;\n        width: 100%;\n    }\n\n    table tr td {\n        margin: 0;\n        padding: 4px 8px;\n        border: 0;\n        border: 1px solid #999;\n        \n    }\n    &lt;\/style&gt;\n    &lt;script type=\"text\/javascript\"&gt;\n\n    $(document).ready(function(){\n        $('#tableID td').each(function(){\n            if ($(this).text() == 'false') {\n                $(this).css('background-color','red');\n            }\n        });\n    });\n\n    &lt;\/script&gt;\n  &lt;\/head&gt;\n  &lt;body&gt;\n    &lt;form action=\"\" method=\"post\" enctype=\"multipart\/form-data\"&gt;\n        &lt;input type=\"file\" name=\"file\"&gt;\n        &lt;button type=\"submit\" name=\"import\"&gt;Import&lt;\/button&gt;\n    &lt;\/form&gt;\n&lt;?php\nDEFINE('VIES_URL', 'http:\/\/ec.europa.eu\/taxation_customs\/vies\/services\/checkVatService');\n\/**\n * VIES VAT number validation\n * Based on http:\/\/stackoverflow.com\/a\/29955950\n *\n * @author Eugen Mihailescu\n *\n * @param string $countryCode\n * @param string $vatNumber\n * @param int $timeout\n *\/\nfunction viesCheckVAT($countryCode, $vatNumber, $timeout = 30) {\n    $response = array();\n    $pattern = '\/&lt;(%s).*?&gt;([\\s\\S]*)&lt;\\\/\\1\/';\n    $keys = array('countryCode', 'vatNumber', 'requestDate', 'valid', 'name', 'address');\n    $content = \"&lt;s11:Envelope xmlns:s11='http:\/\/schemas.xmlsoap.org\/soap\/envelope\/'&gt;\n  &lt;s11:Body&gt;\n    &lt;tns1:checkVat xmlns:tns1='urn:ec.europa.eu:taxud:vies:services:checkVat:types'&gt;\n      &lt;tns1:countryCode&gt;%s&lt;\/tns1:countryCode&gt;\n      &lt;tns1:vatNumber&gt;%s&lt;\/tns1:vatNumber&gt;\n    &lt;\/tns1:checkVat&gt;\n  &lt;\/s11:Body&gt;\n&lt;\/s11:Envelope&gt;\";\n    $opts = array('http' =&gt; array('method' =&gt; 'POST', 'header' =&gt; \"Content-Type: text\/xml; charset=utf-8; SOAPAction: checkVatService\", 'content' =&gt; sprintf($content, $countryCode, $vatNumber), 'timeout' =&gt; $timeout));\n    $ctx = stream_context_create($opts);\n    $result = file_get_contents(VIES_URL, false, $ctx);\n    if (preg_match(sprintf($pattern, 'checkVatResponse'), $result, $matches)) {\n        foreach ($keys as $key) preg_match(sprintf($pattern, $key), $matches[2], $value) &amp;&amp; $response[$key] = $value[2];\n    }\n    return $response;\n}\n\nif (isset($_POST['import'])) {\n    if ((isset($_FILES['file']) &amp;&amp; is_array($_FILES['file']))) {\n        $csv = $_FILES['file'];\n        if (isset($csv['tmp_name']) &amp;&amp; !empty($csv['tmp_name'])) {\n            $finfo = finfo_open(FILEINFO_MIME_TYPE);\n            $mime = finfo_file($finfo, $csv['tmp_name']);\n            finfo_close($finfo);\n            $allowed_mime = array('text\/x-comma-separated-values', 'text\/comma-separated-values', 'application\/octet-stream', 'application\/vnd.ms-excel', 'application\/x-csv', 'text\/x-csv', 'text\/csv', 'application\/csv', 'application\/excel', 'application\/vnd.msexcel', 'text\/plain');\n            if (in_array($mime, $allowed_mime) &amp;&amp; is_uploaded_file($csv['tmp_name'])) {\n                $f = fopen($csv['tmp_name'], 'r');\n                fgetcsv($f);\n                $data = array();\n                while (!feof($f)) {\n                    $data[] = fgetcsv($f, null, ';');\n                }\n                foreach ($data as $array) {\n                    $dati[] = viesCheckVAT($array[0], $array[1]);\n                }\n                if (count($dati) &gt; 0):\n                    $it = 0; ?&gt;\n                &lt;table id=\"tableID\"&gt;\n                  &lt;thead&gt;\n                    &lt;tr&gt;\n                      &lt;th&gt;ID&lt;\/th&gt;\n                      &lt;th&gt;&lt;?php echo implode('&lt;\/th&gt;&lt;th&gt;', array_keys(current($dati))); ?&gt;&lt;\/th&gt;\n                    &lt;\/tr&gt;\n                  &lt;\/thead&gt;\n                  &lt;tbody&gt;\n                &lt;?php foreach ($dati as $row):\n                        array_map('htmlentities', $row); ?&gt;\n                    &lt;tr&gt;\n                      &lt;td&gt;&lt;?php $it++;\n                        echo $it; ?&gt;&lt;\/td&gt;\n                      &lt;td&gt;&lt;?php echo implode('&lt;\/td&gt;&lt;td&gt;', $row); ?&gt;&lt;\/td&gt;\n                    &lt;\/tr&gt;\n                &lt;?php\n                    endforeach; ?&gt;\n                  &lt;\/tbody&gt;\n                &lt;\/table&gt;\n                &lt;?php\n                endif;\n                fclose($f);\n                die;\n            }\n        }\n    }\n}\n?&gt;\n  &lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" style=\"border: 2px solid black;\" src=\"https:\/\/www.drinkits.lv\/wp-content\/uploads\/2020\/04\/vat_check.gif\" alt=\"Test animation\" width=\"1395\" height=\"802\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<a href=\"https:\/\/www.drinkits.lv\/en\/2020\/04\/16\/simple-php-script-for-vies-vat-number-validation\/\" rel=\"bookmark\" title=\"Permalink to Simple PHP script for VIES VAT number validation\"><p>I have created simple VIES VAT number validation script. Script allows to upload previously prepared CSV with countryCode and\u00a0vatNumber\u00a0and creates HTML table with validation results.<\/p>\n<\/a>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[7,8],"tags":[31,74,90,95,97,98,99],"class_list":{"0":"post-516","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-noderigi","7":"category-skripti","8":"tag-csv","9":"tag-php","10":"tag-script","11":"tag-validation","12":"tag-vat-number","13":"tag-vies","14":"tag-vies-vat-number-validation","15":"h-entry","16":"hentry"},"_links":{"self":[{"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/posts\/516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/comments?post=516"}],"version-history":[{"count":0,"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/posts\/516\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/media?parent=516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/categories?post=516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.drinkits.lv\/en\/wp-json\/wp\/v2\/tags?post=516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}