XML generation and template engine for Greeva electronic invoicing using RazorLight
$ dotnet add package Greeva.XmlXML generation and template engine for Greeva electronic invoicing using RazorLight templates.
Greeva.Xml provides XML document generation capabilities for all SUNAT electronic document types using RazorLight template engine with embedded CSHTML templates.
using Greeva.Xml.Builder;
using Greeva.Core.Domain.Sale;
// Create invoice builder
var invoiceBuilder = new InvoiceBuilder();
// Generate XML from invoice
var invoice = new Invoice
{
Serie = "F001",
Correlativo = "123",
// ... other properties
};
var xml = await invoiceBuilder.BuildAsync(invoice);
Console.WriteLine(xml);
var invoiceBuilder = new InvoiceBuilder();
var xml = await invoiceBuilder.BuildAsync(invoice);
var noteBuilder = new NoteBuilder();
var xml = await noteBuilder.BuildAsync(creditNote);
var summaryBuilder = new SummaryBuilder();
var xml = await summaryBuilder.BuildAsync(summary);
var despatchBuilder = new DespatchBuilder();
var xml = await despatchBuilder.BuildAsync(despatch);
All templates are embedded as resources and include:
using RazorLight;
// Configure RazorLight for file-based templates
var engine = new RazorLightEngineBuilder()
.UseFileSystemProject(Path.Combine(Directory.GetCurrentDirectory(), "Templates"))
.UseMemoryCachingProvider()
.Build();
// Configure for embedded resources
var engine = new RazorLightEngineBuilder()
.UseEmbeddedResourcesProject(typeof(InvoiceBuilder).Assembly)
.UseMemoryCachingProvider()
.Build();
Generated XML follows UBL 2.1 standard:
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:UBLVersionID>2.1</cbc:UBLVersionID>
<cbc:CustomizationID>2.0</cbc:CustomizationID>
<cbc:ID>F001-123</cbc:ID>
<cbc:IssueDate>2025-10-11</cbc:IssueDate>
<cbc:InvoiceTypeCode listAgencyName="PE:SUNAT" listName="SUNAT:Identificador de Tipo de Documento" listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo01">01</cbc:InvoiceTypeCode>
<!-- ... more XML content ... -->
</Invoice>
You can create custom templates by implementing the IBuilder<T> interface:
public class CustomInvoiceBuilder : IBuilder<Invoice>
{
public async ValueTask<string> BuildAsync(Invoice invoice)
{
// Custom XML generation logic
return xmlContent;
}
}
MIT License - see LICENSE file for details.
For issues and questions, please visit: https://github.com/augustoteles/greeva/issues