'datetime', 'reported_at' => 'datetime', 'moderated_at' => 'datetime', ]; } public function workOrder(): BelongsTo { return $this->belongsTo(WorkOrder::class); } public function reviewer(): BelongsTo { return $this->belongsTo(User::class, 'reviewer_id'); } public function reviewee(): BelongsTo { return $this->belongsTo(User::class, 'reviewee_id'); } public function reportedBy(): BelongsTo { return $this->belongsTo(User::class, 'reported_by_id'); } public function moderatedBy(): BelongsTo { return $this->belongsTo(User::class, 'moderated_by_id'); } public function isVisible(): bool { return $this->moderation_status !== 'hidden'; } public function editableBy(User $user): bool { if ($user->hasRole('admin')) { return true; } $hours = (int) config('reputation.review_edit_window_hours', 48); return $this->reviewer_id === $user->id && $this->created_at?->greaterThanOrEqualTo(now()->subHours($hours)); } }