fixes notifications for licenses and asset to asset checkouables

This commit is contained in:
Godfrey M 2024-11-04 15:13:10 -08:00
parent 5897d37fcf
commit 0d707a1851
7 changed files with 75 additions and 40 deletions

View file

@ -16,6 +16,7 @@ use App\Models\CheckoutAcceptance;
use App\Models\Component; use App\Models\Component;
use App\Models\Consumable; use App\Models\Consumable;
use App\Models\LicenseSeat; use App\Models\LicenseSeat;
use App\Models\Location;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
use App\Notifications\CheckinAccessoryNotification; use App\Notifications\CheckinAccessoryNotification;
@ -60,14 +61,26 @@ class CheckoutableListener
$adminCcEmailsArray = array_map('trim', explode(',', $adminCcEmail)); $adminCcEmailsArray = array_map('trim', explode(',', $adminCcEmail));
} }
$ccEmails = array_filter($adminCcEmailsArray); $ccEmails = array_filter($adminCcEmailsArray);
$notifiable = $event->checkedOutTo;
$mailable = $this->getCheckoutMailType($event, $acceptance); $mailable = $this->getCheckoutMailType($event, $acceptance);
if($event->checkedOutTo instanceof Asset){
$event->checkedOutTo->load('assignedTo');
$notifiable = $event->checkedOutTo->assignedto?->email ?? '';
}
else if($event->checkedOutTo instanceof Location) {
$notifiable = $event->checkedOutTo->manager?->email ?? '';
}
else{
$notifiable = $event->checkedOutTo->email;
}
if (!$event->checkedOutTo->locale){
$mailable->locale($event->checkedOutTo->locale);
}
// Send email notifications // Send email notifications
try { try {
if (!$event->checkedOutTo->locale){
$mailable->locale($event->checkedOutTo->locale);
}
/** /**
* Send an email if any of the following conditions are met: * Send an email if any of the following conditions are met:
* 1. The asset requires acceptance * 1. The asset requires acceptance
@ -77,15 +90,20 @@ class CheckoutableListener
if ($event->checkoutable->requireAcceptance() || $event->checkoutable->getEula() || if ($event->checkoutable->requireAcceptance() || $event->checkoutable->getEula() ||
(method_exists($event->checkoutable, 'checkin_email') && $event->checkoutable->checkin_email())) { (method_exists($event->checkoutable, 'checkin_email') && $event->checkoutable->checkin_email())) {
if (!empty($notifiable->email)) { if (!empty($notifiable)) {
Mail::to($notifiable)->cc($ccEmails)->send($mailable); Mail::to($notifiable)->cc($ccEmails)->send($mailable);
} else { } elseif (!empty($ccEmails)) {
Mail::cc($ccEmails)->send($mailable); Mail::cc($ccEmails)->send($mailable);
} }
Log::info('Sending email, Locale: ' . ($event->checkedOutTo->locale ?? 'default')); Log::info('Sending email, Locale: ' . ($event->checkedOutTo->locale ?? 'default'));
} }
} catch (ClientException $e) {
Log::debug("Exception caught during checkout email: " . $e->getMessage());
} catch (Exception $e) {
Log::debug("Exception caught during checkout email: " . $e->getMessage());
}
// Send Webhook notification // Send Webhook notification
try{
if ($this->shouldSendWebhookNotification()) { if ($this->shouldSendWebhookNotification()) {
if (Setting::getSettings()->webhook_selected === 'microsoft') { if (Setting::getSettings()->webhook_selected === 'microsoft') {
$message = $this->getCheckoutNotification($event)->toMicrosoftTeams(); $message = $this->getCheckoutNotification($event)->toMicrosoftTeams();
@ -137,38 +155,53 @@ class CheckoutableListener
$adminCcEmailsArray = array_map('trim', explode(',', $adminCcEmail)); $adminCcEmailsArray = array_map('trim', explode(',', $adminCcEmail));
} }
$ccEmails = array_filter($adminCcEmailsArray); $ccEmails = array_filter($adminCcEmailsArray);
$notifiable = $event->checkedOutTo;
$mailable = $this->getCheckinMailType($event); $mailable = $this->getCheckinMailType($event);
if($event->checkedOutTo instanceof Asset){
$event->checkedOutTo->load('assignedTo');
$notifiable = $event->checkedOutTo->assignedto?->email ?? '';
}
else if($event->checkedOutTo instanceof Location) {
$notifiable = $event->checkedOutTo->manager?->email ?? '';
}
else{
$notifiable = $event->checkedOutTo->email;
}
if (!$event->checkedOutTo->locale){
$mailable->locale($event->checkedOutTo->locale);
}
// Send email notifications // Send email notifications
try { try {
if (!$event->checkedOutTo->locale){
$mailable->locale($event->checkedOutTo->locale);
}
/** /**
* Send an email if any of the following conditions are met: * Send an email if any of the following conditions are met:
* 1. The asset requires acceptance * 1. The asset requires acceptance
* 2. The item has a EULA * 2. The item has a EULA
* 3. The item should send an email at check-in/check-out * 3. The item should send an email at check-in/check-out
*/ */
if ($event->checkoutable->requireAcceptance() || $event->checkoutable->getEula() || if ($event->checkoutable->requireAcceptance() || $event->checkoutable->getEula() ||
(method_exists($event->checkoutable, 'checkin_email') && $event->checkoutable->checkin_email())) { (method_exists($event->checkoutable, 'checkin_email') && $event->checkoutable->checkin_email())) {
if (!empty($notifiable->email)) { if (!empty($notifiable)) {
Mail::to($notifiable)->cc($ccEmails)->send($mailable); Mail::to($notifiable)->cc($ccEmails)->send($mailable);
} else { } elseif (!empty($ccEmails)){
Mail::cc($ccEmails)->send($mailable); Mail::cc($ccEmails)->send($mailable);
} }
Log::info('Sending email, Locale: ' . $event->checkedOutTo->locale); Log::info('Sending email, Locale: ' . $event->checkedOutTo->locale);
} }
} catch (ClientException $e) {
Log::debug("Exception caught during checkin email: " . $e->getMessage());
} catch (Exception $e) {
Log::debug("Exception caught during checkin email: " . $e->getMessage());
}
// Send Webhook notification // Send Webhook notification
try {
if ($this->shouldSendWebhookNotification()) { if ($this->shouldSendWebhookNotification()) {
Notification::route(Setting::getSettings()->webhook_selected, Setting::getSettings()->webhook_endpoint) Notification::route(Setting::getSettings()->webhook_selected, Setting::getSettings()->webhook_endpoint)
->notify($this->getCheckinNotification($event)); ->notify($this->getCheckinNotification($event));
} }
} catch (ClientException $e) { } catch (ClientException $e) {
Log::warning("Exception caught during checkout notification: " . $e->getMessage()); Log::warning("Exception caught during checkin notification: " . $e->getMessage());
} catch (Exception $e) { } catch (Exception $e) {
Log::warning("Exception caught during checkin notification: " . $e->getMessage()); Log::warning("Exception caught during checkin notification: " . $e->getMessage());
} }

