2025-06-24 12:52:37 -03:00
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 )
{
2025-11-04 11:51:43 -03:00
// << CAMBIO: Reducido el padding superior de 1cm a 5mm >>
container . PaddingTop ( 5 , Unit . Millimetre ) . Column ( column = >
2025-06-24 12:52:37 -03:00
{
2025-11-04 11:51:43 -03:00
// << CAMBIO: Reducido el espaciado principal entre elementos de 15 a 10 puntos >>
column . Spacing ( 10 ) ;
2025-06-24 12:52:37 -03:00
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 ( ) ) ;
} ) ;
} ) ;
2025-11-04 11:51:43 -03:00
column . Item ( ) . PaddingTop ( 3 ) . Border ( 1 ) . Background ( Colors . Grey . Lighten3 ) . AlignCenter ( ) . Padding ( 2 ) . Text ( Model . NombreEmpresa ) . SemiBold ( ) ;
2025-06-24 12:52:37 -03:00
2025-11-04 11:51:43 -03:00
column . Item ( ) . Border ( 1 ) . Padding ( 8 ) . Column ( innerCol = > // << CAMBIO: Padding reducido de 10 a 8 >>
2025-06-24 12:52:37 -03:00
{
2025-11-04 11:51:43 -03:00
// << CAMBIO: Reducido el espaciado interno de 5 a 4 >>
innerCol . Spacing ( 4 ) ;
2025-06-24 12:52:37 -03:00
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" ) ) ;
2025-11-04 11:51:43 -03:00
} ) ;
2025-06-24 12:52:37 -03:00
foreach ( var item in Model . Detalles )
{
var totalSeccion = item . Devueltos - item . Llevados ;
2025-11-04 11:51:43 -03:00
// << CAMBIO: Reducido el padding superior de 5 a 3 >>
innerCol . Item ( ) . PaddingTop ( 3 ) . Row ( row = >
2025-06-24 12:52:37 -03:00
{
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}" ) ;
} ) ;
2025-11-04 11:51:43 -03:00
// << CAMBIO: Reducido el padding superior de 2 a 1 >>
sub . Item ( ) . BorderTop ( 1.5f ) . BorderColor ( Colors . Black ) . PaddingTop ( 1 ) . Row ( r = > {
2025-06-24 12:52:37 -03:00
r . RelativeItem ( ) . Text ( t = > t . Span ( "Total" ) . SemiBold ( ) ) ;
r . RelativeItem ( ) . AlignRight ( ) . Text ( t = > t . Span ( totalSeccion . ToString ( "N0" ) ) . SemiBold ( ) ) ;
} ) ;
} ) ;
} ) ;
}
} ) ;
2025-11-04 11:51:43 -03:00
// << CAMBIO: Reducido el padding superior de 10 a 8 >>
column . Item ( ) . PaddingTop ( 8 ) . Column ( finalCol = >
2025-06-24 12:52:37 -03:00
{
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 ( ) ;
} ;
2025-11-04 11:51:43 -03:00
// << CAMBIO: Reducido el padding superior de 2 a 1 en las siguientes líneas >>
finalCol . Item ( ) . BorderTop ( 2f ) . BorderColor ( Colors . Black ) . PaddingTop ( 1 ) . Row ( row = > AddTotalRow ( row , "Total Devolución a la Fecha" , Model . TotalDevolucionALaFecha . ToString ( "N0" ) , false ) ) ;
finalCol . Item ( ) . BorderTop ( 1 ) . BorderColor ( Colors . Grey . Lighten2 ) . PaddingTop ( 1 ) . Row ( row = > AddTotalRow ( row , "Total Devolución Días Anteriores" , Model . TotalDevolucionDiasAnteriores . ToString ( "N0" ) , false ) ) ;
finalCol . Item ( ) . BorderTop ( 1 ) . BorderColor ( Colors . Grey . Lighten2 ) . PaddingTop ( 1 ) . Row ( row = > AddTotalRow ( row , "Total Devolución" , Model . TotalDevolucionGeneral . ToString ( "N0" ) , false ) ) ;
// << CAMBIO: Reducido el padding superior de 5 a 3 >>
finalCol . Item ( ) . BorderTop ( 2f ) . BorderColor ( Colors . Black ) . PaddingTop ( 3 ) . Row ( row = > AddTotalRow ( row , "Sin Cargo" , Model . TotalSinCargo . ToString ( "N0" ) , false ) ) ;
finalCol . Item ( ) . BorderTop ( 1 ) . BorderColor ( Colors . Grey . Lighten2 ) . PaddingTop ( 1 ) . Row ( row = > AddTotalRow ( row , "Sobrantes" , $"-{Model.TotalSobrantes.ToString(" N0 ")}" , false ) ) ;
// << CAMBIO: Reducido el padding superior de 5 a 3 >>
finalCol . Item ( ) . BorderTop ( 1 ) . BorderColor ( Colors . Grey . Lighten2 ) . BorderBottom ( 1 ) . BorderColor ( Colors . Grey . Lighten2 ) . PaddingTop ( 3 ) . Row ( row = > AddTotalRow ( row , "Diferencia" , Model . DiferenciaFinal . ToString ( "N0" ) , true ) ) ;
2025-06-24 12:52:37 -03:00
} ) ;
} ) ;
}
}
}