Fix #13 Send only notifications to Admin users if message is private

This commit is contained in:
Jérémy Munsch 2023-04-21 15:45:29 +02:00
parent b446a09167
commit 5ac7888fc8
No known key found for this signature in database
GPG key ID: 18361AF3BFEC0FEC
7 changed files with 62 additions and 29 deletions

View file

@ -454,6 +454,7 @@ class TicketController extends Controller
/** @var \App\Enums\TicketStatus */
$oldStatus = $ticket->status;
// * Notification systeme doit etre privée.
event(new TicketStatusChanged($ticket, $oldStatus, null, $message, true, false));
event(new NotifySubscriptions($ticket, $message, collect([$ticket->user])));

View file

@ -20,14 +20,15 @@ class CreateMessage extends FormRequest
return false;
}
if (
!auth()->user()->can('createPrivateMessage', request()->route()->ticket)
!$user->can('createPrivateMessage', $this->route()->ticket)
&& $this->is_private == MessageType::private()
) {
return false;
}
return auth()->check() and auth()->user()->sites and (
$user->isAdmin() or
auth()->user()->sites->contains(request()->route()->ticket->site_id)
return auth()->check() and $user->sites and (
$user->isAdmin() or $user->sites->contains(
$this->route()->ticket->site_id
)
);
}

View file

