'integer', 'pilot_id' => 'integer', 'flights' => 'integer', 'flight_time' => 'integer', 'transfer_time' => 'integer', 'balance' => 'double', 'state' => 'integer', 'status' => 'integer', 'toc_accepted' => 'boolean', 'opt_in' => 'boolean', ]; public static $rules = [ 'name' => 'required', 'email' => 'required|email', 'pilot_id' => 'required|integer', ]; /** * Format the pilot ID/ident * * @return Attribute */ public function ident(): Attribute { return Attribute::make( get: function ($_, $attrs) { $length = setting('pilots.id_length'); $ident_code = filled(setting('pilots.id_code')) ? setting( 'pilots.id_code' ) : optional($this->airline)->icao; return $ident_code.str_pad($attrs['pilot_id'], $length, '0', STR_PAD_LEFT); } ); } /** * Return a "privatized" version of someones name - First and middle names full, last name initials * * @return Attribute */ public function namePrivate(): Attribute { return Attribute::make( get: function ($_, $attrs) { $name_parts = explode(' ', $attrs['name']); $count = count($name_parts); if ($count === 1) { return $name_parts[0]; } $gdpr_name = ''; $last_name = $name_parts[$count - 1]; $loop_count = 0; while ($loop_count < ($count - 1)) { $gdpr_name .= $name_parts[$loop_count].' '; $loop_count++; } $gdpr_name .= mb_substr($last_name, 0, 1); return mb_convert_case($gdpr_name, MB_CASE_TITLE); } ); } /** * Shortcut for timezone * * @return Attribute */ public function tz(): Attribute { return Attribute::make( get: fn ($_, $attrs) => $attrs['timezone'], set: fn ($value) => [ 'timezone' => $value, ] ); } /** * Return a File model */ public function avatar(): Attribute { return Attribute::make( get: function ($_, $attrs) { if (!$attrs['avatar']) { return null; } return new File([ 'path' => $attrs['avatar'], ]); } ); } /** * @param mixed $size Size of the gravatar, in pixels * * @return string */ public function gravatar($size = null) { $default = config('gravatar.default'); $uri = config('gravatar.url').md5(strtolower(trim($this->email))).'?d='.urlencode($default); if ($size !== null) { $uri .= '&s='.$size; } return $uri; } public function resolveAvatarUrl() { /** @var File $avatar */ $avatar = $this->avatar; if (empty($avatar)) { return $this->gravatar(); } return $avatar->url; } /** * Foreign Keys */ public function airline() { return $this->belongsTo(Airline::class, 'airline_id'); } /** * @return \App\Models\Award[]|mixed */ public function awards() { return $this->belongsToMany(Award::class, 'user_awards'); } /** * The bid rows * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function bids() { return $this->hasMany(Bid::class, 'user_id'); } public function home_airport() { return $this->belongsTo(Airport::class, 'home_airport_id'); } public function current_airport() { return $this->belongsTo(Airport::class, 'curr_airport_id'); } public function last_pirep() { return $this->belongsTo(Pirep::class, 'last_pirep_id'); } public function fields() { return $this->hasMany(UserFieldValue::class, 'user_id'); } public function pireps() { return $this->hasMany(Pirep::class, 'user_id'); } public function rank() { return $this->belongsTo(Rank::class, 'rank_id'); } public function typeratings() { return $this->belongsToMany( Typerating::class, 'typerating_user', 'user_id', 'typerating_id' ); } public function rated_subfleets() { return $this->hasManyDeep( Subfleet::class, ['typerating_user', Typerating::class, 'typerating_subfleet'] ); } }