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();
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |