'boolean']; } public function organization(): BelongsTo { return $this->belongsTo(Organization::class, 'organization_id'); } public function branch(): BelongsTo { return $this->belongsTo(Branch::class, 'branch_id'); } public function host(): BelongsTo { return $this->belongsTo(Host::class, 'host_id'); } public function presence(): HasOne { return $this->hasOne(EmployeePresence::class, 'employee_id'); } protected static function booted(): void { static::creating(function (Employee $employee) { if (! $employee->qr_token) { $employee->qr_token = Str::random(32); } }); } public static function findByQrLookup(string $lookup, int $organizationId): ?self { $token = self::parseQrLookup($lookup); if ($token === null) { return null; } return self::query() ->where('organization_id', $organizationId) ->where('qr_token', $token) ->where('active', true) ->first(); } public static function parseQrLookup(string $lookup): ?string { $lookup = trim($lookup); if ($lookup === '') { return null; } if (preg_match('#/eq/([A-Za-z0-9]+)#', $lookup, $matches)) { return $matches[1]; } if (preg_match('/^[A-Za-z0-9]{16,64}$/', $lookup)) { return $lookup; } return null; } }