All checks were successful
		
		
	
	Optimized Build and Deploy / remote-build-and-deploy (push) Successful in 7m55s
				
			
		
			
				
	
	
		
			126 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using GestionIntegral.Api.Dtos.Reportes.ViewModels;
 | |
| using QuestPDF.Fluent;
 | |
| using QuestPDF.Helpers;
 | |
| using QuestPDF.Infrastructure;
 | |
| using System.Linq;
 | |
| 
 | |
| namespace GestionIntegral.Api.Controllers.Reportes.PdfTemplates
 | |
| {
 | |
|     public class ControlDevolucionesDocument : IDocument
 | |
|     {
 | |
|         public ControlDevolucionesViewModel Model { get; }
 | |
| 
 | |
|         public ControlDevolucionesDocument(ControlDevolucionesViewModel model)
 | |
|         {
 | |
|             Model = model;
 | |
|         }
 | |
| 
 | |
|         public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
 | |
|         public DocumentSettings GetSettings() => DocumentSettings.Default;
 | |
| 
 | |
|         public void Compose(IDocumentContainer container)
 | |
|         {
 | |
|             container.Page(page =>
 | |
|             {
 | |
|                 page.Margin(1, Unit.Centimetre);
 | |
|                 page.DefaultTextStyle(x => x.FontFamily("Roboto").FontSize(11));
 | |
| 
 | |
|                 page.Header().Element(ComposeHeader);
 | |
|                 page.Content().Element(ComposeContent);
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         void ComposeHeader(IContainer container)
 | |
|         {
 | |
|             container.Column(column =>
 | |
|             {
 | |
|                 column.Item().AlignCenter().Text("Control de Devoluciones").SemiBold().FontSize(16);
 | |
|                 column.Item().AlignCenter().Text("Canillas / Accionistas").FontSize(13);
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         void ComposeContent(IContainer container)
 | |
|         {
 | |
|             container.PaddingTop(1, Unit.Centimetre).Column(column =>
 | |
|             {
 | |
|                 column.Spacing(15);
 | |
| 
 | |
|                 column.Item().Row(row =>
 | |
|                 {
 | |
|                     row.RelativeItem().Text(text =>
 | |
|                     {
 | |
|                         text.Span("Fecha Consultada: ").SemiBold();
 | |
|                         text.Span(Model.FechaConsultada);
 | |
|                     });
 | |
|                     row.RelativeItem().AlignRight().Text(text =>
 | |
|                     {
 | |
|                         text.Span("Cantidad Canillas: ").SemiBold();
 | |
|                         text.Span(Model.CantidadCanillas.ToString());
 | |
|                     });
 | |
|                 });
 | |
|                 
 | |
|                 column.Item().PaddingTop(5).Border(1).Background(Colors.Grey.Lighten3).AlignCenter().Padding(2).Text(Model.NombreEmpresa).SemiBold();
 | |
| 
 | |
|                 column.Item().Border(1).Padding(10).Column(innerCol =>
 | |
|                 {
 | |
|                     innerCol.Spacing(5);
 | |
|                     
 | |
|                     // Fila de "Ingresados por Remito" con borde inferior sólido.
 | |
|                     innerCol.Item().BorderBottom(1, Unit.Point).BorderColor(Colors.Grey.Medium).Row(row =>
 | |
|                     {
 | |
|                         row.RelativeItem().Text("Ingresados por Remito:").SemiBold();
 | |
|                         row.RelativeItem().AlignRight().Text(Model.TotalIngresadosPorRemito.ToString("N0"));
 | |
|                     }); // <-- SOLUCIÓN: Borde sólido simple.
 | |
|                     
 | |
|                     foreach (var item in Model.Detalles)
 | |
|                     {
 | |
|                         var totalSeccion = item.Devueltos - item.Llevados;
 | |
|                         innerCol.Item().PaddingTop(5).Row(row =>
 | |
|                         {
 | |
|                             row.ConstantItem(100).Text(item.Tipo).SemiBold();
 | |
|                             
 | |
|                             row.RelativeItem().Column(sub =>
 | |
|                             {
 | |
|                                 sub.Spacing(2);
 | |
|                                 sub.Item().Row(r => {
 | |
|                                     r.RelativeItem().Text("Llevados");
 | |
|                                     r.RelativeItem().AlignRight().Text($"-{item.Llevados:N0}");
 | |
|                                 });
 | |
|                                 sub.Item().Row(r => {
 | |
|                                     r.RelativeItem().Text("Devueltos");
 | |
|                                     r.RelativeItem().AlignRight().Text($"{item.Devueltos:N0}");
 | |
|                                 });
 | |
|                                 sub.Item().BorderTop(1.5f).BorderColor(Colors.Black).PaddingTop(2).Row(r => {
 | |
|                                     r.RelativeItem().Text(t => t.Span("Total").SemiBold());
 | |
|                                     r.RelativeItem().AlignRight().Text(t => t.Span(totalSeccion.ToString("N0")).SemiBold());
 | |
|                                 });
 | |
|                             });
 | |
|                         });
 | |
|                     }
 | |
|                 });
 | |
|                 
 | |
|                 column.Item().PaddingTop(10).Column(finalCol =>
 | |
|                 {
 | |
|                     finalCol.Spacing(2);
 | |
|                     
 | |
|                     Action<RowDescriptor, string, string, bool> AddTotalRow = (row, label, value, isBold) =>
 | |
|                     {
 | |
|                         var text = row.RelativeItem().Text(label);
 | |
|                         if (isBold) text.SemiBold();
 | |
|                         
 | |
|                         var valueText = row.ConstantItem(80).AlignRight().Text(value);
 | |
|                         if (isBold) valueText.SemiBold();
 | |
|                     };
 | |
|                     
 | |
|                     // Usamos bordes superiores para separar las líneas de total
 | |
|                     finalCol.Item().BorderTop(2f).BorderColor(Colors.Black).PaddingTop(2).Row(row => AddTotalRow(row, "Total Devolución a la Fecha", Model.TotalDevolucionALaFecha.ToString("N0"), false));
 | |
|                     finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(2).Row(row => AddTotalRow(row, "Total Devolución Días Anteriores", Model.TotalDevolucionDiasAnteriores.ToString("N0"), false));
 | |
|                     finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(2).Row(row => AddTotalRow(row, "Total Devolución", Model.TotalDevolucionGeneral.ToString("N0"), false));
 | |
|                     finalCol.Item().BorderTop(2f).BorderColor(Colors.Black).PaddingTop(5).Row(row => AddTotalRow(row, "Sin Cargo", Model.TotalSinCargo.ToString("N0"), false));
 | |
|                     finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(2).Row(row => AddTotalRow(row, "Sobrantes", $"-{Model.TotalSobrantes.ToString("N0")}", false));
 | |
|                     finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(5).Row(row => AddTotalRow(row, "Diferencia", Model.DiferenciaFinal.ToString("N0"), true));
 | |
|                 });
 | |
|             });
 | |
|         }
 | |
|     }
 | |
| } |