Deploy Ladill Frontdesk / deploy (push) Has been cancelled
Pro includes 5,000 email and 5,000 SMS host alerts per month with hard monthly caps; Enterprise is unlimited. Custom badge templates are Enterprise-only, and plan benefit copy matches the new limits.
124 lines
4.3 KiB
PHP
124 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Frontdesk;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Controllers\Frontdesk\Concerns\RequiresPlanFeature;
|
|
use App\Http\Controllers\Frontdesk\Concerns\ScopesToAccount;
|
|
use App\Models\Visit;
|
|
use App\Services\Frontdesk\BadgeRenderService;
|
|
use App\Services\Frontdesk\FrontdeskPermissions;
|
|
use App\Services\Printers\PrinterManager;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
|
|
class BadgeController extends Controller
|
|
{
|
|
use RequiresPlanFeature;
|
|
use ScopesToAccount;
|
|
|
|
private const FEATURE = 'custom_badge_templates';
|
|
|
|
public function editTemplate(Request $request): View
|
|
{
|
|
$this->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',
|
|
]);
|
|
}
|
|
}
|