TicketType::class, 'status' => TicketStatus::class ]; protected $fillable = [ 'site_id', 'type', 'status', 'text', 'is_internal' ]; protected static function booted() { static::creating(function (Ticket $ticket) { // If evolution force the ticket status on estimateTodo if ($ticket->type->equals(TicketType::evolution())) { $ticket->status = TicketStatus::estimateTodo(); } }); static::updating(function (Ticket $ticket) { if (!$ticket->original['status'] !== $ticket->status->value) { event(new TicketStatusChanged( $ticket, TicketStatus::make($ticket->original['status']), auth()->user() )); event(new NotifySubscriptions($ticket, sprintf( '%s a modifié le statut en %s', auth()->user()->name, $ticket->status->label ))); event(new NotifyAdmin($ticket, sprintf( '%s a modifié le statut en %s', auth()->user()->name, $ticket->status->label ))); } }); } public function site() { return $this->belongsTo(Site::class); } public function user() { return $this->belongsTo(User::class, 'created_by'); } public function messages() { return $this->hasMany(Message::class, 'ticket_id'); } public function subscriptions() { return $this->belongsToMany(User::class, 'subscriptions'); } public static function saveFile(Site $site, Ticket $ticket, TicketType $type, UploadedFile $file) { $siteAssetFullPath = Site::ticketAssetsFullPath($site->slug_name); $fileAssetPath = Site::ticketAssetsPath($site->slug_name); $fileName = sprintf( '%s-%s-%d-%d.%s', $site->slug_name, $type->getDefinition(), $ticket->id, rand(), $file->extension() ); $file->move(sprintf('%s/%d', $siteAssetFullPath, $ticket->id), $fileName); return sprintf('%s/%d/%s', $fileAssetPath, $ticket->id, $fileName); } /** * Parse message @user tags and send emails to concerned users * returns and array with to users notified * * @param Message $message * @return Collection */ public function sendBeenMentionnedToUser(Message $message): Collection { $ticket = $this; // find @user + send mail si un seul user est trouvé $usersNotified = collect([]); $matches = []; $ticket->load('site'); \preg_match_all('/@\w*/', $message->message, $matches); $matches = collect($matches[0] ?? [])->unique(); foreach ($matches as $pseudo_usertag) { try { $user = User::where('name', 'LIKE', '%' . ltrim($pseudo_usertag, '@') . '%') ->where('email', '!=', $ticket->user->email) ->where(function ($q) use ($ticket) { $q->whereHas('sites', function ($q) use ($ticket) { $q->where('id', $ticket->site->id); })->orWhere('role', Role::admin()->value) ->orWhere('role', Role::developper()->value); })->firstOrFail(); if ($ticket->is_internal === 1) { if ($user->isAdmin()) { $usersNotified->add($user); SendTicketMentionMail::dispatchAfterResponse( $user, new TicketMention($ticket, $message->message) ); } } else { $usersNotified->add($user); SendTicketMentionMail::dispatchAfterResponse( $user, new TicketMention($ticket, $message->message) ); } } catch (ModelNotFoundException $e) { continue; } } return $usersNotified; } }