|null $recipient_default_bank_account * @property array|null $recipient_transfer_settings * @property array|null $recipient_automatic_anticipation_settings * @property array|null $recipient_metadata * @property-read \Illuminate\Database\Eloquent\Collection $addresses * @property-read int|null $addresses_count * @property-read \Illuminate\Database\Eloquent\Collection $blockedByClients * @property-read int|null $blocked_by_clients_count * @property-read \Illuminate\Database\Eloquent\Collection $blockedClients * @property-read int|null $blocked_clients_count * @property-read \App\Models\Address|null $primaryAddress * @property-read \App\Models\Media|null $profileMedia * @method static \Illuminate\Database\Eloquent\Builder|Provider newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Provider newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Provider onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Provider query() * @method static \Illuminate\Database\Eloquent\Builder|Provider whereApprovalStatus($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereAverageRating($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereBirthDate($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDailyPrice2h($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDailyPrice4h($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDailyPrice6h($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDailyPrice8h($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDeletedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDocument($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDocumentBackMediaBase64($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDocumentFrontMediaBase64($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereDocumentVerified($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereProfileMediaId($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientAutomaticAnticipationSettings($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientCode($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientDefaultBankAccount($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientDescription($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientDocument($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientEmail($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientId($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientMetadata($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientName($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientPaymentMode($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientTransferSettings($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRecipientType($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereRg($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereSelfieMediaBase64($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereSelfieVerified($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereTotalServices($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|Provider withTrashed(bool $withTrashed = true) * @method static \Illuminate\Database\Eloquent\Builder|Provider withoutTrashed() * @mixin \Eloquent */ class Provider extends Model { use HasFactory, SoftDeletes; protected $table = "providers"; protected $guarded = ["id"]; /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'birth_date' => 'date', 'selfie_verified' => 'boolean', 'document_verified' => 'boolean', 'approval_status' => ApprovalStatusEnum::class, 'average_rating' => 'decimal:1', 'daily_price_8h' => 'decimal:2', 'daily_price_6h' => 'decimal:2', 'daily_price_4h' => 'decimal:2', 'daily_price_2h' => 'decimal:2', 'total_services' => 'integer', 'recipient_default_bank_account' => 'array', 'recipient_transfer_settings' => 'array', 'recipient_automatic_anticipation_settings' => 'array', 'recipient_metadata' => 'array', ]; } public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } /** * @return BelongsTo */ public function profileMedia(): BelongsTo { return $this->belongsTo(Media::class, "profile_media_id"); } /** * @return HasMany */ public function addresses(): HasMany { return $this->hasMany(Address::class, 'source_id') ->where('source', 'provider'); } // /** // * @return HasOne // */ // public function primaryAddress(): HasOne // { // return $this->hasOne(Address::class, 'source_id') // ->where('source', 'provider') // ->where('is_primary', true); // } /** * @return HasMany */ public function blockedClients() { return $this->hasMany(ProviderClientBlock::class); } /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function blockedByClients() { return $this->hasMany(ClientProviderBlock::class); } public function updateAverageRating(float $newRating): void { $totalReviews = Review::where('reviews.origin', 'client') ->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id') ->where('schedules.provider_id', $this->id) ->count(); if ($totalReviews === 0) { $this->average_rating = $newRating; } else { $currentTotalRating = $this->average_rating * ($totalReviews - 1); $newAverage = ($currentTotalRating + $newRating) / $totalReviews; $this->average_rating = round($newAverage, 2); } $this->save(); } public function primaryAddress() { return $this->hasOne(Address::class, "source_id") ->where("source", "provider") ->orderBy("is_primary", "desc"); } }