Initial Ladill Frontdesk release with deploy pipeline.
Deploy Ladill Frontdesk / deploy (push) Failing after 35s
Test / test (push) Failing after 2m45s

Visitor management app with SSO, kiosk, badges, reports, and Gitea CI deploy to frontdesk.ladill.com.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-27 20:37:15 +00:00
co-authored by Cursor
commit 9e2d79936c
284 changed files with 29134 additions and 0 deletions
@@ -0,0 +1,100 @@
<?php
namespace App\Http\Controllers\Frontdesk;
use App\Http\Controllers\Controller;
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 ScopesToAccount;
public function editTemplate(Request $request): View
{
$this->authorizeAbility($request, 'settings.view');
$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');
$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',
]);
}
}