mivita/app/Http/Controllers/Web/CustomerEmailChangeController.php
Kevin Adametz 9ad69a3218 Kundenhoheit: E-Mail-Aenderung mit Bestaetigung, Zuordnungsfehler behoben, Admin-Uebersicht
- E-Mail-Aenderung durch Berater wird erst nach Bestaetigung durch den Kunden
  aktiv (Link an die neue Adresse, Portal kunde/email-bestaetigen); danach
  ziehen alle Eintraege des Kunden und seine Abos mit. Admins aendern direkt.
- Kundenhoheit: E-Mail eines Beraterkontos oder eines Kunden eines anderen
  Beraters wird abgelehnt (beim Speichern und bei der Bestaetigung).
- Fix CustomerPriority::entryExists: aelteste gepruefte Zuordnung gilt,
  Eintraege in Pruefung (is_like) dienen nicht mehr als Vorlage.
- "Berater zuweisen" voreingestellt auf alle Bestellungen des Kunden.
- Neue Admin-Seite Kundenhoheit: offene Pruefungen, Kunden bei mehreren
  Beratern, abgelehnte/offene E-Mail-Aenderungen; Zaehler im Menue.
- Neue Tabelle shopping_user_email_changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 08:48:17 +00:00

43 lines
1.6 KiB
PHP

<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Services\CustomerEmailChangeService;
use Illuminate\Contracts\View\View;
/**
* Login-free confirmation of a new customer e-mail address via the tokenized link in the
* confirmation mail. GET only shows the page; the change is applied on POST, so mail
* scanners that open links cannot confirm on the customer's behalf.
*/
class CustomerEmailChangeController extends Controller
{
public function show(string $token, CustomerEmailChangeService $service): View
{
$change = $service->findConfirmable($token);
if (! $change) {
return view('portal.customer.email_change_done', ['status' => CustomerEmailChangeService::STATUS_INVALID]);
}
if ($change->shopping_user && $service->ownershipConflict($change->shopping_user, $change->new_email)) {
return view('portal.customer.email_change_done', ['status' => CustomerEmailChangeService::STATUS_CONFLICT]);
}
return view('portal.customer.email_change_confirm', [
'change' => $change,
'token' => $token,
]);
}
public function store(string $token, CustomerEmailChangeService $service): View
{
$change = $service->findConfirmable($token);
$status = $change ? $service->confirm($change) : CustomerEmailChangeService::STATUS_INVALID;
return view('portal.customer.email_change_done', [
'status' => $status,
'email' => $status === CustomerEmailChangeService::STATUS_CONFIRMED ? $change->new_email : null,
]);
}
}