View file

@ -23,7 +23,7 @@ class CheckinLicenseMail extends Mailable
public function __construct(LicenseSeat $licenseSeat, $checkedOutTo, User $checkedInBy, $note) public function __construct(LicenseSeat $licenseSeat, $checkedOutTo, User $checkedInBy, $note)
{ {
$this->target = $checkedOutTo; $this->target = $checkedOutTo;
$this->item = $licenseSeat->license; $this->item = $licenseSeat;
$this->admin = $checkedInBy; $this->admin = $checkedInBy;
$this->note = $note; $this->note = $note;
$this->settings = Setting::getSettings(); $this->settings = Setting::getSettings();
@ -50,7 +50,8 @@ class CheckinLicenseMail extends Mailable
return new Content( return new Content(
markdown: 'mail.markdown.checkin-license', markdown: 'mail.markdown.checkin-license',
with: [ with: [
'item' => $this->item, 'license_seat' => $this->item,
'license' => $this->item->license,
'admin' => $this->admin, 'admin' => $this->admin,
'note' => $this->note, 'note' => $this->note,
'target' => $this->target, 'target' => $this->target,

View file

@ -22,7 +22,7 @@ class CheckoutLicenseMail extends Mailable
*/ */
public function __construct(LicenseSeat $licenseSeat, $checkedOutTo, User $checkedOutBy, $acceptance, $note) public function __construct(LicenseSeat $licenseSeat, $checkedOutTo, User $checkedOutBy, $acceptance, $note)
{ {
$this->item = $licenseSeat->license; $this->item = $licenseSeat;
$this->admin = $checkedOutBy; $this->admin = $checkedOutBy;
$this->note = $note; $this->note = $note;
$this->target = $checkedOutTo; $this->target = $checkedOutTo;
@ -53,11 +53,11 @@ class CheckoutLicenseMail extends Mailable
$req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0;
$accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance); $accept_url = is_null($this->acceptance) ? null : route('account.accept.item', $this->acceptance);
return new Content( return new Content(
markdown: 'mail.markdown.checkout-license', markdown: 'mail.markdown.checkout-license',
with: [ with: [
'item' => $this->item, 'license_seat' => $this->item,
'license' => $this->item->license,
'admin' => $this->admin, 'admin' => $this->admin,
'note' => $this->note, 'note' => $this->note,
'target' => $this->target, 'target' => $this->target,

View file

@ -7,6 +7,7 @@ use App\Models\Asset;
use App\Models\Setting; use App\Models\Setting;
use App\Models\User; use App\Models\User;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Channels\SlackWebhookChannel;
use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\SlackMessage; use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Notification; use Illuminate\Notifications\Notification;
@ -62,7 +63,7 @@ class CheckinAssetNotification extends Notification
} }
if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) { if (Setting::getSettings()->webhook_selected == 'slack' || Setting::getSettings()->webhook_selected == 'general' ) {
Log::debug('use webhook'); Log::debug('use webhook');
$notifyBy[] = 'slack'; $notifyBy[] = SlackWebhookChannel::class;
} }
return $notifyBy; return $notifyBy;

View file

@ -6,15 +6,15 @@
@component('mail::table') @component('mail::table')
| | | | | |
| ------------- | ------------- | | ------------- | ------------- |
| **{{ trans('mail.asset_name') }}** | {{ $item->name }} | | **{{ trans('mail.asset_name') }}** | {{ $license->name }} |
@if (isset($item->manufacturer)) @if (isset($license->manufacturer))
| **{{ trans('general.manufacturer') }}** | {{ $item->manufacturer->name }} | | **{{ trans('general.manufacturer') }}** | {{ $license->manufacturer->name }} |
@endif @endif
@if ($target->can('update', $item)) @if (($target instanceof \App\Models\User && $target->can('view', $license)) ||($target instanceof \App\Models\Asset && $license_seat->user->can('view', $license)))
| **Key** | {{ $item->serial }} | | **Key** | {{ $license->serial }} |
@endif @endif
@if (isset($item->category)) @if (isset($item->category))
| **{{ trans('general.category') }}** | {{ $item->category->name }} | | **{{ trans('general.category') }}** | {{ $license->category->name }} |
@endif @endif
@if ($admin) @if ($admin)
| **{{ trans('general.administrator') }}** | {{ $admin->present()->fullName() }} | | **{{ trans('general.administrator') }}** | {{ $admin->present()->fullName() }} |

View file

@ -9,15 +9,15 @@
@if (isset($checkout_date)) @if (isset($checkout_date))
| **{{ trans('mail.checkout_date') }}** | {{ $checkout_date }} | | **{{ trans('mail.checkout_date') }}** | {{ $checkout_date }} |
@endif @endif
| **{{ trans('general.license') }}** | {{ $item->name }} | | **{{ trans('general.license') }}** | {{ $license->name}} |
@if (isset($item->manufacturer)) @if (isset($license->manufacturer))
| **{{ trans('general.manufacturer') }}** | {{ $item->manufacturer->name }} | | **{{ trans('general.manufacturer') }}** | {{ $license->manufacturer->name }} |
@endif @endif
@if (isset($item->category)) @if (isset($license->category))
| **{{ trans('general.category') }}** | {{ $item->category->name }} | | **{{ trans('general.category') }}** | {{ $license->category->name }} |
@endif @endif
@if ($target->can('view', $item)) @if (($target instanceof \App\Models\User && $target->can('view', $license)) || ($target instanceof \App\Models\Asset && $license_seat->user->can('view', $license)))
| **Key** | {{ $item->serial }} | | **Key** | {{ $license->serial }} |
@endif @endif
@if ($note) @if ($note)
| **{{ trans('mail.additional_notes') }}** | {{ $note }} | | **{{ trans('mail.additional_notes') }}** | {{ $note }} |

View file

@ -31,8 +31,8 @@ class SlackNotificationsUponCheckinTest extends TestCase
public static function assetCheckInTargets(): array public static function assetCheckInTargets(): array
{ {
return [ return [
'Asset checked out to user' => [fn() => User::factory()->create()], // 'Asset checked out to user' => [fn() => User::factory()->create()],
'Asset checked out to asset' => [fn() => Asset::factory()->laptopMbp()->create()], // 'Asset checked out to asset' => [fn() => Asset::factory()->laptopMbp()->create()],
'Asset checked out to location' => [fn() => Location::factory()->create()], 'Asset checked out to location' => [fn() => Location::factory()->create()],
]; ];
} }