Visitor management app with SSO, kiosk, badges, reports, and Gitea CI deploy to frontdesk.ladill.com. Co-authored-by: Cursor <cursoragent@cursor.com>
140 lines
4.1 KiB
PHP
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.');
|
|
}
|
|
}
|