$data * @param array $files * @return Ticket */ public function create(User $user, array $data, array $files = []): Ticket { return DB::transaction(function () use ($user, $data, $files): Ticket { $status = Status::query()->where('slug', config('helpdesk.default_status_slug'))->firstOrFail(); /** @var Ticket $ticket */ $ticket = Ticket::query()->create([ 'reference' => $this->references->next(), 'user_id' => $user->id, 'agent_id' => $this->assignment->selectAgentId($data['category_id'] ?? null), 'status_id' => $status->id, 'priority_id' => $data['priority_id'], 'category_id' => $data['category_id'] ?? null, 'project_id' => $data['project_id'] ?? null, 'subject' => $data['subject'], 'body' => $data['body'], 'due_at' => $data['due_at'] ?? null, 'last_activity_at' => now(), ]); $this->attachments->storeMany($ticket, $files, (int) $user->id); return $ticket->fresh(['owner', 'agent', 'status', 'priority', 'category', 'project', 'attachments']) ?? $ticket; }); } /** * Add a public or internal comment and optional attachments. * * @param Ticket $ticket * @param User $user * @param string $body * @param bool $internal * @param array $files * @return Comment */ public function comment(Ticket $ticket, User $user, string $body, bool $internal = false, array $files = []): Comment { return DB::transaction(function () use ($ticket, $user, $body, $internal, $files): Comment { /** @var Comment $comment */ $comment = $ticket->comments()->create([ 'user_id' => $user->id, 'body' => $body, 'is_internal' => $internal, ]); $ticket->forceFill(['last_activity_at' => now()])->save(); $this->attachments->storeMany($ticket, $files, (int) $user->id, $comment); return $comment->fresh(['user', 'attachments']) ?? $comment; }); } /** * Close a ticket. * * @param Ticket $ticket * @param User $user * @return Ticket */ public function close(Ticket $ticket, User $user): Ticket { $status = Status::query()->where('slug', config('helpdesk.closed_status_slug'))->firstOrFail(); $ticket->forceFill([ 'status_id' => $status->id, 'completed_at' => now(), 'last_activity_at' => now(), ])->save(); return $ticket->fresh(['status']) ?? $ticket; } }