121 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			121 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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(); | ||
|  |             }); | ||
|  |         } | ||
|  |     } | ||
|  | } |