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>
115 lines
7 KiB
PHP
115 lines
7 KiB
PHP
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||
<title>{{ $headline }}</title>
|
||
<style type="text/css">
|
||
a { text-decoration: none; border: 0; outline: none; color: #919f7a; }
|
||
a:hover { color: #b6b600; }
|
||
td, h1, h2, h3 { font-family: Helvetica, Verdana, Arial, sans-serif; font-weight: 400; }
|
||
td { text-align: left; }
|
||
body { -webkit-font-smoothing: antialiased; width: 100%; height: 100%; color: #37302d; background: #ffffff; font-size: 15px; line-height: 26px; }
|
||
table { border-collapse: separate !important; }
|
||
.headline { color: #37302d; font-size: 18px; }
|
||
.force-full-width { width: 100% !important; }
|
||
</style>
|
||
</head>
|
||
<body class="body" style="padding:0; margin:0; display:block; background:#f8f8f8; -webkit-text-size-adjust:none" bgcolor="#f8f8f8">
|
||
<table align="left" cellpadding="0" cellspacing="0" width="100%" height="100%">
|
||
<tr>
|
||
<td align="left" valign="top" bgcolor="#f8f8f8" width="100%">
|
||
<br>
|
||
<table style="margin: 0 auto;" cellpadding="0" cellspacing="0" width="700" class="w320">
|
||
<tr>
|
||
<td align="left" valign="top">
|
||
<table style="margin: 0 auto;" cellpadding="0" cellspacing="0" width="100%">
|
||
<tr>
|
||
<td style="text-align:center;">
|
||
<center>
|
||
<picture style="text-align: center">
|
||
<img src="https://my.mivita.care/images/logo_mivita.png" alt="mivita.care" style="border:none" width="230">
|
||
</picture>
|
||
</center>
|
||
<br>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
<table cellpadding="10" style="padding: 10px;" cellspacing="0" border="0" width="100%" bgcolor="#ffffff">
|
||
<tr>
|
||
<td class="headline">
|
||
<b>{{ $headline }}</b>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td style="color:#37302d;line-height:1.6em;">
|
||
{{ trim($salutation) }},
|
||
@foreach ($paragraphs as $paragraph)
|
||
<br><br>
|
||
{{ $paragraph }}
|
||
@endforeach
|
||
</td>
|
||
</tr>
|
||
@foreach (['customers' => $customers, 'team' => $team] as $listKey => $rows)
|
||
@if (count($rows) > 0)
|
||
<tr>
|
||
<td style="color:#37302d;line-height:1.6em;">
|
||
<b>{{ __('suspension.list_'.$listKey, ['count' => count($rows)]) }}</b>
|
||
<table cellpadding="6" cellspacing="0" border="0" width="100%" style="border-collapse: collapse !important; font-size: 13px; margin-top: 6px;">
|
||
<tr style="background:#f6fdf5;">
|
||
<td style="border-bottom:1px solid #b5c49b;"><b>{{ __('suspension.col_first_name') }}</b></td>
|
||
<td style="border-bottom:1px solid #b5c49b;"><b>{{ __('suspension.col_last_name') }}</b></td>
|
||
<td style="border-bottom:1px solid #b5c49b;"><b>{{ __('suspension.col_phone') }}</b></td>
|
||
<td style="border-bottom:1px solid #b5c49b;"><b>{{ __('suspension.col_email') }}</b></td>
|
||
</tr>
|
||
@foreach ($rows as $row)
|
||
<tr>
|
||
<td style="border-bottom:1px solid #eeeeee;">{{ $row['first_name'] }}</td>
|
||
<td style="border-bottom:1px solid #eeeeee;">{{ $row['last_name'] }}</td>
|
||
<td style="border-bottom:1px solid #eeeeee;">{{ $row['phone'] !== '' ? $row['phone'] : '–' }}</td>
|
||
<td style="border-bottom:1px solid #eeeeee;">{{ $row['email'] }}</td>
|
||
</tr>
|
||
@endforeach
|
||
</table>
|
||
</td>
|
||
</tr>
|
||
@endif
|
||
@endforeach
|
||
<tr>
|
||
<td style="color:#37302d;line-height:1.6em;">
|
||
<br>
|
||
{{ $greetings }}<br>
|
||
{{ $sender }}
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
<center>
|
||
<table cellpadding="0" cellspacing="0" class="force-full-width" bgcolor="#f8f8f8" style="margin: 0 auto; text-align: center;line-height:1.6em;">
|
||
<tr>
|
||
<td style="color:#7B7B7E; font-size:14px; text-align: center;line-height:1.6em;" align="center">
|
||
<p>{{__('email.footer_copy1')}}</p>
|
||
<br>
|
||
<a href="https://www.mivita.care" style="color: #7B7B7E; text-decoration: underline;">www.mivita.care</a>
|
||
<br>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<td style="color:#bbbbbb; font-size:12px; text-align: center;line-height:1.6em;" align="center">
|
||
<p>{{__('email.footer_copy2')}}</p>
|
||
<a href="https://www.mivita.care/datenschutz">{{ __('dataprotect.data_protect') }}</a> <br>
|
||
<p>{{__('email.footer_copy3')}}</p>
|
||
<br><br>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</center>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</body>
|
||
</html>
|