src/Controller/AjaxController.php line 163

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\InfosSuivi;
  4. use App\Entity\Proposition;
  5. use App\Repository\PropositionRepository;
  6. use DateTime;
  7. use App\Entity\Lot;
  8. use App\Entity\Prospect;
  9. use App\Service\Geocoder;
  10. use App\Service\ImagePdf;
  11. use App\Entity\Historique;
  12. use App\Entity\Impression;
  13. use App\Entity\PieceJointe;
  14. use App\Entity\Utilisateur;
  15. use App\Service\Notification;
  16. use Doctrine\ORM\EntityManager;
  17. use App\Repository\LotRepository;
  18. use App\Repository\VilleRepository;
  19. use App\Repository\ProspectRepository;
  20. use App\Repository\HistoriqueRepository;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use App\Repository\UtilisateurRepository;
  23. use App\Repository\ProgrammeRepository;
  24. use App\Repository\DepartementRepository;
  25. use phpDocumentor\Reflection\Types\This;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Doctrine\ORM\Query\AST\NewObjectExpression;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. use Symfony\Component\HttpFoundation\JsonResponse;
  31. use Symfony\Component\HttpFoundation\Session\Session;
  32. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  33. /**
  34.  * @Route("/ajax")
  35.  */
  36. class AjaxController extends AbstractController
  37. {
  38.     protected $notificationService;
  39.     public function __construct(Notification $notificationService)
  40.     {
  41.         $this->notificationService $notificationService;
  42.     }
  43.     /**
  44.      * @Route("/ville", name="ajax_ville")
  45.      */
  46.     public function ville(Request $requestVilleRepository $villeRepository): Response
  47.     {
  48.         $searchTerm $request->query->get('search'null);
  49.         $villes $villeRepository->findByNomReel($searchTerm);
  50.         $data = [];
  51.         foreach($villes as $ville) {
  52.             $data[] = [
  53.                 'value' => $ville->getNomReel(),
  54.                 'text' => $ville->getNomReel() . ' (' $ville->getCodePostal() . ')',
  55.                 'code_postal' => $ville->getCodePostal()
  56.             ];
  57.         }
  58.         return $this->json($data);
  59.     }
  60.     /**
  61.      * @Route("/departement", name="ajax_departement")
  62.      */
  63.     public function departement(Request $requestDepartementRepository $departementRepository): Response
  64.     {
  65.         $departements $departementRepository->findByNomOrCode($request->query->get('search'null));
  66.         $data = [];
  67.         foreach($departements as $departement) {
  68.             $data[] = [
  69.                 'id' => $departement->getId(),
  70.                 'text' => $departement->getNom() . ' (' $departement->getCode() . ')'
  71.             ];
  72.         }
  73.         return $this->json($data);
  74.     }
  75.     /**
  76.      * @Route("/code-postal", name="ajax_code_postal")
  77.      */
  78.     public function codePostal(Request $requestVilleRepository $villeRepository): Response
  79.     {
  80.         $searchTerm $request->query->get('search'null);
  81.         $villes $villeRepository->findByCodePostal($searchTerm);
  82.         $data = [];
  83.         foreach ($villes as $ville) {
  84.             $data[] = [
  85.                 'id' => $ville->getCodePostal(),
  86.                 'text' => $ville->getNomReel() . ' (' $ville->getCodePostal() . ')'
  87.             ];
  88.         }
  89.         return $this->json($data);
  90.     }
  91.     /**
  92.      * @Route("/lot", name="ajax_lot")
  93.      */
  94.     public function lot(Request $requestLotRepository $lotRepository): Response
  95.     {
  96.         $user $this->getUser();
  97.         $entreprise $user->getEntreprise();
  98.     
  99.         $lots $lotRepository->findByProgrammeRefTitreAndEntreprise($request->query->get('search'null), $entreprise$user);
  100.     
  101.         $data = [];
  102.         foreach($lots as $lot) {
  103.             $data[] = [
  104.                 'id' => $lot->getId(),
  105.                 'text' => (string)$lot,
  106.                 'reference' => $lot->getReference(),
  107.                 'programme' => $lot->getProgramme(),
  108.                 'type' => $lot->getType(),
  109.                 'ville' => $lot->getVille(),
  110.                 'codePostal' => $lot->getCodePostal()
  111.             ];
  112.         }
  113.         return $this->json([
  114.             'results' => $data
  115.         ]);
  116.     }
  117.     /**
  118.      * @Route("/prospect", name="ajax_prospect")
  119.      */
  120.     public function prospect(Request $requestProspectRepository $prospectRepository): Response
  121.     {
  122.         $prospects $prospectRepository->findByPrenomNom($request->query->get('search'null));
  123.         //dd($prospects);
  124.         $data = [];
  125.         foreach($prospects as $prospect) {
  126.             $data[] = [
  127.                 'id' => $prospect->getId(),
  128.                 'text' => $prospect->getEmprunteurPrenom()." ".$prospect->getEmprunteurNom(),
  129.                 'nom' => $prospect->getEmprunteurNom(),
  130.                 'prenom' => $prospect->getEmprunteurPrenom()
  131.             ];
  132.         }
  133.         return $this->json([
  134.             'results' => $data
  135.         ]);
  136.     }
  137.     /**
  138.      * @Route("/programme", name="ajax_programme")
  139.      */
  140.     public function programme(Request $requestProgrammeRepository $programmeRepository): Response
  141.     {
  142.         $user $this->getUser();
  143.         $entreprise $user->getEntreprise();
  144.     
  145.         $programmes $programmeRepository->findByNomOrPromoteurOrVilleAndEntreprise($request->query->get('search'null), $entreprise$user);
  146.         foreach($programmes as $p) {
  147.             $data[] = [
  148.                 'id' => $p->getId(),
  149.                 'text' => (string)$p . (trim((string)$p->getPromoteur()) != '' ' (' $p->getPromoteur() . ')' ''),
  150.                 'ville' =>(string)$p->getVille(),
  151.                 'programme' => (string)$p,
  152.                 'promoteur' => $p->getPromoteur(),
  153.             ];
  154.         }
  155.         return $this->json([
  156.             'results' => $data
  157.         ]);
  158.     }
  159.     /**
  160.      * @Route("/prospect/add/lot/{lotId}", name="ajax_prospect_add_lot", methods={"POST"})
  161.      */
  162.     public function addLotToProspect(Lot $lotId ,Request $requestProspectRepository $prospectRepositoryPropositionRepository $propositionRepositoryEntityManagerInterface $em): Response
  163.     {
  164.         $prospect $prospectRepository->findBy(['id' => $request->request->get('prospectId')]);
  165.         if(!empty($propositionRepository->findByLotAndProspect($lotId$prospect))){
  166.             return $this->json([
  167.                 'warning' => 'Ce lot est déja proposé à ce client'
  168.             ]);
  169.         }
  170.         $newProposition = new Proposition();
  171.         $newProposition->setLot($lotId);
  172.         $prospect[0]->addProposition($newProposition);
  173.         $em->persist($newProposition);
  174.         $em->flush();
  175.         return $this->json([
  176.             'success' => 'Proposition ajoutée'
  177.         ]);
  178.     }
  179.     /**
  180.      * @Route("/geocode/adresse", name="ajax_geocode_adresse")
  181.      */
  182.     public function geocodeAdresse(Request $requestGeocoder $geocoder): Response
  183.     {
  184.         $search $request->query->get('query');
  185.         $coords $geocoder->encode($search);
  186.         if($coords) {
  187.             return $this->json([
  188.                 'latitude' => $coords['lat'],
  189.                 'longitude' => $coords['lng']
  190.             ]);
  191.         } else {
  192.             return $this->json(false);
  193.         }
  194.     }
  195.     /**
  196.      * @Route("/send/impression/{lot}", name="ajax_send_impression")
  197.      */
  198.     public function sendImpression(Lot $lotRequest $requestUtilisateurRepository $utilisateurRepositoryProspectRepository $prospectRepEntityManagerInterface $emNotification $serviceNotificationHistoriqueRepository $historiqueRepository): Response
  199.     {
  200.         if ($request->isXmlHttpRequest()) {
  201.             $token $request->getSession()->get('token');
  202.             $data $request->request->get('form');
  203.             $commentaire $data['commentaire'];
  204.             if(trim($commentaire) == '')
  205.                 return $this->json([
  206.                     'status' => 'fail',
  207.                     'message' => 'Veuillez renseigner le champ de commentaire.'
  208.                 ]);
  209.             $prospect $prospectRep->findOneBy(['token' => $token]);
  210.             $historique $historiqueRepository->findOneBy(['prospect' => $prospect->getId()], ['dateheure' => 'DESC']);
  211.             if($historique == null)
  212.             {
  213.                 $historique = new Historique();
  214.                 $historique->setProspect($prospect);
  215.                 $historique->setModeEnvoi('automatique');
  216.                 $historique->setDateheure(new DateTime());
  217.                 foreach ($prospect->getPropositions() as $p) {
  218.                     $historique->addLot($p->getLot());
  219.                 }
  220.                 $em->persist($historique);
  221.             }
  222.             $impression = new Impression();
  223.             $impression->setHistorique($historique);
  224.             $impression->setProspect($prospect);
  225.             $impression->setCommentaire($commentaire);
  226.             $impression->setDateheure(new \DateTime());
  227.             $em->persist($impression);
  228.             $em->flush();
  229.             $res $serviceNotification->alertInterne($prospect$impression$lot$utilisateurRepository);
  230.             if(!$res)
  231.                 return $this->json([
  232.                     'status' => 'fail',
  233.                     'message' => 'Une erreur s\'est produite lors de l\'envoi de votre message.'
  234.                 ]);
  235.             return $this->json([
  236.                 'status' => 'success',
  237.                 'message' => 'Votre commentaire a bien été envoyé.'
  238.             ]);
  239.         }
  240.         return $this->json([
  241.             'status' => 'fail',
  242.             'message' => 'Une erreur s\'est produite lors de l\'envoi de votre message.'
  243.         ]);
  244.     }
  245.     /**
  246.      * @Route("/new/historique/{prospect}", name="ajax_new_historique")
  247.      */
  248.     public function newHistorique(Prospect $prospect nullRequest $requestEntityManagerInterface $em):Response
  249.     {
  250.         $modeEnvoi $request->query->get('modeEnvoi');
  251.         $contenu $request->query->get('msg');
  252.         $contenu str_replace('%0a'PHP_EOL$contenu);
  253.         $expediteur $this->container->get('security.token_storage')->getToken()->getUser();
  254.         $historique = new Historique();
  255.         $historique->setProspect($prospect);
  256.         $historique->setModeEnvoi($modeEnvoi);
  257.         $historique->setDateheure(new DateTime());
  258.         $historique->setContenu($contenu);
  259.         $historique->setEntreprise($prospect->getEntreprise());
  260.         if($expediteur instanceof Utilisateur) {
  261.             $historique->setExpediteur($expediteur);
  262.         }
  263.         foreach ($prospect->getPropositions() as $p) {
  264.             $historique->addLot($p->getLot());
  265.         }
  266.         $em->persist($historique);
  267.         $em->flush();
  268.         return $this->json([
  269.             'message' => 'Nouvelle proposition dans l\'historique.'
  270.         ]);
  271.     }
  272.     /**
  273.      * @Route("/pj/rotate", name="ajax_piece_jointe_rotate")
  274.      */
  275.     public function pieceJointeRotate(Request $request): Response
  276.     {
  277.         $fileName $request->query->get('query');
  278.         $degrees 90;
  279.         $strArray explode('.'$fileName);
  280.         $ext trim(strtolower(end($strArray)));
  281.         if($ext == 'png')
  282.         {
  283.             ImagePdf::rotateImage90Deg($fileName);
  284.             return $this->json($fileName);
  285.         }
  286.         if ($ext == 'jpg' || $ext == 'jpeg')
  287.         {
  288.             $path explode('/'$fileName);
  289.             $fileName end($path);
  290.             ImagePdf::rotateImage90Deg(PieceJointe::SAVE_PATH $fileName);
  291.             return $this->json(PieceJointe::SAVE_PATH $fileName);
  292.         }
  293.         return $this->json(false);
  294.     }
  295.     /**
  296.      * @Route("/envoi-mail-fiche", name="ajax_envoi_mail_fiche")
  297.      */
  298.     public function envoiMailFiche(Request $requestUtilisateurRepository $utilisateurRepositoryProspectRepository $prospectRepositoryEntityManagerInterface $em): JsonResponse
  299.     {
  300.         $auteurId $request->get('auteurId');
  301.         $prospectId $request->get('prospectId');
  302.         $userConnected $this->getUser();
  303.     
  304.         if ($auteurId || $prospectId) {
  305.             $this->notificationService->alertAuteurProspect($prospectId$auteurId$userConnected);
  306.             
  307.             $infoSuivi = new InfosSuivi();
  308.             $infoSuivi->setUtilisateur($utilisateurRepository->find($auteurId));
  309.             $infoSuivi->addProspect($prospectRepository->find($prospectId));
  310.             $infoSuivi->setType('client');
  311.             $infoSuivi->setDescription('Un nouveau client vous a été attribué : [prospect]');
  312.             $infoSuivi->setDate(new DateTime());
  313.             $infoSuivi->setLu(false);
  314.             $em->persist($infoSuivi);
  315.             $em->flush();
  316.             return $this->json([
  317.                 'status' => 'success',
  318.                 'message' => 'Email envoyé avec succès'
  319.             ]);
  320.         }
  321.     
  322.         return $this->json([
  323.             'status' => 'error',
  324.             'message' => 'Auteur non trouvé ou erreur d\'envoi'
  325.         ]);
  326.     }
  327.     /**
  328.      * @Route("/info-suivi/{id}/lu", name="ajax_info_suivi_lu", methods={"POST"})
  329.      */
  330.     public function setInfoSuiviLu(Request $requestInfosSuivi $infoSuivi): Response
  331.     {
  332.         $infoSuivi->setLu(true);
  333.         $entityManager $this->getDoctrine()->getManager();
  334.         $entityManager->flush();
  335.         return new Response();
  336.     }
  337.     /**
  338.      * @Route("/prospect/check-duplicate", name="ajax_prospect_check_duplicate")
  339.      */
  340.     public function checkProspectDuplicate(Request $requestProspectRepository $prospectRepository): JsonResponse
  341.     {
  342.         $nom trim($request->query->get('nom'''));
  343.         $prenom trim($request->query->get('prenom'''));
  344.         $currentProspectId $request->query->get('currentId'null);
  345.         if (empty($nom) || empty($prenom)) {
  346.             return $this->json([
  347.                 'exists' => false,
  348.                 'message' => 'Nom et prénom requis'
  349.             ]);
  350.         }
  351.         if (strlen($nom) < || strlen($prenom) < 2) {
  352.             return $this->json([
  353.                 'exists' => false,
  354.                 'message' => 'Nom et prénom trop courts'
  355.             ]);
  356.         }
  357.         $user $this->getUser();
  358.         if (!$user instanceof Utilisateur || !$user->getEntreprise()) {
  359.             return $this->json([
  360.                 'exists' => false,
  361.                 'error' => 'Utilisateur non authentifié ou entreprise non définie'
  362.             ]);
  363.         }
  364.         try {
  365.             $currentNom null;
  366.             $currentPrenom null;
  367.             if ($currentProspectId) {
  368.                 $currentProspect $prospectRepository->find($currentProspectId);
  369.                 if ($currentProspect) {
  370.                     $currentNom trim($currentProspect->getEmprunteurNom());
  371.                     $currentPrenom trim($currentProspect->getEmprunteurPrenom());
  372.                 }
  373.             }
  374.             $existingProspect $prospectRepository->findExistingProspectByNomPrenom(
  375.                 $nom,
  376.                 $prenom,
  377.                 $user->getEntreprise(),
  378.                 $currentProspectId,
  379.                 $currentNom,
  380.                 $currentPrenom
  381.             );
  382.             if ($existingProspect) {
  383.                 return $this->json([
  384.                     'exists' => true,
  385.                     'blocked' => true,
  386.                     'message' => 'Un prospect avec ce nom et prénom existe déjà',
  387.                     'prospect' => [
  388.                         'id' => $existingProspect->getId(),
  389.                         'nom' => $existingProspect->getEmprunteurNom(),
  390.                         'prenom' => $existingProspect->getEmprunteurPrenom(),
  391.                         'email' => $existingProspect->getEmprunteurEmail(),
  392.                         'dateCreation' => $existingProspect->getDateheure() ? $existingProspect->getDateheure()->format('d/m/Y H:i') : null,
  393.                         'auteur' => $existingProspect->getAuteur() ? $existingProspect->getAuteur()->getNomEtPrenom() : null
  394.                     ]
  395.                 ]);
  396.             }
  397.             return $this->json([
  398.                 'exists' => false,
  399.                 'message' => 'Aucun doublon détecté'
  400.             ]);
  401.         } catch (\Exception $e) {
  402.             return $this->json([
  403.                 'exists' => false,
  404.                 'error' => 'Erreur lors de la vérification des doublons',
  405.             ], 500);
  406.         }
  407.     }
  408. }