current(); if (! $tenant || ! data_get($tenant->settings, 'shop.enabled')) { throw new NotFoundHttpException('Magazinul online nu este activ.'); } return $tenant; } public function showRegister() { $tenant = $this->tenantOrFail(); if (Auth::guard('shop')->check()) return redirect('/shop/account'); return view('shop.auth.register', ['tenant' => $tenant, 'cartCount' => $this->cartCount()]); } public function register(Request $request) { $tenant = $this->tenantOrFail(); $data = $request->validate([ 'name' => 'required|string|max:160', 'phone' => 'required|string|max:40', 'email' => 'nullable|email|max:160', 'password' => 'required|string|min:6|confirmed', ]); // Unique per tenant (handled by composite index, but check for nicer error). if (ShopCustomer::where('phone', $data['phone'])->exists()) { return back()->withErrors(['phone' => 'Există deja un cont cu acest telefon.'])->withInput(); } // Auto-link to existing Client by phone if present. $client = Client::where('phone', $data['phone'])->first(); $customer = ShopCustomer::create([ 'client_id' => $client?->id, 'name' => $data['name'], 'phone' => $data['phone'], 'email' => $data['email'] ?? null, 'password' => $data['password'], // hashed by cast ]); event(new Registered($customer)); Auth::guard('shop')->login($customer, remember: true); $customer->forceFill(['last_login_at' => now()])->save(); return redirect('/shop/account'); } public function showLogin() { $tenant = $this->tenantOrFail(); if (Auth::guard('shop')->check()) return redirect('/shop/account'); return view('shop.auth.login', ['tenant' => $tenant, 'cartCount' => $this->cartCount()]); } public function login(Request $request) { $tenant = $this->tenantOrFail(); $data = $request->validate([ 'phone' => 'required|string|max:40', 'password' => 'required|string', ]); $ok = Auth::guard('shop')->attempt( ['phone' => $data['phone'], 'password' => $data['password']], remember: true ); if (! $ok) { return back()->withErrors(['phone' => 'Telefon sau parolă incorecte.'])->withInput(); } $request->session()->regenerate(); Auth::guard('shop')->user()?->forceFill(['last_login_at' => now()])->save(); return redirect()->intended('/shop/account'); } public function logout(Request $request) { Auth::guard('shop')->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/shop'); } public function account() { $tenant = $this->tenantOrFail(); $customer = Auth::guard('shop')->user(); if (! $customer) return redirect('/shop/login'); $orders = $customer->orders() ->latest('created_at') ->limit(50) ->get(); return view('shop.account', [ 'tenant' => $tenant, 'customer' => $customer, 'orders' => $orders, 'cartCount' => $this->cartCount(), ]); } private function cartCount(): int { $tenant = app(TenantManager::class)->current(); $cart = (array) session('shop_cart_' . ($tenant?->id ?? '0'), []); return (int) collect($cart)->sum('qty'); } }