authorize('update', $ticket); $this->ticket = $ticket->fresh(['status', 'priority', 'category', 'project', 'team', 'agent']) ?? $ticket; $this->company_id = $this->ticket->company_id; $this->subject = $this->ticket->subject; $this->body = $this->ticket->body; $this->status_id = $this->ticket->status_id; $this->priority_id = $this->ticket->priority_id; $this->category_id = $this->ticket->category_id; $this->project_id = $this->ticket->project_id; $this->team_id = $this->ticket->team_id; $this->agent_id = $this->ticket->agent_id; $this->due_at = $this->ticket->due_at?->format('Y-m-d'); } public function save(WorkflowNotificationService $workflow): mixed { $this->authorize('update', $this->ticket); $this->validate(); $status = Status::query()->findOrFail($this->status_id); $this->ticket->forceFill([ 'company_id' => $this->company_id, 'subject' => $this->subject, 'body' => $this->body, 'status_id' => $status->id, 'priority_id' => $this->priority_id, 'category_id' => $this->category_id, 'project_id' => $this->project_id, 'team_id' => $this->team_id, 'agent_id' => $this->agent_id, 'due_at' => $this->due_at, 'completed_at' => $status->is_closed ? now() : null, 'last_activity_at' => now(), ])->save(); $fresh = $this->ticket->fresh(['owner', 'agent', 'status', 'priority', 'category', 'project', 'team']) ?? $this->ticket; $workflow->dispatch($fresh, $status->is_closed ? 'ticket.closed' : 'ticket.updated', Auth::user()); session()->flash('success', 'Ticket ' . $fresh->reference . ' has been updated.'); return redirect()->route('helpdesk.tickets.show', $fresh); } public function render(): View { return view('helpdesk::livewire.ticket-edit', [ 'statuses' => Status::query()->orderBy('sort_order')->orderBy('name')->get(), 'priorities' => Priority::query()->orderBy('sort_order')->orderBy('name')->get(), 'categories' => Category::query()->orderBy('name')->get(), 'companies' => Schema::hasTable('companies') ? DB::table('companies')->select(['id', 'name'])->orderBy('name')->get() : collect(), 'teams' => Team::query()->whereNull('archived_at')->orderBy('name')->get(), 'projects' => Project::query()->whereNull('archived_at')->orderBy('title')->get(), 'agents' => User::query() ->where(static function ($query): void { $query->where('helpdesk_agent', true)->orWhere('helpdesk_admin', true); }) ->orderBy('name') ->get(['id', 'name', 'email']), ])->layout('layouts.app'); } }