ADDEV.Framework.Backend 5.12.3
ADDEV Framework - Service Peppol Billit
Ce document décrit l'utilisation du service Peppol Billit intégré dans le framework ADDEV pour l'envoi et la gestion de documents électroniques.
Vue d'ensemble
Le service Billit permet l'intégration avec l'API Peppol de Billit pour :
- L'envoi de factures électroniques avec pièces jointes PDF
- La confirmation d'envoi des factures
- La récupération du statut des commandes
- La gestion complète du cycle de vie des documents Peppol
Configuration
Variables d'environnement requises
# Endpoint API Billit (sandbox ou production)
BILLIT_API_ENDPOINT=https://api.sandbox.billit.be
# Clé API Billit
BILLIT_API_KEY=votre-cle-api
# ID de l'entreprise Billit
BILLIT_COMPANY_ID=votre-company-id
Utilisation de base
Envoi d'une facture
using ADDEV.Framework.Backend.Services.Peppol;
// Création d'une facture
var invoice = new BillitOrder
{
OrderNumber = "INV-2025-001",
OrderDate = DateTime.UtcNow,
ExpiryDate = DateTime.UtcNow.AddDays(30),
Customer = new BillitCustomer
{
Name = "Client SA",
VATNumber = "BE0123456789",
Addresses = new List<BillitAddress>
{
new BillitAddress
{
AddressType = BillitAddressType.InvoiceAddress,
Street = "Rue de la Clientèle",
StreetNumber = "123",
Zipcode = "1000",
City = "Bruxelles",
CountryCode = "BE"
}
}
},
Orderlines = new List<BillitOrderLine>
{
new BillitOrderLine
{
Description = "Service de consultation",
Quantity = 1,
UnitPriceExcl = 500.00m,
VATPercentage = 21.0m
}
},
OrderPDF = new BillitOrderPDF
{
FileName = "facture-2025-001.pdf",
FileContent = Convert.ToBase64String(pdfBytes)
}
};
// Envoi de la facture
var response = await BillitService.SendInvoice(invoice);
Console.WriteLine($"Facture envoyée avec l'ID: {response.OrderId}");
Confirmation d'envoi
// Confirmation d'envoi (passage du statut "ToSend" à "Sent")
bool confirmed = await BillitService.ConfirmSendInvoice(response.OrderId);
if (confirmed)
{
Console.WriteLine("Facture confirmée pour envoi");
}
Récupération du statut
// Récupération des détails complets de la commande
var details = await BillitService.GetOrderStatus(response.OrderId);
Console.WriteLine($"Statut actuel: {details.Status}");
Classes principales
BillitOrder
Représente une commande/facture à envoyer.
Propriétés principales :
OrderNumber: Numéro de commande (requis)OrderDate: Date de commande (requis)ExpiryDate: Date d'échéance (requis)Customer: Informations client (requis)Orderlines: Lignes de commande (au moins une requise)OrderPDF: Pièce jointe PDF (optionnel)
BillitCustomer
Informations sur le client destinataire.
Propriétés principales :
Name: Nom du client (requis)VATNumber: Numéro TVA (requis)Addresses: Liste d'adresses (au moins une requise)
BillitOrderLine
Représente une ligne de commande.
Propriétés principales :
Description: Description de l'article (requis)Quantity: Quantité (doit être > 0)UnitPriceExcl: Prix unitaire HTVA (ne peut pas être négatif)VATPercentage: Pourcentage TVA (0-100%)
BillitOrderResponse
Réponse retournée lors de l'envoi d'une facture.
Propriétés :
OrderId: ID unique de la commandeStatus: Statut initial de la commandeCreatedAt: Date de création
BillitOrderDetails
Détails complets d'une commande existante.
Propriétés principales :
OrderId: ID de la commandeStatus: Statut actuelOrderType: Type de commandeOrderDirection: Direction (Income/Cost)- Toutes les propriétés de BillitOrder
Gestion des erreurs
Le service utilise des exceptions spécialisées pour différents types d'erreurs :
BillitValidationException
Lancée lors d'erreurs de validation des données d'entrée.
try
{
var response = await BillitService.SendInvoice(invalidInvoice);
}
catch (BillitValidationException ex)
{
Console.WriteLine($"Erreur de validation pour {ex.FieldName}: {ex.Message}");
}
BillitApiException
Lancée lors d'erreurs retournées par l'API Billit.
try
{
var details = await BillitService.GetOrderStatus(orderId);
}
catch (BillitApiException ex)
{
Console.WriteLine($"Erreur API {ex.StatusCode}: {ex.Message}");
Console.WriteLine($"Détails: {ex.ErrorDetails}");
}
BillitException
Exception générique pour les autres erreurs.
Statuts de commande
Les commandes peuvent avoir différents statuts :
Draft: BrouillonToSend: Prêt à envoyerSent: EnvoyéToPay: À payerToInvoice: À facturerInvoiced: FacturéPaid: PayéRefused: RefuséCanceled: Annulé
Bonnes pratiques
1. Validation des données
Validez toujours les données avant envoi :
// Le service valide automatiquement, mais vous pouvez pré-valider
try
{
BillitValidator.ValidateInvoice(invoice);
var response = await BillitService.SendInvoice(invoice);
}
catch (BillitValidationException ex)
{
// Gérer l'erreur de validation
}
2. Gestion des PDF
- Le contenu PDF doit être encodé en base64
- Le nom du fichier doit inclure l'extension
.pdf - Vérifiez que le fichier n'est pas corrompu avant encodage
3. Gestion des retry
Le service implémente automatiquement des retry sur les erreurs temporaires (5xx, timeouts). Pas besoin de les implémenter côté client.
4. Logging
Les erreurs sont automatiquement loggées. Pour un logging personnalisé :
try
{
var response = await BillitService.SendInvoice(invoice);
}
catch (Exception ex)
{
logger.LogError(ex, "Erreur lors de l'envoi de facture {OrderNumber}", invoice.OrderNumber);
throw;
}
Exemple complet
using ADDEV.Framework.Backend.Services.Peppol;
public class InvoiceService
{
public async Task<string> SendInvoiceAsync(InvoiceData data)
{
// Construction de l'objet BillitOrder
var billitOrder = new BillitOrder
{
OrderNumber = data.InvoiceNumber,
OrderDate = data.InvoiceDate,
ExpiryDate = data.DueDate,
Customer = MapToBillitCustomer(data.Customer),
Orderlines = data.Lines.Select(MapToBillitOrderLine).ToList(),
OrderPDF = new BillitOrderPDF
{
FileName = $"{data.InvoiceNumber}.pdf",
FileContent = Convert.ToBase64String(data.PdfBytes)
}
};
// Envoi
var response = await BillitService.SendInvoice(billitOrder);
// Confirmation d'envoi
await BillitService.ConfirmSendInvoice(response.OrderId);
return response.OrderId;
}
private BillitCustomer MapToBillitCustomer(CustomerData customer)
{
return new BillitCustomer
{
Name = customer.Name,
VATNumber = customer.VatNumber,
Addresses = new List<BillitAddress>
{
new BillitAddress
{
AddressType = BillitAddressType.InvoiceAddress,
Street = customer.Address.Street,
StreetNumber = customer.Address.Number,
Zipcode = customer.Address.ZipCode,
City = customer.Address.City,
CountryCode = customer.Address.CountryCode
}
}
};
}
private BillitOrderLine MapToBillitOrderLine(InvoiceLineData line)
{
return new BillitOrderLine
{
Description = line.Description,
Quantity = line.Quantity,
UnitPriceExcl = line.UnitPrice,
VATPercentage = line.VatRate
};
}
}
Support et documentation
Pour plus d'informations :
Versions
- v2.4.7 : Implémentation initiale du service Billit avec envoi, confirmation et récupération de statut
- Support complet de la validation des données et gestion d'erreurs robuste
Dernière mise à jour : 2025-10-19
Showing the top 20 packages that depend on ADDEV.Framework.Backend.
| Packages | Downloads |
|---|---|
|
ADDEV.Framework.ErrorMonitoring
Package Description
|
0 |
|
ADDEV.Framework.Testing
Package Description
|
0 |
.NET 8.0
- HttpMultipartParser (>= 9.1.0)
- LogiPrint.SDK (>= 3.0.3)
- Microsoft.EntityFrameworkCore (>= 8.0.20)
- Pomelo.EntityFrameworkCore.MySql (>= 8.0.3)
- Pomelo.EntityFrameworkCore.MySql.Json.Microsoft (>= 8.0.3)
- SuperSocket.WebSocketServer (>= 2.0.0-beta.18)
- System.IdentityModel.Tokens.Jwt (>= 8.14.0)
| Version | Downloads | Last updated |
|---|---|---|
| 5.12.3 | 0 | 11/13/2026 |