Ticket 647:

- Fix double mails send.
- If admin answers ticket he will auto subscribe to it.
- Equipe web always receive ticket status changes
This commit is contained in:
Jérémy Munsch 2022-02-02 13:51:45 +01:00
parent 30b0fdb475
commit f5fe094c4a
No known key found for this signature in database
GPG key ID: 55196BEE445F6049
8 changed files with 96 additions and 18 deletions

View file

@ -0,0 +1,32 @@
<?php
namespace App\Events;
use App\Models\Ticket;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class NotifyAdmin
{
use Dispatchable;
use InteractsWithSockets;
use SerializesModels;
/** @var Ticket */
public $ticket;
/** @var string */
public $corpsMaj;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Ticket $ticket, string $corpsMaj)
{
$this->ticket = $ticket;
$this->corpsMaj = $corpsMaj;
}
}

View file

@ -0,0 +1,23 @@
<?php
namespace App\Listeners;
use App\Events\NotifyAdmin;
use App\Mail\TicketUpdate;
use Illuminate\Support\Facades\Mail;
class SendNotificationMailToAdmin
{
/**
* Handle the event.
*
* @param NotifyTicketCreator $event
* @return void
*/
public function handle(NotifyAdmin $event)
{
$ticket = $event->ticket;
Mail::to(config('mail.MAIL_ADMIN'))
->send(new TicketUpdate($ticket, $event->corpsMaj));
}
}

View file

@ -4,6 +4,7 @@ namespace App\Listeners;
use App\Events\NotifySubscriptions;
use App\Mail\TicketUpdate;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
@ -22,7 +23,9 @@ class SendSubscriptionsNotificationsMail
foreach ($event->ticket->subscriptions as $sub) {
if (
$sub->email !== $ignoreConnectedUserEmail and
!$ignoreUsers->contains($sub->email)
!$ignoreUsers->filter(function (User $user) use ($sub) {
return $user->email === $sub->email;
})->count()
) {
Mail::to($sub->email)
->send(new TicketUpdate($event->ticket, $event->corpsMaj));

View file

@ -38,7 +38,7 @@ class TicketUpdate extends Mailable
public function build()
{
$ticket = $this->ticket;
$corpsMaj = Utils::plainToHtml($this->corpsMaj);
$corpsMaj = \html_entity_decode(Utils::plainToHtml($this->corpsMaj));
return $this->subject("[SupportWeb][{$ticket->site->name}] Ticket n°$ticket->id")
->view('emails.ticket-update', compact('ticket', 'corpsMaj'));
}

View file

@ -19,19 +19,32 @@ class Message extends Model
protected static function booted()
{
static::created(function (Message $message) {
/** @var \App\Models\Ticket $ticket */
$ticket = $message->ticket;
if ($message->user) {
$ticket->load('user');
if ($ticket->user !== $message->user) {
/** @var \App\Models\User $messageUser */
$messageUser = $message->user;
// * Send mail to mentionned users
$usersNotified = $ticket->sendBeenMentionnedToUser($message);
// * If email has not been sen to ticket author yet.
if (!$usersNotified->contains($ticket->user) and $ticket->user->id !== $messageUser->id) {
// * Send mail to ticket author
event(new NotifyTicketCreator(
$ticket,
trans('Nouvelle réponse de :name :<br> :message sur votre ticket', [
'name' => $message->user->name,
'name' => $messageUser->name,
'message' => $message->message
])
));
$usersNotified->push($ticket->user);
}
$usersNotified = $ticket->sendBeenMentionnedToUser($message);
// ? Is message author is admin ?
if ($messageUser->isAdmin()) {
$ticket->subscriptions()->attach($messageUser);
\session()->flash('info', trans('Vous avez été inscrit.'));
}
// * Send mail to other subscribed users
event(new NotifySubscriptions(
$message->ticket,
trans('Nouvelle réponse de :name :<br> :message', [
@ -40,13 +53,7 @@ class Message extends Model
]),
$usersNotified
));
} else {
event(new NotifyTicketCreator(
$ticket,
trans('Votre ticket : :message', [
'message' => $message->message
])
));
//
}
});
}

View file

@ -5,6 +5,7 @@ namespace App\Models;
use App\Enums\Role;
use App\Enums\TicketStatus;
use App\Enums\TicketType;
use App\Events\NotifyAdmin;
use App\Events\NotifySubscriptions;
use App\Events\TicketStatusChanged;
use App\Jobs\SendTicketMentionMail;
@ -42,11 +43,20 @@ class Ticket extends Model
}
});
static::updating(function (Ticket $ticket) {
$oldStatus = Ticket::where('id', $ticket->id)->first()->status;
if (!$ticket->status->equals($oldStatus)) {
event(new TicketStatusChanged($ticket, $oldStatus, auth()->user()));
if (!$ticket->original['status'] !== $ticket->status->value) {
event(new TicketStatusChanged(
$ticket,
TicketStatus::make($ticket->original['status']),
auth()->user()
));
event(new NotifySubscriptions($ticket, sprintf(
'Le ticket à changé de status : %s',
'<b>%s</b> a modifié le statut en <b>%s</b>',
auth()->user()->name,
$ticket->status->label
)));
event(new NotifyAdmin($ticket, sprintf(
'<b>%s</b> a modifié le statut en <b>%s</b>',
auth()->user()->name,
$ticket->status->label
)));
}
@ -94,7 +104,7 @@ class Ticket extends Model
* returns and array with to users notified
*
* @param Message $message
* @return array[User]
* @return Collection
*/
public function sendBeenMentionnedToUser(Message $message): Collection
{

View file

@ -3,6 +3,7 @@
namespace App\Providers;
use App\Events\FileCreated;
use App\Events\NotifyAdmin;
use App\Events\NotifySubscriptions;
use App\Events\NotifyTicketCreator;
use App\Events\ProjectUpdated;
@ -10,6 +11,7 @@ use App\Events\SiteUpdated;
use App\Events\TicketStatusChanged;
use App\Listeners\AddStatusMessages;
use App\Listeners\HandleLoggable;
use App\Listeners\SendNotificationMailToAdmin;
use App\Listeners\SendNotificationMailToTicketCreator;
use App\Listeners\SendSubscriptionsNotificationsMail;
use Illuminate\Auth\Events\Registered;
@ -29,6 +31,7 @@ class EventServiceProvider extends ServiceProvider
TicketStatusChanged::class => [AddStatusMessages::class],
NotifySubscriptions::class => [SendSubscriptionsNotificationsMail::class],
NotifyTicketCreator::class => [SendNotificationMailToTicketCreator::class],
NotifyAdmin::class => [SendNotificationMailToAdmin::class],
FileCreated::class => [HandleLoggable::class],
ProjectUpdated::class => [HandleLoggable::class],
SiteUpdated::class => [HandleLoggable::class]

View file

@ -92,7 +92,7 @@ return [
],
'contactsList' => [
'serviceweb' => env('MAIL_LIST_SERVICEWEB', 'informatique.internet@ldc.fr')
'serviceweb' => env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr')
],
/*