From e97d39abd7b82d84fa1585ebaf131b43c3dfd302 Mon Sep 17 00:00:00 2001 From: philipp lang Date: Fri, 30 May 2025 01:12:59 +0200 Subject: [PATCH] Fix: Dont send yearly prevention mail when user has no email address --- app/Member/Member.php | 4 ++++ .../Actions/YearlyRememberAction.php | 11 ++++++++- tests/EndToEnd/Member/PreventionTest.php | 24 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/Member/Member.php b/app/Member/Member.php index d04bec79..67973eac 100644 --- a/app/Member/Member.php +++ b/app/Member/Member.php @@ -204,6 +204,10 @@ class Member extends Model implements Geolocatable, Preventable return null; } + if (!$this->email) { + return null; + } + return (object) ['name' => $this->fullname, 'email' => $this->email]; } diff --git a/app/Prevention/Actions/YearlyRememberAction.php b/app/Prevention/Actions/YearlyRememberAction.php index f8e73fdf..f0a98ab8 100644 --- a/app/Prevention/Actions/YearlyRememberAction.php +++ b/app/Prevention/Actions/YearlyRememberAction.php @@ -22,8 +22,12 @@ class YearlyRememberAction $settings = app(PreventionSettings::class); $expireDate = now()->addWeeks($settings->weeks); - foreach ($settings->yearlyMemberFilter->getQuery()->get() as $member) { + // @todo add this check to FilterScope + if ($member->getMailRecipient() === null) { + continue; + } + $noticePreventions = $member->preventions($expireDate) ->filter(fn($prevention) => $prevention->expiresAt($expireDate)); @@ -35,6 +39,11 @@ class YearlyRememberAction } foreach ($settings->yearlyMemberFilter->getQuery()->get() as $member) { + // @todo add this check to FilterScope + if ($member->getMailRecipient() === null) { + continue; + } + $preventions = $member->preventions() ->filter(fn($prevention) => $prevention->expiresAt(now())); diff --git a/tests/EndToEnd/Member/PreventionTest.php b/tests/EndToEnd/Member/PreventionTest.php index 67ab0750..9501e253 100644 --- a/tests/EndToEnd/Member/PreventionTest.php +++ b/tests/EndToEnd/Member/PreventionTest.php @@ -10,6 +10,7 @@ use App\Form\Models\Form; use App\Form\Models\Participant; use App\Invoice\InvoiceSettings; use App\Lib\Editor\Condition; +use App\Member\FilterScope; use App\Prevention\Mails\PreventionRememberMail; use App\Member\Member; use App\Member\Membership; @@ -283,6 +284,29 @@ it('testItDoesntRememberParticipantThatHasNoMail', function () { Mail::assertNotSent(PreventionRememberMail::class); }); +it('doesnt send yearly mail when member has no mail', function () { + Mail::fake(); + createMember(['efz' => now()->subYears(5), 'ps_at' => now(), 'has_vk' => true, 'email' => '', 'email_parents' => '']); + + sleep(2); + YearlyRememberAction::run(); + + Mail::assertNotSent(YearlyMail::class); +}); + +it('doesnt send yearly mail when member doesnt match', function () { + Mail::fake(); + app(PreventionSettings::class)->fill([ + 'yearlyMemberFilter' => FilterScope::from(['search' => 'Lorem Ipsum']), + ])->save(); + createMember(['efz' => now()->subYears(5), 'ps_at' => now(), 'has_vk' => true, 'firstname' => 'Max', 'lastname' => 'Muster']); + + sleep(2); + YearlyRememberAction::run(); + + Mail::assertNotSent(YearlyMail::class); +}); + it('testItRendersSetttingMail', function () { Mail::fake(); app(PreventionSettings::class)->fill([