Guida all'uso
Sono supportate sie fatture ordinarie che seplificate. Qui
viene usata una FatturaOrdinaria
, ma gli esempi sono validi quasi sempre
anche per una instanza di FatturaSemplificata
.
Instanziare la fattura
var fattura = new FatturaOrdinaria();
// In alternativa usare CreateInstance() per ottenere una istanza già tipizzata.
// Questa chiamata restituisce fattura con CodiceDestinatario = "0000000"
// FormatoTrasmissione = "FPR12":
fattura = FatturaOrdinaria.CreateInstance(Instance.Privati);
Caricare la fattura da XML
// Lettura da file XML
var readerSettings = new XmlReaderSettings
{
IgnoreWhitespace = true,
IgnoreComments = true,
IgnoreProcessingInstructions = true
};
using (var r = XmlReader.Create("IT01234567890_12345.xml", readerSettings))
{
fattura.ReadXml(r);
}
In alternativa CreateInstanceFromXml
restituisce una istanza di FatturaOrdinaria
o FatturaSemplificata
a seconda dei contenuti del file:
using var stream = new FileStream("IT02182030391_31.xml.p7m", FileMode.Open, FileAccess.Read);
var fattura = FatturaBase.CreateInstanceFromXml(stream);
Console.WriteLine(fattura.GetFormatoTrasmissione());
// "FSM10"
CreateInstanceFromXml
supporta sia file XML puri (.xml) che firmati digitalmente (.p7m), eventualmente anche
codificati Base64. Questa comodità ha un costo, ovvero un leggero impatto sulle prestazioni in quanto è necessaria
una pre-scasione dello stream per determinarne il formato e la tipologia di fattura.
Consultare la fattura
// Ogni file di fattura contiene un array di elementi FatturaElettronicaBody.
Console.WriteLine($"Numero documenti: {fattura.FatturaElettronicaBody.Count}.");
// Iterazione documenti presenti nel file.
Console.WriteLine("Documenti inclusi nel file FatturaPA:");
foreach (var doc in fattura.FatturaElettronicaBody)
{
var datiDocumento = doc.DatiGenerali.DatiGeneraliDocumento;
Console.WriteLine($"Numero: {datiDocumento.Numero}");
Console.WriteLine($"Data: {datiDocumento.Data.ToShortDateString()}");
Console.WriteLine($"Importo totale: {datiDocumento.ImportoTotaleDocumento}");
Console.WriteLine();
}
Convalidare la fattura
// Convalida del documento.
var validator = new FatturaOrdinariaValidator();
var result = validator.Validate(fattura);
Console.WriteLine(result.IsValid);
// Introspezione errori di convalida.
foreach (var error in result.Errors)
{
Console.WriteLine(error.PropertyName);
Console.WriteLine(error.ErrorMessage);
// ErrorCode conterrà il codice errore (es: "00423").
Console.WriteLine(error.ErrorCode);
}
// Per brevità è possibile usare un extension method.
result = fattura.Validate();
Console.WriteLine(result.IsValid);
// Sono disponibili validatori per ogni classe esposta da FatturaElettronica.
var anagrafica = new DatiAnagraficiCedentePrestatore();
var anagraficaValidator = new DatiAnagraficiCedentePrestatoreValidator();
Console.WriteLine(anagraficaValidator.Validate(anagrafica).IsValid);
// Oppure, come già visto:
Console.WriteLine(anagrafica.Validate().IsValid);
Modificare e aggiungere elementi alla fattura
// Modifica proprietà Header.
var header = fattura.FatturaElettronicaHeader;
header.CedentePrestatore.DatiAnagrafici.Anagrafica.Denominazione = "Bianchi Srl";
// Modifica proprietà Body
var body = fattura.FatturaElettronicaBody[0];
body.DatiGenerali.DatiGeneraliDocumento.Numero = "12345";
// Aggiunta di un nuovo elemento Body.
body = new FatturaElettronicaBody();
body.DatiGenerali.DatiGeneraliDocumento.Numero = "99";
fattura.FatturaElettronicaBody.Add(body);
Salvare la fattura su XML
// Serializzazione XML
var writerSettings = new XmlWriterSettings { Indent = true };
using (var w = XmlWriter.Create("IT01234567890_FPA01.xml", writerSettings))
{
fattura.WriteXml(w);
}
Scrittura e lettura da JSON
// Serializzazione JSON.
var json = fattura.ToJson(JsonOptions.Indented);
Console.WriteLine(json);
// Deserializzazione da JSON.
var fatturaFromJson = new FatturaOrdinaria();
fatturaFromJson.FromJson(new JsonTextReader(new StringReader(json)));
Esempio completo
using FatturaElettronica.Ordinaria;
using FatturaElettronica.Common;
using FatturaElettronica.Defaults;
using FatturaElettronica.Validators;
using FatturaElettronica.Ordinaria.FatturaElettronicaBody;
using FatturaElettronica.Ordinaria.FatturaElettronicaHeader.CedentePrestatore;
using System;
using System.Xml;
using System.IO;
using Newtonsoft.Json;
using FatturaElettronica;
namespace DemoApp
{
class Program
{
static void Main(string[] args)
{
var fattura = new FatturaOrdinaria();
// In alternativa usare CreateInstance() per ottenere una istanza già tipizzata.
// Questa chiamata restituisce fattura con CodiceDestinatario = "0000000"
// FormatoTrasmissione = "FPR12":
fattura = FatturaOrdinaria.CreateInstance(Instance.Privati);
// Lettura da file XML
var readerSettings = new XmlReaderSettings
{
IgnoreWhitespace = true,
IgnoreComments = true,
IgnoreProcessingInstructions = true
};
using (var r = XmlReader.Create("IT01234567890_12345.xml", readerSettings))
{
fattura.ReadXml(r);
}
// Ogni file di fattura contiene un array di elementi FatturaElettronicaBody.
Console.WriteLine($"Numero documenti: {fattura.FatturaElettronicaBody.Count}.");
// Iterazione documenti presenti nel file.
Console.WriteLine("Documenti inclusi nel file FatturaPA:");
foreach (var doc in fattura.FatturaElettronicaBody)
{
var datiDocumento = doc.DatiGenerali.DatiGeneraliDocumento;
Console.WriteLine($"Numero: {datiDocumento.Numero}");
Console.WriteLine($"Data: {datiDocumento.Data.ToShortDateString()}");
Console.WriteLine($"Importo totale: {datiDocumento.ImportoTotaleDocumento}");
Console.WriteLine();
}
// Convalida del documento.
var validator = new FatturaOrdinariaValidator();
var result = validator.Validate(fattura);
Console.WriteLine(result.IsValid);
// Introspezione errori di convalida.
foreach (var error in result.Errors)
{
Console.WriteLine(error.PropertyName);
Console.WriteLine(error.ErrorMessage);
// ErrorCode conterrà il codice errore (es: "00423").
Console.WriteLine(error.ErrorCode);
}
// Per brevità è possibile usare un extension method.
result = fattura.Validate();
Console.WriteLine(result.IsValid);
// Sono disponibili validatori per ogni classe esposta da FatturaElettronica.
var anagrafica = new DatiAnagraficiCedentePrestatore();
var anagraficaValidator = new DatiAnagraficiCedentePrestatoreValidator();
Console.WriteLine(anagraficaValidator.Validate(anagrafica).IsValid);
// Oppure, come già visto:
Console.WriteLine(anagrafica.Validate().IsValid);
// Modifica proprietà Header.
var header = fattura.FatturaElettronicaHeader;
header.CedentePrestatore.DatiAnagrafici.Anagrafica.Denominazione = "Bianchi Srl";
// Modifica proprietà Body
var body = fattura.FatturaElettronicaBody[0];
body.DatiGenerali.DatiGeneraliDocumento.Numero = "12345";
// Aggiunta di un nuovo elemento Body.
body = new FatturaElettronicaBody();
body.DatiGenerali.DatiGeneraliDocumento.Numero = "99";
fattura.FatturaElettronicaBody.Add(body);
// Serializzazione XML
var writerSettings = new XmlWriterSettings { Indent = true };
using (var w = XmlWriter.Create("IT01234567890_FPA01.xml", writerSettings))
{
fattura.WriteXml(w);
}
// Serializzazione JSON.
var json = fattura.ToJson(JsonOptions.Indented);
Console.WriteLine(json);
// Deserializzazione da JSON.
var fatturaFromJson = new FatturaOrdinaria();
fatturaFromJson.FromJson(new JsonTextReader(new StringReader(json)));
}
}
}
Limitazioni
In convalida non sono supportati gli errori di tipo 3xx
in quanto risultato dei riscontri fatti da PA sui propri server.