Mava.Reporting
0.1.0-alpha.2
See the version list below for details.
dotnet add package Mava.Reporting --version 0.1.0-alpha.2
NuGet\Install-Package Mava.Reporting -Version 0.1.0-alpha.2
<PackageReference Include="Mava.Reporting" Version="0.1.0-alpha.2" />
<PackageVersion Include="Mava.Reporting" Version="0.1.0-alpha.2" />
<PackageReference Include="Mava.Reporting" />
paket add Mava.Reporting --version 0.1.0-alpha.2
#r "nuget: Mava.Reporting, 0.1.0-alpha.2"
#:package Mava.Reporting@0.1.0-alpha.2
#addin nuget:?package=Mava.Reporting&version=0.1.0-alpha.2&prerelease
#tool nuget:?package=Mava.Reporting&version=0.1.0-alpha.2&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.mddocs/13-fastreport-evaluation.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(options => {
options.QuestPdfLicenseType = MavaQuestPdfLicenseType.Community;
});
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
});
Licenciamiento de QuestPDF en consumo:
Mava.Reportingno define automaticamente una licencia por el consumidor.- La app consumidora debe definir la licencia en startup con
AddMavaReporting(options => ...). - Si no se configura
QuestPdfLicenseType, se lanza una excepcion en el registro de servicios. - La responsabilidad de cumplimiento de licencias de terceros recae en la aplicacion consumidora.
- Para uso comercial, valida elegibilidad y tier (Community/Professional/Enterprise) segun los terminos oficiales de QuestPDF.
Texto sugerido para documentacion del consumidor:
El uso de
Mava.Reportingimplica la aceptacion y cumplimiento de las licencias de dependencias de terceros incluidas o transitivas (por ejemplo, QuestPDF y ScottPlot). La aplicacion consumidora es la responsable de evaluar su contexto legal/comercial y seleccionar o adquirir las licencias que correspondan.
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
padding puede declararse como numero uniforme o por lado:
{ "padding": 8 }
{
"padding": {
"top": 8,
"right": 12,
"bottom": 8,
"left": 12
}
}
styles nombrados aplican hoy a un subconjunto explicito:
text: tipografia basica,backgroundColor,alignmentypaddingsection:padding,backgroundColor,borderColor,borderWidthyborderRadiusbox:backgroundColor,borderColor,borderWidthyborderRadiustable:padding, colores, borde, alineacion y tipografia basicatable.columns[]:padding,align, colores y tipografia basica
Regla de precedencia: propiedad inline del elemento > styles.<name> > default del renderer.
Para tablas, la precedencia efectiva es mas especifica:
- celdas de datos: columna inline > columna
style>table.cellStyle> table inline > tablestyle> default - encabezado: table inline
header*>table.headerStyle> tablestyle> default
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- flujo automatizado de publicacion: fuera del alcance actual
THIRD-PARTY-NOTICES.md: incluir y mantener avisos/licencias de dependencias redistribuidas
Metadata ya definida:
- licencia del paquete:
MIT(viaPackageLicenseExpressionensrc/Mava.Reporting/Mava.Reporting.csproj)
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 |