initial commit

This commit is contained in:
2026-07-21 14:14:44 +07:00
commit fa7dbb970d
1359 changed files with 104110 additions and 0 deletions
+129
View File
@@ -0,0 +1,129 @@
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using Indotalent.Features.Purchase.Bill.Cqrs;
namespace Indotalent.Features.Purchase.Bill;
public class BillPdfGenerator
{
public static byte[] Generate(GetBillByIdResponse 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("VENDOR BILL")
.FontSize(20).ExtraBold().FontColor(primaryBlue);
col.Item().Text($"{data.AutoNumber}").FontSize(11).SemiBold();
col.Item().Text($"PO Ref: {data.PurchaseOrderAutoNumber}").FontSize(9).FontColor(textSlate);
});
row.RelativeItem().AlignRight().Column(col =>
{
col.Item().Text(data.CompanyName).FontSize(11).ExtraBold();
col.Item().Text($"{data.CompanyStreet}").FontColor(textSlate);
col.Item().Text($"{data.CompanyCity}").FontColor(textSlate);
});
});
page.Content().PaddingVertical(20).Column(col =>
{
col.Item().Row(row =>
{
row.RelativeItem().Column(c =>
{
c.Item().BorderBottom(1).PaddingBottom(5).Text("VENDOR").FontSize(8).Bold().FontColor(textSlate);
c.Item().PaddingTop(5).Text(data.VendorName).Bold();
c.Item().Text(data.VendorStreet);
c.Item().Text(data.VendorCity);
});
row.ConstantItem(40);
row.RelativeItem().Column(c =>
{
c.Item().BorderBottom(1).PaddingBottom(5).Text("BILL DETAILS").FontSize(8).Bold().FontColor(textSlate);
c.Item().PaddingTop(5).Row(r => {
r.RelativeItem().Text("Bill Date");
r.RelativeItem().AlignRight().Text(data.BillDate?.ToString("dd MMM yyyy"));
});
c.Item().Row(r => {
r.RelativeItem().Text("Status");
r.RelativeItem().AlignRight().Text(data.BillStatus.ToString().ToUpper()).Bold().FontColor(primaryBlue);
});
});
});
col.Item().PaddingTop(20).Table(table =>
{
table.ColumnsDefinition(columns =>
{
columns.ConstantColumn(25);
columns.RelativeColumn(4);
columns.RelativeColumn(2);
columns.RelativeColumn(1.5f);
columns.RelativeColumn(2.5f);
});
table.Header(header =>
{
header.Cell().Element(HeaderStyle).Text("#");
header.Cell().Element(HeaderStyle).Text("Product");
header.Cell().Element(HeaderStyle).AlignRight().Text("Unit Price");
header.Cell().Element(HeaderStyle).AlignCenter().Text("Qty");
header.Cell().Element(HeaderStyle).AlignRight().Text($"Total ({data.CurrencySymbol})");
static IContainer HeaderStyle(IContainer container) => 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).Column(c => {
c.Item().Text(item.ProductName).Bold();
if (!string.IsNullOrEmpty(item.Summary)) c.Item().Text(item.Summary).FontSize(8).FontColor(textSlate);
});
table.Cell().Element(CellStyle).AlignRight().Text(item.UnitPrice?.ToString("N2"));
table.Cell().Element(CellStyle).AlignCenter().Text(item.Quantity?.ToString());
table.Cell().Element(CellStyle).AlignRight().Text(item.Total?.ToString("N2"));
static IContainer CellStyle(IContainer container) => container.BorderBottom(1).BorderColor("#E2E8F0").PaddingVertical(8).PaddingHorizontal(5);
}
});
col.Item().PaddingTop(10).Row(row =>
{
row.RelativeItem().Column(c => {
c.Item().Text("Notes:").FontSize(8).Bold();
c.Item().Text(string.IsNullOrEmpty(data.Description) ? "-" : data.Description).FontSize(8);
});
row.ConstantItem(200).Column(c =>
{
c.Item().Row(r => { r.RelativeItem().Text("Sub Total"); r.RelativeItem().AlignRight().Text(data.BeforeTaxAmount?.ToString("N2")); });
c.Item().Row(r => { r.RelativeItem().Text("Tax Amount"); r.RelativeItem().AlignRight().Text(data.TaxAmount?.ToString("N2")); });
c.Item().PaddingTop(5).BorderTop(1).Row(r => { r.RelativeItem().Text($"TOTAL").Bold(); r.RelativeItem().AlignRight().Text(data.AfterTaxAmount?.ToString("N2")).ExtraBold().FontColor(primaryBlue); });
});
});
});
page.Footer().AlignCenter().Text(x => { x.Span("Page ").FontSize(8); x.CurrentPageNumber().FontSize(8); });
});
}).GeneratePdf();
}
}