<?php
namespace App\Controller\Front;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Doctrine\ORM\EntityManagerInterface;
use App\Manager\CustomerManager;
use App\Entity\Customer;
use App\Manager\CartManager;
class CustomerController extends FrontController
{
public function block(CustomerManager $customerMgr)
{
$customer = $customerMgr->getCustomer();
return $this->render('front/customer/blocks/header.html.twig', [
'customer' => $customer
]);
}
/**
* @Route("/{_locale}/customer/login", name="customer_login")
*/
public function login(Request $request, CustomerManager $customerMgr, Session $session, \Doctrine\ORM\EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$from = $request->get('from','index');
$customer = $customerMgr->getCustomer();
if(!empty($customer))
return $this->redirectToRoute ('customer_account');
$loginForm = $this->createForm(\App\Form\Customer\LoginType::class,null,[
'action' => $this->generateUrl('customer_login', ['from'=>$from]),
'method' => 'POST',
'translator' => $translator,
'locale' => $request->getLocale(),
'attr' => [
'novalidate'=>'novalidate'
]
]);
$registerForm = $this->createForm(\App\Form\Customer\QuickRegisterType::class,null,[
'action' => $this->generateUrl('customer_login', ['from'=>$from]),
'method' => 'POST',
'entity_manager'=>$em,
'attr' => [
'novalidate'=>'novalidate'
]
]);
if($request->isMethod('POST')){
$loginForm->handleRequest($request);
if($loginForm->isSubmitted()){
if($loginForm->isValid()){
$data = $loginForm->getData();
try{
$result = $customerMgr->login($data['email'], $data['password']);
if($result!==false){
$status = $result->getStatus();
if($status == Customer::STATUS_WAITING){
$session->getFlashBag()->add('popup', $translator->trans("Votre demande de création de compte PRO a bien été prise en compte. Notre délai de traitement est de 72h. Au-delà de ce délai, si vous rencontrez des problèmes de connexion, nous vous invitons à contacter le service client au +33 (0)2 47 73 38 38, email : infos@vivog.fr"));
// $tvaForm = $this->createTvaForm($result, $em, $translator, $from);
// $popup = $this->renderView('front/customer/forms/tva.html.twig', [
// 'tvaForm' => $tvaForm->createView()
// ]);
// $session->getFlashBag()->add('modal', $popup);
}elseif($status == Customer::STATUS_BLOCKED){
$session->getFlashBag()->add('popup', $translator->trans("Votre demande de compte Pro n’a pas pu être validée. Il nous manque des éléments pour valider votre accès PRO. Nous vous invitons à contacter le service client au +33 (0)2 47 73 38 38, email : infos@vivog.fr."));
}
$priceGroups = $result->getPriceGroups();
if(count($priceGroups) > 1) {
$msg = $this->renderView('front/customer/popups/price-groups/login.html.twig', [
'customer' => $customer,
'priceGroups' => $priceGroups,
'from' => $this->generateUrl($from)
]);
$session->getFlashBag()->add('popup', $msg);
}else if(count($priceGroups) == 1) {
$customerMgr->setPriceContext($priceGroups->first()->getGroup());
}
return $this->redirectToRoute($from);
}else{
$session->getFlashBag()->add('error', $translator->trans("Erreur d'identification."));
}
} catch (\App\Exception\PriceGroupException $ex) {
$session->getFlashBag()->add('error', $translator->trans("Vous n'avez accès à aucun type de tarif. <br>Veuillez contacter notre équipe commerciale."));
} catch (\Exception $ex) {
$session->getFlashBag()->add('error', $translator->trans("Une erreur s'est produite."));
}
}else{
$session->getFlashBag()->add('error', $translator->trans($loginForm->getErrors()));
}
}
$registerForm->handleRequest($request);
if($registerForm->isSubmitted() && $registerForm->isValid()){
$email = strtolower(trim($registerForm->get('email')->getData()));
$customer = $em->getRepository('App:Customer')->findOneBy(array('email'=>$email));
if(!empty($customer)){
$session->getFlashBag()->add('error', $translator->trans("Un compte utilisateur utilise déjà l'adresse email : ").$email);
return $this->redirectToRoute('customer_login');
}
$session->set('email', $email);
return $this->redirectToRoute('customer_register');
}
}
$tpl = 'front/customer/identification.html.twig';
if(strpos($from, 'checkout')!==false)
$tpl = 'front/checkout/identification.html.twig';
return $this->render($tpl, [
'loginForm' => $loginForm->createView(),
'registerForm' => $registerForm->createView()
]);
}
/**
* @Route("/{_locale}/customer/context", name="customer_context")
*/
public function changeContext(Request $request, CustomerManager $customerMgr, CartManager $cartManager, \Doctrine\ORM\EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$ctx = $request->get('ctx', false);
$from = $request->get('from', false);
$confirm = $request->get('confirm', false);
$customer = $customerMgr->getCustomer();
if(empty($from)) {
$from = $this->generateUrl('index');
}
if($customer && ctype_alpha($ctx)) {
$priceGroup = $em->getRepository(\App\Entity\PriceGroup::class)->findOneByCode($ctx);
if($priceGroup) {
try{
if($confirm == 1) {
$cartManager->empty();
$customerMgr->setPriceContext($priceGroup);
return $this->redirect($from);
}else{
$msg = $this->renderView('front/customer/popups/price-groups/change.html.twig', [
'customer' => $customer,
'priceGroup' => $priceGroup,
'from' => $from
]);
$request->getSession()->getFlashBag()->add('popup', $msg);
}
} catch (Exception $ex) {
$request->getSession()->getFlashBag()->add('error', $translator->trans("Vous n'avez accès à aucun type de tarif. <br>Veuillez contacter notre équipe commerciale."));
}
}
}
return $this->redirectToRoute('index');
}
/**
* @Route("/{_locale}/customer/logout", name="customer_logout")
*/
public function logout(CustomerManager $customerMgr)
{
$customerMgr->logout();
return $this->redirectToRoute('index');
}
protected function createTvaForm(Customer $customer, \Doctrine\ORM\EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator, $from) {
return $this->createForm(\App\Form\Customer\TvaType::class, $customer,[
'action' => $this->generateUrl('customer_tva_popup', ['from'=>$from]),
'method' => 'POST',
'entity_manager'=>$em,
'translator'=>$translator
]);
}
/**
* @Route("/{_locale}/customer/popup/tva", name="customer_tva_popup")
*/
public function tvaPopup(Request $request, CustomerManager $customerMgr, \Doctrine\ORM\EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$output = [
'success' => false,
'message' => ''
];
$from = $request->get('from','index');
$customer = $customerMgr->getCustomer();
if(!empty($customer))
return $this->redirectToRoute ('customer_account');
$tvaForm = $this->createTvaForm($customer, $em, $translator, $from);
$customerId = $customer->getId();
if($request->isMethod('POST')){
$tvaForm->handleRequest($request);
if($tvaForm->isSubmitted() && $tvaForm->isValid()){
try {
$customer = $tvaForm->getData();
if($customer->getId() == $customerId){
$em->persist($customer);
$em->flush();
$output['success'] = true;
}else{
$output['message'] = "Identification incorrecte.";
}
} catch (\Exception $ex) {
$output['message'] = "Données saisies non valides.";
}
}else{
$output['message'] = "Données saisies non valides.";
}
}
return new JsonResponse($output);
}
/**
* @Route("/{_locale}/customer/register", name="customer_register")
*/
public function register(Request $request, CustomerManager $customerMgr, Session $session, \Doctrine\ORM\EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$from = $request->get('from','customer_account');
$email = $session->get('email','');
$registerForm = $this->createForm(\App\Form\Customer\RegisterType::class,['email'=>$email],[
'action' => $this->generateUrl('customer_register', ['from'=>$from]),
'method' => 'POST',
'entity_manager'=>$em,
'translator'=>$translator,
'locale' => $request->getLocale(),
'attr' => [
'novalidate'=>'novalidate'
]
]);
if($request->isMethod('POST')){
$registerForm->handleRequest($request);
if($registerForm->isValid()){
$data = $registerForm->getData();
$result = $customerMgr->register($data, $request->getLocale());
if($result!==false){
$session->getFlashBag()->add('popup', $translator->trans("Votre demande de création de compte a bien été prise en compte. Votre compte sera activé sous 72h. Au-delà de ce délai, si vous rencontrez des problèmes de connexion, nous vous invitons à contacter le service client au +33 (0)2 47 73 38 38, email : infos@vivog.fr."));
return $this->redirectToRoute($from);
}else{
$session->getFlashBag()->add('error', $result);
}
}
}
return $this->render('front/customer/register.html.twig',[
'registerForm' => $registerForm->createView()
]);
}
/**
* @Route("/{_locale}/customer/password", name="customer_password")
*/
public function password(Request $request, CustomerManager $customerMgr, \Doctrine\ORM\EntityManagerInterface $em, Session $session, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$from = $request->get('from','customer_account');
$passwordForm = $this->createForm(\App\Form\Customer\PasswordRecoveryType::class,null,[
'action' => $this->generateUrl('customer_password', ['from'=>$from]),
'method' => 'POST',
'translator' => $translator,
'locale' => $request->getLocale()
]);
if($request->isMethod('POST')){
$passwordForm->handleRequest($request);
if($passwordForm->isValid()){
$data = $passwordForm->getData();
$result = $customerMgr->renewPassword($data['email'], $request->getLocale());
if($result !== true){
$session->getFlashBag()->add('error', $result);
}
$session->getFlashBag()->add('notice', $translator->trans('Un nouveau mot de passe a été envoyé à votre adresse email.'));
return $this->redirectToRoute('customer_login');
}
}
return $this->render('front/customer/password.html.twig', [
'passwordForm' => $passwordForm->createView()
]);
}
/**
* @Route("/{_locale}/customer/password/change", name="customer_password_change")
*/
public function changePassword(Request $request, CustomerManager $customerMgr, \Doctrine\ORM\EntityManagerInterface $em, Session $session, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$from = $request->get('from','customer_account');
$customer = $customerMgr->getCustomer();
if(empty($customer))
return $this->redirectToRoute ('customer_login',['from'=>'customer_account']);
$passwordForm = $this->createForm(\App\Form\Customer\PasswordChangeType::class,null,[
'action' => $this->generateUrl('customer_password_change', ['from'=>$from]),
'method' => 'POST',
]);
if($request->isMethod('POST')){
$passwordForm->handleRequest($request);
if($passwordForm->isValid()){
$data = $passwordForm->getData();
$result = $customerMgr->changePassword($customer, $data['password'], $data['plainPassword']);
if($result===true){
$session->getFlashBag()->add('notice', $translator->trans('Votre mot de passe a été mis à jour...'));
}else{
$session->getFlashBag()->add('error', $result);
}
return $this->redirectToRoute('customer_password_change');
}
}
return $this->render('front/customer/password-change.html.twig', [
'customer' => $customer,
'passwordForm' => $passwordForm->createView()
]);
}
/**
* @Route("/{_locale}/customer/account", name="customer_account")
*/
public function account(CustomerManager $customerMgr)
{
$customer = $customerMgr->getCustomer();
if(!$customer){
return $this->redirectToRoute('customer_login',[
'from'=>'customer_account'
]);
}
return $this->render('front/customer/account.html.twig', [
'customer' => $customer
]);
}
/**
* @Route("/{_locale}/aj/customer/address", name="customer_address" )
*/
public function addressUpdate(Request $request, CustomerManager $customerMgr, \Doctrine\ORM\EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$customer = $customerMgr->getCustomer();
if(!$customer){
return $this->redirectToRoute('customer_login',[
'from'=>'customer_account'
]);
}
$address = null;
$id = $request->get('id',0);
$from = $request->get('from',false);
if($id)
$address = $em->getRepository('App:Address')->find($id);
if(empty($address)){
$address = new \App\Entity\Address();
$france = $em->getRepository(\App\Entity\Country::class)->find(73);
$address->setCountry($france);
}elseif($address->getCustomer()!=$customer){
throw new NotFoundHttpException();
}
$actionData = ['id'=>$id];
if(!empty($from)){
$actionData['from'] = $from;
}
$form = $this->createForm(\App\Form\Customer\AddressType::class, $address,[
'action' => $this->generateUrl('customer_address',$actionData),
'method' => 'POST',
'entity_manager' => $em,
'translator' => $translator,
'attr' => [
'id'=>'form-address',
'novalidate'=>'novalidate'
]
]);
if($request->isMethod('POST')){
$form->handleRequest($request);
if($form->isValid()){
try{
$address = $form->getData();
$address->setCustomer($customer);
$em->persist($address);
$default = $form->get('default')->getData();
if(!empty($default)){
$customer->setDefaultAddress($address);
$em->persist($customer);
}
$em->flush();
return new JsonResponse([
'success'=>true,
'address'=>$address->toArray(),
'redirect'=>empty($from)?false:$this->redirectToRoute ($from)
]);
}
catch (\Exception $ex) {
return new JsonResponse([
'success'=>false,
'error'=>$ex->getMessage()
]);
}
}
}
$content = $this->renderView('front/customer/forms/address.html.twig',[
'addressForm' => $form->createView()
]);
$response = new JsonResponse();
$response->setContent(json_encode([
'content' => $content
]));
return $response;
}
/**
* @Route("/{_locale}/aj/customer/address/selection", name="customer_address_selection" )
*/
public function addressSelection(Request $request, CustomerManager $customerMgr, EntityManagerInterface $em)
{
$type = $request->get('type','');
$customer = $customerMgr->getCustomer();
if(!$customer){
throw new NotFoundHttpException();
}
$addresses = $em->getRepository('App:Address')->findByCustomer($customer);
$content = $this->renderView('front/customer/blocks/address-selection.html.twig',[
'addresses' => $addresses,
'type' => $type
]);
$response = new JsonResponse();
$response->setContent(json_encode([
'content' => $content
]));
return $response;
}
/**
* @Route("/{_locale}/aj/customer/address/delete", name="customer_address_delete" )
*/
public function deleteAddress(Request $request, CustomerManager $customerMgr, EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$id = $request->get('id','');
$customer = $customerMgr->getCustomer();
if(!$customer){
throw new NotFoundHttpException();
}
$address = $em->getRepository('App:Address')->findByCustomer($customer);
try{
$address = $em->getRepository('App:Address')->find($id);
if($address){
if($address->getId() == $customer->getDefaultAddressId())
throw new \Exception($translator->trans('Impossible de supprimer votre adresse principale.'));
$em->remove($address);
$em->flush();
}else{
throw new \Exception($translator->trans('Adresse inconnue.'));
}
return new JsonResponse([
'success'=>true,
'address'=>$address->toArray()
]);
}
catch (\Exception $ex) {
return new JsonResponse([
'success'=>false,
'error'=>$ex->getMessage()
]);
}
$response = new JsonResponse();
$response->setContent(json_encode([
'success'=>false,
'error'=>''
]));
return $response;
}
/**
* @Route("/{_locale}/customer/information", name="customer_information")
*/
public function information(Request $request, \Symfony\Component\HttpFoundation\Session\SessionInterface $session, CustomerManager $customerMgr, EntityManagerInterface $em, \Symfony\Contracts\Translation\TranslatorInterface $translator)
{
$customer = $customerMgr->getCustomer();
if(!$customer){
return $this->redirectToRoute('customer_login',[
'from'=>'customer_history'
]);
}
$form = $this->createForm(\App\Form\Customer\InformationType::class, $customer, [
'method' => 'POST',
'attr' => [
'novalidate' => 'novalidate',
'class' => 'customer-info'
],
'translator' => $translator
]);
if($request->isMethod('POST')){
$form->handleRequest($request);
if($form->isValid()){
$customer = $form->getData();
try{
$customer->setAccountUpdate(new \DateTime);
$em->persist($customer);
$em->flush();
$session->getFlashBag()->add('notice',$translator->trans('Vos informations ont été enregistrées.'));
return $this->redirectToRoute('customer_information');
}
catch (\Exception $ex) {
$session->getFlashBag()->add('error',$translator->trans('Une erreur est survenue.'));
}
} else {
$session->getFlashBag()->add('error',$translator->trans('Erreur présente dans le formulaire.'));
}
}
return $this->render('front/customer/informations.html.twig', [
'customer' => $customer,
'form' => $form->createView()
]);
}
/**
* @Route("/{_locale}/customer/history", name="customer_history")
*/
public function history(CustomerManager $customerMgr, EntityManagerInterface $em)
{
$customer = $customerMgr->getCustomer();
if(!$customer){
return $this->redirectToRoute('customer_login',[
'from'=>'customer_history'
]);
}
$orders = $em->getRepository('App:Order')->history($customer);
return $this->render('front/customer/history.html.twig', [
'customer' => $customer,
'orders' => $orders
]);
}
/**
* @Route("/{_locale}/customer/addresses", name="customer_addresses")
*/
public function adresses(CustomerManager $customerMgr, EntityManagerInterface $em)
{
$customer = $customerMgr->getCustomer();
if(!$customer){
return $this->redirectToRoute('customer_login',[
'from'=>'customer_addresses'
]);
}
$addresses = $em->getRepository('App:Address')->findByCustomer($customer);
return $this->render('front/customer/addresses.html.twig', [
'customer' => $customer,
'addresses' => $addresses
]);
}
/**
* @Route("/{_locale}/json/customer/invoiceType/{cid}/{token}/{type}", name="json_customer_invoice_type", requirements={"cid"="\d+","type":"0|1","token":".+"})
*/
public function invoiceType(Request $request, $cid, $token, $type)
{
$em = $this->getDoctrine()->getManager();
$output = ['success' => false, 'message'=>''];
if($request->isMethod('POST')){
$customer = null;
if(md5('LKLSDF456ERF'.$cid) == $token){
$customer = $em->getRepository('App:Customer')->find($cid);
}
if(empty($customer))
throw new NotFoundHttpException ();
try{
$customer->setInvoiceType($type);
$em->persist($customer);
$em->flush();
$output['success'] = true;
}
catch (\Exception $ex) {
$output['message'] = $ex->getMessage();
}
}
$response = new JsonResponse($output);
if(!empty($_SERVER['HTTP_ORIGIN'])){
$http_origin = $_SERVER['HTTP_ORIGIN'];
if (in_array($http_origin,["https://test.dogcat.com","https://www.dogcat.com","https://v2.dogcat.com","https://v2-test.dogcat.com"]))
{
$response->headers->set("Access-Control-Allow-Origin",$http_origin);
}
}
return $response;
}
}