Fix #13 Send only notifications to Admin users if message is private
This commit is contained in:
parent
b446a09167
commit
5ac7888fc8
7 changed files with 62 additions and 29 deletions
|
|
@ -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])));
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue