<?php
namespace App\Controller;
use App\Entity\Contact;
use App\Entity\Produit\Produit;
use App\Entity\Address\BillingAddress;
use App\Form\CatalogueType;
use App\Form\ContactType;
use App\Form\Order\OrderDevisFormType;
use App\Form\Order\OrderFormType;
use App\Manager\OrderManager;
use App\Services\ContactService as Service;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Order\{Order, OrderLineOption, OrderLineColor, OrderLineGarantie, OrderLineFinition};
use App\Form\Cart\AddToCartType;
use App\Manager\CartManager;
use App\Repository\{CouleurRepository, CategorieRepository, OptionRepository, GarantieRepository, FinitionRepository};
use App\Repository\ProduitRelatedVersionRepository;
use App\Repository\ProduitRepository;
use App\Services\NoteCheckService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class FicheProduitController extends AbstractController
{
/**
* @Route("/fiche-produit/{id_categorie}-categorie/{id_product}", name="app_fiche_produit")
*/
public function index(Request $request, TranslatorInterface $translator, OrderManager $orderManager, ProduitRepository $produitRepository, CategorieRepository $categorieRepository, Service $service, ProduitRelatedVersionRepository $produitRelatedVersionRepository, NoteCheckService $noteCheckService, CartManager $cartManager, OptionRepository $optionRepository, GarantieRepository $garantieRepository, CouleurRepository $couleurRepository, FinitionRepository $finitionRepository, $id_product=null, $id_categorie=null): Response
{
$session = $request->getSession();
$session->remove("ficheProductDataSelect");
$product = $produitRepository->find($id_product);
$nbrImageProduct = count($product->getImageProduits());
$restShowInModal = ($nbrImageProduct - 4) > 0 ? ($nbrImageProduct - 4) : 0;
$allParentCategorie = $categorieRepository->findByNoChild();
$currentParentCategorie = $categorieRepository->find($id_categorie);
$relation = $product->getProduitRelatedVersions();
$caracteristiques = null;
if ($relation){
$caracteristiques = $relation[0];
}
// $productFinitions = $produitRelatedVersionRepository->findProductRelatedVersionsWithFinitions($id_product);
$productFinitions = $produitRepository->findAllFinitionProductOfOneProduct($id_product);
// dd($productFinitions);
$note = $noteCheckService->getNote($product->getAvisClients());
$form = $this->createForm(AddToCartType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$datas = $request->request->all();
$item = $form->getData();
$item->setProduit($product);
if ($item->getQuantity()==0 || $item->getQuantity()==null){
$item->setQuantity(1);
}
if(array_key_exists('options', $datas)){
$options = $datas['options'];
foreach($options as $opt_id){
if(!empty($opt_id)){
$opt = $optionRepository->findOneById($opt_id);
$item_opt = new OrderLineOption();
$item_opt->setPriceTtc($opt->getPriceTtc());
$item_opt->setPriceHt($opt->getPriceHt());
$item_opt->setDescription($opt->getName());
$item_opt->setOpt($opt);
$item->addOrderLineOption($item_opt);
}
}
}
if(array_key_exists('garantie', $datas)){
$garanties = $datas['garantie'];
foreach($garanties as $garantie_id){
if(!empty($garantie_id)){
$garantie = $garantieRepository->findOneById($garantie_id);
$item_garantie = new OrderLineGarantie();
$item_garantie->setPriceTtc($garantie->getPriceTtc());
$item_garantie->setPriceHt($garantie->getPriceHt());
$item_garantie->setDescription($garantie->getName());
$item_garantie->setGarantie($garantie);
$item->addOrderLineGaranty($item_garantie);
}
}
}
$color = $request->request->get('color');
if(!empty($color)){
$color = $couleurRepository->findOneById($color);
$item_color = new OrderLineColor();
$item_color->setColor($color);
$item_color->setPriceTtc($color->getPriceTtc());
$item_color->setPriceHt($color->getPriceHt());
$item_color->setDescription($color->getName());
$item->setOrderLineColor($item_color);
}
$finition = $request->request->get('finition');
if(!empty($finition)){
$finition = $finitionRepository->findOneById($finition);
$item_finition = new OrderLineFinition();
$item_finition->setFinition($finition);
$item_finition->setPriceTtc($finition->getPriceTtc());
$item_finition->setPriceHt($finition->getPriceHt());
$item_finition->setDescription($finition->getName());
$item->setOrderLineFinition($item_finition);
}
$cart = $cartManager->getCurrentCart();
$cart
->addOrderLine($item)
->setUpdatedAt(new \DateTime());
$cartManager->save($cart);
return $this->redirectToRoute('app.cart.list');
}
$order = new Order();
$formOrder = $this->createForm(OrderDevisFormType::class, $order);
$formOrder->handleRequest($request);
if ($formOrder->isSubmitted() && $formOrder->isValid()) {
$billingAddress = new BillingAddress();
$shippingAddress = $order->getShippingAddress();
if(!empty($shippingAddress)){
$billingAddress->setFirstname($shippingAddress->getFirstname());
$billingAddress->setLastname1($shippingAddress->getLastname1());
$billingAddress->setLastname2($shippingAddress->getLastname2());
$billingAddress->setStreet($shippingAddress->getStreet());
$billingAddress->setCity($shippingAddress->getCity());
$billingAddress->setState($shippingAddress->getState());
$billingAddress->setPostalCode($shippingAddress->getPostalCode());
$billingAddress->setCountry($shippingAddress->getCountry());
$billingAddress->setPhone($shippingAddress->getPhone());
$order->setBillingAddress($billingAddress);
}
$order->setCreatedAt(new \DateTime());
$order->setUpdatedAt(new \DateTime());
$order->setTypeCommand(1);
$order->setState(2);
$datas = $request->request->all();
$orderManager->generateNumberDevis($order);
$orderManager->generateSlug($order);
$orderManager->saveOrder($order, $datas);
$this->addFlash("success", $translator->trans("change_save"));
return $this->redirectToRoute('fiche_produit_show_devis', ["slug"=>$order->getSlug()]);
}
$contact = new Contact();
$contactForm = $this->createForm(CatalogueType::class, $contact);
$contactForm->handleRequest($request);
if ($contactForm->isSubmitted() && $contactForm->isValid()) {
try {
$contact->setCreatedAt(new \DateTime());
$contact->setType(Contact::TYPE_CATALOGUE);
$contact->setMessage("Télécharger le catalogue");
$em = $this->getDoctrine()->getManager();
$em->persist($contact);
$em->flush();
$service->notifyResponsible($contact, $this->getParameter('contact_form.subject'), $this->getParameter('app_mailer_name'));
$this->addFlash(
'success',
'Message envoyé !'
);
} catch (\Throwable $th) {
$this->addFlash(
'warning',
'Erreur d\'envoie !'
);
}
}
return $this->render('fiche_produit/index.html.twig', [
'controller_name' => 'FicheProduitController',
'produit' => $product,
'restCountShowInModal' => $restShowInModal,
'categori_parent' => $allParentCategorie,
'categorie_parent_current' => $id_categorie,
'current_parent_categorie' => $currentParentCategorie,
'caracteristique_init' => $caracteristiques,
'product_finitions' => $productFinitions,
'note_product' => $note,
'form' => $form->createView(),
'formMobile' => $form->createView(),
'form_order' => $formOrder->createView(),
'catalogueForm' => $contactForm->createView(),
'catalogueMobileForm' => $contactForm->createView(),
]);
}
/**
* @Route("/fiche-produit/portail-{id_categorie}-{name_categorie}/{id_produit}", name="app_fiche_produit_portail_luxe")
*/
public function portailLuxe(CategorieRepository $categorieRepository, ProduitRepository $produitRepository, $id_categorie=null, $name_categorie=null, $id_produit=null): Response
{
$product = $produitRepository->find($id_produit);
$allParentCategorie = $categorieRepository->findByNoChild();
$currentParentCategorie = $categorieRepository->find($id_categorie);
return $this->render('fiche_produit/portail/index.html.twig', [
'controller_name' => 'FicheProduitController',
'produit' => $product,
'categori_parent' => $allParentCategorie,
'categorie_parent_current' => $id_categorie,
'current_parent_categorie' => $currentParentCategorie,
]);
}
/**
* @Route("/fiche-produit/produit-{id_produit}/get-by-finition/{id_finition}", name="app_fiche_produit_get_by_finition")
*/
public function getCaracteristiqueOfProductByFinition(Request $request, ProduitRepository $produitRepository, ProduitRelatedVersionRepository $produitRelatedVersionRepository,$id_produit=null, $id_finition=null){
// $caracteristic = $produitRelatedVersionRepository->findBy(["produit"=>$id_produit,"finition"=>$id_finition]);
$caracteristic = $produitRepository->find(["id"=>$id_produit])->getProduitRelatedVersions()->toArray();
$caracter = [];
$session = $request->getSession();
$filtersFicheProduct = $session->get('ficheProductDataSelect', []);
if (count($filtersFicheProduct) > 0){
for ($i=0; $i<count($filtersFicheProduct); $i++){
if ($filtersFicheProduct[$i]["idProduit"] == $id_produit){
if ($caracteristic[0]){
$filtersFicheProduct[$i]["idCaracteristique"] = $caracteristic[0]->getId();
$filtersFicheProduct[$i]["idFinition"] = $id_finition;
}
}
}
$session->set("ficheProductDataSelect", $filtersFicheProduct);
}else{
if ($caracteristic[0]){
$newCaracteristiques = [
[
"idProduit" => $id_produit,
"idCaracteristique" => $caracteristic[0]->getId(),
"idFinition" => $id_finition
]
];
$session->set("ficheProductDataSelect", $newCaracteristiques);
}
}
if ($caracteristic[0]){
$caracter["placeAssise"] = $caracteristic[0]->getPlacesAssis()." places assises";
$caracter["placeAllonge"] = $caracteristic[0]->getPlacesAllonge()." places allongées ";
$caracter["cascade"] = $caracteristic[0]->getCascadeLed() ? "Cascade Inox" : "Aucun";
$caracter["nuage"] = $caracteristic[0]->isNuageLedSole() ? "Nuage au sol" : "Aucun";
$caracter["ledPeripherique"] = $caracteristic[0]->getLedChromaPeripherique() ? $caracteristic[0]->getLedChromaPeripherique()." Leds de périphérie" : "Aucune Leds de périphérie";
//$caracter["coque"] = $caracteristic[0]->getCoque();
}
return new JsonResponse($caracter);
}
/**
* @Route("/fiche-produit/produit-{id_produit}/get-by-color/{id_color}", name="app_fiche_produit_get_by_color")
*/
public function getSelectOptionColor(Request $request, $id_produit=null, $id_color=null){
$session = $request->getSession();
$filtersFicheProduct = $session->get('ficheProductDataSelect', []);
// dd($filtersFicheProduct);
if (count($filtersFicheProduct) > 0){
for ($i=0; $i<count($filtersFicheProduct); $i++){
if ($filtersFicheProduct[$i]["idProduit"] == $id_produit){
$filtersFicheProduct[$i]["idColor"] = $id_color;
}
}
$session->set("ficheProductDataSelect", $filtersFicheProduct);
}else{
$newColor = [
[
"idProduit"=>$id_produit,
"idColor" => $id_color
]
];
$session->set("ficheProductDataSelect", $newColor);
}
// dd($session->get('ficheProductDataSelect', []));
return new JsonResponse([]);
}
/**
* @Route("/fiche-produit/produit/get-by-color/type-color/show-image", name="app_fiche_produit_get_by_color_show_images")
*/
public function getImageBySelectedColor(Request $request, ProduitRepository $produitRepository){
$idProduit = $request->request->get("idProduit");
$prod = $produitRepository->find($idProduit);
$idColor = $request->request->get("idColor");
$typeColor = $request->request->get("typeColor");
$isMobil = $request->request->get("isMobil");
$allImagesProduct = $prod->getImageProduits()->toArray();
$initImageId = $allImagesProduct[0]->getId();
$showInitImage = false;
$priceShow = 0;
for ($i=0; $i<count($allImagesProduct); $i++){
$prodImage = $allImagesProduct[$i];
if ($prodImage->getColor()->getId() == $idColor && $prodImage->getColor()->getType() == $typeColor){
if ($prodImage->getId() == $initImageId){
// $showInitImage = true; si on ajout l'image principale en premier.
$showInitImage = false;
}
$priceShow = $prodImage->getColor()->getPriceTtc();
}
}
$priceProduct = ($prod->getPriceTtc() ? $prod->getPriceTtc() : 0) + ($priceShow ? $priceShow : 0);
if ($isMobil==1){
$templateImage = $this->renderView("fiche_produit/_partial/_produitMobil.html.twig", ["produit"=>$prod, "idColor"=>$idColor, "typeColor"=>$typeColor, "showInitImage"=>$showInitImage, "priceProduct"=>number_format($priceProduct, 2, '.', '')]);
}else{
$templateImage = $this->renderView("fiche_produit/_partial/_produit.html.twig", ["produit"=>$prod, "idColor"=>$idColor, "typeColor"=>$typeColor, "showInitImage"=>$showInitImage, "priceProduct"=>number_format($priceProduct, 2, '.', '')]);
}
return new Response($templateImage);
}
}