load(['client', 'vehicle', 'master', 'works.master', 'parts', 'payments']); $subcontractJobs = \App\Models\Tenant\SubcontractJob::withoutGlobalScope(\App\Models\Scopes\TenantScope::class) ->where('work_order_id', $wo->id) ->where('company_id', $wo->company_id) ->with('subcontractor') ->get(); $company = $wo->company ?: \App\Models\Central\Company::find($wo->company_id); $themeColor = $company?->settings['theme_color'] ?? '#3B82F6'; $currency = $company?->settings['currency'] ?? 'MDL'; $worksTotal = (float) $wo->works->sum('total'); $partsTotal = (float) $wo->parts->sum('total'); $paid = (float) $wo->payments->sum('amount'); $balance = max(0, (float) $wo->total - $paid); // Embed logo as data URI (DomPDF can't fetch external URLs reliably). $logoData = null; if ($company && ($logoMedia = $company->getFirstMedia('logo'))) { try { $path = $logoMedia->getPath(); if (file_exists($path)) { $mime = mime_content_type($path) ?: 'image/png'; $logoData = 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($path)); } } catch (\Throwable $e) { $logoData = null; } } $html = view('pdf.work-order', [ 'wo' => $wo, 'company' => $company, 'themeColor' => $themeColor, 'currency' => $currency, 'worksTotal' => $worksTotal, 'partsTotal' => $partsTotal, 'paid' => $paid, 'balance' => $balance, 'logoData' => $logoData, 'subcontractJobs' => $subcontractJobs, ])->render(); // DejaVu Sans lacks U+0219 (ș) and U+021B (ț) — normalize to cedilla // variants (U+015F ş, U+0163 ţ) which are visually identical and supported. $html = strtr($html, [ "\u{0219}" => "\u{015F}", "\u{0218}" => "\u{015E}", "\u{021B}" => "\u{0163}", "\u{021A}" => "\u{0162}", ]); return Pdf::loadHTML($html)->setPaper('A4'); } public function filename(WorkOrder $wo): string { return $wo->number . '-' . optional($wo->opened_at)->format('Ymd') . '.pdf'; } }