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>
This commit is contained in:
parent
03ad249eeb
commit
bb57522b70
29 changed files with 1528 additions and 193 deletions
|
|
@ -315,13 +315,10 @@ class AdminUserCleanupController extends Controller
|
|||
}
|
||||
|
||||
try {
|
||||
// Führe Artisan Command aus
|
||||
\Artisan::call('user:restore', ['user_id' => $userId]);
|
||||
|
||||
$output = \Artisan::output();
|
||||
|
||||
// Prüfe ob Command erfolgreich war (Exit Code 0)
|
||||
// Genau ein Lauf: der Command holt Team und Sponsor zurueck, ein zweiter
|
||||
// Aufruf wuerde auf einem bereits wiederhergestellten User arbeiten.
|
||||
$exitCode = \Artisan::call('user:restore', ['user_id' => $userId]);
|
||||
$output = \Artisan::output();
|
||||
|
||||
\Log::channel('cleanup')->info('AdminUserCleanupController restore via web: user_id='.$userId.' | exitCode='.$exitCode);
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Exceptions\GdprDeletionException;
|
|||
use App\Mail\UserRestoreEmail;
|
||||
use App\Models\UserAccount;
|
||||
use App\Repositories\UserRepository;
|
||||
use App\Services\ConsultantSuspensionService;
|
||||
use App\Services\GdprDeletionService;
|
||||
use App\Services\HTMLHelper;
|
||||
use App\Services\SysLog;
|
||||
|
|
@ -167,12 +168,12 @@ class AdminUserController extends Controller
|
|||
UserUtil::markPartnerPaid($user);
|
||||
if ($user->active === 0) {
|
||||
$user->active = true;
|
||||
UserUtil::reactiveUserResetChilds($user->id, 'on save-account AdminUserController');
|
||||
app(ConsultantSuspensionService::class)->reinstate($user, 'on save-account AdminUserController');
|
||||
}
|
||||
} else {
|
||||
if ($user->active === 1) {
|
||||
$user->active = false;
|
||||
UserUtil::deactiveUserNewSponsorChilds($user->id, 'on save-account AdminUserController');
|
||||
app(ConsultantSuspensionService::class)->suspend($user, 'on save-account AdminUserController');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue