src/Controller/CalculatorController.php line 58

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Demand;
  4. use App\Form\CalculatorFlow;
  5. use App\Form\MessageType;
  6. use App\Model\ApiHelper;
  7. use App\Model\MailHelper;
  8. use App\Model\RaynetcrmManager;
  9. use App\Repository\DemandRepository;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Mjml\Client;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. class CalculatorController extends AbstractController
  17. {
  18.     private string $googleApiKey;
  19.     public function __construct(
  20.         private EntityManagerInterface $entityManager,
  21.         private DemandRepository $demandRepository,
  22.         private ApiHelper $apiHelper,
  23.         private MailHelper $mailHelper,
  24.         private RaynetcrmManager $raynetcrmManager,
  25.     ) {
  26.         $this->googleApiKey $_ENV['GOOGLE_API_KEY'];
  27.     }
  28.     public function generateRandomValue()
  29.     {
  30.         $demands $this->demandRepository->findAll();
  31.         $ctas array_column($demands'ctaNumber');
  32.         if (empty($demands)) {
  33.             $tmp random_int(99999910000000);
  34.         } else {
  35.             $b true;
  36.             $tmp 0;
  37.             while ($b) {
  38.                 $tmp random_int(99999910000000);
  39.                 foreach ($ctas as $cta) {
  40.                     if ($cta !== $tmp) {
  41.                         $b false;
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.         return $tmp;
  47.     }
  48.     #[Route('/kalkulator'name'calculator')]
  49.     public function createAction(CalculatorFlow $calculatorFlowRequest $requestAdminController $adminController): Response
  50.     {
  51.         $formData = new Demand();
  52.         $flow $calculatorFlow;
  53.         $flow->bind($formData);
  54.         $form $flow->createForm();
  55.         if ($flow->isValid($form)) {
  56.             $flow->saveCurrentStepData($form);
  57.             if ($flow->nextStep()) {
  58.                 $form $flow->createForm();
  59.             } else {
  60.                 $entityManager $this->entityManager;
  61.                 $origData = (array) $formData;
  62.                 $generatedData $this->apiHelper->getDataToApi($origData);
  63.                 $result $generatedData['result'];
  64.                 $original $generatedData['orig_params'];
  65.                 $lat $result['lat'];
  66.                 $lng $result['lng'];
  67.                 // Required data
  68.                 $kind $original['kind'];
  69.                 $propertyType $original['property_type'];
  70.                 $rating $original['rating'];
  71.                 $floorArea $original['floor_area'];
  72.                 // Required data
  73.                 $urlParams '?kind='.urlencode($kind);
  74.                 $urlParams .= '&place='.urlencode($lat.', '.$lng);
  75.                 $urlParams .= '&property_type='.urlencode($propertyType);
  76.                 $urlParams .= '&rating='.urlencode($rating);
  77.                 if ($rating === 'very_good') {
  78.                     $urlParams .= '&new_building=1';
  79.                 }
  80.                 $urlParams .= '&floor_area='.urlencode($floorArea);
  81.                 $date = new \DateTime();
  82.                 $date $date->format('d-m-Y');
  83.                 $urlParams .= '&as_of='.$date;
  84.                 // Non-required data
  85.                 if (isset($original['ownership'])) {
  86.                     $ownership $original['ownership'];
  87.                     $urlParams .= '&ownership='.urlencode($ownership);
  88.                 }
  89.                 if (isset($original['house_type'])) {
  90.                     $houseType $original['house_type'];
  91.                     $urlParams .= '&house_type='.urlencode($houseType);
  92.                 }
  93.                 if (isset($original['local_type'])) {
  94.                     $localType $original['local_type'];
  95.                     $urlParams .= '&local_type='.urlencode($localType);
  96.                 }
  97.                 if (isset($original['construction'])) {
  98.                     $construction $original['construction'];
  99.                     $urlParams .= '&construction='.urlencode($construction);
  100.                 }
  101.                 if (isset($original['lift'])) {
  102.                     $lift $original['lift'];
  103.                     $urlParams .= '&lift='.urlencode($lift);
  104.                 }
  105.                 if (isset($original['floor'])) {
  106.                     $floor $original['floor'];
  107.                     $urlParams .= '&floor='.urlencode($floor);
  108.                 }
  109.                 if (isset($original['total_floors'])) {
  110.                     $totalFloors $original['total_floors'];
  111.                     $urlParams .= '&total_floors='.urlencode($totalFloors);
  112.                 }
  113.                 if (isset($original['garages'])) {
  114.                     $garages $original['garages'];
  115.                     $urlParams .= '&garages='.urlencode($garages);
  116.                 }
  117.                 if (isset($original['parking_spaces'])) {
  118.                     $parking_spaces $original['parking_spaces'];
  119.                     $urlParams .= '&parking_spaces='.urlencode($parking_spaces);
  120.                 }
  121.                 if (isset($original['balcony_area'])) {
  122.                     $balcony_area $original['balcony_area'];
  123.                     $urlParams .= '&balcony_area='.urlencode($balcony_area);
  124.                 }
  125.                 if (isset($original['lot_area'])) {
  126.                     $garden_area $original['lot_area'];
  127.                     $urlParams .= '&lot_area='.urlencode($garden_area);
  128.                 }
  129.                 if (isset($original['other_area'])) {
  130.                     $other_area $original['other_area'];
  131.                     $urlParams .= '&other_area='.urlencode($other_area);
  132.                 }
  133.                 $url 'https://profi.valuo.cz/calculation/link';
  134.                 $formData->valuoLink $url.$urlParams;
  135.                 $formData->ctaNumber $this->generateRandomValue();
  136.                 $formData->state Demand::STATE_NEW;
  137.                 // result
  138.                 $formData->formattedMaxPrice number_format($result['range_price'][1], 0','' ');
  139.                 $formData->formattedMaxPriceMeter number_format($result['range_price_m2'][1], 0','' ');
  140.                 $formData->formattedMinPrice number_format($result['range_price'][0], 0','' ');
  141.                 $formData->formattedMinPriceMeter number_format($result['range_price_m2'][0], 0','' ');
  142.                 $formData->formattedAvgPrice number_format($result['avg_price'], 0','' ');
  143.                 $formData->formattedAvgPriceMeter number_format($result['avg_price_m2'], 0','' ');
  144.                 $formData->formattedAsOf = (new \DateTime())->format('d. m. Y');
  145.                 $entityManager->persist($formData);
  146.                 $entityManager->flush();
  147.                 $adminController->pdfGenerator($request$formData->id);
  148.                 $formData->raynetLeadId $this->raynetcrmManager->putNewLead($formData);
  149.                 $this->raynetcrmManager->addPdfToRaynetcrm($formData);
  150.                 $entityManager->persist($formData);
  151.                 $entityManager->flush();
  152.                 $appKey $_ENV['MJML_APP_KEY'];
  153.                 $secretKey $_ENV['MJML_SECRET_KEY'];
  154.                 $client = new Client($appKey$secretKey);
  155.                 $mjml $this->renderView('mail/index.mjml.twig', [
  156.                     'cta' => $formData->ctaNumber,
  157.                     'id' => $formData->id,
  158.                     'server' => $request->getSchemeAndHttpHost(),
  159.                 ]);
  160.                 $html $client->render($mjml);
  161.                 $this->mailHelper->newDemandMail($formData);
  162.                 $this->mailHelper->calculationCTAMail($html$formData);
  163.                 unlink("generatedPdfs/pdf_$formData->email.pdf");
  164.                 $nameArr explode(' '$formData->name);
  165.                 $ecomail = new \Ecomail($_ENV['ECOMAIL_API_KEY']);
  166.                 if (count($nameArr) > 1) {
  167.                     $ecomail->addSubscriber(2, [
  168.                         'subscriber_data' => [
  169.                             'name' => $nameArr[0],
  170.                             'surname' => $nameArr[1],
  171.                             'email' => $formData->email,
  172.                         ],
  173.                         'trigger_autoresponders' => true,
  174.                     ]);
  175.                 } else {
  176.                     $ecomail->addSubscriber(2, [
  177.                         'subscriber_data' => [
  178.                             'name' => $nameArr[0],
  179.                             'email' => $formData->email,
  180.                         ],
  181.                         'trigger_autoresponders' => true,
  182.                     ]);
  183.                 }
  184.                 $flow->reset(); // remove step data from the session
  185.                 return $this->redirectToRoute('form_sent'); // redirect when done
  186.             }
  187.         }
  188.         return $this->render('calculator/index.html.twig', [
  189.             'googleApiKey' => $this->googleApiKey,
  190.             'form' => $form->createView(),
  191.             'flow' => $flow,
  192.         ]);
  193.     }
  194.     #[Route('/cta/{id}'name'check_cta')]
  195.     public function checkCtaClicked(Request $requeststring $id): Response
  196.     {
  197.         $demand $this->demandRepository->find($id);
  198.         $action $request->get('action');
  199.         $form $this->createForm(MessageType::class, $demand);
  200.         $form->handleRequest($request);
  201.         if ($demand->ctaNumber === (int) $action) {
  202.             // PotvrzenĂ­ o kliku pro obchodnĂ­ka
  203.             $this->mailHelper->confirmedCTAMail($demand);
  204.             $demand->state Demand::STATE_HOT_LEAD;
  205.             $this->entityManager->persist($demand);
  206.             $this->entityManager->flush();
  207.         }
  208.         if (!$form->isSubmitted()) {
  209.             $form->get('checkName')->setData($demand->name);
  210.             $form->get('checkEmail')->setData($demand->email);
  211.             $form->get('checkPhone')->setData($demand->phone);
  212.         }
  213.         if ($form->isSubmitted()) {
  214.             if ($form->get('message')->getData() !== null) {
  215.                 $demand->message $form->get('message')->getData();
  216.                 $this->entityManager->persist($demand);
  217.                 $this->entityManager->flush();
  218.             }
  219.             return $this->redirectToRoute('cta_sent');
  220.         }
  221.         return $this->render('calculator/message.html.twig', [
  222.             'form' => $form->createView(),
  223.         ]);
  224.     }
  225. }