Mava.Reporting
0.1.0-alpha.1
See the version list below for details.
dotnet add package Mava.Reporting --version 0.1.0-alpha.1
NuGet\Install-Package Mava.Reporting -Version 0.1.0-alpha.1
<PackageReference Include="Mava.Reporting" Version="0.1.0-alpha.1" />
<PackageVersion Include="Mava.Reporting" Version="0.1.0-alpha.1" />
<PackageReference Include="Mava.Reporting" />
paket add Mava.Reporting --version 0.1.0-alpha.1
#r "nuget: Mava.Reporting, 0.1.0-alpha.1"
#:package Mava.Reporting@0.1.0-alpha.1
#addin nuget:?package=Mava.Reporting&version=0.1.0-alpha.1&prerelease
#tool nuget:?package=Mava.Reporting&version=0.1.0-alpha.1&prerelease
Mava.Reporting
Libreria .NET para generacion dinamica de reportes PDF a partir de definiciones declarativas en JSON.
Estado actual del paquete: 0.1.0-alpha
Estado de roadmap:
Alpha Hardening: cerradaConsumption Expansion: cerrada- siguiente fase recomendada:
Engine Semantics
Objetivo
Permitir que multiples aplicaciones consuman un motor de reportes reutilizable, extensible y publicable en NuGet, capaz de renderizar:
- Header de reporte
- Page header
- Content dinamico
- Footer
- Tablas
- Graficos
- Estilos y layout reutilizable
Principios
- Contrato del reporte controlado por nosotros, no por un vendor externo.
- Arquitectura limpia y extensible.
- Render declarativo basado en JSON.
- Separacion estricta entre definicion, validacion, render y exportacion.
- Preparado para publicarse como paquete NuGet.
Documentacion interna
docs/01-goals-and-scope.mddocs/02-architecture.mddocs/03-development-rules.mddocs/04-json-contract-v1.mddocs/05-testing-strategy.mddocs/06-release-versioning-and-publishing.mddocs/07-roadmap.mddocs/08-vscode-ai-collaboration.mddocs/09-alpha-hardening-phase.mddocs/10-consumption-expansion-phase.mddocs/11-section-decorative-backgrounds-phase.mddocs/12-nuget-publication-guide.mdAGENTS.mdCONTRIBUTING.md
Sample recomendado
El repositorio mantiene un sample ejecutable en samples/Mava.Reporting.SampleConsole/.
Ese sample ya no es una demo minima: representa un escenario de negocio realista de monthly sales performance para un backend que necesita generar un PDF operativo con:
- logo SVG embebido por
sourceSvgBase64 sectioncon fondo degradado decorativosectioncon fondo SVG decorativoboxcomo primitiva decorativa sin contenido para segmentos y bloques visuales- salto de pagina explicito con
pageBreak - layout horizontal relativo en
rowmedianteweight stylesnombrados- placeholders
{{param.*}} tableconformatprogressRingcomo indicador circular SVG de progresosegmentedProgresscomo indicador lineal segmentado para distribuciones por estadocharttipoBarmultiserie con modo inline o dataset-backedheader,pageHeader,contentyfooter- multiples datasets en un mismo reporte
Consumo esperado desde NuGet:
using Microsoft.Extensions.DependencyInjection;
using Mava.Reporting;
var services = new ServiceCollection();
services.AddMavaReporting();
using var provider = services.BuildServiceProvider();
var reporting = provider.GetRequiredService<IReportingService>();
var report = await reporting.GenerateDocumentAsync(
definitionJson,
cultureName: "es-ES",
parameters: new Dictionary<string, object?> {
["reportTitle"] = "Sales Summary"
},
datasets: new Dictionary<string, IReadOnlyCollection<IDictionary<string, object?>>> {
["sales"] = rows
});
La ruta publica recomendada devuelve ReportDocument desde Mava.Reporting, para evitar que el caso comun de consumo dependa de Application.Models.
La cultura visible del reporte se controla desde ReportRequest.CultureName o mediante el overload publico con cultureName.
Si no se informa, el motor usa CultureInfo.CurrentCulture.
El contrato JSON soporta styles nombrados con efecto real en elementos text.
La precedencia actual es:
- propiedades inline del elemento sobre el estilo nombrado
- estilo nombrado sobre los defaults del renderer
Las columnas de table tambien soportan format con efecto real para:
currencydatedatetime
Comportamiento cultural actual:
currencyusa la cultura efectiva del request- placeholders convierten valores visibles usando la cultura efectiva del request
dateydatetimese mantienen con formato estable para preservar el contrato actual
El elemento chart soporta hoy:
Bar,LineyPieBarmultiserie agrupado por categoria- color por serie
frame.visibleyframe.colorlegend.visibleylegend.positionlegend.fontSizeylegend.fontColorxAxis.visible,xAxis.labelFontSize,xAxis.labelColoryAxis.visible,yAxis.labelFontSize,yAxis.labelColorgrid.visible,grid.direction,grid.colorygrid.lineWidthbarLayout.mode,barLayout.groupSpacing,barLayout.barSpacingybarLayout.barWidth- dos modos de datos para
Bar: inline y dataset-backed
Reglas actuales de Bar:
- usa exactamente uno entre modo inline (
data.labels+data.series) y modo dataset-backed (dataset+categoryField+series) series[].valueFieldaplica solo al modo dataset-backeddata.series[].valuesaplica solo al modo inline- el mapping concreto a ScottPlot vive solo en
Infrastructure
El elemento image soporta hoy:
sourceBase64para rastersourceSvgBase64para SVGwidthheight
Regla de validacion actual para image:
- debe existir exactamente una fuente soportada
- no puede definir
sourceBase64ysourceSvgBase64al mismo tiempo
Los hijos de row pueden declarar weight para repartir ancho relativo.
Regla actual:
- si un hijo no define
weight, su peso relativo es1 - si un hijo define
width,widthgana y ese hijo pasa a ancho fijo
Los placeholders en texto soportan hoy:
{{name}}por compatibilidad{{param.name}}como forma explicita recomendada
Los tokens {{engine.*}} y {{fn.*}} quedan reservados para una futura capa de expresiones y hoy se conservan sin cambios. En particular, {{engine.pageNumber}} y {{engine.totalPages}} quedan reservados para una futura iteracion relacionada con paginacion.
El contrato tambien soporta ahora un elemento section para agrupar hijos en flujo vertical y aplicar presentacion visual simple al bloque con:
itemsspacingpaddingbackgroundColorbackgroundGradientbackgroundImageborderColorborderWidthborderRadius
El contrato soporta tambien box como primitiva decorativa sin contenido, con:
heightrequeridawidthoweightopcionales segun el layoutbackgroundColorborderColorborderWidthborderRadius
Regla semantica actual:
boxes un bloque visual sin hijossectionsigue siendo el contenedor visual con contenido
El contrato soporta tambien progressRing como indicador visual de un unico valor, separado de chart, con:
valuenumerico directo ovalueFromcomo referencia explicita aparam.<name>maxopcional con default100color,trackColorythicknesslabelopcional o porcentaje automatico en el centro- render SVG directo para mantener nitidez en PDF
Reglas actuales de progressRing:
- debe definir exactamente uno entre
valueyvalueFrom valueFromusa la forma explicitaparam.<name>- si el parametro no existe o no es numerico, el motor falla con error claro
El contrato soporta tambien segmentedProgress como indicador lineal segmentado, separado de row + box, con:
heightrequeridaborderRadius,trackColorygap- modo inline mediante
segments[]convalue,colorylabelopcional - modo dataset-backed mediante
dataset,valueField,labelFieldycolorField - calculo proporcional basado en la suma real de
segments[].value, sin exigir que sumen100 colorFieldopcional con fallback estable#94A3B8por fila cuando no hay color usable- render SVG directo;
labelqueda como metadato y no se renderiza dentro de la barra en esta iteracion
Reglas actuales para fondos de section:
backgroundColor,backgroundGradientybackgroundImageson mutuamente excluyentesbackgroundImagesoporta raster porsourceBase64y SVG porsourceSvgBase64backgroundImage.fitsoportaContain,CoveryStretchbackgroundImage.horizontalAlignybackgroundImage.verticalAligncontrolan la alineacion interna del fondo- el fondo decorativo se renderiza detras del contenido sin afectar el flujo interno del bloque
Para generar un PDF de prueba:
dotnet run --project .\samples\Mava.Reporting.SampleConsole\Mava.Reporting.SampleConsole.csproj
El archivo PDF se genera en:
samples/Mava.Reporting.SampleConsole/bin/Debug/net10.0/generated/
El reporte generado muestra:
- logo SVG vectorial embebido sin rasterizacion manual
- bloque ejecutivo con fondo degradado decorativo
- bloque documental con fondo SVG decorativo
- resumen ejecutivo del periodo
- facturas liquidadas del mes
- receivables pendientes de cobro
Es la referencia recomendada para entender como integrar Mava.Reporting desde un backend.
Preparacion de pre-release
Validacion local recomendada antes de empaquetar:
dotnet test .\tests\Mava.Reporting.UnitTests\Mava.Reporting.UnitTests.csproj -m:1 -nr:false --disable-build-servers
dotnet test .\tests\Mava.Reporting.IntegrationTests\Mava.Reporting.IntegrationTests.csproj -m:1 -nr:false --disable-build-servers
dotnet pack .\src\Mava.Reporting\Mava.Reporting.csproj -c Debug -p:ContinuousIntegrationBuild=false
Pendientes de metadata antes de una publicacion final:
AuthorsyCompany: no definidos por falta de dato confirmado- licencia del paquete: no declarada todavia
- flujo automatizado de publicacion: fuera del alcance actual
Estructura esperada de la solucion
src/
Mava.Reporting.Domain/
Mava.Reporting.Application/
Mava.Reporting.Infrastructure/
Mava.Reporting/
samples/
Mava.Reporting.SampleConsole/
tests/
Mava.Reporting.UnitTests/
Mava.Reporting.IntegrationTests/
docs/
.github/
Estado inicial sugerido
- v0.1.x: base del motor, parser, text, line, spacer, header/footer, table simple
- v0.2.x: chart bar, line, pie
- v0.3.x: estilos, parametros, expresiones simples
- v0.4.x: layout compuesto, repeticion, page breaks, reglas de visibilidad
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.DependencyInjection (>= 10.0.7)
- QuestPDF (>= 2026.2.4)
- ScottPlot (>= 5.1.58)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-alpha.3.1 | 63 | 5/16/2026 |
| 0.1.0-alpha.3 | 53 | 5/15/2026 |
| 0.1.0-alpha.2 | 65 | 5/7/2026 |
| 0.1.0-alpha.1 | 66 | 4/24/2026 |