<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Services\RoleService;
use App\Services\FileUploader;
use App\Services\Utils;
use App\Form\UserType;
use App\Entity\User;
use App\Entity\FileSend;
use App\Entity\Dic;
use App\Entity\Ba;
/**
* @Route("/customer")
*/
class CustomerController extends AbstractController
{
protected $em;
protected $fileUploader;
protected $utils;
public function __construct(EntityManagerInterface $entityManager, \Swift_Mailer $mailer, FileUploader $fileUploader, Utils $utils, TranslatorInterface $translator, \Knp\Snappy\Pdf $knpSnappy, RoleService $roleService) {
$this->em = $entityManager;
$this->mailer = $mailer;
$this->fileUploader = $fileUploader;
$this->utils = $utils;
$this->translator = $translator;
$this->knpSnappy = $knpSnappy;
$this->roleService = $roleService;
}
/**
* @Route("/list", name="customer_list")
*/
public function list(): Response
{
return $this->render('customer/list.html.twig', [
'menu' => 'customer'
]);
}
/**
* @Route("/list-ajax", name="customer_list_ajax")
*/
public function listAjax(Request $request): Response
{
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
//Load dataTable request
$limitStart = $request->get("start");
$limitWidth = $request->get("length");
$limitSearch = $request->get("search");
$limitOrder = $request->get("order");
$data['data'] = [];
$byUser = $userCurrent->getId();
if($this->roleService->isGranted('ROLE_ADMIN', $userCurrent)){
$customersResult = $this->em
->getRepository(User::class)
->findByCustomerAdminAjax($limitStart, $limitWidth, $limitSearch, $limitOrder, ["ACTIVE", "SIGNINEND", "CREATE"]);
}
else{
$customersResult = $this->em
->getRepository(User::class)
->findByCustomerAjax($limitStart, $limitWidth, $limitSearch, $limitOrder, $byUser, ["ACTIVE", "SIGNINEND", "CREATE"]);
}
$nbSellerTotal = $customersResult['lenght'];
$customers = $customersResult['data'];
foreach ($customers as $customer) {
$urlView = $this->generateUrl('customer_view',
array(
'userID' => $customer['userId']
),
UrlGeneratorInterface::ABSOLUTE_URL);
$urlUpdate = $this->generateUrl('customer_update',
array(
'userID' => $customer['userId']
),
UrlGeneratorInterface::ABSOLUTE_URL);
$urlDelete = $this->generateUrl('customer_delete',
array(
'userID' => $customer['userId']
),
UrlGeneratorInterface::ABSOLUTE_URL);
$urlSendMail = $this->generateUrl('customer_resend_mail_signin_end',
array(
'userID' => $customer['userId']
),
UrlGeneratorInterface::ABSOLUTE_URL);
$status = $this->utils->getStatusMembership($customer['userId']);
$membershipCurrent = $this->utils->getMembershipByCustomer($customer['userId']);
$linkSendMail = "";
if($membershipCurrent->getUser()->getStatus() == 'SIGNINEND'){
$linkSendMail = "<a class='dropdown-item' href='".$urlSendMail."'>Renvoyer mail d’inscription</a>";
}
$action =
"<div class='edit-btn'>
<i class='far fa-ellipsis-h dropdown-toggle' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'></i>
<div class='dropdown-menu'>
<a class='dropdown-item' href='".$urlView."'>Fiche particulier</a>
".$linkSendMail."
<a class='dropdown-item' href='".$urlUpdate."'><i class='fal fa-pencil'></i> Mettre à jour</a>
<div class='dropdown-divider'></div>
<a class='dropdown-item delete' href='".$urlDelete."'><i class='fal fa-trash'></i> Supprimer</a>
</div>
</div>";
if($membershipCurrent->getStatus() == "PAYBYCUSTOMER"){
$type = "Adhérent";
}
else{
$type = "Prospect";
}
if($this->roleService->isGranted('ROLE_ADMIN', $userCurrent)){
$mailSendCustomer = "Non";
if($membershipCurrent->getMailSendCustomer()){
$mailSendCustomer = "Oui";
}
$data['data'][] = Array(
"lastName" => $customer['last_name'],
"firstName" => $customer['first_name'],
"phone" => $customer['phone'],
"email" => $customer['email'],
"seller" => $customer['seller_name'],
"numeroAdherent" => $this->utils->getNumberMembership($customer['userId']),
"mailSendCustomer" => $mailSendCustomer,
"status" => "<span class='st-".$membershipCurrent->getStatus()."'>".$status."</span>",
);
}
else{
$data['data'][] = Array(
"lastName" => "<a href='".$urlView."'>".$customer['last_name']."</a>",
"firstName" => $customer['first_name'],
"phone" => $customer['phone'],
"type" => $type,
"numeroAdherent" => $this->utils->getNumberMembership($customer['userId']),
"status" => "<span class='st-".$membershipCurrent->getStatus()."'>".$status."</span>",
"action" => $action,
);
}
}
$data["draw"] = intval($request->get("draw"));
$data["recordsTotal"] = $nbSellerTotal;
$data["recordsFiltered"] = $nbSellerTotal;
return new JsonResponse($data);
}
/**
* @Route("/{userID}/update", name="customer_update")
*/
public function update(Request $request, $userID){
//Load parameter
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
$role = 'CUSTOMER';
$menu = 'customer';
$siretFilter = $this->getParameter('siret_filter');
$mailTemp = null;
if ( $userID == 'new-customer') {
$user = new User;
$typeForm = "Ajouter";
} else {
$user = $this->em
->getRepository(User::class)
->find($userID);
if ( !$user ) {
$this->addFlash('danger', 'Cet utilisateur n\'existe pas.');
return $this->redirectToRoute('customer_list');
}
if (!$user->getSeller()) {
$this->addFlash('danger', 'Cette page n\'existe pas');
return $this->redirectToRoute('customer_list');
}
if ($user->getSeller()->getId() != $userCurrent->getId()) {
$this->addFlash('danger', 'Vous ne pouvez pas accéder à cette page');
return $this->redirectToRoute('customer_list');
}
$mailTemp = $user->getEmail();
$typeForm = "Modifier";
}
//If email change in update
$lastEmail = "";
if ( $typeForm == 'Ajouter' ) {
$form = $this->createForm(UserType::class, $user, Array("validation_groups" => "update"));
} else {
$lastEmail = $user->getEmail();
$form = $this->createForm(UserType::class, $user, Array("validation_groups" => "update"));
}
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$formValid = true;
// Check user mail exists on creation
if ( $typeForm == 'Ajouter' ) {
$userMailExist = $this->em
->getRepository(User::class)
->findOneBy(['email' => $user->getEmail()]);
if ( $userMailExist ) {
$this->addFlash('danger', 'Cet email est déjà pris.');
$formValid = false;
}
$user->setUsername( $user->getEmail() );
//Create salt for end signin
$tokenGenerator = random_bytes(10);
$user->setTokenReset(md5($tokenGenerator));
$user->setPassword('null');
$user->addRole('ROLE_CUSTOMER');
$user->setSeller($userCurrent);
if($user->getSeller()->getNumeroSiren() == $siretFilter){
$user->setDicIsFile(true);
}
$user->setStatus('CREATE');
}
else{
if($mailTemp != $user->getEmail()){
$userMailExist = $this->em
->getRepository(User::class)
->findOneBy(['email' => $user->getEmail()]);
if ( $userMailExist ) {
$this->addFlash('danger', 'Cet email est déjà pris.');
$formValid = false;
}
}
$reSend = $this->generateUrl('customer_resend_mail_signin_end',
array(
'userID' => $user->getId()
),
UrlGeneratorInterface::ABSOLUTE_URL);
if($user->getStatus() == "SIGNINEND" && $user->getEmail() != $lastEmail && $formValid){
$this->addFlash('warning', 'Attention ce client n\'a pas terminé son incription et son email a été modifié, son mail de fin d\'inscription doit être renvoyé : <a href="'.$reSend.'"><button class="button blue">Envoyer de nouveau</button></a>');
}
}
if($formValid){
if($user->getDateDeNaissance()){
$dateDeNaissance = str_replace("/", "-", $user->getDateDeNaissance());
$user->setDateDeNaissance(new \DateTime(date("Y-m-d", strtotime($dateDeNaissance))));
} else{
$user->setDateDeNaissance(null);
}
$this->em->persist($user);
$this->em->flush();
//If no membership
$membershipCurrent = $this->utils->getMembershipByCustomer($user);
if($membershipCurrent->getFic()){
$membershipCurrent->getFic()->setAcceptRecevoirDocumentGarantieEmail($user->isAcceptRecevoirDocumentGarantieEmail());
$membershipCurrent->getFic()->setAcceptPropositionCommercialEmail($user->isAcceptPropositionCommercialEmail());
$membershipCurrent->getFic()->setAcceptPropositionCommercialTelephone($user->isAcceptPropositionCommercialTelephone());
}
$membershipCurrent->getBa()->setAcceptRecevoirDocumentGarantieEmail($user->isAcceptRecevoirDocumentGarantieEmail());
$membershipCurrent->getBa()->setAcceptPropositionCommercialEmail($user->isAcceptPropositionCommercialEmail());
$membershipCurrent->getBa()->setAcceptPropositionCommercialTelephone($user->isAcceptPropositionCommercialTelephone());
if ( $typeForm == 'Ajouter' ){
//Create unique number for yousign, systempay
$membershipCurrent->setNumberMembershipFolder(date("Ymd").$membershipCurrent->getId());
$this->em->persist($membershipCurrent);
$this->em->flush();
$this->addFlash('success', 'L\'utilisateur a bien été ajouté.');
} else {
if($membershipCurrent->getStatus() == 'DRAFT' || $membershipCurrent->getStatus() == 'VALIDBYSELLER'){
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
//Update dic informations
$dic = $membershipCurrent->getDic();
$dic->setSex($user->getSex());
$dic->setPrenom($user->getFirstName());
$dic->setNom($user->getLastName());
$dic->setAdresseFiscale($user->getNumeroDeVoie());
$dic->setAdresseFiscaleCodePostal($user->getCodePostal());
$dic->setAdresseFiscaleVille($user->getVille());
$dic->setAdresseFiscalePays($user->getPays());
$dic->setDateDeNaissance($user->getDateDeNaissance());
$this->em->persist($dic);
} else {
//V2 PLATFORM (FIC AND NOT DIC)
//Update dic informations
$fic = $membershipCurrent->getFic();
$fic->setSex($user->getSex());
$fic->setPrenom($user->getFirstName());
$fic->setNom($user->getLastName());
$fic->setAdresseFiscale($user->getNumeroDeVoie());
$fic->setAdresseFiscaleCodePostal($user->getCodePostal());
$fic->setAdresseFiscaleVille($user->getVille());
$fic->setAdresseFiscalePays($user->getPays());
$fic->setDateDeNaissance($user->getDateDeNaissance());
$this->em->persist($fic);
}
//Update ba informations
$ba = $membershipCurrent->getBa();
$ba->setEmail($user->getEmail());
$ba->setTelPhone($user->getPhonePrefix()." ".$user->getPhone());
$ba->setSex($user->getSex());
$ba->setPrenom($user->getFirstName());
$ba->setNom($user->getLastName());
$ba->setNumeroDeVoie($user->getNumeroDeVoie());
$ba->setCodePostal($user->getCodePostal());
$ba->setVille($user->getVille());
$ba->setPays($user->getPays());
$ba->setDateDeNaissance($user->getDateDeNaissance());
$this->em->persist($ba);
$this->em->flush();
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
//Generate dic file
$dicName = $this->utils->generateDic($user);
} else {
//V2 PLATFORM (FIC AND NOT DIC)
//Generate fic file
$ficName = $this->utils->generateFic($user);
}
//Generate ba file
$baName = $this->utils->generateBA($user);
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
$dic->setUrlPdf($dicName);
} else {
//V2 PLATFORM (FIC AND NOT DIC)
$fic->setUrlPdf($ficName);
}
$ba->setUrlPdf($baName);
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
$this->em->persist($dic);
} else {
//V2 PLATFORM (FIC AND NOT DIC)
$this->em->persist($fic);
}
$this->em->persist($ba);
$this->em->flush();
}
$this->addFlash('success', 'L\'utilisateur a bien été mis à jour.');
}
return $this->redirectToRoute('customer_list');
}
}
return $this->render('customer/update.html.twig', Array(
"user" => $user,
"userID" => $userID,
"form" => $form->createView(),
"typeForm" => $typeForm,
"role" => $role,
"menu" => $menu,
"siretFilter" => $siretFilter,
"seller" => $userCurrent
));
}
/**
* @Route("/{userID}", name="customer_view")
*/
public function view(Request $request, SluggerInterface $slugger, $userID): Response
{
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
if($userID == "me"){
$userID = $userCurrent->getId();
}
$customer = $this->em
->getRepository(User::class)
->findOneBy(['id' => $userID]);
if(!$customer){
$this->addFlash('danger', 'Le client n\'existe pas.');
return $this->redirectToRoute('customer_list');
}
if (!$customer->getSeller()) {
$this->addFlash('danger', 'Cette page n\'existe pas');
return $this->redirectToRoute('customer_list');
}
if(!$this->roleService->isGranted('ROLE_ADMIN', $userCurrent)){
if($this->roleService->isGranted('ROLE_SELLER', $userCurrent)){
if ($customer->getSeller()->getId() != $userCurrent->getId()) {
$this->addFlash('danger', 'Vous ne pouvez pas accéder à cette page');
return $this->redirectToRoute('customer_list');
}
}
else if($this->roleService->isGranted('ROLE_CUSTOMER', $userCurrent)){
if ($customer->getId() != $userCurrent->getId()) {
$this->addFlash('danger', 'Vous ne pouvez pas accéder à cette page');
return $this->redirectToRoute('app_login');
}
}
else{
$this->addFlash('danger', 'Vous ne pouvez pas accéder à cette page');
return $this->redirectToRoute('app_login');
}
}
//If no membership
$membershipCurrent = $this->utils->getMembershipByCustomer($customer);
//Configure BIC and BA
$baId = "new-ba";
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
$dicId = "new-dic";
} else {
//V2 PLATFORM (FIC AND NOT DIC)
$ficId = "new-fic";
}
if($membershipCurrent){
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
if($membershipCurrent->getDic()){
$dicId = $customer->getCurrentMemberships()->getDic()->getId();
}
} else {
//V2 PLATFORM (FIC AND NOT DIC)
if($membershipCurrent->getFic()){
$ficId = $customer->getCurrentMemberships()->getFic()->getId();
}
}
if($membershipCurrent->getBa()){
$baId = $customer->getCurrentMemberships()->getBa()->getId();
}
}
if($this->roleService->isGranted('ROLE_SELLER', $userCurrent) || $this->roleService->isGranted('ROLE_ADMIN', $userCurrent)){
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
return $this->render('customer/view.html.twig', [
'menu' => 'customer',
"customer" => $customer,
"baId" => $baId,
"dicId" => $dicId,
"membership" => $membershipCurrent
]);
} else {
//V2 PLATFORM (FIC AND NOT DIC)
return $this->render('customer/view.html.twig', [
'menu' => 'customer',
"customer" => $customer,
"baId" => $baId,
"ficId" => $ficId,
"membership" => $membershipCurrent
]);
}
}
else if($this->roleService->isGranted('ROLE_CUSTOMER', $userCurrent)){
if($membershipCurrent->getPlatformVersion() == 1){
//V1 PLATFORM
return $this->render('customer/view-me.html.twig', [
'menu' => 'customer',
"customer" => $customer,
"baId" => $baId,
"dicId" => $dicId,
"membership" => $membershipCurrent
]);
} else {
//V2 PLATFORM (FIC AND NOT DIC)
return $this->render('customer/view-me.html.twig', [
'menu' => 'customer',
"customer" => $customer,
"baId" => $baId,
"ficId" => $ficId,
"membership" => $membershipCurrent
]);
}
}
else{
$this->addFlash('danger', 'Vous ne pouvez pas accéder à cette page');
return $this->redirectToRoute('app_login');
}
}
/**
* @Route("/{userID}/delete", name="customer_delete")
*/
public function delete(Request $request, $userID){
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
$user = $this->em
->getRepository(User::class)
->find($userID);
if ( !$user ) {
$this->addFlash('danger', 'Cet utilisateur n\'existe pas.');
return $this->redirectToRoute('customer_list');
}
if (!$user->getSeller()) {
$this->addFlash('danger', 'Cette page n\'existe pas');
return $this->redirectToRoute('customer_list');
}
if ($user->getSeller()->getId() != $userCurrent->getId()) {
$this->addFlash('danger', 'Vous ne pouvez pas accéder à cette page');
return $this->redirectToRoute('customer_list');
}
$date = new \DateTime();
//For RGPD
$user->setUsername( $user->getEmail() . '_' . $date->getTimestamp() );
$user->setEmail( $user->getEmail() . '_' . $date->getTimestamp() );
/*
$user->setEmailCanonical( $user->getEmail() . '_' . $date->getTimestamp() );
$user->setUsername( $user->getEmail() . '_' . $date->getTimestamp() );
$user->setUsernameCanonical( $user->getEmail() . '_' . $date->getTimestamp() );
*/
$user->setStatus('DELETED');
$this->em->persist($user);
$this->em->flush();
$this->addFlash('success', 'Le compte a été supprimé');
return $this->redirectToRoute('customer_list');
}
/**
* @Route("/{userID}/resend-mail-signin-end", name="customer_resend_mail_signin_end")
*/
public function reSendMailSigninEnd(Request $request, $userID){
$userCurrent = $this->get('security.token_storage')->getToken()->getUser();
$user = $this->em
->getRepository(User::class)
->find($userID);
if ( !$user ) {
$this->addFlash('danger', 'Cet utilisateur n\'existe pas');
return $this->redirectToRoute('customer_list');
}
if ( $user->getStatus() != "SIGNINEND" ) {
$this->addFlash('danger', 'Cet utilisateur a déjà terminé son inscription');
return $this->redirectToRoute('customer_list');
}
$this->utils->sendEmailEndSigninCustomer($user);
$this->addFlash('success', 'Le mail de fin d\'inscription a bien été envoyé');
return $this->redirectToRoute('customer_list');
}
}