src/Controller/EstimateurController.php line 46

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Lead;
  4. use App\Entity\Mailling;
  5. use App\Entity\Task;
  6. use App\Entity\User;
  7. use App\Form\LeadType;
  8. use App\Notification\MaillingNotification;
  9. use App\Repository\DvfRepository;
  10. use App\Repository\LeadRepository;
  11. use App\Repository\UserRepository;
  12. use App\Service\EstimatePrice;
  13. use App\Service\SmsMode as ServiceSmsMode;
  14. use DateInterval;
  15. use DateTime;
  16. use Doctrine\ORM\EntityManager;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  20. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. class EstimateurController extends AbstractController
  26. {
  27.     private $webDirectory;
  28.     public $maillingNotification;
  29.     private $token;
  30.     public function __construct($webDirectoryMaillingNotification $maillingNotification)
  31.     {
  32.         $this->webDirectory $webDirectory;
  33.         $this->maillingNotification $maillingNotification;
  34.     }
  35.     /**
  36.      *@Route("/estimateur/{step}", name="estimateur.index")
  37.      */
  38.     public function index($step "stepOne"Request $requestEntityManagerInterface $entityManagerDvfRepository $dvfUserRepository $userRepositoryLeadRepository $leadRepositoryEstimatePrice $estimatePrice)
  39.     {
  40.         $this->token $request->query->get('api_key');
  41.         if ($userRepository->findToken($this->token) == 0) {
  42.             return new Response('WRONG API KEY GIVEN');
  43.         }
  44.         if (empty($request->request->get('form')['uid'])) {
  45.             $lead = new Lead('new');
  46.         } else {
  47.             $lead $leadRepository->find($this->encrypt_decrypt($request->request->get('form')['uid'], $this->token'decrypt'));
  48.         }
  49.         if ($request->request->get('form') != null) {
  50.             $lead $this->updateLead($request$entityManager$userRepository$leadRepository);
  51.         }
  52.         if ($request->request->get('step') == 'stepFive') {
  53.             if ($this->checkCodeSms($request)) {
  54.                 /**
  55.                  * Calcule de l'estimation
  56.                  */
  57.                 $lead $estimatePrice->estimatePrice($lead$dvf);
  58.                 $lead->setVerified(1);
  59.                 $entityManager->flush();
  60.                 $user = ($lead->getUser() != null) ? $lead->getUser() : $lead->getPossessor();
  61.                 $task = new Task();
  62.                 $task->setUser($user)
  63.                     ->setTitle('Première prise de contact avec ' $lead->getLastName() . ' ' $lead->getName())
  64.                     ->setNote('Tâche automatique')
  65.                     ->setType(0)
  66.                     ->setPriority(1)
  67.                     ->setState(0)
  68.                     ->setDueDate(time(), 259200)
  69.                     ->setLead($lead)
  70.                     ->setDueDay('P3D')
  71.                     ->setDueHour(28800)
  72.                     ->setReminderInterval('0')
  73.                     ->setIsSend(1)
  74.                     ->setUserAction($user);
  75.                 $entityManager->persist($task);
  76.                 $entityManager->flush();
  77.                 $mailling = new Mailling();
  78.                 $mailling->setEmailFrom($lead->getPossessor()->getCompanyName()." <".$lead->getPossessor()->getEmail().">");
  79.                 $mailling->setEmailTo($lead->getEmail());
  80.                 $mailling->setSubject('Estimation de votre bien immobilier');
  81.                 $mailling->setMessage($this->messageEstimation($lead));
  82.                 $mailling->headerSender $lead->getPossessor()->getCompanyName();
  83.                 $this->maillingNotification->notify($mailling'Voici votre estimatation');
  84.                 $this->maillingNotification->notification($lead->getId(), 2);
  85.                 $this->maillingNotification->notification($task->getId(), 0);
  86.                 return $this->lastStep($request$lead);
  87.             } else {
  88.                 return new JsonResponse([
  89.                     'error' => "Merci d'indiquer le code recu par sms",
  90.                 ]);
  91.             }
  92.         }
  93.         $form $this->{$step}($lead);
  94.         if ($request->isXmlHttpRequest()) {
  95.             return new JsonResponse([
  96.                 'step' => $this->renderView('estimateur/steps/' $step '.html.twig', [
  97.                     'form'      => $form->createView(),
  98.                     'lead'      => $lead,
  99.                     'step'      => $step,
  100.                 ]),
  101.             ]);
  102.         }
  103.         return $this->render('estimateur/index.html.twig', [
  104.             'form'  => $form->createView(),
  105.             'lead'  => $lead,
  106.             'step'  => $step
  107.         ]);
  108.     }
  109.     private function messageEstimation(Lead $lead)
  110.     {
  111.         $return "<p>Cher(e) {$lead->getName()} {$lead->getLastName()}</p>
  112.         <p>L'estimation que vous avez réalisée sur notre site vous a permis de nourrir votre réflexion quant à votre projet immobilier. 
  113.         D'après les caractéristiques que vous nous avez transmises, voici le prix du marché de votre bien immobilier qui se situe dans la fourchette suivante :</p>
  114.         <h3>{$lead->getStreetNumber()} {$lead->getStreet()}{$lead->getZipcode()}{$lead->getCity()}</h3>";
  115.         if($lead->getMediumPrice()> 0){
  116.             $return .= "
  117.             <p>Les moins chers dans votre quartier : ".number_format($lead->getLowerPrice(), 0','' ')." € </p>
  118.             <p>Les plus chers dans votre quartier : ".number_format($lead->getHighPrice(), 0','' ')."  €</p>";
  119.         }else{
  120.             $return .= "<p><br>Aucune évaluation n'a pu être réalisé pour votre bien immobilier.<br></p>";
  121.         }
  122.         $return .= "<p>Cette évaluation ne peut pas être aussi précise que celle réalisée par un professionnel. 
  123.         C'est pour cela qu'un agent vous contactera très prochainement afin d'affiner votre recherche et vous communiquer un rapport d'estimation précis et complet. 
  124.         Vous vous posez peut-être des questions sur l'état du marché local ? Ou peut-être sur la concrétisation de ce projet ? 
  125.         Vous voulez acheter, vendre, louer ou même investir nous restons à votre disposition pour échanger.</p>
  126.         <p>
  127.         {$lead->getPossessor()->getPhone()} <br>
  128.         {$lead->getPossessor()->getCompanyName()} <br>
  129.         {$lead->getPossessor()->getStreetNumber()} {$lead->getPossessor()->getStreet()} <br>
  130.         {$lead->getPossessor()->getZipcode()}{$lead->getPossessor()->getCity()}
  131.         </p>";
  132.         return $return
  133.     }
  134.     /**
  135.      *@Route("/send-sms", name="estimateur.send_sms", methods={"POST"})
  136.      */
  137.     public function sendSms(Request $request)
  138.     {
  139.         $result '';
  140.         for ($i 0$i 4$i++) {
  141.             $result .= rand(09);
  142.         }
  143.         $smsMode = new ServiceSmsMode("Bk5TH6EkshsXMJ5JpouMONDNrmIQ0DVY""Afin de valider votre estimation immobilière, merci de renseigner ce code: " $result " Merci."$request->request->get('form')['phone'], "Aquizio");
  144.         $smsMode->sendSmsGet();
  145.         if ($request->isXmlHttpRequest()) {
  146.             return new JsonResponse([
  147.                 'code'      => $this->encrypt_decrypt($result$request->query->get('api_key'), 'encrypt')
  148.             ]);
  149.         }
  150.     }
  151.     private function checkCodeSms(Request $request)
  152.     {
  153.         $code $request->request->get('code');
  154.         $code_generate $this->encrypt_decrypt($request->request->get('code_generate'), $this->token'decrypt');
  155.         if ($code === $code_generate) {
  156.             return true;
  157.         } else {
  158.             return false;
  159.         }
  160.     }
  161.     private function stepOne(Lead $lead)
  162.     {
  163.         $uid '';
  164.         if ($lead->getId() != null) {
  165.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  166.         }
  167.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  168.             ->add('uid'HiddenType::class, ['mapped' => false'required' => false'data' => $uid])
  169.             ->add('location_type'HiddenType::class, ['attr' => ['id' => 'location-type'], 'mapped' => false'data' => 'none'])
  170.             ->add('latlng'HiddenType::class)
  171.             ->add('zipcode'null, ['label' => 'Code postal'])
  172.             ->add('city'null, ['label' => 'Ville'])
  173.             ->add('street'null, ['label' => 'Rue'])
  174.             ->add('street_number'null, ['label' => 'N°'])
  175.             ->getForm();
  176.     }
  177.     private function stepTwo(Lead $lead)
  178.     {
  179.         $uid '';
  180.         if ($lead->getId() != null) {
  181.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  182.         }
  183.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  184.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  185.             ->add('property_type_code'ChoiceType::class, ['choices' => array_flip(Lead::TYPE_CODE), 'expanded' => true'label' => false])
  186.             ->add('property_type_subcode_appartment'ChoiceType::class, ['mapped' => false'choices' => $this->removeValue(array_flip(Lead::TYPE_SUBCODE), [23]), 'expanded' => true'label' => false])
  187.             ->add('property_type_subcode_house'ChoiceType::class, ['mapped' => false'choices' => $this->removeValue(array_flip(Lead::TYPE_SUBCODE), [01]), 'expanded' => true'label' => false])
  188.             ->add('pool'ChoiceType::class, ['choices' => [01], 'expanded' => true'label' => false])
  189.             ->add('floor'null, ['label' => 'Étage de l\'appartement'])
  190.             ->add('floor_building'null, ['label' => 'Nombre d\'étages de l\'immeuble'])
  191.             ->add('elevator'ChoiceType::class, ['choices' => [01], 'label' => 'Ascenseur'])
  192.             ->add('isOwner'ChoiceType::class, ['choices' => [01], 'expanded' => true'label' => false])
  193.             ->add('best_description'ChoiceType::class, ['choices' => array_flip(Lead::BEST_DESCRIPTION), 'expanded' => true'label' => false])
  194.             ->getForm();
  195.     }
  196.     private function stepThree(Lead $lead)
  197.     {
  198.         $uid '';
  199.         if ($lead->getId() != null) {
  200.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  201.         }
  202.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  203.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  204.             ->add('square_area'null, ['label' => 'Surface (Carrez)'])
  205.             ->add('balcony_area'null, ['label' => 'Surface des balcons'])
  206.             ->add('garden_area'null, ['label' => 'Surface du jardin'])
  207.             ->add('land_area'null, ['label' => 'Surface du terrain'])
  208.             ->add('year_construction'null, ['label' => 'Année de construction'])
  209.             ->add('year_renovation'null, ['label' => 'Année de rénovation'])
  210.             ->add('number_rooms'null, ['label' => 'Nombre de pièce'])
  211.             ->add('number_bathroom'null, ['label' => 'Nombre de SdB'])
  212.             ->add('parking_space_inside'null, ['label' => 'Place de parking intérieur'])
  213.             ->add('parking_space_outside'null, ['label' => 'Place de parking extérieur'])
  214.             ->add('condition_property'ChoiceType::class, ['choices' => array_flip([=> 'À rénover'=> 'Bon état'=> 'Rénové'=> 'Neuf']), 'expanded' => true'label' => false])
  215.             ->getForm();
  216.     }
  217.     private function stepFour(Lead $lead)
  218.     {
  219.         $uid '';
  220.         if ($lead->getId() != null) {
  221.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  222.         }
  223.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  224.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  225.             ->add('name'null, ['label' => 'Prénom'])
  226.             ->add('last_name'null, ['label' => 'Nom'])
  227.             ->add('email'null, ['label' => 'Email'])
  228.             ->add('phone'null, ['label' => 'Téléphone'])
  229.             ->getForm();
  230.     }
  231.     private function stepFive(Lead $lead)
  232.     {
  233.         $uid '';
  234.         if ($lead->getId() != null) {
  235.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  236.         }
  237.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  238.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  239.             ->getForm();
  240.     }
  241.     private function removeValue($value$arr)
  242.     {
  243.         foreach ($value as $k => $v) {
  244.             if (in_array($v$arr)) {
  245.                 unset($value[$k]);
  246.             }
  247.         }
  248.         return $value;
  249.     }
  250.     private function updateLead(Request $requestEntityManagerInterface $entityManagerUserRepository $userRepositoryLeadRepository $leadRepository)
  251.     {
  252.         // $this->this->token = $request->query->get('api_key');
  253.         // Première étape du formulaire passé
  254.         if (empty($request->request->get('form')['uid'])) {
  255.             $lead = new Lead('new');
  256.             $form $this->stepOne($lead);
  257.             $form->handleRequest($request);
  258.             $usersPocess $userRepository->findIdPocessor($this->token);
  259.             $possessor $userRepository->find($usersPocess->getParentId());
  260.             $user $userRepository->find($usersPocess->getId());
  261.             if ($this->token != $possessor->getApiKey()) {
  262.                 $lead->setUser($user);
  263.             }
  264.             $lead->setPossessor($possessor)
  265.                 ->setAutomatisation(0)
  266.                 ->setVerified(0)
  267.                 ->setProspection(0)
  268.                 ->setToken($this->token);
  269.             $this->removeSpam($lead$leadRepository$entityManager);
  270.             $entityManager->persist($lead);
  271.             $entityManager->flush();
  272.             return $lead;
  273.         } else { // Les autres étapes du formulaire
  274.             $lead $leadRepository->find($this->encrypt_decrypt($request->request->get('form')['uid'], $this->token'decrypt'));
  275.             $form $this->{$request->request->get('step')}($lead);
  276.             $form->handleRequest($request);
  277.             if (isset($request->request->get('form')['property_type_code'])) {
  278.                 if ($request->request->get('form')['property_type_code'] == 1) {
  279.                     $lead->setPropertyTypeSubcode($request->request->get('form')['property_type_subcode_house'] ?? 'n/a');
  280.                 } elseif ($request->request->get('form')['property_type_code'] == 0) {
  281.                     $lead->setPropertyTypeSubcode($request->request->get('form')['property_type_subcode_appartment'] ?? 'n/a');
  282.                 }
  283.             }
  284.             $entityManager->flush();
  285.             return $lead;
  286.         }
  287.     }
  288.     private function removeSpam(Lead $leadLeadRepository $leadRepositoryEntityManagerInterface $entityManager)
  289.     {
  290.         $spams $leadRepository->findSpam($lead->getLatLng(), $lead->getToken());
  291.         foreach ($spams as $spam) {
  292.             $entityManager->remove($spam);
  293.             $entityManager->flush();
  294.         }
  295.     }
  296.     private function encrypt_decrypt($string$token$action 'encrypt')
  297.     {
  298.         $encrypt_method "AES-256-CBC";
  299.         $secret_key $token// user define private key
  300.         $secret_iv '2dyk0c4p4aqz1qpvxh6g80lrf'// user define secret key
  301.         $key hash('sha256'$secret_key);
  302.         $iv substr(hash('sha256'$secret_iv), 016); // sha256 is hash_hmac_algo
  303.         if ($action == 'encrypt') {
  304.             $output openssl_encrypt($string$encrypt_method$key0$iv);
  305.             $output base64_encode($output);
  306.         } else if ($action == 'decrypt') {
  307.             $output openssl_decrypt(base64_decode($string), $encrypt_method$key0$iv);
  308.         }
  309.         return $output;
  310.     }
  311.     /**
  312.      *@Route("/estimateur-end", name="estimateur.end")
  313.      */
  314.     public function lastStep(Request $requestLead $lead): Response
  315.     {
  316.         if ($request->isXmlHttpRequest()) {
  317.             return new JsonResponse([
  318.                 'step' => $this->renderView('estimateur/steps/lastStep.html.twig', ['lead' => $lead])
  319.             ]);
  320.         }
  321.         return $this->render('estimateur/steps/lastStep.html.twig', []);
  322.     }
  323. }