PSTW_CentralizeSystem/Areas/MMS/Models/PDFGenerator/TarBallPDF.cs

339 lines
15 KiB
C#

using QuestPDF.Fluent;
using QuestPDF.Infrastructure;
using QuestPDF.Helpers;
using Google.Protobuf.WellKnownTypes;
using PSTW_CentralSystem.Models;
namespace PSTW_CentralSystem.Areas.MMS.Models.PDFGenerator
{
public class TarBallPDF(string stationID, string stateName, string locationName,
string longitude, string latitude, DateTime dateSample, TimeSpan timeSample,
string classifyID, bool tarBallYes, bool tarBallNo, bool isSand, bool isNonSandy,
bool isCoquina, string photoPath1, string photoPath2, string photoPath3, string photoPath4)
: IDocument
{
private readonly string _stationId = stationID;
private readonly string _stateName = stateName;
private readonly string _locationName = locationName;
private readonly string _longitude = longitude;
private readonly string _latitude = latitude;
private readonly DateTime _dateSample = dateSample;
private readonly TimeSpan _timeSample = timeSample;
private readonly string _classifyID = classifyID;
private readonly bool _tarBallYes = tarBallYes;
private readonly bool _tarBallNo = tarBallNo;
private readonly bool _isSand = isSand;
private readonly bool _isNonSandy = isNonSandy;
private readonly bool _isCoquina = isCoquina;
private readonly string _photoPath1 = photoPath1;
private readonly string _photoPath2 = photoPath2;
private readonly string _photoPath3 = photoPath3;
private readonly string _photoPath4 = photoPath4;
//INSERT LOADIMAGE() HERE
private static Image? LoadImage(string path)
{
if (!string.IsNullOrEmpty(path) && File.Exists(path))
{
return Image.FromFile(path); // Load image if the file exists
}
return Image.FromFile("default-placeholder.jpg"); // Return null if the file is missing
}
// Metadata for the PDF document
public DocumentMetadata GetMetadata() => new()
{
Title = "TARBALL SAMPLING FORM",
Author = "PAKAR SCIENO TW Integrated Environmental Solutions",
Subject = "Environmental Survey and Observations"
};
// Compose the PDF content
public void Compose(IDocumentContainer container)
{
container.Page(page =>
{
// Page Setup
page.Size(PageSizes.A4);
page.Margin(1.1f, Unit.Centimetre);
page.DefaultTextStyle(x => x.FontFamily("Arial").FontSize(10));
// Header Section
page.Header().Row(row =>
{
row.RelativeItem(1).Element(CellStyle).Column(column =>
{
column.Item()
.AlignMiddle()
.AlignCenter()
.Text("Logo Placeholder");
});
row.RelativeItem(1).Element(CellStyle)
.AlignMiddle()
.AlignCenter()
.Text("TARBALL SAMPLING FORM")
.FontSize(16)
.FontColor("#4B0082");
row.RelativeItem(1).Column(column =>
{
column.Spacing(0);
column.Item().Row(innerRow =>
{
innerRow.RelativeItem(1).Element(CellStyle).Text("Document:")
.AlignLeft();
innerRow.RelativeItem(1).Element(CellStyle).Text("F-MM06")
.AlignLeft().Bold();
});
column.Item().Row(innerRow =>
{
innerRow.RelativeItem(1).Element(CellStyle).Text("Effective Date:")
.AlignLeft();
innerRow.RelativeItem(1).Element(CellStyle).Text("1 April 2025")
.AlignLeft();
});
column.Item().Row(innerRow =>
{
innerRow.RelativeItem(1).Element(CellStyle).Text("Revision No.")
.AlignLeft();
innerRow.RelativeItem(1).Element(CellStyle).Text("02")
.AlignLeft();
});
});
static IContainer CellStyle(IContainer container)
=> container.Border(0.5f).Padding(5);
});
// Content Section
page.Content().Column(column =>
{
// Observations Table
column.Item().Element(container =>
{
container
.PaddingTop(20)
.PaddingBottom(10)
.Text("Please be informed that we have observed the following conditions:");
});
column.Item().Table(table =>
{
column.Spacing(0);
table.ColumnsDefinition(columns =>
{
columns.RelativeColumn(3);
columns.RelativeColumn(3);
});
table.Cell()
.Background(Colors.Grey.Lighten2).Element(CellStyle).Text("STATE")
.Bold();
table.Cell().Element(CellStyle).Text(_stateName);
table.Cell()
.Background(Colors.Grey.Lighten2).Element(CellStyle).Text("STATION ID")
.Bold();
table.Cell().Element(CellStyle).Text(_stationId);
table.Cell()
.Background(Colors.Grey.Lighten2).Element(CellStyle).Text("LOCATION")
.Bold();
table.Cell().Element(CellStyle).Text(_locationName);
table.Cell()
.Background(Colors.Grey.Lighten2).Element(CellStyle).Text("TARBALL SURVEY LOCATION LONGITUDE & LATITUDE")
.Bold();
table.Cell().Element(CellStyle).Text($"{_longitude}, {_latitude}");
// Display DateSample and TimeSample together in the table
table.Cell()
.Background(Colors.Grey.Lighten2).Element(CellStyle).Text("DATE / TIME")
.Bold();
table.Cell().Element(CellStyle).Text($"{_dateSample:yyyy-MM-dd} {_timeSample:hh\\:mm\\:ss}");
});
column.Spacing(3);
// Survey Findings - ALWAYS shows all options
column.Item()
.PaddingTop(10)
.PaddingBottom(10)
.Text("SURVEY FINDING:")
.Bold().FontSize(12);
// 1. Tar Ball YES/NO (always shown)
column.Item()
.PaddingBottom(10)
.Text(text =>
{
text.Span("Tar Ball: ").Style(TextStyle.Default.FontSize(10));
text.Span(_classifyID == "NO" ? "☐ YES ☑ NO" : "☑ YES ☐ NO").Style(TextStyle.Default.FontSize(10));
});
// 2. Classification (always shown)
column.Item()
.PaddingBottom(10)
.Text("If YES, Tar Ball falls under the Classification of:")
.FontSize(10);
column.Item()
.PaddingBottom(10)
.Text(text =>
{
text.Span(_classifyID == "SD" ? "☑ Sand " : "☐ Sand ").Style(TextStyle.Default.FontSize(10));
text.Span(_classifyID == "NS" ? "☑ Non-sandy " : "☐ Non-sandy ").Style(TextStyle.Default.FontSize(10));
text.Span(_classifyID == "CO" ? "☑ Coquina" : "☐ Coquina").Style(TextStyle.Default.FontSize(10));
});
column.Item()
.PaddingBottom(10)
.Text("*tick wherever applicable")
.Italic();
// Photos Section Title
column.Item()
.PaddingBottom(5)
.Text("PHOTOGRAPHS OF SAMPLING")
.AlignCenter()
.Bold()
.FontSize(14);
// Photos Section
column.Item().Table(table =>
{
column.Spacing(0);
table.ColumnsDefinition(columns =>
{
columns.RelativeColumn(1);
columns.RelativeColumn(1);
});
// Row 1: Photos
table.Cell().Element(CellStyle).Height(150)
.Image(LoadImage(_photoPath1)); // Left Side View photo space
table.Cell().Element(CellStyle).Height(150)
.Image(LoadImage(_photoPath2)); // Right Side View photo space
// Row 1: Captions
table.Cell().Element(CellStyle)
.Text("Figure 1: Left Side Coastal View")
.FontSize(12).AlignLeft();
table.Cell().Element(CellStyle)
.Text("Figure 2: Right Side Coastal View")
.FontSize(12).AlignLeft();
// Row 2: Photos
table.Cell().Element(CellStyle).Height(150)
.Image(LoadImage(_photoPath3)); // Vertical Lines photo space
table.Cell().Element(CellStyle).Height(150)
.Image(LoadImage(_photoPath4)); // Horizontal Lines photo space
// Row 2: Captions
table.Cell().Element(CellStyle)
.Text("Figure 3: Drawing Vertical Lines")
.FontSize(12).AlignLeft();
table.Cell().Element(CellStyle)
.Text("Figure 4: Drawing Horizontal Lines (Racking)")
.FontSize(12).AlignLeft();
});
// Page Break
column.Item().PageBreak();
// Additional Photos Section
column.Item().Table(table =>
{
column.Spacing(0);
table.ColumnsDefinition(columns =>
{
columns.RelativeColumn(1);
columns.RelativeColumn(1);
});
table.Cell().Element(CellStyle).Height(150);
table.Cell().Element(CellStyle).Height(150);
table.Cell().Element(CellStyle).Text("Figure 5:").FontSize(12).AlignLeft();
table.Cell().Element(CellStyle).Text("Figure 6:").FontSize(12).AlignLeft();
table.Cell().Element(CellStyle).Height(150);
table.Cell().Element(CellStyle).Height(150);
table.Cell().Element(CellStyle).Text("Figure 7:").FontSize(12).AlignLeft();
table.Cell().Element(CellStyle).Text("Figure 8:").FontSize(12).AlignLeft();
});
// Note Section
column.Item()
.PaddingTop(10)
.PaddingBottom(20)
.Text("* If there are any event observe at the current station it is compulsory to add optional photo with description (figure 5 to figure 8)")
.Bold()
.FontSize(10)
.AlignLeft();
// Signature Section
column.Item().Table(table =>
{
table.ColumnsDefinition(columns =>
{
columns.RelativeColumn(2);
columns.RelativeColumn(1);
columns.RelativeColumn(2);
columns.RelativeColumn(1);
columns.RelativeColumn(1);
});
table.Cell().RowSpan(2).Element(CellStyle).Text("REPORTED BY :").Bold().FontSize(12);
table.Cell().Element(CellStyle).Text("Signature").FontSize(12);
table.Cell().Element(CellStyle).Text("");
table.Cell().Element(CellStyle).Text("Date").FontSize(12);
table.Cell().Element(CellStyle).Text("");
table.Cell().Element(CellStyle).Text("Designation").FontSize(12);
table.Cell().ColumnSpan(3).Element(CellStyle).Text("");
table.Cell().RowSpan(2).Element(CellStyle).Text("CHECKED BY :").Bold().FontSize(12);
table.Cell().Element(CellStyle).Text("Signature").FontSize(12);
table.Cell().Element(CellStyle).Text("");
table.Cell().Element(CellStyle).Text("Date").FontSize(12);
table.Cell().Element(CellStyle).Text("");
table.Cell().Element(CellStyle).Text("Designation").FontSize(12);
table.Cell().ColumnSpan(3).Element(CellStyle).Text("");
table.Cell().RowSpan(2).Element(CellStyle).Text("VERIFIED BY :").Bold().FontSize(12);
table.Cell().Element(CellStyle).Text("Signature").FontSize(12);
table.Cell().Element(CellStyle).Text("");
table.Cell().Element(CellStyle).Text("Date").FontSize(12);
table.Cell().Element(CellStyle).Text("");
table.Cell().Element(CellStyle).Text("Designation").FontSize(12);
table.Cell().ColumnSpan(3).Element(CellStyle).Text("");
});
});
// Footer Section
page.Footer().AlignCenter().Text(text =>
{
text.Span("Page ");
text.CurrentPageNumber();
text.Span(" of ");
text.TotalPages();
});
static IContainer CellStyle(IContainer container) => container.Border(0.5f).Padding(5);
});
}
}
}