diff --git a/app/Services/ConsultantSuspensionService.php b/app/Services/ConsultantSuspensionService.php index df9909fb..54888da8 100644 --- a/app/Services/ConsultantSuspensionService.php +++ b/app/Services/ConsultantSuspensionService.php @@ -133,8 +133,8 @@ class ConsultantSuspensionService return null; } - $sponsor = $user->m_sponsor ? UserUtil::findNextActiveSponsor($user->m_sponsor) : null; - if (! $sponsor || (int) $sponsor->id === (int) $user->id) { + $sponsor = $this->sponsorFor($user); + if (! $sponsor) { Log::channel('cleanup')->error('ConsultantSuspension::suspend kein aktiver Sponsor fuer user_id '.$user->id.' '.$info); return null; @@ -194,8 +194,8 @@ class ConsultantSuspensionService return null; } - $sponsor = UserUtil::findNextActiveSponsor($user->id); - if (! $sponsor || (int) $sponsor->id === (int) $user->id) { + $sponsor = $this->sponsorFor($user); + if (! $sponsor) { Log::channel('cleanup')->error('ConsultantSuspension::terminate kein aktiver Sponsor fuer user_id '.$user->id); return null; @@ -388,6 +388,22 @@ class ConsultantSuspensionService return $lists; } + /** + * Nächster aktiver Sponsor über m_sponsor bzw. pre_sponsor. Berater ganz ohne + * Sponsor (ohne Sponsor registriert) gehen an das Firmenkonto. + */ + private function sponsorFor(User $user): ?User + { + $sponsorId = $user->m_sponsor ?: $user->pre_sponsor; + $sponsor = $sponsorId ? UserUtil::findNextActiveSponsor($sponsorId) : null; + + if (! $sponsor || (int) $sponsor->id === (int) $user->id) { + $sponsor = User::find((int) config('mivita.company_user_id')); + } + + return $sponsor && (int) $sponsor->id !== (int) $user->id ? $sponsor : null; + } + private function logTransfer(User $user, User $sponsor, string $type, int $recordId): void { ConsultantSuspensionTransfer::create([ diff --git a/tests/Feature/ConsultantSuspensionTest.php b/tests/Feature/ConsultantSuspensionTest.php index 18503deb..198954e1 100644 --- a/tests/Feature/ConsultantSuspensionTest.php +++ b/tests/Feature/ConsultantSuspensionTest.php @@ -282,6 +282,19 @@ describe('Stufe 2: harter Cut', function () { ->and($s['abo']->fresh()->member_id)->toBe($s['sponsor']->id) ->and($s['portal']->fresh()->member_id)->toBe($s['sponsor']->id); }); + + it('gibt Berater ganz ohne Sponsor an das Firmenkonto', function () { + // Live 25.09.: ein Berater war ohne Sponsor registriert und waere jede Nacht uebersprungen worden. + $company = User::forceCreate(['id' => 6, 'email' => 'firma@example.com', 'password' => 'x', 'lang' => 'de', 'active' => 1, 'payment_account' => '2030-01-01']); + $consultant = susConsultant(null, '2026-09-01 10:00:00'); + $customer = susCustomer($consultant); + + $this->artisan('user:cleanup')->assertSuccessful(); + + expect(User::withTrashed()->find($consultant->id)->deleted_at)->not->toBeNull() + ->and($customer->fresh()->member_id)->toBe($company->id); + Mail::assertNothingSent(); + }); }); describe('Admin setzt das Ablaufdatum', function () {