<?php
namespace App\Controller;
use App\Entity\Produit\FamilleProduit;
use App\Entity\Produit\SousFamille;
use App\Entity\Produit\SousFamilleType;
use App\Form\DemandeDevisPromoType;
use App\Repository\FiltrePersonaliseBisRepository;
use App\Repository\FiltrePersonaliseRepository;
use App\Repository\Produit\PartitionProduitRepository;
use App\Repository\Site\AlertEmailDevisRepository;
use App\Service\EmailService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
class SousFamilleController extends AbstractController
{
/**
* @var HttpClientInterface
*/
private $httpClient;
/**
* @var AlertEmailDevisRepository
*/
private $alertEmailDevisRepository;
/**
* @var EmailService
*/
private $emailService;
public function __construct(HttpClientInterface $httpClient, AlertEmailDevisRepository $alertEmailDevisRepository, EmailService $emailService)
{
$this->httpClient = $httpClient;
$this->alertEmailDevisRepository = $alertEmailDevisRepository;
$this->emailService = $emailService;
}
/**
* @Route("/produit/{familleProduit}/{sousFamille}", name="sous_famille" )
* @ParamConverter("familleProduit", options={"mapping": {"familleProduit": "seoUrl"}})
* @ParamConverter("sousFamille", options={"mapping": {"sousFamille": "seoUrl"}})
*/
public function index(FamilleProduit $familleProduit, SousFamille $sousFamille, PartitionProduitRepository $partitionProduitRepository, FiltrePersonaliseRepository $filtrePersonaliseRepository, FiltrePersonaliseBisRepository $filtrePersonaliseBisRepository, Request $request)
{
$urlPartitionProduit = $this->getParameter('app.path.product_partitions').'/';
$urlImageProduit = $this->getParameter('app.path.product_images').'/';
$urlImageSousFamille = $this->getParameter('app.path.sous_famille_produit_images').'/';
//Pour les partitions du filtre JS
$queryBuilderPartition = $partitionProduitRepository->createQueryBuilder('partition');
$partitions = $queryBuilderPartition->select('partition')
->join('partition.produits', 'produit')
->where('produit.sousFamille = :sousFamille')
->orderBy('partition.placement', "ASC")
->setParameter("sousFamille", $sousFamille)
->getQuery()
->getResult();
//Pour les filtre personnalisé (emplacement 1) du filtre JS
$queryBuilderfiltrePersonalise = $filtrePersonaliseRepository->createQueryBuilder('filtre');
$filtrePersonaliseResults = $queryBuilderfiltrePersonalise->select('filtre')
->join('filtre.produits', 'produit')
->where('produit.sousFamille = :sousFamille')
->orderBy('filtre.placement', "ASC")
->setParameter("sousFamille", $sousFamille)
->getQuery()
->getResult();
//Pour les filtre personnalisé (emplacement 1) du filtre JS
$queryBuilderfiltreBisPersonalise = $filtrePersonaliseBisRepository->createQueryBuilder('filtrebis');
$filtrePersonaliseBisResults = $queryBuilderfiltreBisPersonalise->select('filtrebis')
->join('filtrebis.produits', 'produit')
->where('produit.sousFamille = :sousFamille')
->orderBy('filtrebis.placement', "ASC")
->setParameter("sousFamille", $sousFamille)
->getQuery()
->getResult();
$form = $this->createForm(DemandeDevisPromoType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$name = $form->get('name')->getData();
$phone = $form->get('phone')->getData();
$email = $form->get('email')->getData();
$address = $form->get('address')->getData();
$city = $form->get('city')->getData();
$postalCode = $form->get('postalCode')->getData();
$message = $form->get('message')->getData();
$movinetApiUrl = $this->getParameter('movinet.url.apiRest.prod') . 'json.api?www-command=createCodePromo';
$header = [
'Content-Type' => 'application/x-www-form-urlencoded',
'responseType' => 'json',
];
$json = [
'session' => $this->getParameter('movinet.auth.session'),
'uniqcode' => $this->getParameter('movinet.auth.uniqcode'),
'enseigne' => 'sogal',
'libelle' => 'PROMO-TV-MAR-25',
'client_final' => $name,
'phone' => $phone,
'email' => $email,
'address' => $address . ' - ' . $postalCode . ' - ' . $city,
'observation' => $message
];
$response = $this->httpClient->request('POST', $movinetApiUrl, ['headers' => $header, 'body' => $json]);
$result = $response->toArray();
$codePromo = $result['code_promo'];
// Données google map
$addressForGoogle = $address."+".$postalCode."+".$city."+France";
$addressForGoogle = preg_replace('/\s+/', '+', $addressForGoogle);
$apiKey = $this->getParameter('app.apiKeyGoogleMapBO');
$url = "https://maps.googleapis.com/maps/api/geocode/json?address=".$addressForGoogle."&key=".$apiKey;
$client = HttpClient::create();
$jsonResults = $client->request('GET', $url);
$results = json_decode($jsonResults->getContent(), true);
$lat = $results["results"][0]["geometry"]["location"]["lat"];
$lng = $results["results"][0]["geometry"]["location"]["lng"];
$dataToSendApiSogal = [
"email" => $email,
"telephone"=> $phone,
"nom" => $name,
"adresse" => $address,
"cp" => $postalCode,
"ville" => $city,
"pays" => "France",
"code_promo" => $codePromo,
"libelle_promo" => 'PROMO-TV-MAR-25',
"message" => $message
];
// Données google map
!empty($lat) ? $dataToSendApiSogal["lat"] = $lat : null;
!empty($lng) ? $dataToSendApiSogal["lng"] = $lng : null;
// Envoi des données à l'API Sogal Expert
$keyApiSogal = $this->getParameter("api.sogalExpert.key");
if ($this->getParameter('kernel.environment') == "dev") {
$urlApiSogal = $this->getParameter("api.sogalExpert.url.localhost");
}else {
$urlApiSogal = $this->getParameter("api.sogalExpert.url");
}
$client = HttpClient::create(['headers' => [
'Content-Type' => 'application/json',
"responseType"=> 'json',
"Api-Token"=> $keyApiSogal
]]);
$baseUrl = $urlApiSogal."reception/devis-promo";
try {
$client->request('POST', $baseUrl, [
'json' => $dataToSendApiSogal,
]);
} catch (TransportExceptionInterface $e) {
$subject = $this->getParameter("app.name") . " - Problème lors de l'envoi de la configuration à l'api sogal-experts";
$errorArray = [
"exception message : " . $e->getMessage(),
'json : ' => json_encode($dataToSendApiSogal),
];
$admins = $this->alertEmailDevisRepository->findAll();
$adminEmails = [];
foreach ($admins as $key => $admin) {
$adminEmails[] = $admin->getEmail();
}
$this->emailService->send($adminEmails, "email/errorDevis.html.twig", $subject, ["errorArray" => $errorArray, "subject" => $subject]);
return $this->render('page/demandeDevisError.html.twig', [
"datas" => $dataToSendApiSogal,
]);
}
$this->addFlash('success', 'Votre demande a bien été envoyée');
return $this->redirectToRoute('homepage');
}
return $this->render('sous_famille/sous_famille.html.twig', [
'filtrePersonaliseResults' => $filtrePersonaliseResults,
'filtrePersonaliseBisResults' => $filtrePersonaliseBisResults,
'sousFamille' => $sousFamille,
'urlImageProduit' => $urlImageProduit,
'urlImageSousFamille' => $urlImageSousFamille,
'urlPartitionProduit' => $urlPartitionProduit,
'partitions' => $partitions,
'form' => $form->createView()
]);
}
/**
* @Route("/produit/{familleProduit}/type/{sousFamilleType}", name="sous_famille_type", priority="1" )
* @ParamConverter("familleProduit", options={"mapping": {"familleProduit": "seoUrl"}})
* @ParamConverter("sousFamilleType", options={"mapping": {"sousFamilleType": "seoUrl"}})
*/
public function indexType(FamilleProduit $familleProduit, sousFamilleType $sousFamilleType, Request $request)
{
$urlImageFamilleProduit = $this->getParameter('app.path.famille_produit_images').'/';
$urlImageSousFamille = $this->getParameter('app.path.sous_famille_produit_images').'/';
return $this->render('famille_produit/famille_produit_type.html.twig', [
'familleProduit' => $familleProduit,
'sousFamilleType' => $sousFamilleType,
'urlImageSousFamille' => $urlImageSousFamille,
'urlImageFamilleProduit' => $urlImageFamilleProduit,
]);
}
}