check()) { return redirect()->route('home'); } return view('auth.register'); } /** * Enregistre le customer dans la base de données * et CRM */ public function register(CustomerRegisterRequest $request) { /** @var \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $crmCustomer = $crm->createCustomer( $request->email, $request->password, $request->firstname, $request->lastname, $request->optin !== null ? 1 : 0, $request->birth_date, isset($phone) ? $phone : null, isset($address) ? $address : null, null, $request->town, $request->postal_code, null ); if ($crmCustomer->status === "OK") { $customer = new Customers($request->all()); $customer->crm_id = $crmCustomer->user->crm_id; $customer->hashcode = $crmCustomer->user->hashcode; $customer->save(); Mail::to($request->email)->send(new RegisterConfirmMail($customer, $request->firstname)); return view('auth.register-success', ['mail' => $request->email]); } else { switch ($crmCustomer->code) { case 102: return back()->withInput()->withErrors( "Les champs obligatoires n'ont pas été correctement remplis." ); case 103: return back()->withInput()->withErrors( "Un compte est déjà associé à cette adresse email." ); default: return back()->withInput()->withErrors( "Une erreur est survenue lors de l'inscription, merci de réessayer plus tard." ); } } } /** * Retourne la page de connexion */ public function authenticateForm(Request $request) { if (Auth::guard('customer')->check()) { return redirect()->route('account.dashboard'); } if ($request->get('url')) { Session::put('url.intended', $request->get('url')); Session::save(); } return view('auth.login'); } /** * Gère l'authentification des customers */ public function authenticate(Request $request) { $request->validate([ 'email' => 'required|email:rfc', 'password' => 'required', ]); $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); $password = $request->password; $remember = $request->remember !== null ? true : false; //check CRM /** @var \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $result = $crm->loginCustomer($email, $password); if ($result->status === "OK") { //exists in crm //do we have the customer in local DB ? /** @var Customers */ $customer = Customers::where('email', $email)->first(); if (!$customer) { //create user $customer = new Customers($request->all()); $customer->crm_id = $result->user->crm_id; $customer->hashcode = $result->user->hashcode; $customer->save(); } //connect and redirect /** @var \Illuminate\Auth\SessionGuard */ $guard = Auth::guard('customer'); $guard->login($customer, $remember); $url = Session::pull('url.intended'); Session::forget('url.intended'); Session::save(); if (empty($url)) { return redirect()->route('account.dashboard'); } return redirect()->to($url); } else { //doesn't exist or is invalid switch ($result->code) { case 115: // @phpcs:ignore Generic.Files.LineLength return back()->withErrors("Veuillez vérifier que vous avez correctement rempli les champs obligatoires."); case 116: Mail::to($email)->send(new RegisterConfirmMail($customer, null)); // @phpcs:ignore Generic.Files.LineLength return back()->withErrors("Votre compte n'est pas activé, vérifier dans vos emails pour y trouver le mail de confirmation. Un lien d'activation vous a été renvoyer."); case 117 || 118 || 119: return back()->withErrors("Email ou mot de passe incorrect."); default: return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement."); } } } /** * Active le compte d'un customer */ public function activate($hashcode) { $hashcode = filter_var($hashcode, FILTER_SANITIZE_STRING); $customer = Customers::select('crm_id')->where('hashcode', $hashcode)->first(); if ($customer) { /** @var \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $result = $crm->activateCustomer($customer->crm_id); if ($result->status === "OK") { // @phpcs:ignore Generic.Files.LineLength return view('auth.activate')->with('message', 'Votre compte a bien été activé, vous pouvez désormais vous connecter.'); } else { return view('auth.activate')->with('message', "Ce lien d'activation n'est pas valide."); } } else { return view('auth.activate')->with('message', "Ce lien d'activation n'est pas valide."); } } /** * deconnexion customer */ public function logout() { if (Auth::guard('customer')->check()) { Auth::guard('customer')->logout(); return redirect()->route('home'); } } /** * page d'accès à la procédure mdp oublié */ public function forgotPasswordForm(Request $request) { return view('auth.passwords.forgot'); } /** * initialisation de la procédure de mdp oublié */ public function passwordReset(Request $request) { $request->validate([ 'email' => 'required|email:rfc|max:255', ]); $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); $customerExist = Customers::where('email', $email)->count() === 0 ? false : true; if ($customerExist) { // Suppression des anciens tokens PasswordReset::where('email', $email)->delete(); $token = Str::random(80); $passwordReset = new PasswordReset(); $passwordReset->email = $email; $passwordReset->token = $token; $passwordReset->created_at = now(); $passwordReset->save(); Mail::to($email)->send(new PasswordResetMail($token)); // @phpcs:ignore Generic.Files.LineLength return back()->with('success', __("La procédure pour changer votre mot de passe a été envoyé sur votre email.")); } else { return back()->withErrors(__("Cette adresse email n'est pas enregistrée dans nos services.")); } } /** * Print the view used to change the password of a user when he required it * @param $token Token used to identificate the user to change the password of * @return View The view to print */ public function viewChangePassword($token) { $pwdReset = PasswordReset::where('token', $token)->first(); if (!$pwdReset) { abort(419); } $customer = Customers::where('email', $pwdReset->email)->first(); if (!$customer) { abort(404); } return view('auth.passwords.reset', compact('customer'))->with('token', $token); } /** * changement de mot de passe (depuis la procédure de mdp oublié) */ public function changePassword(Request $request, $token) { $request->validate([ 'password' => 'required|confirmed|min:8|max:255' ]); $password = $request->password; try { $passwordReset = PasswordReset::where('token', $token)->first(); $customer = Customers::where('email', $passwordReset->email)->first(); $crmId = $customer->crm_id; } catch (Exception $e) { return back()->withErrors("Changement du mot de passe impossible, les données envoyés sont incorrectes."); } /** @var \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $result = $crm->changePwdCustomer($crmId, $password); if ($result->status === "OK") { $passwordReset->delete(); return view('auth.passwords.reset-ok', compact('customer')); } else { switch ($result->code) { case 107: return back()->withErrors("Veuillez vérifier que vous avez correctement rempli les champs obligatoires."); case 108: case 109: return back()->withErrors("Changement impossible, compte inexistant."); default: return back()->withErrors("Une erreur est survenue, merci de réessayer ultérieurement."); } } } /** * profil client (mon compte) */ public function dashboard(Request $request) { //show Profile $customer = Auth::guard('customer')->user(); if (!$customer) { abort(404); } /** @var \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $crmCustomer = $crm->getCustomer($customer->crm_id); if ($crmCustomer->status === "KO") { abort(503); } $crmInfos = $crmCustomer->user; $birthDate = explode('-', $crmInfos->birth_date); return view('customer.dashboard', compact('customer', 'crmInfos', 'birthDate')); } /** * Send a request to the CRM to change the given customer's informations * @param UpdateInfosRequest $request * */ public function updateInfos(UpdateInfosRequest $request) { // TODO : Activer le changement d'email quand ce sera possible dans la CRM /** @var \App\Lib\LDCCRM\ApiV1 */ $crm = app('crmApi'); $crmCustomer = $crm->updateCustomer( Auth::guard('customer')->user()->crm_id, $request->firstname, $request->lastname, $request->optin !== null ? 1 : 0, $request->year . '-' . $request->month . '-' . $request->day, $request->phone, $request->address, null, $request->city, $request->postcode, null ); if ($crmCustomer->status === "KO") { return redirect()->route('account.dashboard') ->withErrors(__("Une erreur est survenue, merci de réessayer ultérieurement.")); } return redirect()->route('account.dashboard') ->with('success', __("Vos informations ont bien été enregistrées.")); } /** * changement de mot de passe depuis le profil */ public function changePasswordWhenAuthenticated(Request $request) { $request->validate([ 'password' => 'required|min:8|confirmed|max:255' ]); $crm = app('crmApi'); $customer = $crm->changePwdCustomer(Auth::guard('customer')->user()->crm_id, $request->password); if ($customer->status === "OK") { return back()->with('success', __("Modifications enregistrés !")); } else { return back()->withErrors(__("Une erreur est survenue, merci de réessayer ultérieurement.")); } } /** * affichage des commandes du customer connecté */ public function myOrders(Request $request) { $orders = Order::where('customer_id', Auth::guard('customer')->user()->id)->orderBy('date', 'DESC')->get(); return view('customer.my-orders', compact('orders')); } public function orderDetail($reference) { $order = Order::where('reference', '=', $reference) ->where('customer_id', Auth::guard('customer')->user()->id) ->firstOrFail(); $magasin = Magasin::first(); return view('customer.order-detail', compact('order', 'magasin')); } public function delete($id) { // TODO : Implémenter la suppression lorsque la CRM sera prête pour le faire aussi die('Not implemented yet'); // Suppression d'un compte client $customer = Customers::findOrFail($id); $customer->recipes()->delete(); $customer->products()->delete(); $customer->answers()->delete(); $customer->forums()->delete(); // TODO : Suppression via la CRM if (Auth::guard('customer')->user()->id === $customer->id) { Auth::guard('customer')->logout(); } $customer->delete(); return redirect()->route('home'); } }