Fattura elettronica in C#
Questo tutorial crea due semplici applicazioni console C# da zero:
- Receive: si connette e autentica con Invoicetronic API e scarica eventuali nuove fatture in arrivo.
- Send: si connette e autentica con Invoicetronic API e invia una fattura allo SDI.
Prima di continuare, assicurati che tutti i prerequisiti sotto siano soddisfatti.
Prerequisiti
Presupponiamo che questi prerequisiti siano soddisfatti:
- Il .NET SDK è stato scaricato e installato
- Hai ottenuto una Chiave API attiva
- Ti sei registrato presso l'Agenzia delle Entrate (necessario per l'ambiente di produzione)
Utilizziamo lo strumento dotnet e VS Code in quanto sono disponibili sulla maggior parte dei sistemi, ma puoi seguire con il tuo IDE preferito (Visual Studio, Rider, ecc.) se preferisci.
Tip
Per un'esperienza C# ottimale in VS Code, assicurati che l'estensione C# Dev Kit sia installata e abilitata. Per ulteriori informazioni, consulta Iniziare con C# in VS Code.
Lo sapevi?
Siamo autori e maintainer del package open-source FatturaElettronica.NET. Se ti serve una liberia per leggere, scrivere, serializzare, de-serializzare e convalidare fatture, faresti bene a dargli una occhiata.
Receive
Crea l'app
Il primo passo è creare l'applicazione:
Il comando ha creato un nuovo progetto C# chiamato "receive" in una directory con lo stesso nome. Entra in quella directory:Installa l'SDK
Una volta nella directory receive, installa l'SDK C#:
Una volta fatto, apri VS Code nella directory corrente:
Clicca sul file Program.cs per vedere il suo contenuto nel pannello destro di VS Code.
Configura l'SDK
Sostituisci il contenuto predefinito di Program.cs con il seguente:
using Invoicetronic.Sdk.Api;
using Invoicetronic.Sdk.Client;
using static Invoicetronic.Sdk.Model.Receive;
// Configura l'SDK.
var config = new Configuration
{
BasePath = "https://api.invoicetronic.com/v1",
Username = "LA TUA CHIAVE API DI TEST (inizia con ik_test_)"
};
Come puoi vedere, inizializziamo un'istanza di Configuration impostando il percorso base dell'API e la tua chiave API di test (non quella live). Nota come utilizziamo la proprietà Username per impostare la chiave API.
Le chiavi API vengono fornite in coppia
Quando crei il tuo account, ottieni una coppia di chiavi API. Una è la chiave di test per la Sandbox API, e l'altra è quella live dell'API. Puoi distinguerle perché la prima inizia con ik_test_, mentre la seconda inizia con ik_live_. In questo tutorial, usa sempre la chiave di test.
Scarica le fatture
Siamo pronti per effettuare una richiesta. Vogliamo scaricare nuove fatture dei fornitori che potrebbero essere disponibili dallo SDI. Aggiungi queste righe:
// Scarica le fatture non lette.
var receiveApi = new ReceiveApi(config);
try
{
var inboundInvoices = await receiveApi.ReceiveGetAsync(unread:true, includePayload:true);
Console.WriteLine($"Ricevute {inboundInvoices.Count} fatture");
foreach (var invoice in inboundInvoices)
{
switch (invoice.Encoding)
{
case EncodingEnum.Xml:
File.WriteAllText(invoice.FileName, invoice.Payload);
break;
case EncodingEnum.Base64:
File.WriteAllBytes(invoice.FileName, Convert.FromBase64String(invoice.Payload));
break;
}
Console.WriteLine($"Scaricato {invoice.FileName} da un fornitore con Partita IVA {invoice.Prestatore}");
}
}
catch (ApiException e)
{
Console.WriteLine($"{e.Message} - {e.ErrorCode}");
}
Inclusione del Payload
Impostiamo includePayload: true per recuperare il contenuto effettivo della fattura nella proprietà Payload. Senza questo parametro, il campo Payload sarebbe null per impostazione predefinita, il che aumenta le prestazioni e riduce le dimensioni della risposta quando hai bisogno solo dei metadati.
Passa al terminale(1) poi digita:
- Se il pannello del terminale non è già aperto, clicca sul menu Terminale, poi Nuovo Terminale.
Dovresti ottenere un output simile a questo:
Ricevute 3 fatture
Scaricato file1.xml da un fornitore con Partita IVA IT06157670966
Scaricato file2.xml.p7m da un fornitore con Partita IVA IT01280270057
Scaricato file3.xml.p7m da un fornitore con Partita IVA IT01280270057
I file sono nella directory corrente, pronti per essere ispezionati.
Non ricevi fatture nell'ambiente di produzione?
Assicurati di esserti registrato presso l'Agenzia delle Entrate, che è un requisito per l'ambiente di produzione.
Cosa abbiamo imparato
In questo esempio, abbiamo imparato diverse cose.
-
Dobbiamo configurare l'SDK impostando sia la proprietà
BasePathcheUsername, quest'ultima inizializzata con la chiave API. -
Dobbiamo istanziare una classe che rappresenta l'endpoint con cui vogliamo lavorare. In questo caso, sfruttiamo
ReceiveApiper scaricare le fatture in arrivo. -
Le classi endpoint come
ReceiveApioffrono metodi per interagire con la loro entità target. ChiamiamoReceiveGetAsyncper recuperare le fatture. Poiché vogliamo solo fatture nuove e non lette, passiamounread: true. Passiamo ancheincludePayload: trueper recuperare il contenuto effettivo della fattura (se esegui l'esempio una seconda volta, probabilmente non riceverai alcuna fattura a meno che non ne sia arrivata qualcuna). -
La classe
Receiveespone proprietà preziose comeEncoding,FileNameePayload. Quest'ultima contiene il contenuto della fattura, come testo normale o codificato in Base64, come descritto daEncoding.
Codice sorgente su GitHub
Il codice sorgente per questo Quickstart è disponibile anche su GitHub.
Send
Crea l'app
Il primo passo è creare l'applicazione:
Il comando ha creato un nuovo progetto C# chiamato "quickstart" in una directory con lo stesso nome. Entra in quella directory:Installa l'SDK
Una volta nella directory quickstart, installa l'SDK C#:
Una volta fatto, apri VS Code nella directory corrente:
Clicca sul file Program.cs per vedere il suo contenuto nel pannello destro di VS Code.
Configura l'SDK
Sostituisci il contenuto predefinito di Program.cs con il seguente:
using Invoicetronic.Sdk.Api;
using Invoicetronic.Sdk.Client;
using Invoicetronic.Sdk.Model;
// Configura l'SDK.
var config = new Configuration
{
BasePath = "https://api.invoicetronic.com/v1",
Username = "LA TUA CHIAVE API DI TEST (inizia con ik_test_)"
};
Come puoi vedere, inizializziamo un'istanza di Configuration impostando il percorso base dell'API e la tua chiave API di test (non quella live). Nota come utilizziamo la proprietà Username per impostare la chiave API.
Le chiavi API vengono fornite in coppia
Quando crei il tuo account, ottieni una coppia di chiavi API. Una è la chiave di test per la Sandbox API, e l'altra è quella live dell'API. Puoi distinguerle perché la prima inizia con ik_test_, mentre la seconda inizia con ik_live_. In questo tutorial, usa sempre la chiave di test.
Invia una fattura
Siamo pronti per effettuare una richiesta. Vogliamo inviare una fattura allo SDI. Aggiungi il seguente codice:
// Invia una fattura
var filePath = "/qualche/percorso/file/nomefile.xml";
var metaData = new Dictionary<string, string>
{
{ "internal_id", "123" },
{ "created_with", "myapp" },
{ "some_other_custom_data", "value" },
};
var sendApi = new SendApi(config);
try
{
var sentInvoice = await sendApi.SendPostAsync(new Send()
{
FileName = Path.GetFileName(filePath),
Payload = File.ReadAllText(filePath),
MetaData = metaData
});
Console.WriteLine($"La fattura è stata inviata con successo, ora ha l'Id univoco {sentInvoice.Id}.");
}
catch (ApiException e)
{
Console.WriteLine($"{e.Message} - {e.ErrorCode}");
}
Passa al terminale(1) poi digita:
- Se il pannello del terminale non è già aperto, clicca sul menu Terminale, poi Nuovo Terminale.
Dovresti ottenere un output simile a questo:
Cosa abbiamo imparato
In questo esempio, abbiamo imparato diverse cose.
-
Dobbiamo configurare l'SDK impostando sia la proprietà
BasePathcheUsername, quest'ultima inizializzata con la chiave API. -
Dobbiamo istanziare una classe che rappresenta l'endpoint con cui vogliamo lavorare. In questo caso, sfruttiamo
SendApiper inviare fatture. Le classi endpoint comeSendApioffrono metodi per interagire con la loro entità target. ChiamiamoInvoiceV1SendPosttAsyncper inviare una fattura. -
La classe
Sendespone proprietà preziose comeFileName,MetaDataePayload. Quest'ultima contiene il contenuto della fattura, mentreMetaDataè opzionale e associa dati personalizzati al documento.
Codice sorgente su GitHub
Il codice sorgente per questo Quickstart è disponibile anche su GitHub.