mivita/app/Mail/SponsorSuspensionNoticeMail.php
Kevin 0b8f8abeeb Berater faellt aus (B2): pausieren nach 2 Tagen, Rueckgabe bei Zahlung, harter Cut am 28. Tag
Entwicklungsplan September, B2 (Protokoll 08.09., Rueckmeldung 14.09., R3):
- Ablauftag + 2 Kalendertage (Nachtlauf): Team, Kunden, Kundenabos und
  Portal-Logins gehen umkehrbar an den naechsten aktiven Sponsor, jede
  Umhaengung in consultant_suspension_transfers protokolliert. Kurzinfo
  an den Sponsor ohne Listen, keine Mail an das Firmenkonto.
- Zahlung bis Tag 27: Berater aktiv, Team und Kundendaten zurueck (nur
  was noch beim Sponsor liegt); Umsaetze der Zwischenzeit bleiben dort.
- Tag 28: was noch am Berater haengt geht endgueltig an den Sponsor,
  Berater wird dessen Kunde (ohne Duplikat) und geloescht; Listen-Mail
  mit Vorname, Nachname, Telefon, E-Mail an jeden haltenden Sponsor.
- Cron, Zahlungseingang und Admin-Ablaufdatum laufen ueber
  ConsultantSuspensionService; user:cleanup --dry-run listet beide Stufen.
- Mail 35 und Dashboard nennen Pausentag und Frist; Fristen in
  config/mivita.php (cleanup_suspend_days, cleanup_delete_days).
- Nebenbefunde: Kernel referenziert UserCleanUp, user:restore aus der
  User-Bereinigung laeuft nur noch einmal.
- Testschema: shopping_users.auth_user_id nullable wie auf Produktion
  (Migration aendert nur, wo die Spalte noch NOT NULL ist).
- Uebersicht fuer die Kundin: dev/_tickets/2026-09-23-mitgliedschaft-
  ablauf-uebersicht.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 15:44:45 +00:00

46 lines
1.7 KiB
PHP

<?php
namespace App\Mail;
use App\User;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
/**
* Kurzinfo an den Sponsor, wenn ein Teampartner pausiert wurde (Entwicklungsplan B2,
* Stufe 1). Bewusst ohne Listen: der Teampartner kann noch zahlen und bekommt dann
* Team und Kunden zurück.
*/
class SponsorSuspensionNoticeMail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(public User $sponsor, public User $consultant, public ?Carbon $deadline) {}
public function build(): self
{
$name = trim($this->consultant->account?->first_name.' '.$this->consultant->account?->last_name) ?: $this->consultant->email;
$days = $this->deadline ? max(0, (int) now()->startOfDay()->diffInDays($this->deadline->copy()->startOfDay(), false)) : 0;
return $this->subject(__('suspension.notice_subject', ['name' => $name]))
->view('emails.consultant_suspension')
->with([
'headline' => __('suspension.notice_subject', ['name' => $name]),
'salutation' => __('email.hello').' '.($this->sponsor->account?->first_name ?? ''),
'paragraphs' => [
__('suspension.notice_intro', [
'name' => $name,
'date' => $this->deadline?->format('d.m.Y') ?? '',
'days' => $days,
]),
__('suspension.notice_hint'),
],
'customers' => [],
'team' => [],
'greetings' => __('email.greetings'),
'sender' => __('email.sender'),
]);
}
}