Files
2026-07-21 13:59:38 +07:00

110 lines
4.8 KiB
C#

using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using Indotalent.Features.Sales.DeliveryOrder.Cqrs;
namespace Indotalent.Features.Sales.DeliveryOrder;
public class DeliveryOrderPdfGenerator
{
public static byte[] Generate(GetDeliveryOrderByIdResponse data)
{
QuestPDF.Settings.License = LicenseType.Community;
var primaryBlue = "#0D47A1";
var textSlate = "#64748b";
return Document.Create(container =>
{
container.Page(page =>
{
page.Size(PageSizes.A4);
page.Margin(1.5f, Unit.Centimetre);
page.PageColor(Colors.White);
page.DefaultTextStyle(x => x.FontSize(9).FontFamily(Fonts.Verdana));
page.Header().Row(row =>
{
row.RelativeItem().Column(col =>
{
col.Item().Text("DELIVERY ORDER")
.FontSize(20).ExtraBold().FontColor(primaryBlue);
col.Item().Text($"{data.AutoNumber}").FontSize(11).SemiBold();
});
row.RelativeItem().AlignRight().Column(col =>
{
col.Item().Text("SHIPPING SLIP").FontSize(11).ExtraBold();
col.Item().Text($"SO Reference: {data.SalesOrderNumber}").FontColor(textSlate);
col.Item().Text($"Date: {data.DeliveryDate?.ToString("dd MMM yyyy")}").FontColor(textSlate);
});
});
page.Content().PaddingVertical(20).Column(col =>
{
col.Item().PaddingTop(10).Table(table =>
{
table.ColumnsDefinition(columns =>
{
columns.ConstantColumn(30);
columns.RelativeColumn(4);
columns.RelativeColumn(3);
columns.RelativeColumn(2);
});
table.Header(header =>
{
header.Cell().Element(HeaderStyle).Text("#");
header.Cell().Element(HeaderStyle).Text("Product Name");
header.Cell().Element(HeaderStyle).Text("Warehouse");
header.Cell().Element(HeaderStyle).AlignCenter().Text("Qty");
static IContainer HeaderStyle(IContainer container)
{
return container.DefaultTextStyle(x => x.SemiBold().FontColor(Colors.White))
.PaddingVertical(5).PaddingHorizontal(5).Background("#0D47A1");
}
});
var index = 1;
foreach (var item in data.Items)
{
table.Cell().Element(CellStyle).Text($"{index++}");
table.Cell().Element(CellStyle).Text(item.ProductName);
table.Cell().Element(CellStyle).Text(item.WarehouseName);
table.Cell().Element(CellStyle).AlignCenter().Text(item.Movement?.ToString());
static IContainer CellStyle(IContainer container)
{
return container.BorderBottom(1).BorderColor("#E2E8F0").PaddingVertical(8).PaddingHorizontal(5);
}
}
});
col.Item().PaddingTop(20).Row(row =>
{
row.RelativeItem().Column(c => {
c.Item().Text("Notes:").FontSize(8).Bold();
c.Item().Text(string.IsNullOrEmpty(data.Description) ? "-" : data.Description).FontSize(8);
c.Item().PaddingTop(10).Text($"Status: {data.Status.ToString().ToUpper()}").FontSize(9).Bold().FontColor(primaryBlue);
});
row.ConstantItem(150).Column(c => {
c.Item().PaddingTop(10).AlignCenter().Text("Issued By,").FontSize(8);
c.Item().PaddingTop(40).AlignCenter().Text("____________________").FontSize(8);
c.Item().AlignCenter().Text("( Customer / Consignee )").FontSize(7);
});
});
});
page.Footer().AlignCenter().Text(x =>
{
x.Span("Page ").FontSize(8);
x.CurrentPageNumber().FontSize(8);
x.Span(" of ").FontSize(8);
x.TotalPages().FontSize(8);
});
});
}).GeneratePdf();
}
}