Skip to content

Commit

Permalink
Specifiche tecniche del formato fatturaPA 1.3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Domenico Ciavarella committed Mar 30, 2020
1 parent d25ba2f commit 2396efa
Show file tree
Hide file tree
Showing 33 changed files with 42,365 additions and 6,647 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -214,3 +214,4 @@ FakesAssemblies/
GeneratedArtifacts/
_Pvt_Extensions/
ModelManifest.xml
/.cr/personal
104 changes: 61 additions & 43 deletions FatturaElettronica.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
// </copyright>
// <author>Nicogis</author>
//-----------------------------------------------------------------------
using System;

namespace FatturazioneElettronica
{
using System.Collections.Generic;
Expand All @@ -19,19 +21,6 @@ namespace FatturazioneElettronica
/// </summary>
public static class FatturaElettronica
{
/// <summary>
/// crea il file XML della fattura senza style
/// </summary>
/// <param name="fatturaElettronicaType">oggetto fattura</param>
/// <param name="pathFileName">percorso e nome file di output</param>
/// <returns>true se la creazione è andata a buon termine altrimenti rigetta l'errore</returns>
/// <example>
/// fatturaElettronicaType.CreateXML("c:\temp\IT01234567890_FPA01.xml");
/// </example>
public static bool CreateXML(this FatturaElettronicaType fatturaElettronicaType, string pathFileName)
{
return FatturaElettronica.CreateXML(fatturaElettronicaType, pathFileName, false);
}

/// <summary>
/// crea il file XML della fattura
Expand All @@ -41,41 +30,36 @@ public static bool CreateXML(this FatturaElettronicaType fatturaElettronicaType,
/// <param name="useStyle">usa lo style per visualizzare la fattura</param>
/// <returns>true se la creazione è andata a buon termine altrimenti rigetta l'errore</returns>
/// <example>
/// fatturaElettronicaType.CreateXML("c:\temp\IT01234567890_FPA01.xml", false);
/// fatturaElettronicaType.CreateXML("c:\temp\IT01234567890_FPA01.xml");
///
/// // generazione file per la visualizzazione con stile
/// fatturaElettronicaType.CreateXML("c:\temp\preview.xml", true);
/// </example>
public static bool CreateXML(this FatturaElettronicaType fatturaElettronicaType, string pathFileName, bool useStyle)
public static bool CreateXML(this IFatturaElettronicaType fatturaElettronicaType, string pathFileName, bool useStyle = false)
{
try
{
XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces();

xmlSerializerNamespaces.Add("xsi", FatturaElettronicaReferences.XsiNamespace);
xmlSerializerNamespaces.Add("p", FatturaElettronicaReferences.PNamespace);
xmlSerializerNamespaces.Add("ds", FatturaElettronicaReferences.DsNamespace);
xmlSerializerNamespaces.Add(FatturaElettronicaReferences.prefixSchema, FatturaElettronicaReferences.XsiNamespace);
xmlSerializerNamespaces.Add(FatturaElettronicaReferences.prefixNamespace, fatturaElettronicaType.Namespace);
xmlSerializerNamespaces.Add(FatturaElettronicaReferences.prefixDigitalSignatures, fatturaElettronicaType.DsNamespace);

XmlSerializer xmlSerializer = new XmlSerializer(typeof(FatturaElettronicaType));
XmlSerializer xmlSerializer = new XmlSerializer(fatturaElettronicaType.GetType());

using (TextWriter textWriter = new StreamWriter(pathFileName))
{
if (useStyle)
{
string styleFile = null;
if (fatturaElettronicaType.versione == FormatoTrasmissioneType.FPA12)
{
styleFile = FatturaElettronicaReferences.FileNameStylePA;
}
else if (fatturaElettronicaType.versione == FormatoTrasmissioneType.FPR12)
{
styleFile = FatturaElettronicaReferences.FileNameStyleOrdinaria;
}
string styleFile = fatturaElettronicaType.FileStyle;

string pathFileStyle = Path.Combine(Path.GetDirectoryName(pathFileName), styleFile);
if (!File.Exists(pathFileStyle))
{
using (FileStream f = File.Create(pathFileStyle))
{
Assembly.GetExecutingAssembly().GetManifestResourceStream($"{typeof(FatturaElettronica).Namespace}.{styleFile}").CopyTo(f);
}
}
}

using (XmlTextWriter xmlWriter = new XmlTextWriter(textWriter))
Expand All @@ -102,17 +86,16 @@ public static bool CreateXML(this FatturaElettronicaType fatturaElettronicaType,
/// <summary>
/// Valida il file XML
/// </summary>
/// <param name="pathFileNameXML">percorso e nome file XML da validare</param>
/// <param name="messages">lista degli errori riscontrati nella validazione dell'XML</param>
/// <returns>true se il file XML è formalmente corretto altrimenti false. Se il metodo va in errore rigetta l'errore</returns>
/// <example>
/// List<string> errors;
/// if (!FatturaElettronica.TryValidateXML("c:\temp\IT01234567890_FPA01.xml", out List<string> errors))
/// if (!fatturaElettronicaType.TryValidateXML(out List<string> errors))
/// {
/// ...
/// }
/// </example>
public static bool TryValidateXML(this FatturaElettronicaType fatturaElettronicaType, out List<string> messages)
public static bool TryValidateXML(this IFatturaElettronicaType fatturaElettronicaType, out List<string> messages)
{
var settings = new XmlReaderSettings() { DtdProcessing = DtdProcessing.Ignore };
messages = null;
Expand All @@ -121,11 +104,12 @@ public static bool TryValidateXML(this FatturaElettronicaType fatturaElettronica

XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces();

xmlSerializerNamespaces.Add("xsi", FatturaElettronicaReferences.XsiNamespace);
xmlSerializerNamespaces.Add("p", FatturaElettronicaReferences.PNamespace);
xmlSerializerNamespaces.Add("ds", FatturaElettronicaReferences.DsNamespace);
xmlSerializerNamespaces.Add(FatturaElettronicaReferences.prefixSchema, FatturaElettronicaReferences.XsiNamespace);
xmlSerializerNamespaces.Add(FatturaElettronicaReferences.prefixNamespace, fatturaElettronicaType.Namespace);
xmlSerializerNamespaces.Add(FatturaElettronicaReferences.prefixDigitalSignatures, fatturaElettronicaType.DsNamespace);

XmlSerializer xmlSerializer = new XmlSerializer(typeof(FatturaElettronicaType));

XmlSerializer xmlSerializer = new XmlSerializer(fatturaElettronicaType.GetType());
using (MemoryStream stream = new MemoryStream())
{
xmlSerializer.Serialize(XmlWriter.Create(stream), fatturaElettronicaType, xmlSerializerNamespaces);
Expand All @@ -136,7 +120,7 @@ public static bool TryValidateXML(this FatturaElettronicaType fatturaElettronica
XDocument xdoc = XDocument.Load(xr);
var schemas = new XmlSchemaSet();
Assembly assembly = Assembly.GetExecutingAssembly();
schemas.Add(FatturaElettronicaReferences.PNamespace, XmlReader.Create(assembly.GetManifestResourceStream($"{typeof(FatturaElettronica).Namespace}.{FatturaElettronicaReferences.XsdFileFatturaVersioneXSD}")) );
schemas.Add(fatturaElettronicaType.Namespace, XmlReader.Create(assembly.GetManifestResourceStream($"{typeof(FatturaElettronica).Namespace}.{fatturaElettronicaType.XsdFileFatturaVersioneXsd}")));

StreamReader xmldsig = new StreamReader(assembly.GetManifestResourceStream($"{typeof(FatturaElettronica).Namespace}.{FatturaElettronicaReferences.Xmldsig_core_schema}"));

Expand All @@ -145,7 +129,7 @@ public static bool TryValidateXML(this FatturaElettronicaType fatturaElettronica
DtdProcessing = DtdProcessing.Ignore
}))
{
schemas.Add(FatturaElettronicaReferences.DsNamespace, reader);
schemas.Add(fatturaElettronicaType.DsNamespace, reader);
}

List<string> errors = new List<string>();
Expand Down Expand Up @@ -174,19 +158,24 @@ public static bool TryValidateXML(this FatturaElettronicaType fatturaElettronica
}

/// <summary>
/// crea oggetto fattura da file
/// Crea oggetto fattura da file
/// La versione dello schema viene automaticamente rilevata dal file.
/// Se la versione è ambigua viene utilizzata la versione più recente dello schema
/// Per forzare una versione ambigua utilizzare il parametro forceVersion,
/// Attualmente è valido solo il valore '1.2' visto che la 1.2.1 è retrocompatibile con la 1.2
/// </summary>
/// <param name="pathFileName">percorso e nome del file</param>
/// <param name="fatturaElettronicaType">oggetto fattura</param>
/// <param name="forceVersion">forza ad una versione specifica. L'unico valore valido è "1.2"</param>
/// <returns>true se l'operazione è avvenuta con success altrimenti false. Se il metodo va in errore rigetta l'errore</returns>
/// <example>
/// FatturaElettronicaType fatturaElettronicaType;
/// if (!FatturaElettronica.CreateInvoice("c:\temp\IT01234567890_FPA01.xml", out FatturaElettronicaType fatturaElettronicaType))
/// if (!FatturaElettronica.CreateInvoice("c:\temp\IT01234567890_FPA01.xml", out IFatturaElettronicaType fatturaElettronicaType))
/// {
/// fatturaElettronicaType ....
/// }
/// </example>
public static bool CreateInvoice(string pathFileName, out FatturaElettronicaType fatturaElettronicaType)
public static bool CreateInvoice(string pathFileName, out IFatturaElettronicaType fatturaElettronicaType, string forceVersion = null)
{
fatturaElettronicaType = null;
try
Expand All @@ -196,13 +185,42 @@ public static bool CreateInvoice(string pathFileName, out FatturaElettronicaType
throw new FileNotFoundException();
}

XmlSerializer xmlSerializer = new XmlSerializer(typeof(FatturaElettronicaType));
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(pathFileName);
string versione = xmlDoc.ChildNodes[1].Attributes[FatturaElettronicaReferences.attributoVersione].Value;
XmlSerializer xmlSerializer = null;

if (string.Compare(versione, Versioni.Versione1_0, StringComparison.Ordinal) == 0)
{
xmlSerializer = new XmlSerializer(typeof(Type.V_1_0.FatturaElettronicaType));
}
else if (string.Compare(versione, Versioni.Versione1_1, StringComparison.Ordinal) == 0)
{
xmlSerializer = new XmlSerializer(typeof(Type.V_1_1.FatturaElettronicaType));
}
else if ((string.Compare(versione, Enum.GetName(typeof(Type.V_1_2_1.FormatoTrasmissioneType), Type.V_1_2_1.FormatoTrasmissioneType.FPA12), StringComparison.Ordinal) == 0) ||
(string.Compare(versione, Enum.GetName(typeof(Type.V_1_2_1.FormatoTrasmissioneType), Type.V_1_2_1.FormatoTrasmissioneType.FPR12), StringComparison.Ordinal) == 0))
{
if (forceVersion == Versioni.Versione1_2)
{
xmlSerializer = new XmlSerializer(typeof(Type.V_1_2.FatturaElettronicaType));
}
else
{
xmlSerializer = new XmlSerializer(typeof(Type.V_1_2_1.FatturaElettronicaType));
}
}
else
{
throw new System.Exception("Versione del file xml non trovata!");
}


using (XmlReader reader = XmlReader.Create(pathFileName))
{
if (xmlSerializer.CanDeserialize(reader))
{
fatturaElettronicaType = (FatturaElettronicaType)xmlSerializer.Deserialize(reader);
fatturaElettronicaType = (IFatturaElettronicaType)xmlSerializer.Deserialize(reader);
}
else
{
Expand Down
96 changes: 22 additions & 74 deletions FatturaElettronicaReferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,90 +4,38 @@
// </copyright>
// <author>Nicogis</author>
//-----------------------------------------------------------------------
using FatturazioneElettronica;
using System;
using System.Xml.Serialization;

public static class FatturaElettronicaReferences
namespace FatturazioneElettronica
{
/// <summary>
/// namespace utilizzato nell'xml
/// </summary>
public const string XsiNamespace = "http://www.w3.org/2001/XMLSchema-instance";

/// <summary>
/// versione schema fattura
/// </summary>
public const string Versione = "1.2";

/// <summary>
/// versione xsd
/// </summary>
public const string VersioneXSD = "1.2.1";

/// <summary>
/// namespace utilizzato nell'xml
/// </summary>
public static readonly string PNamespace = $"http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v{FatturaElettronicaReferences.Versione}";
using System;

/// <summary>
/// path schema location
/// </summary>
public static readonly string PathSchemaLocation = $"http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa";
public static class FatturaElettronicaReferences
{
/// <summary>
/// namespace utilizzato nell'xml
/// </summary>
public const string XsiNamespace = "http://www.w3.org/2001/XMLSchema-instance";

/// <summary>
/// namespace utilizzato nell'xml
/// </summary>
public const string DsNamespace = "http://www.w3.org/2000/09/xmldsig#";
/// <summary>
/// path schema location
/// </summary>
public static readonly string PathSchemaLocation = "https://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa";

/// <summary>
/// folder contenitori stili
/// </summary>
public const string FolderStili = "Stili";
/// <summary>
/// Xmldsig_core_schema per validare le fatture
/// </summary>
public static readonly string Xmldsig_core_schema = $"{Globals.FolderSchemi}.xmldsig-core-schema.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.xsd)}";

/// <summary>
/// folder contenitore schemi
/// </summary>
public const string FolderSchemi = "Schemi";
public const string prefixNamespace = "p";

/// <summary>
/// xsd fatture
/// </summary>
public static readonly string XsdFileFatturaVersione = $"{FatturaElettronicaReferences.FolderSchemi}.Schema_del_file_xml_FatturaPA_versione_{FatturaElettronicaReferences.Versione}.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.xsd)}";
public const string prefixSchema = "xsi";

/// <summary>
/// xsd per validare le fatture
/// </summary>
public static readonly string XsdFileFatturaVersioneXSD = $"{FatturaElettronicaReferences.FolderSchemi}.Schema_del_file_xml_FatturaPA_versione_{FatturaElettronicaReferences.VersioneXSD}.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.xsd)}";
public const string prefixDigitalSignatures = "ds";

/// <summary>
/// Xmldsig_core_schema per validare le fatture
/// </summary>
public static readonly string Xmldsig_core_schema = $"{FatturaElettronicaReferences.FolderSchemi}.xmldsig-core-schema.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.xsd)}";
public const string attributoVersione = "versione";

/// <summary>
/// nome file per visualizzare l'anteprima della fattura elettronica PA
/// </summary>
public static readonly string FileNameStylePA = $"{FatturaElettronicaReferences.FolderStili}.fatturaPA_v{FatturaElettronicaReferences.VersioneXSD}.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.xsl)}";

/// <summary>
/// nome file per visualizzare l'anteprima della fattura elettronica
/// </summary>
public static readonly string FileNameStyleOrdinaria = $"{FatturaElettronicaReferences.FolderStili}.fatturaordinaria_v{FatturaElettronicaReferences.VersioneXSD}.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.xsl)}";

/// <summary>
/// url xsd fattura http
/// </summary>
public static readonly string XsdFatturaHttp = new Uri(FatturaElettronicaReferences.PathSchemaLocation).Combine($"v{FatturaElettronicaReferences.Versione}", FatturaElettronicaReferences.XsdFileFatturaVersione).AbsoluteUri;

}
}

public partial class FatturaElettronicaType
{
/// <summary>
/// xsi:schemaLocation
/// </summary>
[XmlAttribute("schemaLocation", AttributeName = "schemaLocation", Namespace = FatturaElettronicaReferences.XsiNamespace)]
public string SchemaLocation = $"{FatturaElettronicaReferences.PNamespace} {FatturaElettronicaReferences.XsdFatturaHttp}";
}


Loading

0 comments on commit 2396efa

Please sign in to comment.