FAQ |
Kalender |
2007-11-13, 01:00 | #1 | |||
|
||||
Supermoderator
|
Har roat mig ikväll med att undersöka hur de olika medlemsländernas momsregistreringsnummer ser ut, även kallat VATIN (Value Added Tax Identification Number) för att sedan skapa regular expressions för att kunna kontrollera om ett inmatat VATIN är korrekt eller ej. En lista över utformningen av momsregistreringsnummer för respektive medlemsland hittade jag på EUs hemsida och dessa regex bygger på dessa och förutsätter att dessa är korrekta.
Jag har inte testat alla och en del går kanske att korta ner något men för mig är det av mindre betydelse att ha optimerade regex. För vissa länder ställer kanske dessa regex för stora krav på användaren när han fyller i informationen. Exempelvis har vissa länder så som Storbritannien och Danmark uppdelade block av siffror och regex förutsätter att mellanslagen är på med och på rätt ställe. Oavsett så hoppas jag att detta kan vara till nytta för någon. Själv ska jag använda detta som en första validering innan jag skickar en förfrågan till EUs script för att kontrollera om VATIN verkligen existerar. Listan: Austria = /^ATU[0-9]{8}$/ Belgium = /^BE[0]{0,1}[0-9]{9}$/ Bulgaria = /^BG[0-9]{9,10}$/ Cyprus = /^CY[0-9]{8}[a-zA-Z]{1}$/ Czech Republic = /^CZ[0-9]{8,10}$/ Denmark = /^DK\d\d \d\d \d\d \d\d$/ Estonia = /^EE[0-9]{9}$/ Finland = /^FI[0-9]{8}$/ France = /^FR[a-zA-Z0-9]{2} [0-9]{9}$/ Germany = /^DE[0-9]{9}$/ Greece = /^EL[0-9]{9}$/ Hungary = /^HU[0-9]{8}$/ Ireland = /^IE\d[a-zA-Z0-9+*][0-9]{5}[a-zA-Z]$/ Italy = /^IT[0-9]{11}$/ Latvia = /^LV[0-9]{11}$/ Lithuania = /^LT([0-9]{9}|[0-9]{12})$/ Luxembourg = /^LU[0-9]{8}$/ Malta = /^MT[0-9]{8}$/ Netherlands = /^NL[0-9]{9}B\d\d$/ Poland = /^PL[0-9]{10}$/ Portugal = /^PT[0-9]{9}$/ Romania = /^RO[0-9]{2,10}$/ Slovakia = /^SK[0-9]{10}$/ Slovenia = /^SI[0-9]{8}$/ Spain = /^ES[a-zA-Z0-9][0-9]{7}[a-zA-Z0-9]$/ Sweden = /^SE[0-9]{12}$/ United Kingdom = /^GB(\d\d\d \d\d\d\d \d\d|\d\d\d \d\d\d\d \d\d \d\d\d|(GD|HA)\d\d\d)$/ |
|||
Svara med citat |
2007-11-13, 08:31 | #2 | ||
|
|||
Banned
|
Erhm...
Finns ett SOAP interface på europa.eu... |
||
Svara med citat |
2007-11-13, 14:52 | #3 | |||
|
||||
Supermoderator
|
Citat:
Jag letade igår på sidan om de hade en färdig webservice men hittade ingenting, och hittar fortfarande ingenting på europa.eu. En mer förvirrande sida att surfa på har jag inte besökt på länge. |
|||
Svara med citat |
2007-11-13, 18:43 | #4 | |||
|
||||
Bara ett inlägg till!
|
Jag håller med dig Fredrik, att man skall validera innan man skickar vidare förfrågan. Ordning och reda...
|
|||
Svara med citat |
2007-11-13, 20:24 | #5 | |||
|
||||
Har WN som tidsfördriv
|
Riktigt bra gjort, den här sparar vi till senare =)
|
|||
Svara med citat |
2007-11-13, 22:53 | #6 | ||
|
|||
Banned
|
|||
Svara med citat |
2007-11-14, 00:03 | #7 | |||
|
||||
Supermoderator
|
Citat:
Hur som helst så verkar det vara problem att göra detta live för användaren då det finns massor med tänkbara fel som går att läsa om här. Så jag kommer köra detta i efterhand och i värsta fall flagga om ett VATIN inte gick igenom så får man ta detta manuellt i efterhand. |
|||
Svara med citat |
2007-11-15, 11:46 | #8 | |||
|
||||
Mycket flitig postare
|
För den som vill kolla automatiskt mot taxation centret.
Tänk dock på att vissa utländska databaser ligger nere vissa tider på dygnet vilket innebär att man inte kan kanske kolla om ett VATnummer är korrekt eller inte. Enjoy Kod:
<?php * function vatcheck($input) { // Administrator email $email = "[email protected]"; $headers = "From: $email\r\n"; * $iso = substr($input,0,2); $vat = substr($input,2); * * * // Vi använder CURL, postar vidare vissa fields $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://ec.europa.eu/taxation_customs/vies/viesquer.do"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "iso=$iso&vat=$vat"); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec ($ch); curl_close($ch); if(strpos($res, "Yes, valid VAT number")) { *$sql = ""; *while(eregi("<font face=\"Verdana\" size=\"2\">([^<]*)</font>", $res, $match)) *{ * $res = substr($res, strpos($res, $match[1])); * $match[1] = trim(str_replace("(dd/mm/yyyy)", "", $match[1])); * * * * * * * if($match[1] != "VAT number" AND $match[1] != "Member State" AND $match[1] != "Name" AND $match[1] != "Address" AND $match[1] != "Date when request received") $sql .= "'".$match[1]."',"; *} * * * * *// Vi sparar ner vatnummer informationen ner i en databas *if($sql) mysql_query("INSERT INTO table VALUES(".substr($sql,0,-1).")"); * *else * // Möjligt fel har inträffat * mail($email, "Script error", "There's a problem with the VAT checking function.", $headers); * * * *return "Yes, valid VAT number ".substr($sql,0,-1).""; } elseif(strpos($res, "No, invalid VAT number")) { *return "No, invalid VAT number"; } else { // Möjligt fel har inträffat *mail($email, "Script error", "There's a problem with the VAT checking function.", $headers); *return 0; } } * Print vatcheck("SE202100284101"); * ?> |
|||
Svara med citat |
2009-08-28, 13:08 | #9 | ||
|
|||
Nykomling
|
Tack Jawn för scriptet!
Tyvärr har det nu efter 2 år har slutat funka, men det fixar man lätt med en liten justering. Sidan kräver nu att man skickar in parametern MS som är samma som ISO. Så ändra raden som ser ut så här: Kod:
curl_setopt($ch, CURLOPT_POSTFIELDS, "iso=$iso&vat=$vat"); Kod:
curl_setopt($ch, CURLOPT_POSTFIELDS, "iso=$iso&vat=$vat&ms=$iso"); För att göra det lite smidigare så kan man kontrollera om numret är matematiskt korrekt med Javascript först innan man skickar det vidare. Ett bra script finns här: http://www.braemoor.co.uk/software/vat.shtml Skriv gärna kommentarer på hur ni använder VAT-check, och hoppas detta hjälpte någon! Senast redigerad av nicmar den 2009-08-28 klockan 14:39 |
||
Svara med citat |
Svara |
|
|