@ -18,25 +18,25 @@ class AddStatusMessages
*/
public function handle(TicketStatusChanged $event)
{
// phpcs:enable
$message = new Message();
$message->ticket_id = $event->ticket->id;
$message->type = MessageType::public();
if ($event->is_private) {
$message->type = MessageType::private();
}
// * Le message system est privé si demandé (eg: Assignation à une personne).
$message->type = $event->is_private ?
MessageType::public() : MessageType::private();
if ($event->message) {
$message->message = $event->message;
} elseif ($event->user) {
$message->message = sprintf(
"<b>%s</b> %s <b>%s</b>",
$event->user->name,
__("a modifié le statut en"),
trans('a modifié le statut en'),
$event->ticket->status->label
);
} else {
$message->message = sprintf(
"%s : <b>%s</b>",
__("Le statut est passé à"),
trans('Le statut est passé à'),
$event->ticket->status->label
);
}
@ -46,55 +46,55 @@ class AddStatusMessages
$message->message = sprintf(
"%s<br>%s<br>",
$message->message,
__("Votre ticket a été créé, nous allons en prendre connaissance.")
trans('Votre ticket a été créé, nous allons en prendre connaissance.')
);
break;
case TicketStatus::estimateTodo():
$message->message = sprintf(
"%s<br>%s<br>",
$message->message,
__("Votre ticket nécessite une estimation, nous allons vous proposer un devis.")
trans('Votre ticket nécessite une estimation, nous allons vous proposer un devis.')
);
break;
case TicketStatus::takenInAccount():
$message->message .= sprintf("<br>" .
__("Votre ticket est dans le processus de traitement.") . "<br>");
trans('Votre ticket est dans le processus de traitement.') . "<br>");
break;
case TicketStatus::waiting():
$message->message = sprintf(
"%s<br>%s<br>",
$message->message,
__("Nous attendons une réponse de votre part pour procéder à la suite du traitement.")
trans('Nous attendons une réponse de votre part pour procéder à la suite du traitement.')
);
break;
case TicketStatus::waitingValidation():
$message->message = sprintf(
"%s<br>%s<br>",
$message->message,
__("Nous attendons une validation de votre part pour procéder au traitement.")
trans('Nous attendons une validation de votre part pour procéder au traitement.')
);
break;
case TicketStatus::recette():
$message->message = sprintf(
"%s<br>%s<br>",
$message->message,
__("Le traitement à été réalisé et mis à disposition sur la plateforme de recette.
Vous pouvez vérifier que la solution mise en œuvre correspond à la demande.")
trans('Le traitement à été réalisé et mis à disposition sur la plateforme de recette.
Vous pouvez vérifier que la solution mise en œuvre correspond à la demande.')
);
break;
case TicketStatus::production():
$message->message = sprintf(
"%s<br>%s<br>",
$message->message,
__("La solution à été mise en ligne.
Vous pouvez vérifier sur le site de production que tout fonctionne comme attendu.")
trans('La solution à été mise en ligne.
Vous pouvez vérifier sur le site de production que tout fonctionne comme attendu.')
);
break;
case TicketStatus::archived():
$message->message = sprintf(
"%s<br>%s<br>",
$message->message,
__("Ce ticket est clos.")
trans('Ce ticket est clos.')
);
break;
} //end switch

View file

@ -22,7 +22,9 @@ class SendSubscriptionsNotificationsMail
$ignoreUsers = $event->ignoreUsers ?? collect();
foreach ($event->ticket->subscriptions as $sub) {
if (
// * Ignore the message author (job in sync).
$sub->email !== $ignoreConnectedUserEmail and
// * Are there are users to notify
!$ignoreUsers->filter(function (User $user) use ($sub) {
return $user->email === $sub->email;
})->count()

View file

@ -9,6 +9,14 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Kwaadpepper\Enum\Traits\CastsEnums;
/**
*
* @property string $message The message content.
* @property \App\Enums\MessageType $type The message is not visible for clients.
* @property string $file The message joined file path.
*
* @package App\Models
*/
class Message extends Model
{
use HasFactory;
@ -32,7 +40,6 @@ class Message extends Model
protected $enumCasts = [
'type' => MessageType::class
];
/**
* The attributes that are mass assignable.
*
@ -52,10 +59,30 @@ class Message extends Model
}]);
/** @var \App\Models\User $messageUser */
$messageUser = $message->user()->withTrashed()->firstOrFail();
// * Send mail to mentionned users
$usersNotified = $ticket->sendBeenMentionnedToUser($message);
// * Send mail to mentionned users\
/** @var \Illuminate\Support\Collection<\App\Models\User> */
$dontNotifyUsers = $ticket->sendBeenMentionnedToUser($message);
// * Ignorer le cas où le message est privé et l'auteur du ticket n'est pas admin.
if (!$ticket->user->isAdmin() && $message->type->equals(MessageType::private())) {
$dontNotifyUsers->push($ticket->user);
}
// * Filter Users if the message is private.
if ($message->type->equals(MessageType::private())) {
$dontNotifyUsers = $dontNotifyUsers->concat(
// * Add to ignore list all non Admin users.
$ticket->subscriptions->filter(function (User $suscribedUser) {
return !$suscribedUser->isAdmin();
})
);
}
// * If email has not been sen to ticket author yet.
if (!$usersNotified->contains($ticket->user) and $ticket->user->id !== $messageUser->id) {
if (
!$dontNotifyUsers->contains(function (User $dontNotifyUser) use ($ticket) {
return $dontNotifyUser->id === $ticket->user->id;
}) and $ticket->user->id !== $messageUser->id
) {
// * Send mail to ticket author
event(new NotifyTicketCreator(
$ticket,
@ -64,7 +91,7 @@ class Message extends Model
'message' => $message->message
])
));
$usersNotified->push($ticket->user);
$dontNotifyUsers->push($ticket->user);
}
// ? Is message author is admin ?
if ($messageUser->isAdmin()) {
@ -85,7 +112,7 @@ class Message extends Model
'name' => $message->user->name,
'message' => $message->message
]),
$usersNotified
$dontNotifyUsers
));
}//end if
});

View file

@ -181,6 +181,7 @@ class Ticket extends Model
{
$ticket = $this;
// Find @user + send mail si un seul user est trouvé.
/** @var \Illuminate\Support\Collection<\App\Models\User> */
$usersNotified = collect([]);
$matches = [];
$ticket->load('site');
@ -215,8 +216,9 @@ class Ticket extends Model
}
} catch (ModelNotFoundException $e) {
continue;
}//end try
}//end foreach
} //end try
} //end foreach
return $usersNotified;
}

View file

@ -130,7 +130,7 @@
<div class="row mt-4">
<div class="col">
<div class="form-check">
<input name="is_private" type="checkbox" class="form-check-input" id="setPrivate" autocomplete="off" value="{{MessageTypeEnum::private()}}">
<input name="is_private" type="checkbox" class="form-check-input" id="setPrivate" autocomplete="off" value="{{ MessageTypeEnum::private() }}">
<label class="form-check-label" for="setPrivate">{{ __('Rendre le message privé') }}</label>
</div>
</div>