Consumiamo i servizi dell’Agenzia delle Entrate: Partite IVA Comunitarie

Spesso le aziende che sono alla ricerca di possibili clienti[1] utilizzano una serie di sofisticati strumenti informatici con la finalità di attirare "le prede" verso la propria rete. Uno degli strumenti utili alla "certificazione" della preda (una volta entrata nella rete) è il controllo dei dati, uno di questi dati è la Partita IVA.

Esistono diversi strumenti commerciali[2] che consentono l'accesso a un vero e proprio dossier del possibile cliente partendo dalla conoscenza della sola Partiva IVA, la quantità e qualità delle informazioni disponibili sul dossier dipende dalla mole di denaro investito sullo strumento.

Questo post è destinato a chi non ha intenzione di usare questi "costosi strumenti" ma magari ha solo la necessità di verificare che la Partita IVA (acquisita per esempio, da una form di registrazione del proprio portale internet) fornita loro sia:

  • Formalmente corretta
  • Attribuita a un'attività (con indicazione di data inizio e fine attività)
  • Non attribuita a un'attività

Nel nostro paese l'unico ente autorizzato a rilasciare la Partita IVA e certificarne la correttezza formale (attraverso un opportuno algoritmo[3]) è l'Agenzia delle Entrate[4]. L'ente mette a disposizione sul proprio portale internet un servizio che prende il nome di: Partite IVA comunitarie - Sistema elettronico di scambio dati sull'IVA, questo servizio consente di ottenere le informazioni indicate in precedenza. Il servizio è orientato "all'umano", in altre parole, si tratta di una semplice form dove occorre indicare il paese comunitario e il numero di Partita IVA. Il metodo di accesso al servizio può andare bene nei casi in cui i controlli da fare sono irrisori e comunque non è necessario integrare i dati ottenuti su di un altro sistema ma magari solo su di un semplice foglio elettronico.

All'indirizzo http://www.agenziaentrate.it/ilwwcm/connect/Nsi/Servizi/Partite+IVA+comunitarie/ troverete le senguenti indicazioni:

  • Guida al servizio
  • F.A.Q. - Frequently Asked Questions

Una delle FAQ recita quanto segue:

Q: È possibile connettersi in maniera automatica al servizio Partite IVA comunitarie?

R: Il servizio "Partite IVA comunitario" è strutturato in modo da fornire una risposta ad un singola richiesta di verifica di un numero identificativo IVA. Tale richiesta deve essere inoltrata esclusivamente mediante l'inserimento manuale del codice IVA da controllare. Ogni altro tentativo di connessione al sistema è vietato. Tuttavia si fa presente che la Commissione europea ha predisposto sul proprio sito un servizio SOAP mediante il quale è possibile ottenere l'informazione sulla validità di un numero identificativo IVA. La descrizione dell'interfaccia pubblica e la modalità di interazione al servizio è descritta nel documento WSDL.

Viste le restrizioni imposte dall'Agenzia delle Entrate, "diciamo" che lo scopo dell'articolo ha un obiettivo prettamente didattico. Desidero  inoltre evidenziare  che la parte sottolineata della risposta alla FAQ si riferisce a un servizio SOAP non esistente o spostato da altra parte.

Cerchiamo di trovare una semplice soluzione al seguente quesito: Supponiamo di avere la necessità di certificare una serie di potenziali clienti, questi ultimi residenti su un vostro sistema di Gestione Clienti (come potrebbe per esempio, essere un CRM[5]) in modo del tutto automatico utilizzando il servizio messo a disposizione dall'Agenzia delle Entrate.

Una soluzione semplice e a costo zero esiste, servono solo tre "ingredienti":

  • Curl[6] : E' responsabile della richiesta del servizio verso l'Agenzia delle Entrate e della restituzione della risposta;
  • PHP : E' responsabile dell'acquisizione della risposta del servizio, risposta fornita attraverso Curl;
  • Regular Expression[7] : E' responsabile dell'elaborazione della risposta del servizio con lo scopo di estrarre le informazioni di nostro interesse

