'boolean', 'is_read_by_user' => 'boolean', ]; public function user() { return $this->belongsTo(User::class); } public function assignee() { return $this->belongsTo(User::class, 'assigned_to'); } public function replies() { return $this->hasMany(MtUserTicketReply::class, 'ticket_id')->orderBy('created_at'); } public function dailyReport() { return $this->belongsTo(MtDailyReport::class, 'daily_report_id'); } public function scopeForBusiness($query, $business_id) { return $query->where('business_id', $business_id); } public function scopeOpen($query) { return $query->whereIn('status', [self::STATUS_OPEN, self::STATUS_IN_PROGRESS]); } public static function statuses(): array { return [ self::STATUS_OPEN => __('managementtools::lang.ticket_status_open'), self::STATUS_IN_PROGRESS => __('managementtools::lang.ticket_status_in_progress'), self::STATUS_RESOLVED => __('managementtools::lang.ticket_status_resolved'), self::STATUS_CLOSED => __('managementtools::lang.ticket_status_closed'), ]; } public static function priorities(): array { return [ 'low' => __('managementtools::lang.ticket_priority_low'), 'normal' => __('managementtools::lang.ticket_priority_normal'), 'high' => __('managementtools::lang.ticket_priority_high'), 'urgent' => __('managementtools::lang.ticket_priority_urgent'), ]; } public function getReferenceAttribute(): string { return 'TKT-'.str_pad((string) $this->id, 5, '0', STR_PAD_LEFT); } public function statusLabel(): string { return self::statuses()[$this->status] ?? (string) $this->status; } public function priorityLabel(): string { return self::priorities()[$this->priority] ?? $this->priority; } public function statusBadgeClass(): string { return match ((int) $this->status) { self::STATUS_OPEN => 'label-warning', self::STATUS_IN_PROGRESS => 'label-info', self::STATUS_RESOLVED => 'label-success', self::STATUS_CLOSED => 'label-default', default => 'label-default', }; } public function priorityBadgeClass(): string { return match ($this->priority) { 'urgent' => 'label-danger', 'high' => 'label-warning', 'low' => 'label-default', default => 'label-primary', }; } }