Files
api/modules/washcertificates/twc_spreadsheet_class.php
T
Jepp9350 ea6c65a7b8 Add Wash Certificate generator module.
This commit introduces the Wash Certificate generator, including template files, images, fonts, and outputs necessary for certificate generation. These assets and configurations support creating customized wash certificates effectively.
2025-01-10 15:20:26 +01:00

146 lines
6.2 KiB
PHP

<?php
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use setasign\Fpdi\Fpdi;
class WashCertificateGenerator
{
private string $template;
private string $department;
private string $color;
private string $colorBackground;
private array $signature;
private array $logo;
private Spreadsheet $spreadsheet;
private array $washPerformedAt;
public function __construct(string $template, string $department)
{
$this->template = $template;
$this->department = $department;
$this->color = '1488bc'; // Hex color code (Without the #)
$this->colorBackground = 'd9d9d9'; // Hex color code (Without the #)
$this->washPerformedAt = [
'hvidovre' => ['column' => 'A', 'row' => 21],
'taastrup' => ['column' => 'B', 'row' => 21],
'glostrup' => ['column' => 'C', 'row' => 21],
'køge' => ['column' => 'D', 'row' => 21],
'roskilde' => ['column' => 'E', 'row' => 21],
'aarhusC' => ['column' => 'F', 'row' => 21],
];
$this->signature = [
'path' => 'images/truckwash-underskrift.png',
'x' => 0,
'y' => 140,
'is-centered' => true,
'width' => 70,
];
$this->logo = [
'path' => 'images/truckwash-banner-png.png',
'x' => 0,
'y' => 20,
'is-centered' => true,
'width' => 80,
];
}
public function generateCertificate(string $outputPath, string $sealOrPlumNumber, string $regNumber, string $regNumberTrailer, string $carriedOutBy): void
{
$data = [
'sealOrPlumNumber' => $sealOrPlumNumber,
'regNumber' => $regNumber,
'regNumberTrailer' => $regNumberTrailer,
'carriedOutBy' => $carriedOutBy,
];
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(false);
$reader->setIncludeCharts(true);
$this->spreadsheet = $reader->load($this->template);
$activeWorksheet = $this->spreadsheet->getActiveSheet();
$activeWorksheet->setTitle('Wash Certificate');
$this->setCellValues($activeWorksheet, $data);
$this->setCellStyles($activeWorksheet);
$this->setPageSetup($activeWorksheet);
$this->exportToPdf($outputPath);
$this->addImagesToPdf($outputPath);
$this->spreadsheet->disconnectWorksheets();
unset($this->spreadsheet);
}
private function setCellValues($activeWorksheet, array $data): void
{
$activeWorksheet->setCellValue('A9', $data['sealOrPlumNumber']);
$activeWorksheet->setCellValue('B17', $data['regNumber']);
$activeWorksheet->setCellValue('B18', $data['regNumberTrailer']);
$activeWorksheet->setCellValue('F18', $data['carriedOutBy']);
$activeWorksheet->setCellValue($this->washPerformedAt[$this->department]['column'] . $this->washPerformedAt[$this->department]['row'], 'X');
}
private function setCellStyles($activeWorksheet): void
{
$activeWorksheet->getStyle($this->washPerformedAt[$this->department]['column'] . ($this->washPerformedAt[$this->department]['row'] + 1))->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($this->color);
$activeWorksheet->getStyle('A9')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($this->colorBackground);
$activeWorksheet->getStyle('B17')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($this->colorBackground);
$activeWorksheet->getStyle('B18')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($this->colorBackground);
$activeWorksheet->getStyle('F18')->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($this->colorBackground);
foreach ( $this->washPerformedAt as $key => $value ) {
if ($key !== $this->department) {
$activeWorksheet->getStyle($value['column'] . ($value['row'] + 1))->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($this->colorBackground);
}
}
// Make sure the cells 32A:32F has the font size 11
$activeWorksheet->getStyle('A32:F32')->getFont()->setSize(11);
// Make sure the cells 35A:35F has the font size 11
$activeWorksheet->getStyle('A35:F35')->getFont()->setSize(11);
}
private function setPageSetup($activeWorksheet): void
{
$activeWorksheet->getPageSetup()->setPaperSize(PageSetup::PAPERSIZE_A4);
$activeWorksheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_PORTRAIT);
$activeWorksheet->getPageSetup()->setFitToWidth(1);
$activeWorksheet->getPageSetup()->setFitToHeight(0);
$activeWorksheet->getPageMargins()->setTop(0.75);
$activeWorksheet->getPageMargins()->setRight(0.75);
$activeWorksheet->getPageMargins()->setLeft(0.75);
$activeWorksheet->getPageMargins()->setBottom(0.75);
$activeWorksheet->getPageMargins()->setHeader(0.3);
$activeWorksheet->getPageMargins()->setFooter(0.3);
}
private function exportToPdf(string $outputPath): void
{
$writer = IOFactory::createWriter($this->spreadsheet, 'Mpdf');
$writer->setIncludeCharts(false);
$writer->setPreCalculateFormulas(true);
$writer->save($outputPath);
}
private function addImagesToPdf(string $outputPath): void
{
$logo = $this->logo;
$signature = $this->signature;
// Center the logo and signature
$logo['x'] = $logo['is-centered'] ? (210 - $logo['width']) / 2 : $logo['x'];
$signature['x'] = $signature['is-centered'] ? (210 - $signature['width']) / 2 : $signature['x'];
$pdf = new Fpdi();
$pdf->AddPage();
$pdf->setSourceFile($outputPath);
$tplIdx = $pdf->importPage(1);
$pdf->useTemplate($tplIdx, 0, 0, 210);
$pdf->Image($logo['path'], $logo['x'], $logo['y'], $logo['width']);
$pdf->Image($signature['path'], $signature['x'], $signature['y'], $signature['width']);
$pdf->Output($outputPath, 'F');
}
}