Il servizio dell'Agenzia delle Entrate è disponibile su protocollo HTTP/1.1 e i parametri del servizio sono illustrati in Tabella 1.

Tabella 1. Parametri HTTP del servizio Partita IVA Agenzia delle Entrate

Protocollo Indirizzo
HTTP/1.1 www1.agenziaentrate.it/servizi/vies/vies.htm
Metodo HTTP GET
Parametri
Nome Descrizione Valore
act Tipo di servizio Predefinito a piva
stato Codice dello stato comunitario Esempio IT
piva Numero di Partita IVA 02069411003

La lista completa degli stati comunitari è pubblicata sulla pagina del servizio. Un esempio di chiamata al servizio utilizzando Curl potrebbe essere come quella illustrata di seguito (per ragioni di spazio sono stati soppressi alcuni parametri non indispensabili e mandato a capo parte dell'indirizzo):

curl "http://www1.agenziaentrate.it/servizi/
      vies/vies.htm?act=piva&stato=IT&piva=00990131005"

Il comando Curl restituisce sullo stdout (standard output, quindi sullo schermo) il risultato del controllo effettuato per la Partita IVA indicata, il risultato è semplicemente codice HTML, riporto un breve estratto:

Listato 1. Risultato (HTML) del servizio a fronte della richiesta tramite Curl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="it">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
...
<title>Agenzia Entrate - Partite IVA comunitarie</title>
<div id="vies_boxr2">
<p>OPERATORE IVA ESISTENTE           </p>
</div>
<div id="vies_boxr3">
<table summary="Dettaglio della partita IVA">
<tr> <th>Partita IVA:</th>
<td><strong>00990131005</strong></td> ...

Il risultato così ottenuto sarà passato come input a un semplice script PHP che in breve è responsabile di:

  • Leggere dallo stdin (standard input, ovverro, dal flusso ricevuto da Curl);
  • Applicare una serie di espressioni regolari (termine abbreviato in Regex) a blocchi di codice HTML al fine di estrarre le informazioni di nostro interesse;
  • Costruire la risposta per essere elaborata in modo automatico. La risposta è un semplice documento XML

Al Listato 2 sono mostrate le linee di codice più rilevanti.

Listato 2. Linee di codice PHP responsabili del reading e parsing della risposta HTML e build dell'XML

// Read from Standard Input $subject = file_get_contents("php://stdin");
...
// Start parsing HTML receive from Agenzia Entrate
// 1. Match contenuto informativo d'interesse compreso tra i tag HTML <div>
// 2. Match esito della verifica
// 3. Match Denominazione
// 4. Match Indirizzo
// 5. Match Data Inizio attivita'
// 6. Match Data Fine attivita'
preg_match_all("/<divb id="vies_boxr[2,3][^>]*>(?:(?>[^<]+)| <(?!divb[^>]*>))*?</div>/",
               $subject, $matches); 

preg_match("/<p class="vies_(ok|er)">([A-Z,s]+)</p>/",
           $matches[0][0], $matches_esito); 

preg_match("/.+Denominazione:.+s*<td>(.+)</td>/",
           $matches[0][1], $matches_detail_a); 

preg_match("/.+Indirizzo:.+s*<td>(.+)</td>/",
           $matches[0][1], $matches_detail_b); 

preg_match("/.+Data di inizio.+s*<td>(.+)</td>/",
           $matches[0][1], $matches_detail_c); 

preg_match("/.+Data di fine.+s*<td>(.+)</td>/",
           $matches[0][1], $matches_detail_d); ... 

// New XML Object $xml_result = '<?xml version = "1.0" encoding = "UTF-8"?><Results></Results>';
$xml_piva = new SimpleXMLElement($xml_result);
$child_ResultPIVA = $xml_piva->addChild("items");
$child_ResultPIVA->addAttribute("Response", $matches_esito[1] === "ok" ? "OK" : "ERROR");
$child_ResultPIVA->addAttribute("Description", trim($matches_esito[2]));
$child_ResultPIVA->addAttribute("Denominazione", $matches_detail_a[1]);
$child_ResultPIVA->addAttribute("Indirizzo", $matches_detail_b[1]);
$child_ResultPIVA->addAttribute("DataInizioAttivita", $matches_detail_c[1]);
$child_ResultPIVA->addAttribute("DataFineAttivita", $matches_detail_d[1]); 

// Send XML echo $xml_piva->asXML();

A ogni blocco di unità informativa ho preferito associare una propria Regex per questioni puramente didattiche e di pulizia, è possibile utilizzare una sola Regex che soddisfi l'intero problema. Il semplice documento XML è construito utilizzando l'oggetto SimpleXML di PHP, al Listato 3 un esempio del documento XML ottenuto a fronte di una richiesta.

Listato 3. Due esempi di documento XML ottenuti.

<?xml version="1.0" encoding="UTF-8"?>
<Results>
     <items Response="OK" Description="OPERATORE IVA ESISTENTE"
            Denominazione="N.D." Indirizzo="N.D."
            DataInizioAttivita="01/01/1989" DataFineAttivita="---"/>
</Results> 

<?xml version="1.0" encoding="UTF-8"?>
<Results>
      <items Response="ERROR" Description="CODICE IVA FORMALMENTE ERRATO"
             Denominazione="---" Indirizzo="---"
             DataInizioAttivita="---" DataFineAttivita="---"/>
</Results>

Il comando per ottenere i nostri documenti XML potrebbe essere del tipo (per ragioni di spazio ho dovuto mettere qualche ritorno a capo):

curl --user-agent "Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.1.7)
                   Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
     "http://www1.agenziaentrate.it/servizi/
      vies/vies.htm? act=piva&stato=IT&piva=02069411004"
     | php CheckPartitaIVA_AgenziaEntrate.php

La soluzione del problema porta a un semplice documento XML, in altre parole, sono applicabili tutte le possibili integrazioni. Vi lascio con un semplice pensiero: Perchè non trasformare la soluzione del problema sottoforma di un Web Service {y = f(g(x))} ?


[1] A sales lead is the identity of a human or entity potentially interested in purchasing a product or service, and represents the first stage of a sales process.

[2] Vedi i servizi offerti da Infocamere, Cerved e altri operatori abilitati ad offrire questo genere di servizi

[3] La partita IVA è una sequenza di cifre che identifica univocamente un soggetto che esercita un'attività rilevante ai fini dell'imposizione fiscale. Vedi http://it.wikipedia.org/wiki/Partita_IVA

[4] Questo servizio consente agli operatori commerciali titolari di una partita IVA che effettuano cessioni intracomunitarie o altre operazioni legate alle propria attività, di verificare la validità del numero di identificazione IVA dei loro clienti, attraverso il collegamento con i sistemi fiscali degli Stati membri dell'Unione Europea. Vedi http://www1.agenziaentrate.it/servizi/vies/vies.htm?act=default&piva=&stato=IT#app

[5] Customer relationship management is a broadly recognized, widely-implemented strategy for managing and nurturing a company’s interactions with customers and sales prospects. Vedi http://en.wikipedia.org/wiki/Customer_relationship_management

[6] Curl is a command line tool for transferring data with URL syntax, supporting FTP ... Curl supports HTTPS certificates, HTTP POST, HTTP PUT. Vedi http://curl.haxx.se/

[7] In computing, regular expressions, also referred to as regex or regexp, provide a concise and flexible means for matching strings of text, such as particular characters, words, or patterns of characters. Vedi http://en.wikipedia.org/wiki/Regular_expression

Antonio Musarra

I began my journey into the world of computing from an Olivetti M24 PC (http://it.wikipedia.org/wiki/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until … Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.

You may also like...