Files
isaacclad b6f229ab9a
Deploy Ladill Frontdesk / deploy (push) Has been cancelled
Tighten Pro alert caps and move custom badges to Enterprise.
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.
2026-07-16 08:37:06 +00:00

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',
]);
}
}