Optimierung 3.5: Kleinere Zentralisierungen (VAT, findByEmail, Waehrung, Provisioning)
- VatResolver::normalizeCountryCode()/isEuCountry() als Single Source of Truth;
resolve(), VatIdValidationService und StripeCheckoutService nutzen jetzt die
zentrale EU-Pruefung statt eigener config-Lookups.
- User::findByEmail() buendelt die LOWER(email)-Lookups (ContactAccessService,
SocialAuthService). Bleibt bewusst case-insensitiv, da E-Mails nicht
normalisiert gespeichert werden; der indexfreundliche Direktvergleich
braucht erst eine Schreib-Normalisierung (offen, dokumentiert).
- config('billing.default_currency') ersetzt 8 verstreute 'EUR'/'eur'-Literale
(Stripe-Calls via strtolower). Vereinheitlicht nebenbei die zuvor uneinheitlich
gespeicherte SinglePurchase.currency.
- Neuer CustomerAccountProvisioner::provisionVerifiedCustomer() ist die
gemeinsame Provisioning-Methode (verifiziert + aktiv + customer-Rolle) fuer
ContactAccessService und SocialAuthService.
- Tests: UserFindByEmailTest, erweiterte VatResolverTest.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
31d407d3ad
commit
b255d90721
19 changed files with 151 additions and 46 deletions
|
|
@ -132,6 +132,27 @@ class User extends Authenticatable implements MustVerifyEmail
|
|||
|
||||
private ?int $cachedOpenSinglePurchaseCount = null;
|
||||
|
||||
/**
|
||||
* Findet einen User case-insensitive anhand der E-Mail. Single Source of
|
||||
* Truth für die E-Mail-basierte Auflösung (Magic-Link, Social-Login,
|
||||
* Kontakt-Zugang).
|
||||
*
|
||||
* Bewusst weiterhin über `LOWER(email)`: E-Mails werden nicht normalisiert
|
||||
* gespeichert, daher ist der case-insensitive Vergleich Pflicht. Ein
|
||||
* indexfreundlicher Direktvergleich setzt eine Normalisierung beim
|
||||
* Schreiben voraus (separater, datenseitiger Schritt).
|
||||
*/
|
||||
public static function findByEmail(string $email): ?self
|
||||
{
|
||||
$email = mb_strtolower(trim($email));
|
||||
|
||||
if ($email === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
return static::query()->whereRaw('LOWER(email) = ?', [$email])->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Der Tarif des aktiven Stripe-Abos, aufgelöst über die in `plans`
|
||||
* gepflegten Stripe-Preis-IDs. Null ohne (gültiges) Abo.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue