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>
46 lines
1.7 KiB
PHP
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'),
|
|
]);
|
|
}
|
|
}
|