<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\UserType;
use App\Form\LiensType;
use App\Form\DetailsType;
use App\Form\DomaineType;
use App\Repository\UserRepository;
use App\Repository\CuveeRepository;
use Symfony\Component\Mime\Address;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Response;
use App\Form\ChangePasswordFromSettingFormType;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use SymfonyCasts\Bundle\ResetPassword\Controller\ResetPasswordControllerTrait;
class MenuController extends AbstractController
{
use ResetPasswordControllerTrait;
/**
* @Route("/", name="app_accueil")
*/
public function index(): Response
{
$user = $this->getUser();
return $this->render('menu/pages-starter.html.twig', [
'user' => $user
]);
}
/**
* @Route("/admin", name="app_admin")
*/
public function admin(UserRepository $ur): Response
{
return $this->render('user/index.html.twig', [
'users' => $ur->findAll(),
]);
}
/**
* @Route("/admin/user/{id}", name="user_edit")
*/
public function userEdit(User $user, Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $em): Response
{
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->flush();
return $this->redirectToRoute('app_admin');
}
return $this->render('user/form.html.twig', [
'form' => $form->createView(),
'user' => $user,
'type' => 'modifier'
]);
}
/**
* @Route("/qrCode/telecharger", name="qrcode_telecharger")
*/
public function qRCode_download(CuveeRepository $cr): Response
{
$zip = new \ZipArchive();
$zipName = 'mesQRCodes.zip';
$zip->open($zipName, \ZipArchive::CREATE);
foreach($cr->findBy(['user' => $this->getUser(), 'statut' => 1]) as $cuvee) {
$zip->addEmptyDir($cuvee->getNomCuvee());
$zip->addFile(realpath($this->getParameter('external_directory').'/'.$cuvee->getUser()->getEntreprise().'/'.$cuvee->getNomCuvee().'/'.urldecode($cuvee->getQRCode()->getSvg())), $cuvee->getNomCuvee().'/'.$cuvee->getNomCuvee().' - QR Code.svg');
$zip->addFile(realpath($this->getParameter('external_directory').'/'.$cuvee->getUser()->getEntreprise().'/'.$cuvee->getNomCuvee().'/'.urldecode($cuvee->getQRCode()->getPng())), $cuvee->getNomCuvee().'/'.$cuvee->getNomCuvee().' - QR Code.png');
$zip->addFile(realpath($this->getParameter('external_directory').'/'.$cuvee->getUser()->getEntreprise().'/'.$cuvee->getNomCuvee().'/'.urldecode($cuvee->getQRCode()->getPdf())), $cuvee->getNomCuvee().'/'.$cuvee->getNomCuvee().' - QR Code.pdf');
}
$zip->close();
if(count($cr->findBy(['user' => $this->getUser(), 'statut' => 1]))){
$response = new Response(file_get_contents($zipName));
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment;filename="' . $zipName . '"');
$response->headers->set('Content-length', filesize($zipName));
@unlink($zipName);
return $response;
}else{
@unlink($zipName);
$this->addFlash(
'error',
'Aucun qrCode trouvé sous votre domaine.'
);
return $this->redirectToRoute('app_cuvee_index');
}
}
/**
* @Route("/profil", name="app_profil")
*/
public function profil(): Response
{
/** @var User $user */
$user = $this->getUser();
$progress = 0 ;
if($user->getAdresse()){
$progress++;
}
if($user->getCodePostal()){
$progress++;
}
if($user->getVille()){
$progress++;
}
if($user->getCodePostal()){
$progress++;
}
if($user->getTelephone()){
$progress++;
}
if($user->getSite()){
$progress++;
}
if($user->getInstagram()){
$progress++;
}
if($user->getFacebook()){
$progress++;
}
if($user->getTexteDomaine()){
$progress++;
}
$progress = ceil($progress % 100 * 11);
return $this->render('menu/pages-profile.html.twig', [
'user' => $user,
'progress' => $progress
]);
}
/**
* @Route("/profil/savePhotoProfil", name="profil_savePhotoProfil")
*/
public function savePhotoProfil(Request $request, SluggerInterface $slugger, EntityManagerInterface $em): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
/** @var UploadedFile $file */
$file = $request->files->get('file');
if(!$file){
return new JsonResponse('Le fichier n\'a pas été trouvé.', 501);
}
$originalFileName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$safeFileName = $slugger->slug($originalFileName);
$newFileName = $safeFileName.'-'.uniqid().'.'.$file->guessExtension();
try {
$oldFile = $user->getImageProfil();
$file->move(
$this->getParameter('image_profil_directory'),
$newFileName
);
if($oldFile){
unlink($this->getParameter(('image_profil_directory')).'/'.$oldFile);
}
}catch (FileException $e) {
return new JsonResponse('Erreur lors de l\'enregistrement : '.$e, 501);
}
$user->setImageProfil($newFileName);
$em->flush();
return new JsonResponse('Enregistré');
}
/**
* @Route("/profil/savePhotoBgProfil", name="profil_savePhotoBgProfil")
*/
public function savePhotoBgProfil(Request $request, SluggerInterface $slugger, EntityManagerInterface $em): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
/** @var UploadedFile $file */
$file = $request->files->get('file');
if(!$file){
return new JsonResponse('Le fichier n\'a pas été trouvé.', 501);
}
$originalFileName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$safeFileName = $slugger->slug($originalFileName);
$newFileName = $safeFileName.'-'.uniqid().'.'.$file->guessExtension();
try {
$oldFile = $user->getImageFondProfil();
$file->move(
$this->getParameter('image_profil_directory'),
$newFileName
);
if($oldFile){
unlink($this->getParameter(('image_profil_directory')).'/'.$oldFile);
}
}catch (FileException $e) {
return new JsonResponse('Erreur lors de l\'enregistrement : '.$e, 501);
}
$user->setImageFondProfil($newFileName);
$em->flush();
return new JsonResponse('Enregistré');
}
/**
* @Route("/profil/edit", name="app_profil_edit")
*/
public function profilEdit(Request $request, EntityManagerInterface $em, UserPasswordHasherInterface $userPasswordHasher, MailerInterface $mailer): Response
{
/** @var User $user */
$user = $this->getUser();
$progress = 0 ;
if($user->getAdresse()){
$progress++;
}
if($user->getCodePostal()){
$progress++;
}
if($user->getVille()){
$progress++;
}
if($user->getCodePostal()){
$progress++;
}
if($user->getTelephone()){
$progress++;
}
if($user->getSite()){
$progress++;
}
if($user->getInstagram()){
$progress++;
}
if($user->getFacebook()){
$progress++;
}
if($user->getTexteDomaine()){
$progress++;
}
$progress = ceil($progress % 100 * 11);
$formLiens = $this->createForm(LiensType::class, $user);
$formDetails = $this->createForm(DetailsType::class, $user);
$formDomaine = $this->createForm(DomaineType::class, $user);
$formPassword = $this->createForm(ChangePasswordFromSettingFormType::class);
$formLiens->handleRequest($request);
if ($formLiens->isSubmitted() && $formLiens->isValid()) {
$em->flush();
return $this->render('menu/pages-profile-settings.html.twig', [
'user' => $user,
'progress' => $progress,
'formLiens' => $formLiens->createView(),
'formDetails' => $formDetails->createView(),
'formPassword' => $formPassword->createView(),
'formDomaine' => $formDomaine->createView(),
]);
}
$formDetails->handleRequest($request);
if ($formDetails->isSubmitted() && $formDetails->isValid()) {
$em->flush();
return $this->render('menu/pages-profile-settings.html.twig', [
'user' => $user,
'progress' => $progress,
'formLiens' => $formLiens->createView(),
'formDetails' => $formDetails->createView(),
'formPassword' => $formPassword->createView(),
'formDomaine' => $formDomaine->createView(),
]);
}
$formPassword->handleRequest($request);
if ($formPassword->isSubmitted() && $formPassword->isValid()) {
$oldPlainPassword = $formPassword->get('oldPlainPassword')->getData();
if(!$userPasswordHasher->isPasswordValid($user, $oldPlainPassword)){
$this->addFlash(
'error',
'Mot de passe actuel incorrecte'
);
}else{
$newEncodedPassword = $userPasswordHasher->hashPassword(
$user,
$formPassword->get('newPlainPassword')->getData()
);
$user->setPassword($newEncodedPassword);
$em->flush();
$email = (new TemplatedEmail())
->from(new Address('no-reply@iti-conseil.com', 'Gestion Administration'))
->to($user->getEmail())
->subject('Mot de passe réinitialisé')
->htmlTemplate('reset_password/confirmation.html.twig')
;
$mailer->send($email);
// The session is cleaned up after the password has been changed.
$this->cleanSessionAfterReset();
return $this->redirectToRoute('app_login');
}
}
$formDomaine->handleRequest($request);
if ($formDomaine->isSubmitted() && $formDomaine->isValid()) {
$em->flush();
return $this->render('menu/pages-profile-settings.html.twig', [
'user' => $user,
'progress' => $progress,
'formLiens' => $formLiens->createView(),
'formDetails' => $formDetails->createView(),
'formPassword' => $formPassword->createView(),
'formDomaine' => $formDomaine->createView(),
]);
}
return $this->render('menu/pages-profile-settings.html.twig', [
'user' => $user,
'progress' => $progress,
'formLiens' => $formLiens->createView(),
'formDetails' => $formDetails->createView(),
'formPassword' => $formPassword->createView(),
'formDomaine' => $formDomaine->createView(),
]);
}
}