diff --git a/app/Domain/Actions/VacationRequest/ApproveAction.php b/app/Domain/Actions/VacationRequest/ApproveAction.php index 32748df..3d55542 100644 --- a/app/Domain/Actions/VacationRequest/ApproveAction.php +++ b/app/Domain/Actions/VacationRequest/ApproveAction.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Toby\Domain\Actions\VacationRequest; use Toby\Domain\Enums\Role; -use Toby\Domain\Notifications\VacationRequestApprovedNotification; +use Toby\Domain\Notifications\VacationRequestStatusChangedNotification; use Toby\Domain\VacationRequestStateManager; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; @@ -34,9 +34,9 @@ class ApproveAction ->get(); foreach ($users as $user) { - $user->notify(new VacationRequestApprovedNotification($vacationRequest, $user)); + $user->notify(new VacationRequestStatusChangedNotification($vacationRequest, $user)); } - $vacationRequest->user->notify(new VacationRequestApprovedNotification($vacationRequest, $vacationRequest->user)); + $vacationRequest->user->notify(new VacationRequestStatusChangedNotification($vacationRequest, $vacationRequest->user)); } } diff --git a/app/Domain/Actions/VacationRequest/CancelAction.php b/app/Domain/Actions/VacationRequest/CancelAction.php index 13a0868..508f5b0 100644 --- a/app/Domain/Actions/VacationRequest/CancelAction.php +++ b/app/Domain/Actions/VacationRequest/CancelAction.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Toby\Domain\Actions\VacationRequest; use Toby\Domain\Enums\Role; -use Toby\Domain\Notifications\VacationRequestCancelledNotification; +use Toby\Domain\Notifications\VacationRequestStatusChangedNotification; use Toby\Domain\VacationRequestStateManager; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; @@ -34,9 +34,9 @@ class CancelAction ->get(); foreach ($users as $user) { - $user->notify(new VacationRequestCancelledNotification($vacationRequest, $user)); + $user->notify(new VacationRequestStatusChangedNotification($vacationRequest, $user)); } - $vacationRequest->user->notify(new VacationRequestCancelledNotification($vacationRequest, $vacationRequest->user)); + $vacationRequest->user->notify(new VacationRequestStatusChangedNotification($vacationRequest, $vacationRequest->user)); } } diff --git a/app/Domain/Actions/VacationRequest/CreateAction.php b/app/Domain/Actions/VacationRequest/CreateAction.php index cfb1222..3915d6e 100644 --- a/app/Domain/Actions/VacationRequest/CreateAction.php +++ b/app/Domain/Actions/VacationRequest/CreateAction.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Toby\Domain\Actions\VacationRequest; use Illuminate\Validation\ValidationException; +use Toby\Domain\Notifications\VacationRequestCreatedNotification; use Toby\Domain\VacationDaysCalculator; use Toby\Domain\VacationRequestStateManager; use Toby\Domain\VacationTypeConfigRetriever; @@ -31,6 +32,7 @@ class CreateAction { $vacationRequest = $this->createVacationRequest($data, $creator); $this->handleCreatedVacationRequest($vacationRequest); + $this->notify($vacationRequest); return $vacationRequest; } @@ -88,4 +90,9 @@ class CreateAction $this->stateManager->approve($vacationRequest); } + + protected function notify(VacationRequest $vacationRequest): void + { + $vacationRequest->user->notify(new VacationRequestCreatedNotification($vacationRequest)); + } } diff --git a/app/Domain/Actions/VacationRequest/RejectAction.php b/app/Domain/Actions/VacationRequest/RejectAction.php index 6703830..8f6645b 100644 --- a/app/Domain/Actions/VacationRequest/RejectAction.php +++ b/app/Domain/Actions/VacationRequest/RejectAction.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Toby\Domain\Actions\VacationRequest; use Toby\Domain\Enums\Role; -use Toby\Domain\Notifications\VacationRequestRejectedNotification; +use Toby\Domain\Notifications\VacationRequestStatusChangedNotification; use Toby\Domain\VacationRequestStateManager; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; @@ -31,9 +31,9 @@ class RejectAction ->get(); foreach ($users as $user) { - $user->notify(new VacationRequestRejectedNotification($vacationRequest, $user)); + $user->notify(new VacationRequestStatusChangedNotification($vacationRequest, $user)); } - $vacationRequest->user->notify(new VacationRequestRejectedNotification($vacationRequest, $vacationRequest->user)); + $vacationRequest->user->notify(new VacationRequestStatusChangedNotification($vacationRequest, $vacationRequest->user)); } } diff --git a/app/Domain/Actions/VacationRequest/WaitForAdminApprovalAction.php b/app/Domain/Actions/VacationRequest/WaitForAdminApprovalAction.php index c3ddad7..833b470 100644 --- a/app/Domain/Actions/VacationRequest/WaitForAdminApprovalAction.php +++ b/app/Domain/Actions/VacationRequest/WaitForAdminApprovalAction.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Toby\Domain\Actions\VacationRequest; use Toby\Domain\Enums\Role; -use Toby\Domain\Notifications\VacationRequestWaitsForAdminApprovalNotification; +use Toby\Domain\Notifications\VacationRequestWaitsForApprovalNotification; use Toby\Domain\VacationRequestStateManager; use Toby\Domain\VacationTypeConfigRetriever; use Toby\Eloquent\Models\User; @@ -33,7 +33,7 @@ class WaitForAdminApprovalAction ->get(); foreach ($users as $user) { - $user->notify(new VacationRequestWaitsForAdminApprovalNotification($vacationRequest, $user)); + $user->notify(new VacationRequestWaitsForApprovalNotification($vacationRequest, $user)); } } } diff --git a/app/Domain/Actions/VacationRequest/WaitForTechApprovalAction.php b/app/Domain/Actions/VacationRequest/WaitForTechApprovalAction.php index 077c940..1686698 100644 --- a/app/Domain/Actions/VacationRequest/WaitForTechApprovalAction.php +++ b/app/Domain/Actions/VacationRequest/WaitForTechApprovalAction.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Toby\Domain\Actions\VacationRequest; use Toby\Domain\Enums\Role; -use Toby\Domain\Notifications\VacationRequestWaitsForTechApprovalNotification; +use Toby\Domain\Notifications\VacationRequestWaitsForApprovalNotification; use Toby\Domain\VacationRequestStateManager; use Toby\Domain\VacationTypeConfigRetriever; use Toby\Eloquent\Models\User; @@ -33,7 +33,7 @@ class WaitForTechApprovalAction ->get(); foreach ($users as $user) { - $user->notify(new VacationRequestWaitsForTechApprovalNotification($vacationRequest, $user)); + $user->notify(new VacationRequestWaitsForApprovalNotification($vacationRequest, $user)); } } } diff --git a/app/Domain/Notifications/VacationRequestCancelledNotification.php b/app/Domain/Notifications/VacationRequestCancelledNotification.php deleted file mode 100644 index bb5d8f4..0000000 --- a/app/Domain/Notifications/VacationRequestCancelledNotification.php +++ /dev/null @@ -1,74 +0,0 @@ - $this->vacationRequest, - ], - ); - - return $this->buildMailMessage($url); - } - - protected function buildMailMessage(string $url): MailMessage - { - $user = $this->user->first_name; - $title = $this->vacationRequest->name; - $type = $this->vacationRequest->type->label(); - $from = $this->vacationRequest->from->toDisplayString(); - $to = $this->vacationRequest->to->toDisplayString(); - $days = $this->vacationRequest->vacations()->count(); - $requester = $this->vacationRequest->user->fullName; - - return (new MailMessage()) - ->greeting(__("Hi :user!", [ - "user" => $user, - ])) - ->subject(__("Vacation request :title has been cancelled", [ - "title" => $title, - ])) - ->line(__("The vacation request :title for user :requester has been cancelled.", [ - "title" => $title, - "requester" => $requester, - ])) - ->line(__("Vacation type: :type", [ - "type" => $type, - ])) - ->line(__("From :from to :to (number of days: :days)", [ - "from" => $from, - "to" => $to, - "days" => $days, - ])) - ->action(__("Click here for details"), $url); - } -} diff --git a/app/Domain/Notifications/VacationRequestCreatedNotification.php b/app/Domain/Notifications/VacationRequestCreatedNotification.php index 512191a..6166be6 100644 --- a/app/Domain/Notifications/VacationRequestCreatedNotification.php +++ b/app/Domain/Notifications/VacationRequestCreatedNotification.php @@ -40,24 +40,17 @@ class VacationRequestCreatedNotification extends Notification protected function buildMailMessage(string $url): MailMessage { $user = $this->vacationRequest->user->first_name; - $title = $this->vacationRequest->name; $type = $this->vacationRequest->type->label(); $from = $this->vacationRequest->from->toDisplayString(); $to = $this->vacationRequest->to->toDisplayString(); $days = $this->vacationRequest->vacations()->count(); - $appName = config("app.name"); return (new MailMessage()) ->greeting(__("Hi :user!", [ "user" => $user, ])) - ->subject(__("Vacation request :title has been created", [ - "title" => $title, - ])) - ->line(__("The vacation request :title has been created correctly in the :appName.", [ - "title" => $title, - "appName" => $appName, - ])) + ->subject($this->buildSubject()) + ->line($this->buildDescription()) ->line(__("Vacation type: :type", [ "type" => $type, ])) @@ -68,4 +61,38 @@ class VacationRequestCreatedNotification extends Notification ])) ->action(__("Click here for details"), $url); } + + protected function buildSubject(): string + { + $name = $this->vacationRequest->name; + + if ($this->vacationRequest->creator()->is($this->vacationRequest->user)) { + return __("Vacation request :title has been created", [ + "title" => $name, + ]); + } + + return __("Vacation request :title has been created on your behalf", [ + "title" => $name, + ]); + } + + protected function buildDescription(): string + { + $name = $this->vacationRequest->name; + $appName = config("app.name"); + + if ($this->vacationRequest->creator()->is($this->vacationRequest->user)) { + return __("The vacation request :title has been created correctly in the :appName.", [ + "title" => $name, + "appName" => $appName, + ]); + } + + return __("The vacation request :title has been created correctly by user :creator on your behalf in the :appName.", [ + "title" => $this->vacationRequest->name, + "appName" => $appName, + "creator" => $this->vacationRequest->creator->fullName, + ]); + } } diff --git a/app/Domain/Notifications/VacationRequestCreatedOnEmployeeBehalf.php b/app/Domain/Notifications/VacationRequestCreatedOnEmployeeBehalf.php deleted file mode 100644 index 4d2872a..0000000 --- a/app/Domain/Notifications/VacationRequestCreatedOnEmployeeBehalf.php +++ /dev/null @@ -1,73 +0,0 @@ - $this->vacationRequest, - ], - ); - return $this->buildMailMessage($url); - } - - protected function buildMailMessage(string $url): MailMessage - { - $creator = $this->vacationRequest->creator->fullName; - $user = $this->vacationRequest->user->first_name; - $title = $this->vacationRequest->name; - $type = $this->vacationRequest->type->label(); - $from = $this->vacationRequest->from->toDisplayString(); - $to = $this->vacationRequest->to->toDisplayString(); - $days = $this->vacationRequest->vacations()->count(); - $appName = config("app.name"); - - return (new MailMessage()) - ->greeting(__("Hi :user!", [ - "user" => $user, - ])) - ->subject(__("Vacation request :title has been created on your behalf", [ - "title" => $title, - ])) - ->line(__("The vacation request :title has been created correctly by user :creator on your behalf in the :appName.", [ - "title" => $title, - "appName" => $appName, - "creator" => $creator, - ])) - ->line(__("Vacation type: :type", [ - "type" => $type, - ])) - ->line(__("From :from to :to (number of days: :days)", [ - "from" => $from, - "to" => $to, - "days" => $days, - ])) - ->action(__("Click here for details"), $url); - } -} diff --git a/app/Domain/Notifications/VacationRequestRejectedNotification.php b/app/Domain/Notifications/VacationRequestRejectedNotification.php deleted file mode 100644 index e538cf9..0000000 --- a/app/Domain/Notifications/VacationRequestRejectedNotification.php +++ /dev/null @@ -1,74 +0,0 @@ - $this->vacationRequest, - ], - ); - - return $this->buildMailMessage($url); - } - - protected function buildMailMessage(string $url): MailMessage - { - $user = $this->user->first_name; - $title = $this->vacationRequest->name; - $type = $this->vacationRequest->type->label(); - $from = $this->vacationRequest->from->toDisplayString(); - $to = $this->vacationRequest->to->toDisplayString(); - $days = $this->vacationRequest->vacations()->count(); - $requester = $this->vacationRequest->user->fullName; - - return (new MailMessage()) - ->greeting(__("Hi :user!", [ - "user" => $user, - ])) - ->subject(__("Vacation request :title has been rejected", [ - "title" => $title, - ])) - ->line(__("The vacation request :title for user :requester has been rejected.", [ - "title" => $title, - "requester" => $requester, - ])) - ->line(__("Vacation type: :type", [ - "type" => $type, - ])) - ->line(__("From :from to :to (number of days: :days)", [ - "from" => $from, - "to" => $to, - "days" => $days, - ])) - ->action(__("Click here for details"), $url); - } -} diff --git a/app/Domain/Notifications/VacationRequestApprovedNotification.php b/app/Domain/Notifications/VacationRequestStatusChangedNotification.php similarity index 87% rename from app/Domain/Notifications/VacationRequestApprovedNotification.php rename to app/Domain/Notifications/VacationRequestStatusChangedNotification.php index b21b98c..f6b7c4e 100644 --- a/app/Domain/Notifications/VacationRequestApprovedNotification.php +++ b/app/Domain/Notifications/VacationRequestStatusChangedNotification.php @@ -11,7 +11,7 @@ use InvalidArgumentException; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; -class VacationRequestApprovedNotification extends Notification +class VacationRequestStatusChangedNotification extends Notification { use Queueable; @@ -45,6 +45,7 @@ class VacationRequestApprovedNotification extends Notification $user = $this->user->first_name; $title = $this->vacationRequest->name; $type = $this->vacationRequest->type->label(); + $status = $this->vacationRequest->state; $from = $this->vacationRequest->from->toDisplayString(); $to = $this->vacationRequest->to->toDisplayString(); $days = $this->vacationRequest->vacations()->count(); @@ -54,12 +55,14 @@ class VacationRequestApprovedNotification extends Notification ->greeting(__("Hi :user!", [ "user" => $user, ])) - ->subject(__("Vacation request :title has been approved", [ + ->subject(__("Vacation request :title has been :status", [ "title" => $title, + "status" => $status, ])) - ->line(__("The vacation request :title for user :requester has been approved.", [ + ->line(__("The vacation request :title for user :requester has been :status.", [ "title" => $title, "requester" => $requester, + "status" => $status, ])) ->line(__("Vacation type: :type", [ "type" => $type, diff --git a/app/Domain/Notifications/VacationRequestWaitsForAdminApprovalNotification.php b/app/Domain/Notifications/VacationRequestWaitsForAdminApprovalNotification.php deleted file mode 100644 index 4487cde..0000000 --- a/app/Domain/Notifications/VacationRequestWaitsForAdminApprovalNotification.php +++ /dev/null @@ -1,74 +0,0 @@ - $this->vacationRequest, - ], - ); - - return $this->buildMailMessage($url); - } - - protected function buildMailMessage(string $url): MailMessage - { - $user = $this->user->first_name; - $requester = $this->vacationRequest->user->fullName; - $title = $this->vacationRequest->name; - $type = $this->vacationRequest->type->label(); - $from = $this->vacationRequest->from->toDisplayString(); - $to = $this->vacationRequest->to->toDisplayString(); - $days = $this->vacationRequest->vacations()->count(); - - return (new MailMessage()) - ->greeting(__("Hi :user!", [ - "user" => $user, - ])) - ->subject(__("Vacation request :title is waiting for your approval", [ - "title" => $title, - ])) - ->line(__("The vacation request :title from user: :requester is waiting for your approval.", [ - "title" => $title, - "requester" => $requester, - ])) - ->line(__("Vacation type: :type", [ - "type" => $type, - ])) - ->line(__("From :from to :to (number of days: :days)", [ - "from" => $from, - "to" => $to, - "days" => $days, - ])) - ->action(__("Click here for details"), $url); - } -} diff --git a/app/Domain/Notifications/VacationRequestWaitsForTechApprovalNotification.php b/app/Domain/Notifications/VacationRequestWaitsForApprovalNotification.php similarity index 96% rename from app/Domain/Notifications/VacationRequestWaitsForTechApprovalNotification.php rename to app/Domain/Notifications/VacationRequestWaitsForApprovalNotification.php index f98cb85..4e9199c 100644 --- a/app/Domain/Notifications/VacationRequestWaitsForTechApprovalNotification.php +++ b/app/Domain/Notifications/VacationRequestWaitsForApprovalNotification.php @@ -11,7 +11,7 @@ use InvalidArgumentException; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; -class VacationRequestWaitsForTechApprovalNotification extends Notification +class VacationRequestWaitsForApprovalNotification extends Notification { use Queueable; diff --git a/tests/Feature/VacationRequestTest.php b/tests/Feature/VacationRequestTest.php index 5e9d8ff..c7add2c 100644 --- a/tests/Feature/VacationRequestTest.php +++ b/tests/Feature/VacationRequestTest.php @@ -6,6 +6,8 @@ namespace Tests\Feature; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Bus; +use Illuminate\Support\Facades\Notification; use Inertia\Testing\AssertableInertia as Assert; use Tests\FeatureTestCase; use Toby\Domain\Enums\VacationType; @@ -29,6 +31,9 @@ class VacationRequestTest extends FeatureTestCase { parent::setUp(); + Bus::fake(); + Notification::fake(); + $this->polishHolidaysRetriever = $this->app->make(PolishHolidaysRetriever::class); } diff --git a/tests/Unit/VacationRequestNotificationTest.php b/tests/Unit/VacationRequestNotificationTest.php index 1da1690..333c290 100644 --- a/tests/Unit/VacationRequestNotificationTest.php +++ b/tests/Unit/VacationRequestNotificationTest.php @@ -13,8 +13,8 @@ use Toby\Domain\Actions\VacationRequest\RejectAction; use Toby\Domain\Actions\VacationRequest\WaitForTechApprovalAction; use Toby\Domain\Enums\Role; use Toby\Domain\Enums\VacationType; -use Toby\Domain\Notifications\VacationRequestRejectedNotification; -use Toby\Domain\Notifications\VacationRequestWaitsForTechApprovalNotification; +use Toby\Domain\Notifications\VacationRequestStatusChangedNotification; +use Toby\Domain\Notifications\VacationRequestWaitsForApprovalNotification; use Toby\Domain\States\VacationRequest\Created; use Toby\Domain\States\VacationRequest\WaitingForTechnical; use Toby\Eloquent\Models\User; @@ -68,8 +68,8 @@ class VacationRequestNotificationTest extends TestCase $waitForTechApprovalAction->execute($vacationRequest); - Notification::assertSentTo([$technicalApprover, $admin], VacationRequestWaitsForTechApprovalNotification::class); - Notification::assertNotSentTo([$user, $administrativeApprover], VacationRequestWaitsForTechApprovalNotification::class); + Notification::assertSentTo([$technicalApprover, $admin], VacationRequestWaitsForApprovalNotification::class); + Notification::assertNotSentTo([$user, $administrativeApprover], VacationRequestWaitsForApprovalNotification::class); } public function testNotificationIsSentOnceToUser(): void @@ -104,7 +104,7 @@ class VacationRequestNotificationTest extends TestCase $rejectAction->execute($vacationRequest, $technicalApprover); - Notification::assertSentTo([$technicalApprover, $admin, $administrativeApprover], VacationRequestRejectedNotification::class); - Notification::assertTimesSent(3,VacationRequestRejectedNotification::class); + Notification::assertSentTo([$technicalApprover, $admin, $administrativeApprover], VacationRequestStatusChangedNotification::class); + Notification::assertTimesSent(3,VacationRequestStatusChangedNotification::class); } }