*/ use HasFactory; protected $table = 'managed_tenant_onboarding_sessions'; /** * @var array */ public const STATE_ALLOWED_KEYS = [ 'entra_tenant_id', 'tenant_id', 'tenant_name', 'environment', 'primary_domain', 'notes', 'provider_connection_id', 'selected_provider_connection_id', 'verification_operation_run_id', 'verification_run_id', 'bootstrap_operation_types', 'bootstrap_operation_runs', 'bootstrap_run_ids', 'connection_recently_updated', ]; protected $guarded = []; protected $casts = [ 'state' => 'array', 'completed_at' => 'datetime', 'cancelled_at' => 'datetime', ]; /** * @param array|null $value */ public function setStateAttribute(?array $value): void { if ($value === null) { $this->attributes['state'] = null; return; } $allowed = array_intersect_key($value, array_flip(self::STATE_ALLOWED_KEYS)); $encoded = json_encode($allowed, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); $this->attributes['state'] = $encoded !== false ? $encoded : json_encode([], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } /** * @return BelongsTo */ public function workspace(): BelongsTo { return $this->belongsTo(Workspace::class); } /** * @return BelongsTo */ public function tenant(): BelongsTo { return $this->belongsTo(Tenant::class); } /** * @return BelongsTo */ public function startedByUser(): BelongsTo { return $this->belongsTo(User::class, 'started_by_user_id'); } /** * @return BelongsTo */ public function updatedByUser(): BelongsTo { return $this->belongsTo(User::class, 'updated_by_user_id'); } /** * @param Builder $query * @return Builder */ public function scopeResumable(Builder $query): Builder { return $query ->whereNull('completed_at') ->whereNull('cancelled_at'); } public function isCompleted(): bool { return $this->completed_at !== null; } public function isCancelled(): bool { return $this->cancelled_at !== null; } public function status(): OnboardingDraftStatus { if ($this->isCancelled()) { return OnboardingDraftStatus::Cancelled; } if ($this->isCompleted()) { return OnboardingDraftStatus::Completed; } return OnboardingDraftStatus::Draft; } public function isResumable(): bool { return $this->status()->isResumable(); } }