Files
ladill-frontdesk/app/Http/Controllers/Frontdesk/ComplianceController.php
T
isaaccladandCursor 9e2d79936c
Deploy Ladill Frontdesk / deploy (push) Failing after 35s
Test / test (push) Failing after 2m45s
Initial Ladill Frontdesk release with deploy pipeline.
Visitor management app with SSO, kiosk, badges, reports, and Gitea CI deploy to frontdesk.ladill.com.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 20:37:15 +00:00

140 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers\Frontdesk;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Frontdesk\Concerns\ScopesToAccount;
use App\Models\AuditLog;
use App\Models\Visit;
use App\Models\Visitor;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ComplianceController extends Controller
{
use ScopesToAccount;
public function index(Request $request): View
{
$this->authorizeAbility($request, 'compliance.restore');
$organization = $this->organization($request);
$owner = $this->ownerRef($request);
$deletedVisitors = Visitor::owned($owner)
->onlyTrashed()
->where('organization_id', $organization->id)
->latest('deleted_at')
->limit(25)
->get();
$deletedVisits = Visit::owned($owner)
->onlyTrashed()
->where('organization_id', $organization->id)
->with('visitor')
->latest('deleted_at')
->limit(25)
->get();
return view('frontdesk.compliance.recovery', compact('deletedVisitors', 'deletedVisits', 'organization'));
}
public function restoreVisitor(Request $request, int $visitorId): RedirectResponse
{
$this->authorizeAbility($request, 'compliance.restore');
$organization = $this->organization($request);
$visitor = Visitor::owned($this->ownerRef($request))
->onlyTrashed()
->where('organization_id', $organization->id)
->findOrFail($visitorId);
$visitor->restore();
AuditLog::record(
$this->ownerRef($request),
'visitor.restored',
$organization->id,
$this->ownerRef($request),
Visitor::class,
$visitor->id,
['full_name' => $visitor->full_name],
);
return back()->with('success', 'Visitor restored.');
}
public function restoreVisit(Request $request, int $visitId): RedirectResponse
{
$this->authorizeAbility($request, 'compliance.restore');
$organization = $this->organization($request);
$visit = Visit::owned($this->ownerRef($request))
->onlyTrashed()
->where('organization_id', $organization->id)
->findOrFail($visitId);
$visit->restore();
AuditLog::record(
$this->ownerRef($request),
'visit.restored',
$organization->id,
$this->ownerRef($request),
Visit::class,
$visit->id,
['visitor_id' => $visit->visitor_id],
);
return back()->with('success', 'Visit restored.');
}
public function destroyVisitor(Request $request, Visitor $visitor): RedirectResponse
{
$this->authorizeAbility($request, 'visitors.manage');
$this->authorizeOwner($request, $visitor);
$organization = $this->organization($request);
$visitor->delete();
AuditLog::record(
$this->ownerRef($request),
'visitor.deleted',
$organization->id,
$this->ownerRef($request),
Visitor::class,
$visitor->id,
['full_name' => $visitor->full_name],
);
return redirect()
->route('frontdesk.visitors.index')
->with('success', 'Visitor archived.');
}
public function destroyVisit(Request $request, Visit $visit): RedirectResponse
{
$this->authorizeAbility($request, 'visits.manage');
$this->authorizeOwner($request, $visit);
$organization = $this->organization($request);
abort_if($visit->isInside(), 422, 'Check out the visitor before archiving the visit.');
$visit->delete();
AuditLog::record(
$this->ownerRef($request),
'visit.deleted',
$organization->id,
$this->ownerRef($request),
Visit::class,
$visit->id,
['visitor_id' => $visit->visitor_id],
);
return redirect()
->route('frontdesk.visits.index')
->with('success', 'Visit archived.');
}
}