2021-03-25 17:59:02 +01:00
< ? php
namespace App\Http\Controllers ;
use App\Http\Requests\CustomerRegisterRequest ;
2021-04-13 13:50:25 +02:00
use App\Http\Requests\UpdateInfosRequest ;
2021-03-25 17:59:02 +01:00
use App\Mail\PasswordResetMail ;
use App\Mail\RegisterConfirmMail ;
use App\Models\Customers ;
2021-04-21 17:50:57 +02:00
use App\Models\Magasin ;
2021-04-14 09:34:23 +02:00
use App\Models\Order ;
2021-03-25 17:59:02 +01:00
use App\Models\PasswordReset ;
2021-07-21 15:03:37 +02:00
use App\Models\Salarie ;
2021-07-21 12:57:50 +02:00
use App\Models\Setting ;
2021-03-25 17:59:02 +01:00
use Exception ;
use Illuminate\Http\Request ;
use Illuminate\Support\Facades\Auth ;
use Illuminate\Support\Facades\Mail ;
use Illuminate\Support\Facades\Session ;
use Illuminate\Support\Str ;
class CustomerController extends Controller
{
/**
* Affiche la page d ' inscription
*/
public function registerForm ()
{
if ( Auth :: guard ( 'customer' ) -> check ()) {
return redirect () -> route ( 'home' );
}
2021-07-21 12:57:50 +02:00
2021-03-25 17:59:02 +01:00
return view ( 'auth.register' );
}
/**
* Enregistre le customer dans la base de données
2021-04-14 09:34:23 +02:00
* et CRM
2021-03-25 17:59:02 +01:00
*/
public function register ( CustomerRegisterRequest $request )
{
/** @var \App\Lib\LDCCRM\ApiV1 */
$crm = app ( 'crmApi' );
2021-04-15 13:07:46 +02:00
2021-03-25 17:59:02 +01:00
$crmCustomer = $crm -> createCustomer (
$request -> email ,
$request -> password ,
$request -> firstname ,
$request -> lastname ,
$request -> optin !== null ? 1 : 0 ,
2021-03-26 16:10:56 +01:00
$request -> birth_date ,
2021-03-25 17:59:02 +01:00
isset ( $phone ) ? $phone : null ,
isset ( $address ) ? $address : null ,
null ,
2021-03-26 16:10:56 +01:00
$request -> town ,
$request -> postal_code ,
2021-03-25 17:59:02 +01:00
null
);
if ( $crmCustomer -> status === " OK " ) {
2021-04-15 13:07:46 +02:00
$customer = new Customers ( $request -> all ());
$customer -> crm_id = $crmCustomer -> user -> crm_id ;
2021-03-25 17:59:02 +01:00
$customer -> hashcode = $crmCustomer -> user -> hashcode ;
$customer -> save ();
2021-07-21 15:03:37 +02:00
//liaison éventuelle avec la table salaries
if ( $request -> matricule && $request -> code ) {
$salarie = Salarie :: where ( 'matricule' , '=' , $request -> matricule )
-> where ( 'code' , '=' , $request -> code )
-> firstOrFail ();
$salarie -> customer_id = $customer -> id ;
$salarie -> save ();
}
2021-03-25 17:59:02 +01:00
Mail :: to ( $request -> email ) -> send ( new RegisterConfirmMail ( $customer , $request -> firstname ));
2021-09-27 15:19:05 +02:00
Mail :: mailer ( 'smtp2' ) -> to ( $request -> email ) -> send ( new RegisterConfirmMail ( $customer , $request -> firstname ));
2021-03-25 17:59:02 +01:00
2021-03-26 16:10:56 +01:00
return view ( 'auth.register-success' , [ 'mail' => $request -> email ]);
2021-03-25 17:59:02 +01:00
} 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 ()) {
2021-04-13 13:50:25 +02:00
return redirect () -> route ( 'account.dashboard' );
2021-03-25 17:59:02 +01:00
}
if ( $request -> get ( 'url' )) {
Session :: put ( 'url.intended' , $request -> get ( 'url' ));
Session :: save ();
}
2021-03-26 16:10:56 +01:00
return view ( 'auth.login' );
2021-03-25 17:59:02 +01:00
}
/**
* Gère l ' authentification des customers
*/
public function authenticate ( Request $request )
{
$request -> validate ([
'email' => 'required|email:rfc' ,
'password' => 'required' ,
]);
2021-04-15 13:07:46 +02:00
$email = filter_var ( $request -> email , FILTER_SANITIZE_EMAIL );
2021-03-25 17:59:02 +01:00
$password = $request -> password ;
$remember = $request -> remember !== null ? true : false ;
2021-05-05 09:08:57 +02:00
//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
2021-05-04 18:01:56 +02:00
$customer = new Customers ( $request -> all ());
$customer -> crm_id = $result -> user -> crm_id ;
$customer -> hashcode = $result -> user -> hashcode ;
$customer -> save ();
}
2021-05-05 09:08:57 +02:00
//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 :
2021-05-19 17:08:38 +02:00
$customer = Customers :: where ( 'email' , $email ) -> first ();
2021-05-05 09:08:57 +02:00
Mail :: to ( $email ) -> send ( new RegisterConfirmMail ( $customer , null ));
2021-09-27 15:19:05 +02:00
Mail :: mailer ( 'smtp2' ) -> to ( $email ) -> send ( new RegisterConfirmMail ( $customer , null ));
2021-05-05 09:08:57 +02:00
// @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. " );
}
2021-03-25 17:59:02 +01:00
}
}
/**
* 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 */
2021-04-15 13:07:46 +02:00
$crm = app ( 'crmApi' );
2021-03-25 17:59:02 +01:00
$result = $crm -> activateCustomer ( $customer -> crm_id );
if ( $result -> status === " OK " ) {
2021-04-15 13:07:46 +02:00
// @phpcs:ignore Generic.Files.LineLength
2021-03-26 16:10:56 +01:00
return view ( 'auth.activate' ) -> with ( 'message' , 'Votre compte a bien été activé, vous pouvez désormais vous connecter.' );
2021-03-25 17:59:02 +01:00
} else {
2021-03-26 16:10:56 +01:00
return view ( 'auth.activate' ) -> with ( 'message' , " Ce lien d'activation n'est pas valide. " );
2021-03-25 17:59:02 +01:00
}
} else {
2021-03-26 16:10:56 +01:00
return view ( 'auth.activate' ) -> with ( 'message' , " Ce lien d'activation n'est pas valide. " );
2021-03-25 17:59:02 +01:00
}
}
2021-04-14 09:34:23 +02:00
/**
* deconnexion customer
*/
2021-03-25 17:59:02 +01:00
public function logout ()
{
if ( Auth :: guard ( 'customer' ) -> check ()) {
Auth :: guard ( 'customer' ) -> logout ();
return redirect () -> route ( 'home' );
}
}
2021-04-14 09:34:23 +02:00
/**
* page d ' accès à la procédure mdp oublié
*/
2021-03-26 16:10:56 +01:00
public function forgotPasswordForm ( Request $request )
{
return view ( 'auth.passwords.forgot' );
}
2021-04-14 09:34:23 +02:00
/**
* initialisation de la procédure de mdp oublié
*/
2021-03-25 17:59:02 +01:00
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 );
2021-04-15 13:07:46 +02:00
$passwordReset = new PasswordReset ();
$passwordReset -> email = $email ;
$passwordReset -> token = $token ;
2021-03-25 17:59:02 +01:00
$passwordReset -> created_at = now ();
$passwordReset -> save ();
Mail :: to ( $email ) -> send ( new PasswordResetMail ( $token ));
2021-09-27 15:19:05 +02:00
Mail :: mailer ( 'smtp2' ) -> to ( $email ) -> send ( new PasswordResetMail ( $token ));
2021-04-15 13:07:46 +02:00
// @phpcs:ignore Generic.Files.LineLength
2021-03-25 17:59:02 +01:00
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 );
}
2021-03-26 16:10:56 +01:00
return view ( 'auth.passwords.reset' , compact ( 'customer' )) -> with ( 'token' , $token );
2021-03-25 17:59:02 +01:00
}
2021-04-14 09:34:23 +02:00
/**
* changement de mot de passe ( depuis la procédure de mdp oublié )
*/
2021-03-25 17:59:02 +01:00
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 ();
2021-04-15 13:07:46 +02:00
$customer = Customers :: where ( 'email' , $passwordReset -> email ) -> first ();
$crmId = $customer -> crm_id ;
2021-03-25 17:59:02 +01:00
} 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' );
2021-04-15 13:07:46 +02:00
2021-03-25 17:59:02 +01:00
$result = $crm -> changePwdCustomer ( $crmId , $password );
if ( $result -> status === " OK " ) {
$passwordReset -> delete ();
2021-03-26 16:10:56 +01:00
return view ( 'auth.passwords.reset-ok' , compact ( 'customer' ));
2021-03-25 17:59:02 +01:00
} else {
switch ( $result -> code ) {
case 107 :
return back () -> withErrors ( " Veuillez vérifier que vous avez correctement rempli les champs obligatoires. " );
2021-03-26 16:10:56 +01:00
case 108 :
case 109 :
2021-03-25 17:59:02 +01:00
return back () -> withErrors ( " Changement impossible, compte inexistant. " );
default :
return back () -> withErrors ( " Une erreur est survenue, merci de réessayer ultérieurement. " );
}
}
}
2021-04-14 09:34:23 +02:00
/**
* profil client ( mon compte )
*/
2021-04-13 13:50:25 +02:00
public function dashboard ( Request $request )
{
2021-03-26 16:10:56 +01:00
2021-04-13 13:50:25 +02:00
//show Profile
$customer = Auth :: guard ( 'customer' ) -> user ();
if ( ! $customer ) {
abort ( 404 );
}
2021-03-26 16:10:56 +01:00
2021-04-13 13:50:25 +02:00
/** @var \App\Lib\LDCCRM\ApiV1 */
2021-04-15 13:07:46 +02:00
$crm = app ( 'crmApi' );
2021-04-13 13:50:25 +02:00
$crmCustomer = $crm -> getCustomer ( $customer -> crm_id );
if ( $crmCustomer -> status === " KO " ) {
abort ( 503 );
}
2021-04-15 13:07:46 +02:00
$crmInfos = $crmCustomer -> user ;
2021-04-13 13:50:25 +02:00
$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
2021-04-15 13:07:46 +02:00
* @ param UpdateInfosRequest $request
*
2021-04-13 13:50:25 +02:00
*/
public function updateInfos ( UpdateInfosRequest $request )
{
// TODO : Activer le changement d'email quand ce sera possible dans la CRM
/** @var \App\Lib\LDCCRM\ApiV1 */
2021-04-15 13:07:46 +02:00
$crm = app ( 'crmApi' );
2021-04-13 13:50:25 +02:00
$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. " ));
}
2021-04-14 09:34:23 +02:00
/**
* changement de mot de passe depuis le profil
*/
2021-04-13 13:50:25 +02:00
public function changePasswordWhenAuthenticated ( Request $request )
{
$request -> validate ([
'password' => 'required|min:8|confirmed|max:255'
]);
2021-04-15 13:07:46 +02:00
$crm = app ( 'crmApi' );
2021-04-13 13:50:25 +02:00
$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. " ));
}
}
2021-03-26 16:10:56 +01:00
2021-04-14 09:34:23 +02:00
/**
* affichage des commandes du customer connecté
*/
2021-04-15 13:07:46 +02:00
public function myOrders ( Request $request )
{
2021-04-14 09:34:23 +02:00
$orders = Order :: where ( 'customer_id' , Auth :: guard ( 'customer' ) -> user () -> id ) -> orderBy ( 'date' , 'DESC' ) -> get ();
return view ( 'customer.my-orders' , compact ( 'orders' ));
}
2021-04-15 13:07:46 +02:00
public function orderDetail ( $reference )
{
2021-05-05 09:08:57 +02:00
$order = Order :: where ( 'reference' , '=' , $reference )
2021-04-14 09:34:23 +02:00
-> where ( 'customer_id' , Auth :: guard ( 'customer' ) -> user () -> id )
-> firstOrFail ();
2021-11-09 15:24:22 +01:00
if ( $order -> status_id == 1 ) {
$magasin = null ;
} else {
$magasin = Magasin :: find ( $order -> timeslot -> magasin -> id );
}
2021-04-21 17:50:57 +02:00
return view ( 'customer.order-detail' , compact ( 'order' , 'magasin' ));
2021-04-14 09:34:23 +02:00
}
2021-03-25 17:59:02 +01:00
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
2021-04-15 13:07:46 +02:00
if ( Auth :: guard ( 'customer' ) -> user () -> id === $customer -> id ) {
2021-03-25 17:59:02 +01:00
Auth :: guard ( 'customer' ) -> logout ();
2021-04-15 13:07:46 +02:00
}
2021-03-25 17:59:02 +01:00
$customer -> delete ();
return redirect () -> route ( 'home' );
}
}