260 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			260 lines
		
	
	
		
			13 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 CuentasDistribuidorDocument : IDocument | ||
|  |   { | ||
|  |     public CuentasDistribuidorViewModel Model { get; } | ||
|  |     private static readonly CultureInfo CultureAr = new CultureInfo("es-AR", false) | ||
|  |     { | ||
|  |       NumberFormat = { CurrencySymbol = "$" } | ||
|  |     }; | ||
|  | 
 | ||
|  |     public CuentasDistribuidorDocument(CuentasDistribuidorViewModel 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("Arial").FontSize(9)); | ||
|  |         page.Header().Element(ComposeHeader); | ||
|  |         page.Content().Element(ComposeContent); | ||
|  |         page.Footer().AlignCenter().Text(x => { x.Span("Página "); x.CurrentPageNumber(); x.Span(" de "); x.TotalPages(); }); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     void ComposeHeader(IContainer container) | ||
|  |     { | ||
|  |       container.Column(column => | ||
|  |       { | ||
|  |         column.Item().Row(row => | ||
|  |               { | ||
|  |                 row.RelativeItem().Text($"Fecha de Reporte   {Model.FechaReporte}"); | ||
|  |                 row.RelativeItem().AlignCenter().Text("Cuenta De Distribuidor").SemiBold().FontSize(14); | ||
|  |                 row.RelativeItem(); | ||
|  |               }); | ||
|  | 
 | ||
|  |         column.Item().AlignCenter().Text(Model.NombreDistribuidor).FontSize(12); | ||
|  | 
 | ||
|  |         column.Item().PaddingTop(2, Unit.Millimetre).Row(row => | ||
|  |               { | ||
|  |                 row.RelativeItem(2); | ||
|  |                 row.RelativeItem(8).AlignCenter().Text(text => | ||
|  |                       { | ||
|  |                         text.Span("Fecha Consultada: Desde ").SemiBold(); | ||
|  |                         text.Span(Model.FechaDesde); | ||
|  |                         text.Span(" Hasta ").SemiBold(); | ||
|  |                         text.Span(Model.FechaHasta); | ||
|  |                       }); | ||
|  |                 row.RelativeItem(2); | ||
|  |               }); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     void ComposeContent(IContainer container) | ||
|  |     { | ||
|  |       container.PaddingTop(1, Unit.Centimetre).Column(column => | ||
|  |       { | ||
|  |         column.Spacing(20); | ||
|  | 
 | ||
|  |         if (Model.Movimientos.Any()) column.Item().Element(ComposeMovimientosTable); | ||
|  |         if (Model.Pagos.Any()) column.Item().Element(ComposePagosTable); | ||
|  |         if (Model.DebitosCreditos.Any()) column.Item().Element(ComposeDebCredTable); | ||
|  | 
 | ||
|  |         column.Item().Element(ComposeResumenPeriodo); | ||
|  |         column.Item().Element(ComposeSaldoFinal); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     void ComposeMovimientosTable(IContainer container) | ||
|  |     { | ||
|  |       container.Column(column => | ||
|  |       { | ||
|  |         column.Item().PaddingBottom(5).Text("Movimientos").SemiBold().FontSize(11); | ||
|  |         column.Item().Table(table => | ||
|  |               { | ||
|  |                 table.ColumnsDefinition(columns => | ||
|  |                       { | ||
|  |                         columns.ConstantColumn(60); | ||
|  |                         columns.RelativeColumn(2); | ||
|  |                         columns.ConstantColumn(50); | ||
|  |                         columns.ConstantColumn(50); | ||
|  |                         columns.RelativeColumn(1.5f); | ||
|  |                         columns.RelativeColumn(1.5f); | ||
|  |                         columns.RelativeColumn(2); | ||
|  |                       }); | ||
|  | 
 | ||
|  |                 table.Header(header => | ||
|  |                       { | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Fecha"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Publicacion"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Remito"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignCenter().Text("Cantidad"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Debe"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Haber"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Saldo"); | ||
|  |                       }); | ||
|  | 
 | ||
|  |                 decimal saldoAcumulado = 0; // Inicia en CERO | ||
|  |                 foreach (var item in Model.Movimientos.OrderBy(m => m.Fecha)) | ||
|  |                 { | ||
|  |                   saldoAcumulado += (item.Debe - item.Haber); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Fecha.ToString("dd/MM/yyyy")); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Publicacion); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Remito); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignCenter().Text(item.Cantidad.ToString("N0")); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(item.Debe.ToString("C", CultureAr)); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(item.Haber.ToString("C", CultureAr)); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(saldoAcumulado.ToString("C", CultureAr)); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 table.Cell().ColumnSpan(4).Border(1).AlignRight().Padding(2).Text(t => t.Span("Totales").SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(Model.Movimientos.Sum(x => x.Debe).ToString("C", CultureAr)).SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(Model.Movimientos.Sum(x => x.Haber).ToString("C", CultureAr)).SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(saldoAcumulado.ToString("C", CultureAr)).SemiBold()); | ||
|  |               }); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     void ComposePagosTable(IContainer container) | ||
|  |     { | ||
|  |       container.Column(column => | ||
|  |       { | ||
|  |         column.Item().PaddingBottom(5).Text("Pagos").SemiBold().FontSize(12); | ||
|  |         column.Item().Table(table => | ||
|  |               { | ||
|  |                 table.ColumnsDefinition(columns => | ||
|  |                       { | ||
|  |                         columns.ConstantColumn(60); | ||
|  |                         columns.RelativeColumn(1.5f); | ||
|  |                         columns.ConstantColumn(50); | ||
|  |                         columns.RelativeColumn(1.5f); | ||
|  |                         columns.RelativeColumn(1.5f); | ||
|  |                         columns.RelativeColumn(1.5f); | ||
|  |                         columns.RelativeColumn(2); | ||
|  |                       }); | ||
|  | 
 | ||
|  |                 table.Header(header => | ||
|  |                       { | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Fecha"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Recibo"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Tipo"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Debe"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Haber"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Saldo"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Detalle"); | ||
|  |                       }); | ||
|  | 
 | ||
|  |                 decimal saldoAcumulado = Model.TotalMovimientos; | ||
|  |                 foreach (var item in Model.Pagos.OrderBy(p => p.Fecha).ThenBy(p => p.Recibo)) | ||
|  |                 { | ||
|  |                   saldoAcumulado += (item.Debe - item.Haber); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Fecha.ToString("dd/MM/yyyy")); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Recibo.ToString()); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Tipo); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(item.Debe.ToString("C", CultureAr)); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(item.Haber.ToString("C", CultureAr)); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(saldoAcumulado.ToString("C", CultureAr)); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Detalle); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 table.Cell().ColumnSpan(3).Border(1).AlignRight().Padding(2).Text(t => t.Span("Totales").SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(Model.Pagos.Sum(x => x.Debe).ToString("C", CultureAr)).SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(Model.Pagos.Sum(x => x.Haber).ToString("C", CultureAr)).SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(saldoAcumulado.ToString("C", CultureAr)).SemiBold()); | ||
|  |                 table.Cell().Border(1); | ||
|  |               }); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     void ComposeDebCredTable(IContainer container) | ||
|  |     { | ||
|  |       container.Column(column => | ||
|  |       { | ||
|  |         column.Item().PaddingBottom(5).Text("Débitos / Créditos").SemiBold().FontSize(12); | ||
|  |         column.Item().Table(table => | ||
|  |               { | ||
|  |                 table.ColumnsDefinition(columns => | ||
|  |                       { | ||
|  |                         columns.ConstantColumn(65); | ||
|  |                         columns.RelativeColumn(2); | ||
|  |                         columns.RelativeColumn(1); | ||
|  |                         columns.RelativeColumn(1); | ||
|  |                         columns.RelativeColumn(2); | ||
|  |                       }); | ||
|  | 
 | ||
|  |                 table.Header(header => | ||
|  |                       { | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Fecha"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).Text("Referencia"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Debe"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Haber"); | ||
|  |                         header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Saldo"); | ||
|  |                       }); | ||
|  | 
 | ||
|  |                 decimal saldoAcumulado = Model.TotalMovimientos + Model.TotalPagos; | ||
|  |                 foreach (var item in Model.DebitosCreditos.OrderBy(dc => dc.Fecha)) | ||
|  |                 { | ||
|  |                   saldoAcumulado += (item.Debe - item.Haber); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Fecha.ToString("dd/MM/yyyy")); | ||
|  |                   table.Cell().Border(1).Padding(2).Text(item.Referencia); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(item.Debe.ToString("C", CultureAr)); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(item.Haber.ToString("C", CultureAr)); | ||
|  |                   table.Cell().Border(1).Padding(2).AlignRight().Text(saldoAcumulado.ToString("C", CultureAr)); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 table.Cell().ColumnSpan(2).Border(1).AlignRight().Padding(2).Text(t => t.Span("Totales").SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(Model.DebitosCreditos.Sum(x => x.Debe).ToString("C", CultureAr)).SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(Model.DebitosCreditos.Sum(x => x.Haber).ToString("C", CultureAr)).SemiBold()); | ||
|  |                 table.Cell().Border(1).AlignRight().Padding(2).Text(t => t.Span(saldoAcumulado.ToString("C", CultureAr)).SemiBold()); | ||
|  |               }); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     void ComposeResumenPeriodo(IContainer container) | ||
|  |     { | ||
|  |       container.PaddingTop(5, Unit.Millimetre).AlignLeft().Column(column => | ||
|  |       { | ||
|  |         column.Item().Border(1).Padding(5).Width(300, Unit.Point).Column(col => | ||
|  |       { | ||
|  |             col.Spacing(5); | ||
|  |             col.Item().Text("Datos totales del periodo consultado").SemiBold(); | ||
|  |             Action<RowDescriptor, string, decimal> AddResumenRow = (row, label, value) => | ||
|  |           { | ||
|  |                 row.RelativeItem().Text(label); | ||
|  |                 row.ConstantItem(120).AlignRight().Text(value.ToString("C", CultureAr)); | ||
|  |               }; | ||
|  |             col.Item().Row(row => AddResumenRow(row, "Movimientos", Model.TotalMovimientos)); | ||
|  |             col.Item().Row(row => AddResumenRow(row, "Débitos/Créditos", Model.TotalDebitosCreditos)); | ||
|  |             col.Item().Row(row => AddResumenRow(row, "Pagos", Model.TotalPagos)); | ||
|  |             col.Item().BorderTop(1.5f).BorderColor(Colors.Black).PaddingTop(5).Row(row => | ||
|  |           { | ||
|  |                 row.RelativeItem().Text("Total").SemiBold(); | ||
|  |                 row.ConstantItem(120).AlignRight().Text(t => t.Span(Model.TotalPeriodo.ToString("C", CultureAr)).SemiBold()); | ||
|  |               }); | ||
|  |           }); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     void ComposeSaldoFinal(IContainer container) | ||
|  |     { | ||
|  |       container.PaddingTop(5, Unit.Millimetre).AlignLeft().Text(text => | ||
|  |      { | ||
|  |        text.Span($"Saldo Total del Distribuidor al {Model.FechaReporte} ").SemiBold().FontSize(12); | ||
|  |        text.Span(Model.SaldoDeCuenta.ToString("C", CultureAr)).SemiBold().FontSize(12); | ||
|  |      }); | ||
|  |     } | ||
|  |   } | ||
|  | } |