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->setUser($user);
  79.                 $mailling->setEmailFrom($lead->getPossessor()->getEmail());
  80.                 $mailling->setEmailTo($lead->getEmail());
  81.                 $mailling->setSubject('Estimation de votre bien immobilier');
  82.                 $mailling->setMessage($this->messageEstimation($lead));
  83.                 $mailling->setHeaderTitle('Voici votre estimatation');
  84.                 $mailling->setHeaderSender($lead->getPossessor()->getCompanyName());
  85.                 $entityManager->persist($mailling);
  86.                 $entityManager->flush($mailling);
  87.                 // $this->maillingNotification->notify($mailling, );
  88.                 $this->maillingNotification->notification($lead->getId(), 2);
  89.                 $this->maillingNotification->notification($task->getId(), 0);
  90.                 return $this->lastStep($request$lead);
  91.             } else {
  92.                 if ($step != 'lastStep') {
  93.                     $form $this->{$step}($lead);
  94.                     return new JsonResponse([
  95.                         'step' => $this->renderView('estimateur/steps/' $step '.html.twig', [
  96.                             'form'      => $form->createView(),
  97.                             'lead'      => $lead,
  98.                             'step'      => $step,
  99.                         ]),
  100.                     ]);
  101.                 } else {
  102.                     return new JsonResponse([
  103.                         'error' => "Merci d'indiquer le code recu par sms",
  104.                     ]);
  105.                 }
  106.             }
  107.         }
  108.         $form $this->{$step}($lead);
  109.         if ($request->isXmlHttpRequest()) {
  110.             return new JsonResponse([
  111.                 'step' => $this->renderView('estimateur/steps/' $step '.html.twig', [
  112.                     'form'      => $form->createView(),
  113.                     'lead'      => $lead,
  114.                     'step'      => $step,
  115.                 ]),
  116.             ]);
  117.         }
  118.         return $this->render('estimateur/index.html.twig', [
  119.             'form'  => $form->createView(),
  120.             'lead'  => $lead,
  121.             'step'  => $step
  122.         ]);
  123.     }
  124.     private function messageEstimation(Lead $lead)
  125.     {
  126.         $return "<p>Cher(e) {$lead->getName()} {$lead->getLastName()}</p>
  127.         <p>L'estimation que vous avez réalisée sur notre site vous a permis de nourrir votre réflexion quant à votre projet immobilier. 
  128.         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>
  129.         <h3>{$lead->getStreetNumber()} {$lead->getStreet()}{$lead->getZipcode()}{$lead->getCity()}</h3>";
  130.         if ($lead->getMediumPrice() > 0) {
  131.             $return .= "
  132.             <p>Les moins chers dans votre quartier : " number_format($lead->getLowerPrice(), 0','' ') . " € </p>
  133.             <p>Les plus chers dans votre quartier : " number_format($lead->getHighPrice(), 0','' ') . "  €</p>";
  134.         } else {
  135.             $return .= "<p><br>Aucune évaluation n'a pu être réalisé pour votre bien immobilier.<br></p>";
  136.         }
  137.         $return .= "<p>Cette évaluation ne peut pas être aussi précise que celle réalisée par un professionnel. 
  138.         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. 
  139.         Vous vous posez peut-être des questions sur l'état du marché local ? Ou peut-être sur la concrétisation de ce projet ? 
  140.         Vous voulez acheter, vendre, louer ou même investir nous restons à votre disposition pour échanger.</p>
  141.         <p>
  142.         {$lead->getPossessor()->getPhone()} <br>
  143.         {$lead->getPossessor()->getCompanyName()} <br>
  144.         {$lead->getPossessor()->getStreetNumber()} {$lead->getPossessor()->getStreet()} <br>
  145.         {$lead->getPossessor()->getZipcode()}{$lead->getPossessor()->getCity()}
  146.         </p>";
  147.         return $return;
  148.     }
  149.     /**
  150.      *@Route("/send-sms", name="estimateur.send_sms", methods={"POST"})
  151.      */
  152.     public function sendSms(Request $request)
  153.     {
  154.         $result '';
  155.         for ($i 0$i 4$i++) {
  156.             $result .= rand(09);
  157.         }
  158.         $smsMode = new ServiceSmsMode("Bk5TH6EkshsXMJ5JpouMONDNrmIQ0DVY""Afin de valider votre estimation immobilière, merci de renseigner ce code: " $result " Merci."$request->request->get('form')['phone'], "Aquizio");
  159.         $smsMode->sendSmsGet();
  160.         if ($request->isXmlHttpRequest()) {
  161.             return new JsonResponse([
  162.                 'code'      => $this->encrypt_decrypt($result$request->query->get('api_key'), 'encrypt')
  163.             ]);
  164.         }
  165.     }
  166.     private function checkCodeSms(Request $request)
  167.     {
  168.         $code $request->request->get('code');
  169.         $code_generate $this->encrypt_decrypt($request->request->get('code_generate'), $this->token'decrypt');
  170.         if ($code === $code_generate) {
  171.             return true;
  172.         } else {
  173.             return false;
  174.         }
  175.     }
  176.     private function stepOne(Lead $lead)
  177.     {
  178.         $uid '';
  179.         if ($lead->getId() != null) {
  180.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  181.         }
  182.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  183.             ->add('uid'HiddenType::class, ['mapped' => false'required' => false'data' => $uid])
  184.             ->add('location_type'HiddenType::class, ['attr' => ['id' => 'location-type'], 'mapped' => false'data' => 'none'])
  185.             ->add('latlng'HiddenType::class)
  186.             ->add('zipcode'null, ['label' => 'Code postal'])
  187.             ->add('city'null, ['label' => 'Ville'])
  188.             ->add('street'null, ['label' => 'Rue'])
  189.             ->add('street_number'null, ['label' => 'N°'])
  190.             ->getForm();
  191.     }
  192.     private function stepTwo(Lead $lead)
  193.     {
  194.         $uid '';
  195.         if ($lead->getId() != null) {
  196.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  197.         }
  198.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  199.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  200.             ->add('property_type_code'ChoiceType::class, ['choices' => array_flip(Lead::TYPE_CODE), 'expanded' => true'label' => false])
  201.             ->add('property_type_subcode_appartment'ChoiceType::class, ['mapped' => false'choices' => $this->removeValue(array_flip(Lead::TYPE_SUBCODE), [23]), 'expanded' => true'label' => false])
  202.             ->add('property_type_subcode_house'ChoiceType::class, ['mapped' => false'choices' => $this->removeValue(array_flip(Lead::TYPE_SUBCODE), [01]), 'expanded' => true'label' => false])
  203.             ->add('pool'ChoiceType::class, ['choices' => [01], 'expanded' => true'label' => false])
  204.             ->add('floor'null, ['label' => 'Étage de l\'appartement'])
  205.             ->add('floor_building'null, ['label' => 'Nombre d\'étages de l\'immeuble'])
  206.             ->add('elevator'ChoiceType::class, ['choices' => [01], 'label' => 'Ascenseur'])
  207.             ->add('isOwner'ChoiceType::class, ['choices' => [01], 'expanded' => true'label' => false])
  208.             ->add('best_description'ChoiceType::class, ['choices' => array_flip(Lead::BEST_DESCRIPTION), 'expanded' => true'label' => false])
  209.             ->getForm();
  210.     }
  211.     private function stepThree(Lead $lead)
  212.     {
  213.         $uid '';
  214.         if ($lead->getId() != null) {
  215.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  216.         }
  217.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  218.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  219.             ->add('square_area'null, ['label' => 'Surface (Carrez)'])
  220.             ->add('balcony_area'null, ['label' => 'Surface des balcons'])
  221.             ->add('garden_area'null, ['label' => 'Surface du jardin'])
  222.             ->add('land_area'null, ['label' => 'Surface du terrain'])
  223.             ->add('year_construction'null, ['label' => 'Année de construction'])
  224.             ->add('year_renovation'null, ['label' => 'Année de rénovation'])
  225.             ->add('number_rooms'null, ['label' => 'Nombre de pièce'])
  226.             ->add('number_bathroom'null, ['label' => 'Nombre de SdB'])
  227.             ->add('parking_space_inside'null, ['label' => 'Place de parking intérieur'])
  228.             ->add('parking_space_outside'null, ['label' => 'Place de parking extérieur'])
  229.             ->add('condition_property'ChoiceType::class, ['choices' => array_flip([=> 'À rénover'=> 'Bon état'=> 'Rénové'=> 'Neuf']), 'expanded' => true'label' => false])
  230.             ->getForm();
  231.     }
  232.     private function stepFour(Lead $lead)
  233.     {
  234.         $uid '';
  235.         if ($lead->getId() != null) {
  236.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  237.         }
  238.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  239.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  240.             ->add('name'null, ['label' => 'Prénom'])
  241.             ->add('last_name'null, ['label' => 'Nom'])
  242.             ->add('email'null, ['label' => 'Email'])
  243.             ->add('phone'null, ['label' => 'Téléphone'])
  244.             ->getForm();
  245.     }
  246.     private function stepFive(Lead $lead)
  247.     {
  248.         $uid '';
  249.         if ($lead->getId() != null) {
  250.             $uid $this->encrypt_decrypt($lead->getId(), $this->token'encrypt');
  251.         }
  252.         return $this->createFormBuilder($lead, ['action' => $this->generateUrl('estimateur.index')])
  253.             ->add('uid'HiddenType::class, ['mapped' => false'data' => $uid])
  254.             ->getForm();
  255.     }
  256.     private function removeValue($value$arr)
  257.     {
  258.         foreach ($value as $k => $v) {
  259.             if (in_array($v$arr)) {
  260.                 unset($value[$k]);
  261.             }
  262.         }
  263.         return $value;
  264.     }
  265.     private function updateLead(Request $requestEntityManagerInterface $entityManagerUserRepository $userRepositoryLeadRepository $leadRepository)
  266.     {
  267.         // $this->this->token = $request->query->get('api_key');
  268.         // Première étape du formulaire passé
  269.         if (empty($request->request->get('form')['uid'])) {
  270.             $lead = new Lead('new');
  271.             $form $this->stepOne($lead);
  272.             $form->handleRequest($request);
  273.             $usersPocess $userRepository->findIdPocessor($this->token);
  274.             $possessor $userRepository->find($usersPocess->getParentId());
  275.             $user $userRepository->find($usersPocess->getId());
  276.             // if ($this->token != $possessor->getApiKey()) {
  277.             //     $lead->setUser($user);
  278.             // }
  279.             $lead->setPossessor($possessor)
  280.                 ->setUser($possessor)
  281.                 ->setAutomatisation(0)
  282.                 ->setVerified(0)
  283.                 ->setProspection(0)
  284.                 ->setToken($this->token);
  285.             $this->removeSpam($lead$leadRepository$entityManager);
  286.             $entityManager->persist($lead);
  287.             $entityManager->flush();
  288.             return $lead;
  289.         } else { // Les autres étapes du formulaire
  290.             $lead $leadRepository->find($this->encrypt_decrypt($request->request->get('form')['uid'], $this->token'decrypt'));
  291.             $form $this->{$request->request->get('step')}($lead);
  292.             $form->handleRequest($request);
  293.             if (isset($request->request->get('form')['property_type_code'])) {
  294.                 if ($request->request->get('form')['property_type_code'] == 1) {
  295.                     $lead->setPropertyTypeSubcode($request->request->get('form')['property_type_subcode_house'] ?? null);
  296.                 } elseif ($request->request->get('form')['property_type_code'] == 0) {
  297.                     $lead->setPropertyTypeSubcode($request->request->get('form')['property_type_subcode_appartment'] ?? null);
  298.                 }
  299.             }
  300.             if (isset($request->request->get('form')['isOwner'])) {
  301.                 if ($lead->getIsOwner() === null) {
  302.                     $lead->setIntention(0);
  303.                 }
  304.                 if ($lead->getIsOwner() == 0) {
  305.                     if ($lead->getBestDescription() == 4$lead->setIntention(0); //autre à enlever à terme
  306.                     if ($lead->getBestDescription() <= 1$lead->setIntention(0); // Achat
  307.                     if ($lead->getBestDescription() > 1$lead->setIntention(1); // Vente
  308.                 } elseif ($lead->getIsOwner() == 1) {
  309.                     $lead->setIntention(1);
  310.                 }
  311.             }
  312.             $entityManager->flush();
  313.             return $lead;
  314.         }
  315.     }
  316.     private function removeSpam(Lead $leadLeadRepository $leadRepositoryEntityManagerInterface $entityManager)
  317.     {
  318.         $spams $leadRepository->findSpam($lead->getLatLng(), $lead->getToken());
  319.         foreach ($spams as $spam) {
  320.             $entityManager->remove($spam);
  321.             $entityManager->flush();
  322.         }
  323.     }
  324.     private function encrypt_decrypt($string$token$action 'encrypt')
  325.     {
  326.         $encrypt_method "AES-256-CBC";
  327.         $secret_key $token// user define private key
  328.         $secret_iv '2dyk0c4p4aqz1qpvxh6g80lrf'// user define secret key
  329.         $key hash('sha256'$secret_key);
  330.         $iv substr(hash('sha256'$secret_iv), 016); // sha256 is hash_hmac_algo
  331.         if ($action == 'encrypt') {
  332.             $output openssl_encrypt($string$encrypt_method$key0$iv);
  333.             $output base64_encode($output);
  334.         } else if ($action == 'decrypt') {
  335.             $output openssl_decrypt(base64_decode($string), $encrypt_method$key0$iv);
  336.         }
  337.         return $output;
  338.     }
  339.     /**
  340.      *@Route("/estimateur-end", name="estimateur.end")
  341.      */
  342.     public function lastStep(Request $requestLead $lead): Response
  343.     {
  344.         if ($request->isXmlHttpRequest()) {
  345.             return new JsonResponse([
  346.                 'step' => $this->renderView('estimateur/steps/lastStep.html.twig', ['lead' => $lead]),
  347.                 'codeOk' => true
  348.             ]);
  349.         }
  350.         return $this->render('estimateur/steps/lastStep.html.twig', []);
  351.     }
  352. }