authorizeAbility($request, 'settings.view'); if ($upgrade = $this->proFeatureUpgradeView( $request, self::FEATURE, 'Custom badge templates', 'Custom badge layouts and branding are included with Frontdesk Enterprise.', )) { return $upgrade; } $organization = $this->organization($request); $canManage = app(FrontdeskPermissions::class)->isAdmin($this->member($request)); return view('frontdesk.badges.template', [ 'organization' => $organization, 'canManage' => $canManage, 'template' => array_merge( config('frontdesk.default_badge_template', []), $organization->settings['badge_template'] ?? [], ), 'sampleVisit' => Visit::owned($this->ownerRef($request)) ->where('organization_id', $organization->id) ->where('status', Visit::STATUS_CHECKED_IN) ->with(['visitor', 'host']) ->latest('checked_in_at') ->first(), ]); } public function updateTemplate(Request $request): RedirectResponse { $this->authorizeAbility($request, 'settings.manage'); if ($deny = $this->denyWithoutFeature( $request, self::FEATURE, 'Custom badge templates require Frontdesk Enterprise.', )) { return $deny; } $organization = $this->organization($request); $validated = $request->validate([ 'show_photo' => ['boolean'], 'show_qr' => ['boolean'], 'show_host' => ['boolean'], 'show_company' => ['boolean'], 'show_type' => ['boolean'], 'primary_color' => ['nullable', 'string', 'max:7'], 'footer_text' => ['nullable', 'string', 'max:255'], ]); $settings = $organization->settings ?? []; $settings['badge_template'] = [ 'show_photo' => $request->boolean('show_photo'), 'show_qr' => $request->boolean('show_qr'), 'show_host' => $request->boolean('show_host'), 'show_company' => $request->boolean('show_company'), 'show_type' => $request->boolean('show_type'), 'primary_color' => $validated['primary_color'] ?? '#0d9488', 'footer_text' => $validated['footer_text'] ?? '', ]; $organization->update(['settings' => $settings]); return back()->with('success', 'Badge template saved.'); } public function preview(Request $request, Visit $visit, BadgeRenderService $badges): View { $this->authorizeAbility($request, 'visits.view'); $this->authorizeOwner($request, $visit); $visit->load(['visitor', 'host', 'organization']); return view('frontdesk.badges.render', [ 'visit' => $visit, 'template' => $badges->templateFor($visit->organization), 'photoUrl' => $badges->photoUrl($visit), 'qrSvg' => $visit->qr_token ? app(\App\Services\Frontdesk\QrCodeService::class)->svg($visit, 120) : null, 'autoPrint' => false, 'preview' => true, ]); } public function print(Request $request, Visit $visit, PrinterManager $printers) { $this->authorizeAbility($request, 'visits.view'); $this->authorizeOwner($request, $visit); $rendered = $printers->renderBadge($visit, $request->query('driver')); return response($rendered['content'], 200, [ 'Content-Type' => 'text/html; charset=UTF-8', ]); } }