using GestionIntegral.Api.Dtos.Reportes.ViewModels; using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; using System.Globalization; using System.Linq; namespace GestionIntegral.Api.Controllers.Reportes.PdfTemplates { public class FacturasPublicidadDocument : IDocument { public FacturasPublicidadViewModel Model { get; } public FacturasPublicidadDocument(FacturasPublicidadViewModel model) { Model = model; } public DocumentMetadata GetMetadata() => DocumentMetadata.Default; public void Compose(IDocumentContainer container) { container.Page(page => { page.Margin(1, Unit.Centimetre); page.DefaultTextStyle(x => x.FontFamily("Arial").FontSize(9)); page.Header().Element(ComposeHeader); page.Content().Element(ComposeContent); page.Footer().AlignCenter().Text(x => { x.Span("Página "); x.CurrentPageNumber(); }); }); } void ComposeHeader(IContainer container) { // Se envuelve todo el contenido del header en una única Columna. container.Column(column => { // El primer item de la columna es la fila con los títulos. column.Item().Row(row => { row.RelativeItem().Column(col => { col.Item().Text($"Reporte de Suscripciones a Facturar").SemiBold().FontSize(14); col.Item().Text($"Período: {Model.Periodo}").FontSize(11); }); row.ConstantItem(150).AlignRight().Column(col => { col.Item().AlignRight().Text($"Fecha de Generación:"); col.Item().AlignRight().Text(Model.FechaGeneracion); }); }); // El segundo item de la columna es el separador. column.Item().PaddingTop(5).BorderBottom(1).BorderColor(Colors.Grey.Lighten2); }); } void ComposeContent(IContainer container) { container.PaddingTop(10).Column(column => { column.Spacing(20); foreach (var empresaData in Model.DatosPorEmpresa) { column.Item().Element(c => ComposeTablaPorEmpresa(c, empresaData)); } column.Item().AlignRight().PaddingTop(15).Text($"Total General a Facturar: {Model.TotalGeneral.ToString("C", new CultureInfo("es-AR"))}").Bold().FontSize(12); }); } void ComposeTablaPorEmpresa(IContainer container, DatosEmpresaViewModel empresaData) { container.Table(table => { table.ColumnsDefinition(columns => { columns.RelativeColumn(3); // Nombre Suscriptor columns.ConstantColumn(100); // Documento columns.ConstantColumn(100, Unit.Point); // Importe }); table.Header(header => { header.Cell().ColumnSpan(3).Background(Colors.Grey.Lighten2) .Padding(5).Text(empresaData.NombreEmpresa).Bold().FontSize(12); header.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten3).Padding(2).Text("Suscriptor").SemiBold(); header.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten3).Padding(2).Text("Documento").SemiBold(); header.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Importe a Facturar").SemiBold(); }); var facturasPorSuscriptor = empresaData.Facturas.GroupBy(f => f.NombreSuscriptor); foreach (var grupoSuscriptor in facturasPorSuscriptor.OrderBy(g => g.Key)) { foreach(var item in grupoSuscriptor) { table.Cell().Padding(2).Text(item.NombreSuscriptor); table.Cell().Padding(2).Text($"{item.TipoDocumento} {item.NroDocumento}"); table.Cell().Padding(2).AlignRight().Text(item.ImporteFinal.ToString("C", new CultureInfo("es-AR"))); } if(grupoSuscriptor.Count() > 1) { var subtotal = grupoSuscriptor.Sum(i => i.ImporteFinal); table.Cell().ColumnSpan(2).AlignRight().Padding(2).Text($"Subtotal {grupoSuscriptor.Key}:").Italic(); table.Cell().AlignRight().Padding(2).Text(subtotal.ToString("C", new CultureInfo("es-AR"))).Italic().SemiBold(); } } table.Cell().ColumnSpan(2).BorderTop(1).BorderColor(Colors.Grey.Darken1).AlignRight() .PaddingTop(5).Text("Total Empresa:").Bold(); table.Cell().BorderTop(1).BorderColor(Colors.Grey.Darken1).AlignRight() .PaddingTop(5).Text(empresaData.TotalEmpresa.ToString("C", new CultureInfo("es-AR"))).Bold(); }); } } }