Kom ihåg mig?
Home Menu

Menu


PHP - Regular Expressions - VATIN

Ämnesverktyg Visningsalternativ
Oläst 2007-11-13, 01:00 #1
FredrikMHs avatar
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2004
Inlägg: 1 501
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
FredrikMHs avatar
 
Reg.datum: Apr 2004
Inlägg: 1 501
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)$/
FredrikMH är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-13, 08:31 #2
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
Erhm...

Finns ett SOAP interface på europa.eu...
hnn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-13, 14:52 #3
FredrikMHs avatar
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2004
Inlägg: 1 501
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
FredrikMHs avatar
 
Reg.datum: Apr 2004
Inlägg: 1 501
Citat:
Originally posted by hnn@Nov 13 2007, 08:31
Erhm...

Finns ett SOAP interface på europa.eu...
Ja men det ger ingen lokal validering?

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.
FredrikMH är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-13, 18:43 #4
coredevs avatar
coredev coredev är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Sep 2007
Inlägg: 1 554
coredev coredev är inte uppkopplad
Bara ett inlägg till!
coredevs avatar
 
Reg.datum: Sep 2007
Inlägg: 1 554
Jag håller med dig Fredrik, att man skall validera innan man skickar vidare förfrågan. Ordning och reda...
coredev är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-13, 20:24 #5
najks avatar
najk najk är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Oct 2005
Inlägg: 1 224
najk najk är inte uppkopplad
Har WN som tidsfördriv
najks avatar
 
Reg.datum: Oct 2005
Inlägg: 1 224
Riktigt bra gjort, den här sparar vi till senare =)
najk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-13, 22:53 #6
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
hnn hnn är inte uppkopplad
Banned
 
Reg.datum: Mar 2004
Inlägg: 2 587
Validering: http://ec.europa.eu/taxation_customs/vies/...ctedLanguage=EN

WSDL fil: http://ec.europa.eu/taxation_customs/vies/...eckVatPort?wsdl
hnn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-14, 00:03 #7
FredrikMHs avatar
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
 
Reg.datum: Apr 2004
Inlägg: 1 501
FredrikMH FredrikMH är inte uppkopplad
Supermoderator
FredrikMHs avatar
 
Reg.datum: Apr 2004
Inlägg: 1 501
Valideringen kände jag redan till och hade först tänkt utnyttja mig av den men det finns alltså redan ett api för detta. Tack

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.
FredrikMH är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-11-15, 11:46 #8
Jawns avatar
Jawn Jawn är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Aug 2004
Inlägg: 986
Jawn Jawn är inte uppkopplad
Mycket flitig postare
Jawns avatar
 
Reg.datum: Aug 2004
Inlägg: 986
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"); 
 *
?>
Jawn är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-08-28, 13:08 #9
nicmar nicmar är inte uppkopplad
Nykomling
 
Reg.datum: Aug 2009
Inlägg: 3
nicmar nicmar är inte uppkopplad
Nykomling
 
Reg.datum: Aug 2009
Inlägg: 3
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");
Till:
Kod:
curl_setopt($ch, CURLOPT_POSTFIELDS, "iso=$iso&vat=$vat&ms=$iso");
Dock så verkar EU-hemsidan strula ibland, och under vissa tider så ligger sidan nere för service och underhåll beroende på vilket land det är du kollar. Tydligen så har varje land sin egen server som skickar ut denna informationen.

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
nicmar är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 09:12.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017