<?php
namespace App\Controller;
use App\Entity\Demand;
use App\Form\CalculatorFlow;
use App\Form\MessageType;
use App\Model\ApiHelper;
use App\Model\MailHelper;
use App\Model\RaynetcrmManager;
use App\Repository\DemandRepository;
use Doctrine\ORM\EntityManagerInterface;
use Mjml\Client;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CalculatorController extends AbstractController
{
private string $googleApiKey;
public function __construct(
private EntityManagerInterface $entityManager,
private DemandRepository $demandRepository,
private ApiHelper $apiHelper,
private MailHelper $mailHelper,
private RaynetcrmManager $raynetcrmManager,
) {
$this->googleApiKey = $_ENV['GOOGLE_API_KEY'];
}
public function generateRandomValue()
{
$demands = $this->demandRepository->findAll();
$ctas = array_column($demands, 'ctaNumber');
if (empty($demands)) {
$tmp = random_int(999999, 10000000);
} else {
$b = true;
$tmp = 0;
while ($b) {
$tmp = random_int(999999, 10000000);
foreach ($ctas as $cta) {
if ($cta !== $tmp) {
$b = false;
}
}
}
}
return $tmp;
}
#[Route('/kalkulator', name: 'calculator')]
public function createAction(CalculatorFlow $calculatorFlow, Request $request, AdminController $adminController): Response
{
$formData = new Demand();
$flow = $calculatorFlow;
$flow->bind($formData);
$form = $flow->createForm();
if ($flow->isValid($form)) {
$flow->saveCurrentStepData($form);
if ($flow->nextStep()) {
$form = $flow->createForm();
} else {
$entityManager = $this->entityManager;
$origData = (array) $formData;
$generatedData = $this->apiHelper->getDataToApi($origData);
$result = $generatedData['result'];
$original = $generatedData['orig_params'];
$lat = $result['lat'];
$lng = $result['lng'];
// Required data
$kind = $original['kind'];
$propertyType = $original['property_type'];
$rating = $original['rating'];
$floorArea = $original['floor_area'];
// Required data
$urlParams = '?kind='.urlencode($kind);
$urlParams .= '&place='.urlencode($lat.', '.$lng);
$urlParams .= '&property_type='.urlencode($propertyType);
$urlParams .= '&rating='.urlencode($rating);
if ($rating === 'very_good') {
$urlParams .= '&new_building=1';
}
$urlParams .= '&floor_area='.urlencode($floorArea);
$date = new \DateTime();
$date = $date->format('d-m-Y');
$urlParams .= '&as_of='.$date;
// Non-required data
if (isset($original['ownership'])) {
$ownership = $original['ownership'];
$urlParams .= '&ownership='.urlencode($ownership);
}
if (isset($original['house_type'])) {
$houseType = $original['house_type'];
$urlParams .= '&house_type='.urlencode($houseType);
}
if (isset($original['local_type'])) {
$localType = $original['local_type'];
$urlParams .= '&local_type='.urlencode($localType);
}
if (isset($original['construction'])) {
$construction = $original['construction'];
$urlParams .= '&construction='.urlencode($construction);
}
if (isset($original['lift'])) {
$lift = $original['lift'];
$urlParams .= '&lift='.urlencode($lift);
}
if (isset($original['floor'])) {
$floor = $original['floor'];
$urlParams .= '&floor='.urlencode($floor);
}
if (isset($original['total_floors'])) {
$totalFloors = $original['total_floors'];
$urlParams .= '&total_floors='.urlencode($totalFloors);
}
if (isset($original['garages'])) {
$garages = $original['garages'];
$urlParams .= '&garages='.urlencode($garages);
}
if (isset($original['parking_spaces'])) {
$parking_spaces = $original['parking_spaces'];
$urlParams .= '&parking_spaces='.urlencode($parking_spaces);
}
if (isset($original['balcony_area'])) {
$balcony_area = $original['balcony_area'];
$urlParams .= '&balcony_area='.urlencode($balcony_area);
}
if (isset($original['lot_area'])) {
$garden_area = $original['lot_area'];
$urlParams .= '&lot_area='.urlencode($garden_area);
}
if (isset($original['other_area'])) {
$other_area = $original['other_area'];
$urlParams .= '&other_area='.urlencode($other_area);
}
$url = 'https://profi.valuo.cz/calculation/link';
$formData->valuoLink = $url.$urlParams;
$formData->ctaNumber = $this->generateRandomValue();
$formData->state = Demand::STATE_NEW;
// result
$formData->formattedMaxPrice = number_format($result['range_price'][1], 0, ',', ' ');
$formData->formattedMaxPriceMeter = number_format($result['range_price_m2'][1], 0, ',', ' ');
$formData->formattedMinPrice = number_format($result['range_price'][0], 0, ',', ' ');
$formData->formattedMinPriceMeter = number_format($result['range_price_m2'][0], 0, ',', ' ');
$formData->formattedAvgPrice = number_format($result['avg_price'], 0, ',', ' ');
$formData->formattedAvgPriceMeter = number_format($result['avg_price_m2'], 0, ',', ' ');
$formData->formattedAsOf = (new \DateTime())->format('d. m. Y');
$entityManager->persist($formData);
$entityManager->flush();
$adminController->pdfGenerator($request, $formData->id);
$formData->raynetLeadId = $this->raynetcrmManager->putNewLead($formData);
$this->raynetcrmManager->addPdfToRaynetcrm($formData);
$entityManager->persist($formData);
$entityManager->flush();
$appKey = $_ENV['MJML_APP_KEY'];
$secretKey = $_ENV['MJML_SECRET_KEY'];
$client = new Client($appKey, $secretKey);
$mjml = $this->renderView('mail/index.mjml.twig', [
'cta' => $formData->ctaNumber,
'id' => $formData->id,
'server' => $request->getSchemeAndHttpHost(),
]);
$html = $client->render($mjml);
$this->mailHelper->newDemandMail($formData);
$this->mailHelper->calculationCTAMail($html, $formData);
unlink("generatedPdfs/pdf_$formData->email.pdf");
$nameArr = explode(' ', $formData->name);
$ecomail = new \Ecomail($_ENV['ECOMAIL_API_KEY']);
if (count($nameArr) > 1) {
$ecomail->addSubscriber(2, [
'subscriber_data' => [
'name' => $nameArr[0],
'surname' => $nameArr[1],
'email' => $formData->email,
],
'trigger_autoresponders' => true,
]);
} else {
$ecomail->addSubscriber(2, [
'subscriber_data' => [
'name' => $nameArr[0],
'email' => $formData->email,
],
'trigger_autoresponders' => true,
]);
}
$flow->reset(); // remove step data from the session
return $this->redirectToRoute('form_sent'); // redirect when done
}
}
return $this->render('calculator/index.html.twig', [
'googleApiKey' => $this->googleApiKey,
'form' => $form->createView(),
'flow' => $flow,
]);
}
#[Route('/cta/{id}', name: 'check_cta')]
public function checkCtaClicked(Request $request, string $id): Response
{
$demand = $this->demandRepository->find($id);
$action = $request->get('action');
$form = $this->createForm(MessageType::class, $demand);
$form->handleRequest($request);
if ($demand->ctaNumber === (int) $action) {
// PotvrzenĂ o kliku pro obchodnĂka
$this->mailHelper->confirmedCTAMail($demand);
$demand->state = Demand::STATE_HOT_LEAD;
$this->entityManager->persist($demand);
$this->entityManager->flush();
}
if (!$form->isSubmitted()) {
$form->get('checkName')->setData($demand->name);
$form->get('checkEmail')->setData($demand->email);
$form->get('checkPhone')->setData($demand->phone);
}
if ($form->isSubmitted()) {
if ($form->get('message')->getData() !== null) {
$demand->message = $form->get('message')->getData();
$this->entityManager->persist($demand);
$this->entityManager->flush();
}
return $this->redirectToRoute('cta_sent');
}
return $this->render('calculator/message.html.twig', [
'form' => $form->createView(),
]);
}
}