From 3db124e709f2093c97d227f3a75a07ec6ef26892 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 5 Mar 2025 18:12:23 -0800 Subject: [PATCH] First pass at updating wording for asset checkout mail --- app/Mail/CheckoutAssetMail.php | 28 +++++- database/factories/AssetFactory.php | 10 +++ database/factories/AssetModelFactory.php | 9 ++ database/factories/CategoryFactory.php | 7 ++ .../mail/markdown/checkout-asset.blade.php | 4 +- tests/Unit/Mail/CheckoutAssetMailTest.php | 88 +++++++++++++++++++ 6 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 tests/Unit/Mail/CheckoutAssetMailTest.php diff --git a/app/Mail/CheckoutAssetMail.php b/app/Mail/CheckoutAssetMail.php index 1447dfd6f..a810ab8c8 100644 --- a/app/Mail/CheckoutAssetMail.php +++ b/app/Mail/CheckoutAssetMail.php @@ -74,7 +74,7 @@ class CheckoutAssetMail extends Mailable { $this->item->load('assetstatus'); $eula = method_exists($this->item, 'getEula') ? $this->item->getEula() : ''; - $req_accept = method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; + $req_accept = $this->requiresAcceptance(); $fields = []; // Check if the item has custom fields associated with it @@ -98,6 +98,7 @@ class CheckoutAssetMail extends Mailable 'accept_url' => $accept_url, 'last_checkout' => $this->last_checkout, 'expected_checkin' => $this->expected_checkin, + 'opening_line' => $this->openingLine(), ], ); } @@ -118,6 +119,29 @@ class CheckoutAssetMail extends Mailable return trans('mail.Asset_Checkout_Notification'); } - return trans('mail.unaccepted_asset_reminder'); + return 'Reminder: ' . trans('mail.unaccepted_asset_reminder'); + } + + private function openingLine(): string + { + if ($this->firstTimeSending && $this->requiresAcceptance()) { + return 'A new item has been checked out under your name that requires acceptance, details are below.'; + } + + if ($this->firstTimeSending && !$this->requiresAcceptance()) { + return 'A new item has been checked out under your name, details are below.'; + } + + if (!$this->firstTimeSending && $this->requiresAcceptance()) { + return 'An item was recently checked out under your name that requires acceptance, details are below.'; + } + + // we shouldn't get here but let's send a default message just in case + return trans('new_item_checked'); + } + + private function requiresAcceptance(): int|bool + { + return method_exists($this->item, 'requireAcceptance') ? $this->item->requireAcceptance() : 0; } } diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php index 4d6d20651..63b64364e 100644 --- a/database/factories/AssetFactory.php +++ b/database/factories/AssetFactory.php @@ -4,6 +4,7 @@ namespace Database\Factories; use App\Models\Asset; use App\Models\AssetModel; +use App\Models\Category; use App\Models\CustomField; use App\Models\Location; use App\Models\Statuslabel; @@ -333,6 +334,15 @@ class AssetFactory extends Factory }); } + public function doesNotRequireAcceptance() + { + return $this->state(function () { + return [ + 'model_id' => AssetModel::factory()->doesNotRequireAcceptance(), + ]; + }); + } + public function deleted() { return $this->state(function () { diff --git a/database/factories/AssetModelFactory.php b/database/factories/AssetModelFactory.php index 8acecd55d..3adb933e3 100644 --- a/database/factories/AssetModelFactory.php +++ b/database/factories/AssetModelFactory.php @@ -448,4 +448,13 @@ class AssetModelFactory extends Factory ]; }); } + + public function doesNotRequireAcceptance() + { + return $this->state(function () { + return [ + 'category_id' => Category::factory()->doesNotRequireAcceptance(), + ]; + }); + } } diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php index 9897b396c..42103f1b7 100644 --- a/database/factories/CategoryFactory.php +++ b/database/factories/CategoryFactory.php @@ -207,4 +207,11 @@ class CategoryFactory extends Factory 'category_type' => 'consumable', ]); } + + public function doesNotRequireAcceptance() + { + return $this->state([ + 'require_acceptance' => false, + ]); + } } diff --git a/resources/views/mail/markdown/checkout-asset.blade.php b/resources/views/mail/markdown/checkout-asset.blade.php index 72e5860e2..8cb7101ab 100644 --- a/resources/views/mail/markdown/checkout-asset.blade.php +++ b/resources/views/mail/markdown/checkout-asset.blade.php @@ -1,7 +1,7 @@ @component('mail::message') # {{ trans('mail.hello') }} {{ $target->present()->fullName() }}, -{{ trans('mail.new_item_checked') }} +{{ $opening_line }} @if (($snipeSettings->show_images_in_email =='1') && $item->getImageUrl())
Asset
@@ -76,4 +76,4 @@ {{ $snipeSettings->site_name }} -@endcomponent \ No newline at end of file +@endcomponent diff --git a/tests/Unit/Mail/CheckoutAssetMailTest.php b/tests/Unit/Mail/CheckoutAssetMailTest.php new file mode 100644 index 000000000..45004b4fc --- /dev/null +++ b/tests/Unit/Mail/CheckoutAssetMailTest.php @@ -0,0 +1,88 @@ +create(); + $actor = User::factory()->create(); + + $assetRequiringAcceptance = Asset::factory()->requiresAcceptance()->create(); + $assetNotRequiringAcceptance = Asset::factory()->doesNotRequireAcceptance()->create(); + + $acceptance = CheckoutAcceptance::factory()->for($assetRequiringAcceptance, 'checkoutable')->create(); + + (new CheckoutAssetMail( + $assetRequiringAcceptance, + $user, + $actor, + $acceptance, + 'A note goes here', + true, + ))->assertHasSubject('Asset checked out'); + + (new CheckoutAssetMail( + $assetNotRequiringAcceptance, + $user, + $actor, + null, + 'A note goes here', + true, + ))->assertHasSubject('Asset checked out'); + + (new CheckoutAssetMail( + $assetRequiringAcceptance, + $user, + $actor, + $acceptance, + 'A note goes here', + false, + ))->assertHasSubject('Reminder: You have Unaccepted Assets.'); + } + + public function testContent() + { + $user = User::factory()->create(); + $actor = User::factory()->create(); + + $assetRequiringAcceptance = Asset::factory()->requiresAcceptance()->create(); + $assetNotRequiringAcceptance = Asset::factory()->doesNotRequireAcceptance()->create(); + + $acceptance = CheckoutAcceptance::factory()->for($assetRequiringAcceptance, 'checkoutable')->create(); + + (new CheckoutAssetMail( + $assetRequiringAcceptance, + $user, + $actor, + $acceptance, + 'A note goes here', + true, + ))->assertSeeInText('A new item has been checked out under your name that requires acceptance, details are below.'); + + (new CheckoutAssetMail( + $assetNotRequiringAcceptance, + $user, + $actor, + null, + 'A note goes here', + true, + ))->assertSeeInText('A new item has been checked out under your name, details are below.'); + + (new CheckoutAssetMail( + $assetRequiringAcceptance, + $user, + $actor, + $acceptance, + 'A note goes here', + false, + ))->assertSeeInText('An item was recently checked out under your name that requires acceptance, details are below.'); + } +}