From 526acc406b81598d3d86ee1aa05b36333d01a97e Mon Sep 17 00:00:00 2001 From: misya Date: Fri, 28 Mar 2025 10:31:41 +0800 Subject: [PATCH] improvised tarball report, and tarball pdf --- Areas/MMS/Controllers/MarineController.cs | 25 +- Areas/MMS/Models/PDFGenerator/TarBallPDF.cs | 310 ++++++++++++++++---- Areas/MMS/Views/Marine/TarBallForm.cshtml | 222 ++++++-------- Controllers/API/MarineAPI.cs | 11 + Program.cs | 4 + Views/Shared/_Layout.cshtml | 2 +- document.pdf | Bin 0 -> 7767 bytes 7 files changed, 380 insertions(+), 194 deletions(-) create mode 100644 Controllers/API/MarineAPI.cs create mode 100644 document.pdf diff --git a/Areas/MMS/Controllers/MarineController.cs b/Areas/MMS/Controllers/MarineController.cs index 0021d97..c3d1fe2 100644 --- a/Areas/MMS/Controllers/MarineController.cs +++ b/Areas/MMS/Controllers/MarineController.cs @@ -26,14 +26,35 @@ namespace PSTW_CentralSystem.Areas.MMS.Controllers { var document = new TarBallPDF(); var pdf = document.GeneratePdf(); - return File(pdf, "application/pdf", "TarBallReport.pdf"); + var fileName = $"TarBallReport_{DateTime.Now:yyyyMMdd_HHmmss}.pdf"; + return File(pdf, "application/pdf", fileName); } catch (Exception ex) { // Log the error (use a logger if configured) Console.WriteLine(ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while generating the PDF."); + return StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while generating the PDF. "+ex.Message); } } + + public IActionResult ViewPDF() + { + try + { + // Generate the PDF document + var document = new TarBallPDF(); + var pdf = document.GeneratePdf(); + + // Return the PDF for inline viewing + return File(pdf, "application/pdf"); + } + catch (Exception ex) + { + // Log the error (use a logger if configured) + Console.WriteLine(ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError, "An error occurred while viewing the PDF. " + ex.Message); + } + } + } } diff --git a/Areas/MMS/Models/PDFGenerator/TarBallPDF.cs b/Areas/MMS/Models/PDFGenerator/TarBallPDF.cs index ad1aa45..e79fa8f 100644 --- a/Areas/MMS/Models/PDFGenerator/TarBallPDF.cs +++ b/Areas/MMS/Models/PDFGenerator/TarBallPDF.cs @@ -1,81 +1,277 @@ -using Microsoft.AspNetCore.Mvc; -using QuestPDF.Fluent; -using QuestPDF.Helpers; +using QuestPDF.Fluent; using QuestPDF.Infrastructure; +using QuestPDF.Helpers; +using Microsoft.EntityFrameworkCore.Metadata.Internal; public class TarBallPDF : IDocument { - public DocumentMetadata GetMetadata() => DocumentMetadata.Default; + public DocumentMetadata GetMetadata() => new DocumentMetadata + { + Title = "TarBall Sampling Form", + Author = "PAKAR SCIENO TW Integrated Environmental Solutions", + Subject = "Environmental Survey and Observations" + }; public void Compose(IDocumentContainer container) { - try + container.Page(page => { - 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 => { - // Page Setup - page.Size(PageSizes.A4); - page.Margin(2, Unit.Centimetre); - page.DefaultTextStyle(x => x.FontFamily("Arial").FontSize(12)); - - // Header Section - page.Header().Column(column => + row.RelativeItem(1).Element(CellStyle).Column(column => { - column.Spacing(10); - - // Logo and Title - column.Item().AlignCenter().Text("Company Logo Placeholder").FontSize(12).Italic(); - - // Document Details - column.Item().Text("Document: F-MM06").FontSize(14); - column.Item().Text("Effective Date: 1 April 2025").FontSize(14); - column.Item().Text("Revision No.: 02").FontSize(14); + column.Item() + .AlignMiddle() // Ensures vertical centering + .AlignCenter() // Ensures horizontal centering + .Text("Logo Placeholder"); // Placeholder for the logo }); - // Content Section - page.Content().Column(column => + row.RelativeItem(1).Element(CellStyle) + .AlignMiddle() // Ensures vertical centering + .AlignCenter() // Ensures horizontal centering + .Text("TARBALL SAMPLING FORM") + .FontSize(16) + .FontColor("#4B0082"); + + row.RelativeItem(1).Column(column => { - column.Spacing(20); + column.Spacing(0); // Adds consistent spacing between rows - // Table Section - column.Item().Table(table => + // Document Row + column.Item().Row(innerRow => { - table.ColumnsDefinition(columns => - { - columns.RelativeColumn(1); // Column 1 - columns.RelativeColumn(2); // Column 2 - }); - - table.Cell().Text("STATE").Bold(); - table.Cell().Text("Your State Data Here"); - - table.Cell().Text("STATION ID").Bold(); - table.Cell().Text("Your Station ID Here"); + 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(); }); - // Survey Findings Section - column.Item().Text("SURVEY FINDING").Bold().FontSize(14); - column.Item().Text("Tar Ball ☐ Yes ☐ No"); - column.Item().Text("If YES, Tar Ball falls under the classification of:"); - column.Item().Text("☐ Sand ☐ Non-sandy ☐ Coquina"); }); - // Footer Section - page.Footer().AlignCenter().Text(x => + // Define styles + static IContainer CellStyle(IContainer container) + => container.Border(0.5f).Padding(5); // Retains padding for text + }); + + // Content Section + page.Content().Column(column => + { + // Observations Table + column.Item().Element(container => { - x.Span("Page "); - x.CurrentPageNumber(); - x.Span(" of "); - x.TotalPages(); + container + .PaddingTop(20) // Adds space above the text + .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); // Label/Header column + columns.RelativeColumn(3); // Data Entry column + }); + + // Table Rows + table.Cell() + .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("STATE") + .Bold(); + table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry + + table.Cell() + .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("STATION ID") + .Bold(); + table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry + + table.Cell() + .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("LOCATION") + .Bold(); + table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry + + table.Cell() + .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("TARBALL SURVEY LOCATION LONGITUDE & LATITUDE") + .Bold(); + table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry + + table.Cell() + .Background(Colors.Grey.Lighten2).Element(CellStyle).Text("DATE / TIME") + .Bold(); + table.Cell().Element(CellStyle).Text(""); // Empty cell for data entry + }); + + column.Spacing(3); + + // Survey Findings + column.Item() + .PaddingTop(10) // Adds space above the text + .PaddingBottom(10) + .Text("SURVEY FINDING:") + .Bold().FontSize(12); + column.Item() + .PaddingBottom(10) + .Text("Tar Ball: [☐] YES [☐] NO").FontSize(10); + column.Item() + .PaddingBottom(10) + .Text("If YES, Tar Ball falls under the classification of:").FontSize(10); + column.Item() + .PaddingBottom(10) + .Text("[☐] Sand [☐] Non-sandy [☐] Coquina").FontSize(10); + column.Item() + .PaddingBottom(10) + .Text("*tick wherever applicable"); + + // Photos Section Title + column.Item() + .PaddingBottom(5) + .Text("PHOTOGRAPHS OF SAMPLING") + .AlignCenter() // Ensures horizontal centering + .Bold() + .FontSize(14); + + // Table for Photos with Existing Heights + column.Item().Table(table => + { + column.Spacing(0); // No extra spacing between rows + + table.ColumnsDefinition(columns => + { + columns.RelativeColumn(1); // First column + columns.RelativeColumn(1); // Second column + }); + + // For pictures + table.Cell().Element(CellStyle).Height(150); + table.Cell().Element(CellStyle).Height(150); + + 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(); + + table.Cell().Element(CellStyle).Height(150); + table.Cell().Element(CellStyle).Height(150); + + 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() + .PaddingBottom(5) + .AlignCenter(); // Ensures horizontal centering + + // Table for Additional Photos + column.Item().Table(table => + { + column.Spacing(0); // No extra spacing between rows + + table.ColumnsDefinition(columns => + { + columns.RelativeColumn(1); // First column + columns.RelativeColumn(1); // Second column + }); + + // Row 1: Empty spaces for pictures + table.Cell().Element(CellStyle).Height(150); + table.Cell().Element(CellStyle).Height(150); + + // Row 2: Labels for the pictures + table.Cell().Element(CellStyle).Text("Figure 5:").FontSize(12).AlignLeft(); + table.Cell().Element(CellStyle).Text("Figure 6:").FontSize(12).AlignLeft(); + + // Row 3: Empty spaces for pictures + table.Cell().Element(CellStyle).Height(150); + table.Cell().Element(CellStyle).Height(150); + + // Row 4: Labels for the pictures + 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)") + .FontSize(10) + .AlignLeft(); + + // Signature Section + column.Item().Table(table => + { + //define how many columns the table has + table.ColumnsDefinition(columns => + { + columns.RelativeColumn(2); // Label column + columns.RelativeColumn(1); // Signature column + columns.RelativeColumn(2); //empty + columns.RelativeColumn(1); // Date column + columns.RelativeColumn(1); //empty + }); + + // Signature Rows + 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("").FontSize(12); + table.Cell().Element(CellStyle).Text("Date").FontSize(12); + table.Cell().Element(CellStyle).Text("").FontSize(12); + + table.Cell().Element(CellStyle).Text("Designation").FontSize(12); + table.Cell().ColumnSpan(3).Element(CellStyle).Text("").FontSize(12); + + 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("").FontSize(12); + table.Cell().Element(CellStyle).Text("Date").FontSize(12); + table.Cell().Element(CellStyle).Text("").FontSize(12); + + table.Cell().Element(CellStyle).Text("Designation").FontSize(12); + table.Cell().ColumnSpan(3).Element(CellStyle).Text("").FontSize(12); + + 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("").FontSize(12); + table.Cell().Element(CellStyle).Text("Date").FontSize(12); + table.Cell().Element(CellStyle).Text("").FontSize(12); + + table.Cell().Element(CellStyle).Text("Designation").FontSize(12); + table.Cell().ColumnSpan(3).Element(CellStyle).Text("").FontSize(12); }); }); - } - catch (Exception ex) - { - // Log the exception (you can use any logging framework or method you prefer) - Console.WriteLine($"Error generating PDF: {ex.Message}"); - } + + // 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); + }); } } -; - diff --git a/Areas/MMS/Views/Marine/TarBallForm.cshtml b/Areas/MMS/Views/Marine/TarBallForm.cshtml index be03193..5c680a4 100644 --- a/Areas/MMS/Views/Marine/TarBallForm.cshtml +++ b/Areas/MMS/Views/Marine/TarBallForm.cshtml @@ -1,5 +1,5 @@ @{ - ViewData["Title"] = "Tar Ball Sampling Form"; + ViewData["Title"] = "Tarball Report"; Layout = "~/Views/Shared/_Layout.cshtml"; } @@ -8,13 +8,9 @@ - <h3>Tarball Sampling Form</h3> + <h3>Tarball Report</h3> - + -
- Download PDF -
- - - - - - - - - - - - - - - - - -
- - Company Logo - -

TARBALL SAMPLING FORM

-
Document: F-MM06
Effective Date: 1 April 2025
Revision No.: 02
- -

Please be informed that we have observed the following conditions:

+

Month

+ + +

Year

+
-
+ +
- - - + + + + + + - - - - - - - - - - - - - - + + + + +
-

STATE

-
-

-
???DateStationApproval StatusPDF
-

STATION ID

-
-

-
-

LOCATION

-
-

-
-

TARBALL SURVEY LOCATION LONGITUDE & LATITUDE

-
-

-
-

DATE / TIME

-
-

-
+ + + + View PDF + Download PDF +
-
-

SURVEY FINDING:

-

Tar Ball

- - - - -

-

If YES, Tar Ball falls under the Classification of:

- - - - - - -

-

*Tick wherever applicable

-
- -
+
- \ No newline at end of file + + +@section Scripts { + +} \ No newline at end of file diff --git a/Controllers/API/MarineAPI.cs b/Controllers/API/MarineAPI.cs new file mode 100644 index 0000000..df7ef37 --- /dev/null +++ b/Controllers/API/MarineAPI.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace PSTW_CentralSystem.Controllers.API +{ + [Route("api/[controller]")] + [ApiController] + public class MarineAPI : ControllerBase + { + } +} diff --git a/Program.cs b/Program.cs index 27426ce..3adf3ba 100644 --- a/Program.cs +++ b/Program.cs @@ -5,6 +5,8 @@ using PSTW_CentralSystem.CustomPolicy; using PSTW_CentralSystem.DBContext; using PSTW_CentralSystem.Models; using Serilog; +using QuestPDF; +using QuestPDF.Infrastructure; internal class Program { @@ -12,6 +14,8 @@ internal class Program { var builder = WebApplication.CreateBuilder(args); var centralConnectionString = builder.Configuration.GetConnectionString("CentralConnnection"); + Settings.License = LicenseType.Community; + //var inventoryConnectionString = builder.Configuration.GetConnectionString("InventoryConnection"); // Add services to the container. diff --git a/Views/Shared/_Layout.cshtml b/Views/Shared/_Layout.cshtml index 830329e..c028ddf 100644 --- a/Views/Shared/_Layout.cshtml +++ b/Views/Shared/_Layout.cshtml @@ -514,7 +514,7 @@ diff --git a/document.pdf b/document.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b12d02434911f8b21cc594660c655757cea62b9e GIT binary patch literal 7767 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 NK}gux