Guest post: Fattura Elettronica Open Source per .NET

Questo post è stato scritto da Nicola Iarocci , sviluppatore, esperto di MongoDB e autore di alcuni progetti open source in Python e .NET
Se avete progetti Open Source ben avviati, realizzati in tecnologia Microsoft o in altre tecnologie ma che possono, ad esempio, girare in ambienti Microsoft Azure o locali, segnalateceli!

FatturaElettronicaPA è una raccolta di progetti open source che consentono di lavorare agevolmente in .NET con le Fatture Elettroniche accettate dalla Pubblica Amministrazione. I progetti sono in C# e aperti alla collaborazione di tutti: il codice è su GitHub e la licenza è BSD. I corrispondenti package sono disponibili su NuGet, per la maggior parte come Portable Class Library compatibili con .NET Framework 4.0 o superiori, Windows Store, Windows Phone 8, Xamarin.iOS e Android oltre che Silverlight. Queste librerie sono già usate in produzione da diverse realtà.

Perché la Fattura Elettronica Open Source?

Sotto l'impulso delle recenti regolamentazioni in materia di fatturazione alla Pubblica Amministrazione, nel nostro paese l’adozione di massa delle fatture elettroniche è in pieno svolgimento. Dopo una prima fase in cui solo Ministeri, Agenzie fiscali, scuole ed enti di previdenza erano tenuti a non accettare più fatture emesse o trasmesse in forma cartacea, a partire dallo scorso marzo anche i rimanenti Enti Nazionali e amministrazioni locali sono obbligati ad accettare solo fatture elettroniche. Il risultato è che oggi chiunque fattura alla Pubblica Amministrazione lo fa esclusivamente in via elettronica.

Non credo di sbagliare azzardando l'ipotesi di un futuro non troppo remoto in cui il formato SdI (Sistema di Interscambio della Pubblica Amministrazione, in pratica un XML con ferree regole di convalida) verrà adottato, vuoi per imposizione (probabile) vuoi per comodità, anche dal settore privato, diventando di fatto lo standard di riferimento in Italia. Sono evidenti i vantaggi di ordine pratico, economico e fiscale nell'adozione di un sistema standard di scambio dei documenti di vendita. D'altra parte già ci sono state in questo senso dichiarazioni significative da parte degli organi di governo.

Come tutti coloro che si occupano di software gestionali anche noi di Amica 10 ci siamo trovati a dover implementare il supporto per la fatturazione elettronica per i nostri utenti che lavorano con la PA, in massima parte piccole, medie e micro aziende. Abbiamo pensato che questa fosse una buona occasione per rendere libero il nostro lavoro sulla fatturazione elettronia così che chiunque possa trarne vantaggio ed eventualmente prendere parte al progetto.

I progetti Fattura Elettronica

Vediamo rapidamente quali sono i progetti attualmente disponibili:

· FatturaElettronicaPA

· FatturaElettronica.WebServices

· FatturaElettronica.Forms

La Fattura Elettronica vera e propria

FatturaElettronicaPA è il cuore dell'intero progetto Fattura Elettronica. Si occupa essenzialmente di fare tre cose: serializzazione e deserializzatione di un oggetto FatturaElettronicaPA nel formato standard SdI v1.1 e convalida dell'oggetto stesso in osservanza delle specifiche tecniche ufficiali. E' inoltre possible serializzare l'oggetto in formato JSON (la deserializzazione JSON è già nei piani).

Vediamo in pratica come usare un oggetto FatturaElettronicaPA.

// instanzia una nuova fattura elettronica

var fattura = new FatturaElettronica();

// lettura da file XML compatibile con formato SDI1.1

var s = new XmlReaderSettings {IgnoreWhitespace = true};

var r = XmlReader.Create("IT01234567890_11111.xml", s);

fattura.ReadXml(r);

// convalida del documento

if (!fattura.IsValid) {

Debug.WriteLine(fattura.Error);

}

// serializzazione JSON

var json = fattura.ToJson(JsonOptions.Indented);

Debug.WriteLine(json);

// modifica di una proprietà fattura.FatturaElettronicaHeader.CedentePrestatore.DatiAnagrafici.RegimeFiscale = "RF11";

// serializzazione XML secondo lo standard SDI 1.1

var s = new XmlWriterSettings { Indent = true };

XmlWriter w;

using (w = XmlWriter.Create("IT01234567890_11111.xml", s)) {

fattura.WriteXml(w);

}

Il package è su NuGet in forma di Portable Class Library, quindi l'installazione è semplice:

PM> Install-Package FatturaElettronicaPA.WebServices

dalla Package Console, oppure usare il comando equivalente in Visual Studio, Xamarin Studio oppure MonoDevelop.

Interrogare i Web Service della Pubblica Amministrazione
Il namespace

FatturaElettronicaPA.WebServices raccoglie i client che consentono di consultare i Web Service messi a disposizione dalla Pubblica Amministrazione e dedicati alla Fatturazione Elettronica.

I client sono disegnati in maniera da esporre tutti la stessa interfaccia ed essere semplici da usare e leggeri. Al momento lavorano in modalità sincrona ma l'obiettivo è di renderli tutti asincroni (l'implementazione è fatta via HttpClient).

Per l'utilizzo dei Web Services è necessario richiedere una specifica autorizzazione alla PA. E’ gratuita e il rilascio è immediato, ma bisogna compilare un apposito questionario.

Un esempio pratico è CodiceFiscaleWebService che, dato il codice fiscale di un ufficio della PA, consente di estrarre informazioni su tutti gli uffici destinatari di Fatturazione Elettronica ad esso associati:

// instanzia il client per il web service

var cfWebService = new CodiceFiscaleWebService {

AuthId = "<auth Id>",

CodiceFiscale = "00354730392”

};

// effettua una richiesta sincrona

cfWebService.PerformRequest ();

if (cfWebService.Uffici == null)

return;

// "Comune di Ravenna"

Console.WriteLine (cfWebService.Uffici [0].Denominazione);

In tutto sono disponibili sette client, uno per ogni web service della PA. Anche WebServices è su NuGet come PCL quindi l'installazione è semplice:

PM> Install-Package FatturaElettronicaPA.WebServices

dalla Package Console, oppure potete usare il comando equivalente in Visual Studio, Xamarin Studio o MonoDevelop.

Una interfaccia Desktop

FatturaElettronicaPA.Forms è una libreria WinForms che offre una UI per l’editing (via data binding) e la convalida delle fatture. Al momento supporta l’intestazione della fattura (FatturaElettronicaHeader):

clip_image001

E' volutamente semplice graficamente, in maniera da potersi adattare agli usi più disparati. Tenete presente che al momento Forms non dispone di un package NuGet, quindi dovrete importare il progetto nella vostra soluzione oppure compilarlo e includerlo tra le vostre dipendenze.

Il pistolotto finale

Il software è migliore quando è condiviso. Noi l'abbiamo vissuto sulla nostra pelle con altri progetti internazionali e pensiamo sia il momento di dare il nostro contributo anche in Italia favorendo, anche e soprattutto nell'ingessato ambiente business, l'adozione e la diffusione dell’Open Source.

Se vi piace questo progetto o lo trovate utile non esitate a dare una mano. Già qualcuno ha cominciato, aprendo ticket o contribuendo al codice. Se non siete pratici, meglio! Sarà l'occasione giusta per imparare cose nuove. Mettetevi in contatto e vi fornirò le dritte necessarie per cominciare a lavorare con git, GitHub e quant'altro.

A presto!

Nicola