First git push to github
This commit is contained in:
@@ -0,0 +1,308 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$basePath = realpath(__DIR__ . '/..');
|
||||
require_once $basePath . '/tcpdf/tcpdf.php';
|
||||
|
||||
// ======================
|
||||
// Print Permit Facts PDF
|
||||
// ======================
|
||||
|
||||
class Print_PermitFactsPDF {
|
||||
|
||||
// Variables.
|
||||
|
||||
private $output_type = "string";
|
||||
|
||||
// ==================
|
||||
// Class Constructor.
|
||||
// ==================
|
||||
|
||||
public function __construct($output_type = "normal") {
|
||||
|
||||
|
||||
date_default_timezone_set("America/New_York");
|
||||
|
||||
$this->output_type = $output_type;
|
||||
}
|
||||
|
||||
// ================
|
||||
// Print the Report
|
||||
// ================
|
||||
|
||||
public function print($permitfacts, $subscription, $exportjob_base_directory, $exportjob_file_name) {
|
||||
|
||||
$report = new PermitFacts_Print();
|
||||
|
||||
$exportjob_base_directory = str_replace('../exports/', './exports/', $exportjob_base_directory);
|
||||
|
||||
$report->subscription_serial = $subscription[0]['subscription_serial'];
|
||||
$report->subscription_full_title = $subscription[0]['subscription_full_title'];
|
||||
$report->exportjob_file_name = $exportjob_file_name;
|
||||
$report->exportjob_base_directory = $exportjob_base_directory;
|
||||
$report->permitfacts_array = $permitfacts;
|
||||
$report->output_type = $this->output_type;
|
||||
|
||||
$report->render();
|
||||
|
||||
return $exportjob_file_name;
|
||||
}
|
||||
}
|
||||
|
||||
// ==========================
|
||||
// Class to Generate the .pdf
|
||||
// ==========================
|
||||
|
||||
class PermitFacts_Print extends TCPDF {
|
||||
|
||||
// Variables
|
||||
|
||||
public $subscription_serial = 0;
|
||||
public $permitfacts_array = array();
|
||||
public $subscription_full_title = array();
|
||||
public $exportjob_file_name = "";
|
||||
public $exportjob_base_directory = "";
|
||||
public $report_header_title = "";
|
||||
public $first_page = true;
|
||||
public $output_type = "normal";
|
||||
|
||||
// =================
|
||||
// Render the Report
|
||||
// =================
|
||||
|
||||
public function render() {
|
||||
|
||||
// Set report defaults
|
||||
$this->report_header_title = $this->subscription_full_title;
|
||||
$this->title = $this->report_header_title;
|
||||
|
||||
$this->SetFont("Calibri");
|
||||
$this->SetMargins(2, 26, 10);
|
||||
$this->SetHeaderMargin(10);
|
||||
$this->SetFooterMargin(10);
|
||||
$this->setCellPaddings(0, 0, 0, 0);
|
||||
$this->setCellMargins(2, 0, 0, 0);
|
||||
|
||||
$card = function (float $x, float $y, float $w, float $h, array $d) {
|
||||
|
||||
// Card background + border
|
||||
$this->SetDrawColor(210, 210, 210);
|
||||
$this->SetFillColor(250, 250, 250);
|
||||
$this->Rect($x, $y, $w, $h, 'DF');
|
||||
|
||||
// Header bar
|
||||
$headerH = 10;
|
||||
$this->SetFillColor(30, 93, 168); // Bootstrap-ish primary
|
||||
$this->Rect($x, $y, $w, $headerH, 'F');
|
||||
|
||||
// Header text
|
||||
$this->SetTextColor(255, 255, 255);
|
||||
$this->SetFont('helvetica', 'B', 11);
|
||||
$this->SetXY($x + 3, $y + 2.5);
|
||||
$this->Cell($w - 6, 0, "Project Name: {$d['permitfact_project_name']}", 0, 0, 'L', false);
|
||||
|
||||
// Body
|
||||
$this->SetTextColor(20, 20, 20);
|
||||
$this->SetFont('helvetica', '', 9);
|
||||
|
||||
$padX = 3;
|
||||
$padY = 3;
|
||||
|
||||
$curY = $y + $headerH + $padY;
|
||||
|
||||
$bodyX = $x + $padX;
|
||||
$bodyW = $w - ($padX * 2);
|
||||
|
||||
$colGap = 6;
|
||||
$colW = ($bodyW - $colGap) / 2;
|
||||
|
||||
$leftX = $bodyX;
|
||||
$rightX = $bodyX + $colW + $colGap;
|
||||
|
||||
$labelW = 22; // tweak to taste
|
||||
|
||||
$row2 = function (string $l1, string $v1, string $l2, string $v2) use (&$curY, $leftX, $rightX, $colW, $labelW) {
|
||||
$yStart = $curY;
|
||||
|
||||
// LEFT cell
|
||||
$this->SetXY($leftX, $yStart);
|
||||
$this->SetFont('helvetica', 'B', 9);
|
||||
$this->Cell($labelW, 0, $l1, 0, 0, 'L');
|
||||
$this->Cell(2, 0, '', 0, 0); // spacer
|
||||
$this->SetFont('helvetica', '', 9);
|
||||
$this->MultiCell($colW - $labelW, 0, $v1, 0, 'L', false, 1);
|
||||
$yAfterLeft = $this->GetY();
|
||||
|
||||
// RIGHT cell (reset to same starting Y)
|
||||
$this->SetXY($rightX, $yStart);
|
||||
$this->SetFont('helvetica', 'B', 9);
|
||||
$this->Cell($labelW, 0, $l2, 0, 0, 'L');
|
||||
$this->SetFont('helvetica', '', 9);
|
||||
$this->MultiCell($colW - $labelW, 0, $v2, 0, 'L', false, 1);
|
||||
$yAfterRight = $this->GetY();
|
||||
|
||||
// Advance cursor to max height used
|
||||
$curY = max($yAfterLeft, $yAfterRight) + 1;
|
||||
};
|
||||
|
||||
// Two-column rows (swap these however you like)
|
||||
$row2('Permit Number: ', $d['permitfact_permit_number'], 'Permit Date:', $d['permitfact_permit_date']);
|
||||
$row2('Project Address: ', $d['permitfact_project_address'], 'Project Type:', $d['permitfact_project_type']);
|
||||
$row2('City/State/Zip:', $d['permitfact_project_city_state_zip'], 'Work Type:', $d['permitfact_work_type']);
|
||||
$row2('Project County:', $d['permitfact_county_name'], 'Building Type:', $d['permitfact_building_type']);
|
||||
$row2('', '', 'Value:', $d['permitfact_value']);
|
||||
$row2('Company:', $d['permitfact_company'], 'Entry Date:', $d['permitfact_entry_date']);
|
||||
$row2('Address:', $d['permitfact_company_address'], 'Square Foot: ', $d['permitfact_size']);
|
||||
$row2('City/State/Zip:', $d['permitfact_company_city_state_zip'], '', '');
|
||||
$row2('Company Phone:', $d['permitfact_company_phone'], '', '');
|
||||
$row2('', '', '', '');
|
||||
$row2('Owner:', $d['permitfact_owner_name'], '', '');
|
||||
$row2('Owner Phone:', $d['permitfact_owner_phone'], '', '');
|
||||
};
|
||||
|
||||
// Get the data for the report
|
||||
|
||||
$permits = $this->permitfacts_array;
|
||||
|
||||
$this->AddPage('L', 'LETTER');
|
||||
|
||||
$marginL = 10;
|
||||
$marginT = 20; // below header area
|
||||
$pageW = $this->getPageWidth();
|
||||
$pageH = $this->getPageHeight();
|
||||
|
||||
$usableW = $pageW - ($marginL * 2);
|
||||
$usableH = $pageH - $marginT - 12; // leave footer space
|
||||
|
||||
$gapY = 6;
|
||||
|
||||
// Two rows per page
|
||||
$cardW = $usableW;
|
||||
$cardH = ($usableH - $gapY) / 2;
|
||||
|
||||
$index = 0;
|
||||
|
||||
foreach ($permits as $permit) {
|
||||
|
||||
// Add a new page every 2 cards
|
||||
if ($index > 0 && $index % 2 === 0) {
|
||||
$this->AddPage('L', 'LETTER');
|
||||
}
|
||||
|
||||
$slot = $index % 2;
|
||||
|
||||
$x = $marginL;
|
||||
$y = $marginT + ($slot * ($cardH + $gapY));
|
||||
|
||||
// Map your XML fields to the card placeholders (use verbose)
|
||||
$valueRaw = trim((string) $permit['permitfact_value']);
|
||||
$value = ($valueRaw !== '') ? '$' . number_format((float) $valueRaw, 2) : '';
|
||||
|
||||
$d = [
|
||||
// Left Side of Card
|
||||
'permitfact_serial' => trim((string) $permit['permitfact_serial']),
|
||||
'permitfact_project_name' => trim((string) $permit['permitfact_project_name']),
|
||||
'permitfact_permit_number' => trim((string) $permit['permitfact_permit_number']),
|
||||
'permitfact_project_address' => trim((string) $permit['permitfact_project_address']),
|
||||
'permitfact_project_city_state_zip' => trim((string) $permit['project_city_verbose']) . ', ' . trim((string) $permit['permitfact_project_state']) . ' ' . trim((string) $permit['permitfact_project_zip']),
|
||||
'permitfact_county_name' => trim((string) $permit['permitfact_county_name_verbose']),
|
||||
'permitfact_company' => trim((string) $permit['permitfact_company']),
|
||||
'permitfact_company_address' => trim((string) $permit['permitfact_address']),
|
||||
'permitfact_company_city_state_zip' => trim((string) $permit['permitfact_city_verbose']) . ', ' . trim((string) $permit['permitfact_state']) . ' ' . trim((string) $permit['permitfact_zip']),
|
||||
'permitfact_company_phone' => $this->formatPhoneNumber(trim((string) $permit['permitfact_phone'])),
|
||||
'permitfact_owner_name' => trim((string) $permit['permitfact_owner_name']),
|
||||
'permitfact_owner_phone' => $this->formatPhoneNumber(trim((string) $permit['permitfact_owner_phone'])),
|
||||
// Right Side of Card
|
||||
'permitfact_permit_date' => trim((string) $permit['permitfact_permit_date_verbose']),
|
||||
'permitfact_entry_date' => trim((string) $permit['permitfact_entry_date_verbose']),
|
||||
'permitfact_project_type' => trim((string) $permit['permitfact_project_type_verbose']),
|
||||
'permitfact_value' => $value,
|
||||
'permitfact_building_type' => trim((string) $permit['permitfact_building_type_verbose']),
|
||||
'permitfact_work_type' => trim((string) $permit['permitfact_work_type_verbose']),
|
||||
'permitfact_size' => trim((string) $permit['permitfact_size']),
|
||||
];
|
||||
|
||||
$card($x, $y, $cardW, $cardH, $d);
|
||||
|
||||
$index++;
|
||||
}
|
||||
// -----------------
|
||||
// Render the Report
|
||||
// -----------------
|
||||
|
||||
$this->SetFont('helvetica', '', 9);
|
||||
|
||||
// --------------
|
||||
// Return the pdf
|
||||
// --------------
|
||||
while (ob_get_level() > 0) {
|
||||
ob_end_clean();
|
||||
}
|
||||
|
||||
$absPath = __DIR__ . "/../{$this->exportjob_base_directory}/{$this->exportjob_file_name}";
|
||||
|
||||
$this->Output($absPath, "F");
|
||||
|
||||
return $absPath;
|
||||
}
|
||||
|
||||
// ======
|
||||
// Header
|
||||
// ======
|
||||
|
||||
public function Header() {
|
||||
|
||||
$this->setCellPaddings(0, 0, 0, 0);
|
||||
$this->setCellMargins(2, 0, 0, 0);
|
||||
|
||||
$basePath = realpath(__DIR__ . '/..');
|
||||
|
||||
$this->Image($basePath . "/images/dec-international-logo.png", 250, 8, 20, 8);
|
||||
|
||||
$this->SetFont("Calibri", "B", 16);
|
||||
|
||||
$this->Cell(4, 0, "", 0, 0, "L");
|
||||
$this->Cell(0, 0, $this->report_header_title . " Report", 0, 0, "L");
|
||||
|
||||
$this->Ln(10);
|
||||
}
|
||||
|
||||
// ======
|
||||
// Footer
|
||||
// ======
|
||||
|
||||
public function Footer() {
|
||||
|
||||
$this->SetFont("Calibri ", "I", 8);
|
||||
|
||||
$X = $this->GetX();
|
||||
|
||||
$this->Cell(0, 10, "DEC International ", 0, false, "C");
|
||||
|
||||
$this->SetX($X);
|
||||
|
||||
$this->Cell(40, 10, "Page " . $this->getAliasNumPage() . "/" . $this->getAliasNbPages(), 0, false, "L");
|
||||
$this->Cell(0, 10, date("n/j/Y g:i A "), 0, false, "R"
|
||||
);
|
||||
}
|
||||
|
||||
// =======================
|
||||
// Format Raw Phone Number
|
||||
// =======================
|
||||
|
||||
public function formatPhoneNumber(string $phonenumber): string {
|
||||
|
||||
// Remove everything except digits
|
||||
$digits = preg_replace('/\D+/', '', $phonenumber);
|
||||
|
||||
// Handle leading country code (US)
|
||||
if (strlen($digits) === 11 && str_starts_with($digits, '1')) {
|
||||
$digits = substr($digits, 1);
|
||||
}
|
||||
|
||||
return substr($digits, 0, 3) . '-' . substr($digits, 3, 3) . '-' . substr($digits, 6, 4);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user