src/Flexy/FrontBundle/Themes/CoWorking/Controller/ResarvationController.php line 245

  1. <?php
  2. namespace App\Flexy\FrontBundle\Themes\CoWorking\Controller;
  3. use App\Flexy\FrontBundle\Repository\CategoryProductFrontRepository;
  4. use App\Flexy\FrontBundle\Themes\CoWorking\Form\Mission\RequestMissionType;
  5. use App\Flexy\FrontBundle\Themes\CoWorking\Form\Order\OrderStepInfosType;
  6. use App\Flexy\FrontBundle\Themes\CoWorking\Form\Order\OrderType;
  7. use App\Flexy\ShopBundle\Entity\Customer\Customer;
  8. use App\Flexy\ShopBundle\Entity\Customer\CustomerGroup;
  9. use App\Flexy\ShopBundle\Entity\Customer\CustomerWalletPoint;
  10. use App\Flexy\ShopBundle\Entity\Order\Order;
  11. use App\Flexy\ShopBundle\Entity\Order\OrderItem;
  12. use App\Flexy\ShopBundle\Entity\Payment\Payment;
  13. use App\Flexy\ShopBundle\Entity\Payment\PaymentMethod;
  14. use App\Flexy\ShopBundle\Entity\Shipping\CityRegion;
  15. use App\Flexy\ShopBundle\Entity\Shipping\ShippingRule;
  16. use App\Flexy\ShopBundle\Entity\Shipping\ShippingVehicleType;
  17. use App\Flexy\ShopBundle\Repository\Order\OrderRepository;
  18. use App\Flexy\ShopBundle\Repository\Payment\PaymentMethodRepository;
  19. use App\Flexy\ShopBundle\Repository\Product\MetaDataExtraRepository;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use App\Flexy\ShopBundle\Repository\Order\NotificationOrderRepository;
  22. use App\Flexy\FrontBundle\Themes\CoWorking\Service\QrcodeService;
  23. use App\Flexy\ShopBundle\Repository\Product\ProductRepository;
  24. use App\Flexy\ShopBundle\Repository\Order\OrderItemRepository;
  25. use App\Flexy\ShopBundle\Repository\Customer\CustomerRepository;
  26. use Symfony\Component\Security\Core\Security;
  27. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  28. use App\Flexy\FrontBundle\Themes\Mutaweef\Form\RegistrationCustomerFormType;
  29. use App\Flexy\ShopBundle\Repository\Order\UnavailableRoomRepository ;
  30. use DateTime;
  31. use DatePeriod;
  32. use DateInterval;
  33. use App\Flexy\ShopBundle\Repository\Product\AttributValueRepository;
  34.  
  35. use Symfony\Component\HttpFoundation\Response;
  36.  
  37. use App\Flexy\ShopBundle\Repository\CategoryProductRepository;
  38. use App\Flexy\ShopBundle\Repository\Order\EventCalendarRepository;
  39. use App\Flexy\ShopBundle\Repository\Product\CategoryProductRepository as ProductCategoryProductRepository;
  40. use App\Flexy\TransportBundle\Entity\Mission;
  41. use App\Flexy\TransportBundle\Entity\RequestMission;
  42. use Doctrine\Persistence\ManagerRegistry;
  43. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  44. use Symfony\Component\HttpFoundation\Request;
  45. use Symfony\Component\Routing\Annotation\Route;
  46. use Stripe;
  47. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  48. #[Route('/reservation')]
  49. class ResarvationController extends AbstractController
  50. {
  51.     private $security;
  52.     public function __construct(Security $security)
  53.     {
  54.         $this->security $security;
  55.     }
  56.     #[Route('/reservation-paiement'name'reservationPaiement')]
  57.     public function reservatioPaiement(PaymentMethodRepository $paymentMethodRepository,Request $request,OrderRepository $orderRepository): Response
  58.     {
  59.        
  60.         $dateStart$request->request->get('dateStart');
  61.         $dateEnd$request->request->get('dateEnd');
  62.         $Formule$request->request->get('duree');
  63.         $amountToPay$request->request->get("amountToPay");
  64.         $orderCart $request->getSession()->get("cart_items");
  65.         $demandeSpecifique$request->request->get("demandeSpecifique");
  66.         $detailFormule $request->request->get("detailDuree");
  67.         $priceMeals =  $request->request->get("priceMeals");
  68.         $meals =  $request->request->get("meals");
  69.         $nbrApproximatif $request->request->get("nbrApproximatif");
  70.         
  71.         // $paymentsMethod =  $paymentMethodRepository->findBy(array('isEnabled' => true),array('code' => 'ASC'));
  72.          $paymentsMethod =  $paymentMethodRepository->findEnabledForFront();
  73.     
  74.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/paiement.html.twig', [
  75.             "paymentsMethod"=>$paymentsMethod,
  76.             "dateStart" =>$dateStart,
  77.             "dateEnd" =>$dateEnd,
  78.             "Formule" =>$Formule,
  79.             "detailFormule" =>$detailFormule,
  80.             "orderCart"=>$orderCart,
  81.             "amountToPay"=>$amountToPay,
  82.             "priceMeals"=>$priceMeals,
  83.             "nbrApproximatif"=>$nbrApproximatif,
  84.             "meals"=>$meals,
  85.             "demandeSpecifique"=>$demandeSpecifique
  86.         ]);
  87.     }
  88.     
  89.     
  90.      #[Route('/save-meals-session'name'save_meals_session'methods: ['POST'])]
  91.     public function saveMealsSession(Request $requestSessionInterface $session): JsonResponse
  92.     {
  93.         $data json_decode($request->getContent(), true);
  94.         if ($data) {
  95.             $session->set('meals'$data);
  96.             return new JsonResponse(['status' => 'success''message' => 'Meals saved in session']);
  97.         }
  98.         return new JsonResponse(['status' => 'error''message' => 'Invalid data'], 400);
  99.     }
  100.     #[Route('/reservation-paiement-success'name'reservationSuccess')]
  101.     public function reservatioPaiementSuccess(ProductRepository $productRepository,CategoryProductFrontRepository $categoryProductFrontRepository,AttributValueRepository $attributValueRepository): Response
  102.     {
  103.     
  104.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/success-paiement.html.twig'
  105.          );
  106.     }
  107.     
  108.      #[Route('/qrcode'name'app_code')]
  109.     public function qrCodeAction(Request $request,QrcodeService $qrcodeService ): Response
  110.       {
  111.       $qrCode=null;
  112.       $qrCode $qrcodeService->qrcode('najib benkirane');
  113.        return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/qrCode/index.html.twig', [
  114.           'qrCode' =>  $qrCode,
  115.        ]);                
  116.       } 
  117.       
  118.     #[Route('/api/meeting'name'api_meeting_rooms')]
  119.     public function getProducts(ProductRepository $productRepository): JsonResponse
  120.     {
  121.         $products $productRepository->findProductMeeting();
  122.         
  123.         $data array_map(function ($product) {
  124.             return [
  125.                 'id' => $product->getId(),
  126.                  'name' => str_replace('Meeting room '''$product->getName()),
  127.             ];
  128.         }, $products);
  129.         
  130.         return $this->json($data);
  131.     } 
  132.       
  133.     
  134.      #[Route('/calendar'name'showAllResourcesCalendar'methods: ['GET'])]
  135.     public function showAllResourcesCalendar(ProductRepository $productRepository,OrderRepository $orderRepositoryOrderItemRepository $orderItemRepository,EventCalendarRepository $eventCalendarRepository): Response
  136.     {
  137.         $produits $productRepository->findBy(array('productType' => "variable"'parentCategory'=> 4));
  138.         $eventCalendar $eventCalendarRepository->findAll();
  139.        
  140.          
  141.                 // Critères de sélection des produits
  142.             $productType "variable";
  143.             $parentCategory 4;
  144.             // Critères pour les commandes (statuses)
  145.             $statuses = ['paid''paide','paid_Pa'];
  146.             // Récupérer toutes les commandes avec le statut 'paid' ou 'paide' et associées à des produits spécifiques
  147.             $orders $orderRepository->findOrdersWithStatusAndProducts($statuses$productType$parentCategory);
  148.  
  149.             // Récupérer tous les OrderItems associés à des commandes avec le statut 'paid' ou 'paide' et produits spécifiques
  150.             $orderItems $orderItemRepository->findOrderItemsByOrderStatusAndProduct($statuses$productType$parentCategory);
  151.         
  152.  
  153.         
  154.        
  155.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/calendar/index.html.twig', [
  156.              'ressources' => $produits,
  157.               'orderItems'=>$orderItems,
  158.                'eventCalendar' =>$eventCalendar,
  159.         ]);
  160.     }
  161.     
  162.     
  163.     #[Route('/calendar_office'name'showAllResourcesOfficeCalendar'methods: ['GET'])]
  164.     public function showAllResourcesOfficeCalendar(ProductRepository $productRepository,OrderRepository $orderRepositoryOrderItemRepository $orderItemRepository,ProductCategoryProductRepository $productCategoryProductRepository): Response
  165.     {
  166.        //$produits = $productRepository->findBy(array('productType' => "variable", 'parentCategory'=> 1));
  167.       
  168.        $productType 6;
  169.        $type "variable";
  170.        $parentCategory 1;
  171.         $produits $productRepository->findProductsOfficeOnePost();
  172.         $produitsTwo $productRepository->findProductsOfficeTwoPost();
  173.         $produitsFour $productRepository->findProductsOfficeFourPost();
  174.         $produitsColoc $productRepository->findProductsOfficeColoc();
  175.         
  176.          
  177.                 // Critères de sélection des produits
  178.             $productType "variable";
  179.             $parentCategory 1;
  180.             // Critères pour les commandes (statuses)
  181.             $statuses = ['paid''paide','paid_Pa'];
  182.             // Récupérer toutes les commandes avec le statut 'paid' ou 'paide' et associées à des produits spécifiques
  183.             $orders $orderRepository->findOrdersWithStatusAndProducts($statuses$productType$parentCategory);
  184.  
  185.             // Récupérer tous les OrderItems associés à des commandes avec le statut 'paid' ou 'paide' et produits spécifiques
  186.             //$orderItems = $orderItemRepository->findOrderItemsByOrderStatusAndProduct($statuses, $productType, $parentCategory);
  187.             
  188.             $orderItems $orderItemRepository->findOrderItemsByOrderStatusAndProductOnePost($statuses$productType$parentCategory);  
  189.             $orderItemstwoposte $orderItemRepository->findOrderItemsByOrderStatusAndProducTwo($statuses$productType$parentCategory);
  190.             $orderItemsforposte $orderItemRepository->findOrderItemsByOrderStatusAndProducfor($statuses$productType$parentCategory);
  191.             $orderItemscoloc $orderItemRepository->findOrderItemsByOrderStatusAndProductColoc($statuses$productType$parentCategory);
  192.              
  193.            // dd($orderItems);
  194.         
  195.        
  196.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/calendar/office.html.twig', [
  197.              'ressources' => $produits,
  198.              'ressourcesTwo' => $produitsTwo,
  199.              'ressourcesFour' => $produitsFour,
  200.              'ressourcesColoc' => $produitsColoc,
  201.               'orderItems'=>$orderItems,
  202.              'orderItemstwoposte'=>$orderItemstwoposte,
  203.              'orderItemsforposte'=> $orderItemsforposte,
  204.              'orderItemscoloc'=> $orderItemscoloc,
  205.         ]);
  206.     }
  207.     #[Route('/reservation-step-meeting/{id}'name'reservationMeetingstep1')]
  208.     public function reservatioStepOneMeeting($id,ProductRepository $productRepositorySessionInterface $session,CategoryProductFrontRepository $categoryProductFrontRepository,AttributValueRepository $attributValueRepository): Response
  209.     {
  210.     
  211.         //$session->remove('cart_items');
  212.         $product $productRepository->findBy(array('id' => $id));
  213.      
  214.          $name $product[0]->getName();
  215.          $dispotionU =  $product[0]->getOldPrice();
  216.          $dispotionTheatre =  $product[0]->getQuantity();
  217.          $dispotionEcole =  $product[0]->getCapacity();
  218.       
  219.         // $products = $productRepository->findByParentCategory([1]);
  220.        $attributValues $attributValueRepository->findBy(array('product' => $product));
  221.        $services $productRepository->findBy(array('productType' => "service"'parentCategory'=> $product[0]->getParentCategory()->getId()),array('shortDescription' => 'ASC'));
  222.        $servicesCommuns $productRepository->findBy(array('productType' => "service"'parentCategory'=> null),array('shortDescription' => 'ASC'));
  223.       
  224.        
  225.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-meeting-step.html.twig', [
  226.           
  227.             "attributValues"=>$attributValues,
  228.             "services"=>$services,
  229.             "name" => $name,
  230.             "servicesCommuns"=>$servicesCommuns,
  231.             "product"=>$product[0]->getId(),
  232.             "dispotionU"=>$dispotionU,
  233.             "dispotionTheatre"=>$dispotionTheatre,
  234.             "dispotionEcole"=> $dispotionEcole
  235.             
  236.         
  237.         ]);
  238.     }
  239.     #[Route('/reservation-step-freework/{id}'name'reservationFreeworkstep1')]
  240.     public function reservatioStepOneFreework($id,ProductRepository $productRepository,SessionInterface $session,CategoryProductFrontRepository $categoryProductFrontRepository,AttributValueRepository $attributValueRepository): Response
  241.     {
  242.     
  243.        // $session->remove('cart_items');
  244.     
  245.          $product $productRepository->findBy(array('id' => $id));
  246.      
  247.          $name $product[0]->getName();
  248.       
  249.         // $products = $productRepository->findByParentCategory([1]);
  250.        $attributValues $attributValueRepository->findBy(array('product' => $product));
  251.        $services $productRepository->findBy(array('productType' => "service"'parentCategory'=> $product[0]->getParentCategory()->getId()),array('shortDescription' => 'ASC'));
  252.        $servicesCommuns $productRepository->findBy(array('productType' => "service"'parentCategory'=> null),array('shortDescription' => 'ASC'));
  253.       
  254.        
  255.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-freework-step.html.twig', [
  256.             "attributValues"=>$attributValues,
  257.             "services"=>$services,
  258.             "name" => $name,
  259.             "servicesCommuns"=>$servicesCommuns,
  260.             "product"=>$product[0]->getId()
  261.             
  262.         
  263.         ]);
  264.     }
  265.     #[Route('/reservation-step/{id}'name'reservationbureauxstep1')]
  266.     public function reservatioStepOneBureaux($id,Request $requestProductRepository $productRepository,ProductCategoryProductRepository $productCategoryProductRepository,AttributValueRepository $attributValueRepository): Response
  267.     {
  268.     
  269.     
  270.         //$products = $productRepository->findByParentCategory([1]);
  271.         /*$orderCart = $request->getSession()->get("cart_items");
  272.         dd($orderCart);*/
  273.         //$session->remove('cart_items');
  274.         
  275.         $products $productRepository->findBy(array('parentCategory' => 1));
  276.         $subcategoryProduct $productCategoryProductRepository->findBy(array('id' => $id));
  277.         
  278.         $attributValues =  $attributValueRepository->findProductAttri($id,1);
  279.          
  280.         
  281.         $services $productRepository->findBy(array('productType' => "service"'parentCategory'=> 1),array('shortDescription' => 'ASC'));
  282.         
  283.         $servicesCommuns $productRepository->findBy(array('productType' => "service"'parentCategory'=> null),array('shortDescription' => 'ASC'));
  284.        
  285.         
  286.         
  287.       
  288.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-offices-step.html.twig', [
  289.             'products' => $products,
  290.             "attributValues"=>$attributValues,
  291.             'subcategory'=> $id,
  292.             'subcategoryName'=> $subcategoryProduct[0]->getName(),
  293.             "services"=>$services,
  294.             "servicesCommuns"=>$servicesCommuns,
  295.         
  296.         ]);
  297.  
  298.     }
  299.     #[Route('/reservation-step2-office/{id}'name'reservationstep2office')]
  300.     public function reservatioStepTwo($id,CustomerRepository $customerRepository ,SessionInterface $session AuthenticationUtils $authenticationUtils,Request $request,OrderRepository $orderRepositoryOrderItemRepository $orderItemRepository,ProductRepository $productRepository,CategoryProductFrontRepository $categoryProductFrontRepository): Response
  301.     {
  302.          
  303.           $orderCart $request->getSession()->get("cart_items");
  304.   
  305.         $firstItem reset($orderCart);
  306.          $priceFirstItem $firstItem['price'];
  307.       if($priceFirstItem == ) {
  308.         if (!$this->isGranted('ROLE_CUSTOMER')) {
  309.                  
  310.                //hire le lien de redirection vers le lien
  311.               $session->set('redirect_to'$request->getUri());
  312.               return $this->redirectToRoute('login_register', ['message' => 'warning']);
  313.   
  314.           }else{
  315.             $user $this->security->getUser();
  316.             $customer $customerRepository->findBy(array('user' => $user->getId()));
  317.             $orderCart $request->getSession()->get("cart_items");
  318.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-office-long-duration.html.twig', [       
  319.              'customer' => $customer,
  320.              'cart' => $orderCart 
  321.         ]);
  322.     }
  323.       }else{
  324.             
  325.     
  326.         $products $productRepository->findBy(array('parentCategory' => 1));
  327.         $days= (int)$request->query->get('paramFormule');
  328.         //hire le lien de redirection vers le lien
  329.         $session->set('redirect_to'$request->getUri());
  330.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-step2-office.html.twig', [
  331.             'products' => $products,
  332.             'subcategory'=> $id,
  333.             "days" =>$days,
  334.             
  335.          ]);
  336.         }
  337.     }
  338.     #[Route('/reservation-meeting-next/{id}'name'reservationMeetingNext')]
  339.     public function reservatioMeetingNext($id,ProductRepository $productRepository,MetaDataExtraRepository $metaDataExtraRepository,Request $requestSessionInterface $session,CategoryProductFrontRepository $categoryProductFrontRepository,AttributValueRepository $attributValueRepository): Response
  340.     {
  341.     
  342.     // $session->remove('cart_items');
  343.        $days= (int)$request->query->get('paramFormule');
  344.        $nbr $request->query->get('amp;proxim');
  345.        $horaire$request->query->get('amp;Horai12') ;
  346.        $time =  $request->query->get('amp;time') ;
  347.        $device =  $request->query->get('amp;dIS34') ;
  348.      // dd($device);
  349.      
  350.         $metaDataExtraBreakfast $metaDataExtraRepository->findBy(array('type'=>"Pause Matin"));
  351.        $metaDataExtraLunch $metaDataExtraRepository->findBy(array('type'=>"Déjeuner"));
  352.        $metaDataExtraAfternoonBreak $metaDataExtraRepository->findBy(array('type'=>"Pause Après-midi"));
  353.        
  354.           
  355.           
  356.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-meeting-next.html.twig',[
  357.             "days" =>$days,  
  358.             "Plage" => $horaire,
  359.             "nbrApproximatif" =>$nbr,
  360.             "time" =>$time,
  361.             "device" =>$device
  362.             "breakfast"=>$metaDataExtraBreakfast,
  363.             "lunch"=>$metaDataExtraLunch,
  364.             "afternoonBreak"=>$metaDataExtraAfternoonBreak
  365.             "id"=>$id
  366.         ]);
  367.     }
  368.     #[Route('/reservation-step2/{id}'name'reservationstep2')]
  369.     public function reservatioStepTwoBureaux($id,EventCalendarRepository $eventCalendarRepository,CustomerRepository $customerRepository,UnavailableRoomRepository $unavailableRoomRepositoryRequest $request,SessionInterface $session ,OrderRepository $orderRepositoryOrderItemRepository $orderItemRepository,ProductRepository $productRepository,CategoryProductFrontRepository $categoryProductFrontRepository): Response
  370.     {
  371.         
  372.         
  373.          if ($request->query->has('paramFormule')) {
  374.             $paramFormule $request->query->get('paramFormule');
  375.             
  376.             if (is_numeric($paramFormule)) {
  377.                 $days = (int)$paramFormule;
  378.             }
  379.         }
  380.         
  381.         if ($request->query->has('days')) {
  382.             $days $request->query->get('days');
  383.         }
  384.         
  385.            
  386.          /*$days= (int)$request->query->get('paramFormule');
  387.          $horaire= $request->query->get('amp;Horai12') ;
  388.          $time =  $request->query->get('amp;time') ;
  389.          $device =  $request->query->get('amp;dIS34') ;*/
  390.          
  391.          $horaire$request->query->get('Plage') ;
  392.          $time =  $request->query->get('time') ;
  393.          $device =  $request->query->get('device') ;
  394.          $amount_extra =  $request->query->get('amount_extra');
  395.          $nbrApproximatif =  $request->query->get('nbrApproximatif');
  396.          
  397.         
  398.               $orderCart $request->getSession()->get("cart_items");
  399.   
  400.                $firstItem reset($orderCart);
  401.                $priceFirstItem $firstItem['price'];
  402.                
  403.  
  404.   
  405.         if (!$this->isGranted('ROLE_CUSTOMER')) {
  406.                  
  407.             //hire le lien de redirection vers le lien
  408.            $session->set('redirect_to'$request->getUri());
  409.            return $this->redirectToRoute('login_register', ['message' => 'warning']);
  410.       
  411.            }else{
  412.         if($priceFirstItem == ) {
  413.             $user $this->security->getUser();
  414.             $customer $customerRepository->findBy(array('user' => $user->getId()));
  415.             $orderCart $request->getSession()->get("cart_items");
  416.    
  417.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-office-long-duration.html.twig', [       
  418.              'customer' => $customer,
  419.              'cart' => $orderCart 
  420.         ]);
  421.             
  422.          } else{
  423.          $products $productRepository->findBy(['id' => $id]);
  424.             $currentProduct $products[0];
  425.             $currentRoomName $currentProduct->getName();
  426.             $currentRoomId $currentProduct->getId(); 
  427.              
  428.             $currentRoomName str_replace("Meeting room """$currentRoomName);
  429.             // Initialiser la disponibilité des salles et les dates non disponibles
  430.            
  431.             $roomAvailability = [
  432.                 'Univers' => true,
  433.                 'Newton' => true,
  434.                 'Einstein' => true,
  435.             ];
  436.             
  437.             $unavailableDates = [
  438.                 'Univers' => [],
  439.                 'Newton' => [],
  440.                 'Einstein' => [],
  441.             ];
  442.           
  443.             
  444.             
  445.            // Récupérer les produits Newton et Einstein
  446.             /*$universProduct = $productRepository->findOneBy(['name' => 'Meeting room Univers']);
  447.             $newtonProduct = $productRepository->findOneBy(['name' => 'Meeting room Newton']);
  448.             $einsteinProduct = $productRepository->findOneBy(['name' => 'Meeting room Einstein']);*/
  449.             $universProducts $productRepository->findByNameLike('Univers');
  450.             $newtonProducts $productRepository->findByNameLike('Newton');
  451.             $einsteinProducts $productRepository->findByNameLike('Einstein');
  452.             
  453.             // Supposons qu'il n'y a qu'un produit pour chaque salle
  454.             $universProduct $universProducts[0];
  455.             $newtonProduct $newtonProducts[0];
  456.             $einsteinProduct $einsteinProducts[0];
  457.                              
  458.                 if ($currentRoomName === 'Univers') {
  459.                     // Chercher les éléments de commande pour Newton et Einstein
  460.                     $newtonOrderItems $orderItemRepository->findByProduct([$newtonProduct->getId()]);
  461.                     $einsteinOrderItems $orderItemRepository->findByProduct([$einsteinProduct->getId()]);
  462.                     // Combiner les éléments de commande
  463.                     $orderItems array_merge($newtonOrderItems$einsteinOrderItems);
  464.                     //dd($orderItems);
  465.                 } elseif ($currentRoomName === 'Newton' || $currentRoomName === 'Einstein') {
  466.                     // Chercher les éléments de commande pour Univers
  467.                     $universOrderItems $orderItemRepository->findByProduct([$universProduct->getId()]);
  468.                     // Utiliser les éléments de commande de Univers
  469.                     $orderItems $universOrderItems;
  470.                     //dd($orderItems);
  471.                 } else {
  472.                     $orderItems = [];
  473.                 }
  474.  
  475.             
  476.             foreach ($orderItems as $orderItem) {
  477.                 $orders $orderRepository->findOrdersByOrderItem($orderItem->getId());
  478.             
  479.                 foreach ($orders as $order) {
  480.                     
  481.                     $orderRoomName $orderItem->getProduct()->getName();
  482.                     $orderRoomName str_replace("Meeting room """$orderRoomName);
  483.                     $orderStart $order->getStartProcessingAt();
  484.                     $orderEnd $order->getStartDeliveryAt();
  485.                     
  486.                     if ($orderRoomName === 'Univers') {
  487.                         // Si 'Univers' est réservé, 'Newton' et 'Einstein' sont bloqués
  488.                         $unavailableDates['Newton'][] = ['start' => $orderStart'end' => $orderEnd];
  489.                         $unavailableDates['Einstein'][] = ['start' => $orderStart'end' => $orderEnd];
  490.                         $roomAvailability['Newton'] = false;
  491.                         $roomAvailability['Einstein'] = false;
  492.                     } elseif ($orderRoomName === 'Newton') {
  493.                         // Si 'Newton' est réservé, 'Univers' est bloqué
  494.                         $unavailableDates['Univers'][] = ['start' => $orderStart'end' => $orderEnd];
  495.                         $roomAvailability['Univers'] = false;
  496.                     } elseif ($orderRoomName === 'Einstein') {
  497.                         // Si 'Einstein' est réservé, 'Univers' est bloqué
  498.                         $unavailableDates['Univers'][] = ['start' => $orderStart'end' => $orderEnd];
  499.                         $roomAvailability['Univers'] = false;
  500.                     }
  501.                 }
  502.             }
  503.             //dd($unavailableDates);
  504.             
  505.             // Vérifier la disponibilité pour la salle courante
  506.             $canReserve true;
  507.             if ($currentRoomName === 'Univers') {
  508.                 if (!$roomAvailability['Univers']) {
  509.                     $canReserve false;
  510.                 }
  511.             } elseif ($currentRoomName === 'Newton') {
  512.                 if (!$roomAvailability['Newton'] || !$roomAvailability['Univers']) {
  513.                     $canReserve false;
  514.                 }
  515.             } elseif ($currentRoomName === 'Einstein') {
  516.                 if (!$roomAvailability['Einstein'] || !$roomAvailability['Univers']) {
  517.                     $canReserve false;
  518.                 }
  519.             }
  520.             
  521.             $unavailableStartDates = [];
  522.                 foreach ($unavailableDates as $key => $dates) {
  523.                     foreach ($dates as $dateRange) {
  524.                         if (isset($dateRange['start'])) {
  525.                             //$startDates[$key][] = $dateRange['start']->format('Y-m-d');
  526.                             $unavailableStartDates[] = $dateRange['start']->format('Y-m-d');
  527.                             
  528.                         }
  529.                     }
  530.                 }
  531.                 //dd($unavailableStartDates);
  532.         
  533.             $unavailableDateWorkers = [];
  534.             $UnavailableDateWork $unavailableRoomRepository->UnavailableRoomNameLike($currentRoomName);
  535.              
  536.              
  537.             foreach ($UnavailableDateWork as $key => $date) {
  538.                 $startDate $date->getStartDate();  
  539.                 $endDate $date->getEndDate();      
  540.             
  541.                 // Créer une période à partir des deux dates
  542.                 $period = new \DatePeriod(
  543.                     $startDate,
  544.                     new \DateInterval('P1D'), // Intervalle d'un jour
  545.                     $endDate->modify('0 day'// $endDate->modify('+1 day')   Inclure le dernier jour
  546.                 );
  547.             
  548.                 // Ajouter chaque date dans le tableau
  549.                 foreach ($period as $dateBetween) {
  550.                     $unavailableDateWorkers[] = $dateBetween->format('Y-m-d'); 
  551.                 }
  552.             }
  553.             
  554.             
  555.               $unavailableDateCalendars = [];
  556.               $unavailableDateCalendar $eventCalendarRepository->findBy(['product_id' => $currentRoomId]);
  557.                 foreach ($unavailableDateCalendar as $key => $date) {
  558.                 $startDate $date->getDateStart();  
  559.                 $endDate $date->getEndDate();      
  560.             
  561.                 // Créer une période à partir des deux dates
  562.                 $period = new \DatePeriod(
  563.                     $startDate,
  564.                     new \DateInterval('P1D'), // Intervalle d'un jour
  565.                     $endDate->modify('0 day')// Inclure le dernier jour
  566.                 );
  567.             
  568.                 // Ajouter chaque date dans le tableau
  569.                 foreach ($period as $dateBetween) {
  570.                     $unavailableDateCalendars[] = $dateBetween->format('Y-m-d'); 
  571.                 }
  572.             }
  573.           
  574.         
  575.  
  576.            
  577.      
  578.         $orderItems $orderItemRepository->findByProduct([$id]);
  579.        
  580.     
  581.         $relatedOrdersStart = [];
  582.         $relatedOrdersEnd = [];
  583.         $allDates = [];
  584.         $deadlineBeforeTwetyforheursStart=[];
  585.         $deadlineBeforeTwetyforheursEnd=[];
  586.         $deadlineBeforeTwetyforheurs=[];
  587.         
  588.          
  589.       foreach ($orderItems as $orderItem) {
  590.             $orders $orderRepository->findOrdersByOrderItem($orderItem->getId());
  591.        
  592.             // Ajoutez les commandes associées à cet élément de commande à l'ensemble des commandes.
  593.             foreach ($orders as $order) {
  594.                 if ($order->getStatus() === 'paid' || $order->getStatus() === 'paide' || $order->getStatus() ==='paid_Pa') {
  595.                     $relatedOrdersStart[] = $order->getStartProcessingAt();
  596.                     $relatedOrdersEnd[] = $order->getStartDeliveryAt();
  597.                 }
  598.                $createdAt $order->getCreatedAt();
  599.                 $now = new \DateTime();
  600.                 $diffInSeconds $now->getTimestamp() - $createdAt->getTimestamp();
  601.                   // La commande a été créée il y a moins de 24h
  602.                 if ($diffInSeconds <= 86400 && $diffInSeconds >= 0) {
  603.                     //$deadlineBeforeTwetyforheurs[] = $createdAt->format('Y-m-d'); //H:i:s
  604.                     $deadlineBeforeTwetyforheursStart[] = $order->getStartProcessingAt(); 
  605.                     $deadlineBeforeTwetyforheursEnd[] = $order->getStartDeliveryAt();
  606.                 }  
  607.                 
  608.             }
  609.             
  610.              if (!empty($deadlineBeforeTwetyforheursStart)) {
  611.                 $relatedOrdersStart array_merge($relatedOrdersStart$deadlineBeforeTwetyforheursStart);
  612.             }
  613.             
  614.             if (!empty($deadlineBeforeTwetyforheursEnd)) {
  615.                 $relatedOrdersEnd array_merge($relatedOrdersEnd$deadlineBeforeTwetyforheursEnd);
  616.             }
  617.         }
  618.         
  619.                   
  620.          foreach (array_map(null$relatedOrdersStart$relatedOrdersEnd) as $dateRange) {
  621.             [$start$end] = $dateRange;
  622.         
  623.             if ($start instanceof DateTime) {
  624.                 $startDate = clone $start;
  625.             } else {
  626.                 $startDate = new DateTime($start);
  627.             }
  628.         
  629.             if ($end instanceof DateTime) {
  630.                 $endDate = clone $end;
  631.             } else {
  632.                 $endDate = new DateTime($end);
  633.             }
  634.         
  635.             if ($startDate !== null && $endDate !== null) {
  636.                 // Ajouter startDate
  637.                 $allDates[$startDate->format('Y-m-d H:i:s')] = true;
  638.         
  639.                 // Jours entre les deux
  640.                 $currentDate = clone $startDate;
  641.                 $currentDate->modify('+1 day');
  642.         
  643.                 while ($currentDate $endDate) {
  644.                     $allDates[$currentDate->format('Y-m-d') . ' 00:00:00'] = true;
  645.                     $currentDate->modify('+1 day');
  646.                 }
  647.         
  648.                 // Ajouter endDate
  649.                 $allDates[$endDate->format('Y-m-d H:i:s')] = true;
  650.             }
  651.         }
  652.         
  653.         // Finaliser sous forme de tableau indexé
  654.           $allDates array_keys($allDates);
  655.        
  656.         
  657.         /*foreach (array_map(null, $relatedOrdersStart, $relatedOrdersEnd) as $dateRange) {
  658.             [$start, $end] = $dateRange;
  659.             $startDate =  $start;
  660.            
  661.             if ($end instanceof DateTime) {
  662.                 $endDate = $end;
  663.             } else {
  664.                 $endDate = new DateTime($end);
  665.             }
  666.             if($startDate != null ){
  667.             $currentDate = clone $startDate;
  668.         
  669.             while ($currentDate <= $endDate) {
  670.                 $allDates[] = $currentDate->format('Y-m-d');
  671.                 $currentDate->modify('+1 day');
  672.             }
  673.           
  674.         }
  675.         foreach ($relatedOrdersEnd as $endDate) {
  676.              
  677.             if ($endDate instanceof DateTime) {
  678.                 $allDates[] = $endDate->format('Y-m-d');
  679.             } else {
  680.                 $allDates[] = (new DateTime($endDate))->format('Y-m-d');
  681.             }
  682.         }
  683.     }*/
  684.        
  685.        
  686.        
  687.         //hire le lien de redirection vers le lien
  688.         $session->set('redirect_to'$request->getUri());
  689.         $nameOffice $products[0]->getName();
  690.       
  691.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-step2.html.twig',[
  692.             "nameOffice" => $nameOffice,
  693.             "days" =>$days,
  694.             "allDates"=> $allDates,
  695.             "Plage" => $horaire,
  696.             "nbrApproximatif"=>$nbrApproximatif,
  697.             "time" =>$time,
  698.             "device" =>$device,
  699.             "amount_extra"=> $amount_extra,
  700.             'roomAvailability' => $roomAvailability,
  701.             'unavailableDates' => $unavailableDates,
  702.             'unavailableStartDates'=> json_encode($unavailableStartDates),
  703.             'unavailableDateWorkers' => $unavailableDateWorkers,
  704.             'unavailableDateCalendars'=> $unavailableDateCalendars,
  705.              
  706.             
  707.         ]);
  708.     }
  709.    }
  710.             
  711.           
  712.             
  713.           
  714.           
  715.     }
  716.     #[Route('/reservation-step3'name'reservationstep3 _recap')]
  717.     public function reservatioSteptree(Request $request,CustomerRepository $customerRepositoryProductRepository $productRepository,ProductCategoryProductRepository $productCategoryProductRepository,AttributValueRepository $attributValueRepository): Response
  718.     {
  719.  
  720.                  if (!$this->isGranted('ROLE_CUSTOMER')) {
  721.             
  722.             /*  $redirectTo = $session->get('redirect_to');
  723.               dd($redirectTo);*/
  724.   
  725.               return $this->redirectToRoute('login_register', ['message' => 'warning']);
  726.   
  727.           }else{
  728.        
  729.             $formule = (int) $request->request->get('formule_cart');
  730.             $timeStartInput =  $request->request->get('timeStartInput');
  731.             $timeEndInput =  $request->request->get('timeEndInput');
  732.             $plagehoraire=  $request->request->get('plage_horaire');
  733.             $device=  $request->request->get('device');
  734.             $demandeSpecifique $request->request->get('demande_specifique');
  735.             $amount_extra $request->request->get('amount_extra');
  736.             $nbrApproximatif $request->request->get('nbrApproximatif');
  737.            
  738.            
  739.           
  740.             // Vérification de la plage horaire
  741.             if (!empty($plagehoraire)) {
  742.                 // Si la plage horaire est "après-midi"
  743.                 if ($plagehoraire == 'apres-midi') {
  744.                     // Définir les heures de début et de fin pour l'après-midi
  745.                     $timeStartInput '13:00';
  746.                     $timeEndInput '18:00';
  747.                 } 
  748.                 // Si la plage horaire est "matin"
  749.                 elseif ($plagehoraire == 'matin') {
  750.                     // Définir les heures de début et de fin pour le matin
  751.                     $timeStartInput '08:00';
  752.                     $timeEndInput '13:00';
  753.                 }
  754.             }
  755.             
  756.           
  757.             if($amount_extra == "" ){
  758.                 $amount_extra ;
  759.              }
  760.         
  761.             $nombreHeures 0;
  762.            
  763.              
  764.             $orderCart $request->getSession()->get("cart_items");
  765.     if ($timeStartInput !== null && $timeEndInput !== null && empty($plagehoraire) ) {
  766.         $timeStartInput $timeStartInput ':00';
  767.         $timeEndInput =  $timeEndInput ':00';
  768.         
  769.                 // Convertir les heures en objets DateTime
  770.                 $startTime = new \DateTime($timeStartInput);
  771.                 $endTime = new \DateTime($timeEndInput);
  772.         
  773.                 // Calculer la différence entre les heures
  774.                 $difference $endTime->diff($startTime);
  775.                // Obtenir le nombre total d'heures
  776.                 // Heures + minutes
  777.                 $heures $difference->h;
  778.                 $minutes $difference->i;
  779.                 // Convertir minutes en fraction d’heure
  780.                 
  781.               $nombreHeures $heures + ($minutes 60);
  782.                // dd($nombreHeures);
  783.         
  784.              
  785.                $firstItem reset($orderCart);
  786.                // Récupérer le prix actuel de l'élément
  787.                //$price = $firstItem['price'];
  788.                
  789.                 $basePrice $firstItem['price_unit'] ?? $firstItem['price']; // On garde le prix de base
  790.                if (!isset($firstItem['price_unit'])) {
  791.                 $firstItem['price_unit'] = $firstItem['price'];
  792.                 $basePrice $firstItem['price'];
  793.             }
  794.             // Sauvegarder le prix unitaire si pas encore fait
  795.                     if (!isset($firstItem['price_unit'])) {
  796.                         $firstItem['price_unit'] = $firstItem['price'];
  797.                         $basePrice $firstItem['price'];
  798.                     }
  799.                    
  800.             
  801.                             // Calcul du nouveau prix
  802.               /* $updatedPrice = round($price * $nombreHeures, 2); // avec arrondi 2 décimales  commit by najib
  803.              $firstItem['price'] = $updatedPrice;
  804.              $orderCart[key($orderCart)] = $firstItem;
  805.              $request->getSession()->set("cart_items", $orderCart);*/
  806.              $updatedPrice round($basePrice $nombreHeures2);
  807.              $firstItem['price'] = $updatedPrice;
  808.              $orderCart[key($orderCart)] = $firstItem;
  809.              $request->getSession()->set("cart_items"$orderCart);
  810.             } 
  811.             
  812.              if(empty($plagehoraire) && $timeStartInput == null && $timeEndInput== null ){
  813.                      $timeStartInput "08:00" ;
  814.                      $timeEndInput"18:00";
  815.                 } 
  816.             
  817.        
  818.           $dates explode(" to "$request->get('date_resvation'));
  819.           $date_start $dates[0].' '.$timeStartInput// Première date
  820.           $date_end $dates[1].' '.$timeEndInput// Deuxième date
  821.           $user $this->security->getUser();
  822.           
  823.           $user $customerRepository->findBy(array('user' => $user->getId()));
  824.           //$orderCart = $request->getSession()->get("cart_items");
  825.            
  826.           // ... après le calcul de $nombreHeures
  827.             $heuresInt floor($nombreHeures);
  828.             $minutes round(($nombreHeures $heuresInt) * 60);
  829.             $affichageHeure sprintf('%dh%02d'$heuresInt$minutes); // ex: 2h30
  830.    
  831.       
  832.         
  833.   
  834.         
  835.     
  836.         
  837.         return $this->render('@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/reservation-step3.html.twig',[
  838.             "date_start" => $date_start,
  839.             "date_end" => $date_end,
  840.             "customer"=>$user,
  841.             "cart" =>$orderCart,
  842.             "formule"=>$formule ,
  843.             "nbrApproximatif" => $nbrApproximatif,
  844.             "timeStartInput" =>$timeStartInput,
  845.             "timeEndInput" =>  $timeEndInput,
  846.             "plagehoraire" =>  $plagehoraire,
  847.             "device" =>  $device,
  848.              "heure" =>$affichageHeure,
  849.             "demandeSpecifique"=>$demandeSpecifique,
  850.             "amount_extra"=>$amount_extra
  851.             
  852.             
  853.         ]);
  854.            }
  855.     }
  856.     #[Route('/notifications/count'name'admin_notifications_count')]
  857.     public function countUnread(NotificationOrderRepository $repo): JsonResponse
  858.     {
  859.         $count $repo->count(['isRead' => false]);
  860.         return $this->json(['count' => $count]);
  861.     }
  862.     
  863.     #[Route('/ajax-service-price'name'ajaxServicePrice'methods: ['POST',"GET"])]
  864.     public function ajaxServicePrice(Request $requestManagerRegistry $doctrine,ProductRepository $productRepository,AttributValueRepository $attributValueRepository){
  865.         $price;
  866.         $serviceId=  (int) $request->query->get("serviceId");
  867.         //$attribut = $attributValueRepository->findBy(array('product' => $serviceId));
  868.     
  869.       
  870.         $attribut $request->query->get("formule");
  871.         $products $productRepository->findBy(array('id' => $serviceId));
  872.     
  873.         $attributPrice = array(); // Tableau pour stocker les attributs et les prix
  874.         foreach($products[0]->getAttributValues() as $prod){
  875.            /* $attributPrice[] = array(
  876.                 'attribut' => $prod->getAttribut()->getName(),
  877.                 'price' => $prod->getPrice()
  878.             ); // Ajoutez chaque attribut et prix au tableau
  879.          */
  880.             if ($prod->getAttribut()->getName() === $attribut) {
  881.                 $price $prod->getPrice();
  882.                 }
  883.          }
  884.         if (isset($price)) {
  885.              $price 
  886.         } else {
  887.             $price ;
  888.             //dd("prix non trouvé"); 
  889.         }
  890.         
  891.         return new Response($price);
  892.     }
  893.     #[Route('/ajax-formule-reservation'name'ajaxFormuleResersation'methods: ['POST',"GET"])]
  894.     public function ajaxFormuleResersation(Request $requestManagerRegistry $doctrine,ProductRepository $productRepository,AttributValueRepository $attributValueRepository){
  895.        
  896.        $office =  (int) $request->query->get("office");
  897.  
  898.        $products $productRepository->findBy(array('id' => $office));
  899.        $attributValues $attributValueRepository->findBy(array('product' => $products));
  900.        $services $productRepository->findBy(array('productType' => "service"'parentCategory'=> $products[0]->getParentCategory()->getId()));
  901.        
  902.        $servicesCommuns $productRepository->findBy(array('productType' => "service"'parentCategory'=> null));
  903.       
  904.        
  905.      
  906.        return $this->render("@Flexy/FrontBundle/Themes/CoWorking/templates/reservation/_completReservation.html.twig",[
  907.         "attributValues"=>$attributValues,
  908.         "services"=>$services,
  909.         "servicesCommuns"=>$servicesCommuns,
  910.         "product"=> $products[0]->getId()
  911.         
  912.     ]);
  913.        
  914.     }
  915.     #[Route('/ajax-preview-mission'name'ajaxPreviewMission'methods: ['POST',"GET"])]
  916.     public function ajaxPreviewMission(Request $requestManagerRegistry $doctrine){
  917.         
  918.         $formMissions $request->request->all()["missions"];
  919.         
  920.         $distance 0;
  921.         $fees 0;
  922.         $result = [
  923.             "fees"=>0
  924.         ];
  925.         $order = new Order();
  926.         
  927.         //Step 1 = Find ShippingMethod
  928.         $customerGroup $doctrine->getRepository(CustomerGroup::class)->findOneBy(["code"=>"main"]);
  929.         $vehicleType $doctrine->getRepository(ShippingVehicleType::class)->find((int)$request->request->get("vehicleType"));
  930.         
  931.         if(!$customerGroup){
  932.             return $this->json($result);
  933.         }
  934.         
  935.         foreach($formMissions as $key => $singleFromMission){
  936.             if($key == and !$request->request->get("scheduleReturn")){
  937.                 break;
  938.             }
  939.             
  940.             
  941.              //Step 2 = Find cityregions
  942.         $collectCityRegion $doctrine->getRepository(CityRegion::class)->find((int)$singleFromMission["collectCityRegion"]);
  943.         $shippingCityRegion $doctrine->getRepository(CityRegion::class)->find((int)$singleFromMission["shippingCityRegion"]);
  944.         
  945.         if(!$collectCityRegion or !$shippingCityRegion){
  946.             return $this->json($result);
  947.         }
  948.         
  949.         
  950.         //Step 3 = Calculate distance by API
  951.         
  952.        
  953.         
  954.         $curl curl_init();
  955.         
  956.         
  957.         curl_setopt_array($curl, [
  958.             CURLOPT_URL => "https://api.traveltimeapp.com/v4/routes?type=driving&origin_lat=".$collectCityRegion->getLat()."&origin_lng=".$collectCityRegion->getLng()."&destination_lat=".$shippingCityRegion->getLat()."&destination_lng=".$shippingCityRegion->getLng()."&arrival_time=2022-12-02T13:00:00Z&app_id=199062fd&api_key=f81385ce24441a6aebbd791643600522",
  959.             CURLOPT_RETURNTRANSFER => true,
  960.             CURLOPT_ENCODING => '',
  961.             CURLOPT_MAXREDIRS => 10,
  962.             CURLOPT_TIMEOUT => 30,
  963.             CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  964.             CURLOPT_CUSTOMREQUEST => 'GET',
  965.             //CURLOPT_POSTFIELDS => $jsonString,
  966.             CURLOPT_HTTPHEADER => [
  967.                 'Content-Type: application/json',
  968.             ],
  969.         
  970.         ]);
  971.         
  972.         $response curl_exec($curl);
  973.         $err curl_error($curl);
  974.         
  975.         curl_close($curl);
  976.         
  977.         if ($err) {
  978.             
  979.             return $this->json($result);
  980.         } else {
  981.             $results json_decode($responsenull512JSON_THROW_ON_ERROR);
  982.             $singleDistance 0;
  983.             foreach($results->results[0]->locations[0]->properties[0]->route->parts as $singlePart){
  984.                 $singleDistance $singleDistance $singlePart->distance ;
  985.                 $singleDistance $singleDistance;
  986.                 $distance = ($distance $singleDistance) ;
  987.             }
  988.             
  989.              
  990.              
  991.             
  992.         }
  993.         
  994.         $singleDistance $singleDistance/1000;
  995.         $shippingRules $doctrine->getRepository(ShippingRule::class)->findByCustomerGroupAndVehicleType($customerGroup,$vehicleType,$singleDistance );
  996.         
  997.         $singleFees 0;
  998.         
  999.         if((is_countable($shippingRules) ? count($shippingRules) : 0) > 0){
  1000.             $singleFees $shippingRules[0]->getValueCalculation() *  $singleDistance;
  1001.             if($singleFees <  $shippingRules[0]->getShippingMethod()->getPrice()){
  1002.                 $singleFees $shippingRules[0]->getShippingMethod()->getPrice();
  1003.             }
  1004.             $fees $fees $singleFees;
  1005.             
  1006.         }
  1007.         
  1008.         $customer $doctrine->getManager()->getRepository(Customer::class)->findOneBy(["user"=>$this->getUser()]);
  1009.         
  1010.         dd($customer);
  1011.         if( $customer ){
  1012.             $order->setCustomer($customer);
  1013.             $order->setCity($customer->getCity());
  1014.         }
  1015.         
  1016.         $mission = new Mission();
  1017.         $mission->setNbrAdults((int)$singleFromMission["nbrAdults"]);
  1018.         $mission->setNbrChildrens((int)$singleFromMission["nbrChildrens"]);
  1019.         $mission->setNbrBags((int)$singleFromMission["nbrChildrens"]);
  1020.         $datePickup = new \DateTime($this->dateToMySQL($singleFromMission["datePickup"]));
  1021.         $timePickup = new \DateTime($this->dateToMySQL($singleFromMission["datePickup"])." "$singleFromMission["timePickup"]);
  1022.         
  1023.         $mission->setDatePickup($datePickup);
  1024.         $mission->setTimePickup($timePickup);
  1025.         if($key == 0){
  1026.             $startProcessingAt = new \DateTime($datePickup->format("Y-m-d")." ".$timePickup->format("H:i"));
  1027.             $order->setStartProcessingAt($startProcessingAt);
  1028.         }
  1029.         
  1030.         $orderItem = new OrderItem();
  1031.         $orderItem->setDescription("Traget :".$collectCityRegion." <=> ".$shippingCityRegion)." (".$shippingRules[0]->getShippingMethod()->getShippingVehicleType().") ";
  1032.         $orderItem->setPrice($singleFees);
  1033.         $orderItem->setQuantity(1);
  1034.         $shipmentItem $orderItem->getShipmentItem();
  1035.         $shipmentItem->setQuantity((int)$singleFromMission["nbrAdults"]+(int)$singleFromMission["nbrChildrens"]);
  1036.         $shipmentItem->setOrderItem($orderItem);
  1037.         $shipmentItem->setCollectCityRegion($collectCityRegion);
  1038.         $shipmentItem->setShippingCityRegion($shippingCityRegion);
  1039.         if($customer){
  1040.             if($customer->getCityRegion()){
  1041.                 switch ($key) {
  1042.                     case 0:
  1043.                         $shipmentItem->setCollectAddress($customer->getAddress());
  1044.                         break;
  1045.                     case 1:
  1046.                         $shipmentItem->setShippingAddress($customer->getAddress());
  1047.                         break;
  1048.                 }
  1049.             }
  1050.         }
  1051.         $order->addOrderItem($orderItem);
  1052.         $order->setShippingMethod($shippingRules[0]->getShippingMethod());
  1053.         
  1054.         $mission->setShipmentItem($shipmentItem);
  1055.         $mission->setRelatedOrder($order);
  1056.         $doctrine->getManager()->persist($mission);
  1057.         
  1058.         
  1059.         
  1060.         }
  1061.         
  1062.         
  1063.         
  1064.         $fees number_format($fees2);
  1065.         
  1066.         //Step 4 = Look for prices
  1067.         $result = [
  1068.             "fees"=>$fees
  1069.         ];
  1070.         
  1071.         
  1072.         //Step 5 Final = Persist the booking in DB
  1073.        // 
  1074.         if((boolean)$request->request->get("isBookingValid") == true){
  1075.             
  1076.             //dd($order);
  1077.             $doctrine->getManager()->persist($order);
  1078.             $doctrine->getManager()->flush();
  1079.             
  1080.             return $this->redirectToRoute("completeBookingForm",["id"=>$order->getId()]);
  1081.         }
  1082.         
  1083.         return  $this->json($result);
  1084.   
  1085.     
  1086.     }
  1087.     #[Route('/new-office/{id}'name'newReservation'methods: ['POST',"GET"])]
  1088.     public function newMission(Request $requestManagerRegistry $doctrine){
  1089.         return $this->render('@Flexy/FrontBundle/Themes/'.ucfirst($this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName()).'/templates/missions/_completReservationEtap1.html.twig');
  1090.          
  1091.         // $mission = new Mission();
  1092.         //$form = $this->createForm(MissionType::class, $mission);
  1093.         //$missions = $doctrine->getManager()->getRepository(Mission::class)->findBy(["relatedOrder"=>$order]);
  1094.             
  1095.         //$form->handleRequest($request);
  1096.        
  1097.        /* if ($form->isSubmitted() && $form->isValid()) {
  1098.             
  1099.             $order = new Order();
  1100.             $orderItem = new OrderItem();
  1101.             $orderItem->setDescription($mission->getDescription());
  1102.             $orderItem->setQuantity(1);
  1103.             $orderItem->setPrice(0);
  1104.             
  1105.             $order->addOrderItem($orderItem);
  1106.           
  1107.             $mission->setRelatedOrder($order);
  1108.             $doctrine->getManager()->persist($orderItem);
  1109.             $doctrine->getManager()->persist($mission);
  1110.             $doctrine->getManager()->persist($order);
  1111.             
  1112.             $doctrine->getManager()->flush();
  1113.             return $this->redirectToRoute("completeBookingFormStep2",["id"=>$order->getId()]);
  1114.         }
  1115.         $shippingVehicleTypes = $doctrine->getManager()->getRepository(ShippingVehicleType::class)->findAll();
  1116.         $cityRegions = $doctrine->getManager()->getRepository(CityRegion::class)->findBy(["isDefault"=>true],['name'=>"ASC"]);
  1117.         $customer = $doctrine->getManager()->getRepository(Customer::class)->findOneBy(["user"=>$this->getUser()]);
  1118.         return $this->render('@Flexy/FrontBundle/Themes/'.ucfirst($this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName()).'/templates/missions/formBooking.html.twig',[
  1119.             "shippingVehicleTypes"=>$shippingVehicleTypes,
  1120.             "cityRegions"=>$cityRegions,
  1121.             "customer"=>$customer,
  1122.             "form"=>$form->createView()
  1123.         ]);*/
  1124.     }
  1125.     #[Route('/completeBookingForm/{id}'name'completeBookingForm'methods: ['POST',"GET"])]
  1126.     public function completeBookingForm(Order $order,Request $requestManagerRegistry $doctrine){
  1127.         $editForm $this->createForm(OrderType::class, $order);
  1128.         $missions $doctrine->getManager()->getRepository(Mission::class)->findBy(["relatedOrder"=>$order]);
  1129.             
  1130.         $editForm->handleRequest($request);
  1131.     
  1132.         if ($editForm->isSubmitted() && $editForm->isValid()) {
  1133.            
  1134.             if($this->isGranted("ROLE_CUSTOMER")){
  1135.                 $customer $doctrine->getManager()->getRepository(Customer::class)->findOneBy(["user"=>$this->getUser()]);
  1136.                 if(!$order->getFirstName()){
  1137.                     $order->setFirstName($customer->getFirstName());
  1138.                 }
  1139.                 if(!$order->getLastName()){
  1140.                     $order->setLastName($customer->getLastName());
  1141.                 }
  1142.                 if(!$order->getEmail()){
  1143.                     $order->setEmail($customer->getEmail());
  1144.                 }
  1145.                 if(!$order->getTel()){
  1146.                     $order->setTel($customer->getPhone());
  1147.                 }
  1148.                 if(!$order->getAddress()){
  1149.                     $order->setAddress($customer->getAddress());
  1150.                 }
  1151.                 if(!$order->getCompanyName()){
  1152.                     $order->setCompanyName($customer->getCompanyName());
  1153.                 }
  1154.                 if(!$order->getPostcode()){
  1155.                     $order->setPostcode($customer->getPostcode());
  1156.                 }
  1157.                 if(!$order->getCity()){
  1158.                     $order->setCity($customer->getCity());
  1159.                 }
  1160.             }
  1161.             
  1162.             $doctrine->getManager()->persist($order);
  1163.             $doctrine->getManager()->flush();
  1164.             return $this->redirectToRoute('completeBookingFormStep3',["id"=>$order->getId()]);
  1165.         }
  1166.     
  1167.         return $this->render('@Flexy/FrontBundle/Themes/'.$this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName().'/templates/missions/_completBookingForm.html.twig', [
  1168.             'editForm' => $editForm->createView(),
  1169.             "order"=>$order,
  1170.             "missions"=>$missions
  1171.         ]);
  1172.          
  1173.     }
  1174.     #[Route('/completeBookingFormStep3/{id}'name'completeBookingFormStep3'methods: ['POST',"GET"])]
  1175.     public function completeBookingFormStep3(Order $order,Request $requestManagerRegistry $doctrine){
  1176.         
  1177.         $editForm $this->createForm(OrderStepInfosType::class, $order);
  1178.         $missions $doctrine->getManager()->getRepository(Mission::class)->findBy(["relatedOrder"=>$order]);
  1179.             
  1180.         $editForm->handleRequest($request);
  1181.     
  1182.         if ($editForm->isSubmitted() && $editForm->isValid()) {
  1183.            
  1184.             
  1185.             
  1186.             
  1187.             $doctrine->getManager()->persist($order);
  1188.             $doctrine->getManager()->flush();
  1189.             return $this->redirectToRoute('completeBookingFormStep4',["id"=>$order->getId()]);
  1190.         }
  1191.     
  1192.         return $this->render('@Flexy/FrontBundle/Themes/'.$this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName().'/templates/missions/_completBookingFormStep3.html.twig', [
  1193.             'editForm' => $editForm->createView(),
  1194.             "order"=>$order,
  1195.             "missions"=>$missions
  1196.         ]);
  1197.          
  1198.     }
  1199.     #[Route('/completeBookingFormStep4/{id}'name'completeBookingFormStep4'methods: ['POST',"GET"])]
  1200.     public function completeBookingFormStep4(Order $order,Request $requestManagerRegistry $doctrine){
  1201.         
  1202.        
  1203.         $missions $doctrine->getManager()->getRepository(Mission::class)->findBy(["relatedOrder"=>$order]);
  1204.             
  1205.         
  1206.     
  1207.         $stripe = new \Stripe\StripeClient('sk_live_sfq6AEgIbGXeiXpYRHFAm8Dm');
  1208.     
  1209.     
  1210.     $currentDate = new \DateTime();
  1211.     
  1212.     $amountToPay=$order->getTotalAmount()-(int)$order->getWalletPaymentAmount();
  1213.     
  1214.     if(!$order->getTokenStripe()){
  1215.         $paymentIntent $stripe->paymentIntents->create(
  1216.             [
  1217.                 'amount' => $amountToPay 100 ,
  1218.                 'currency' => 'eur',
  1219.                 //"source" => $request->request->get('stripeToken'),
  1220.                 "description" => "Réservation le ".$currentDate->format("d/m/Y H:i"),
  1221.                 'payment_method_types' => [
  1222.                     //'bancontact',
  1223.                     'card',
  1224.                     //'eps',
  1225.                     //'giropay',
  1226.                     //'ideal',
  1227.                     //'p24',
  1228.                     //'sepa_debit',
  1229.                     //'sofort',
  1230.                   ],
  1231.             ]
  1232.                 );
  1233.                  //dd($paymentIntent->id);
  1234.             $order->setTokenStripe($paymentIntent->id);
  1235.             $em =$doctrine->getManager();
  1236.             $em->persist($order);
  1237.             $em->flush();
  1238.     }else{
  1239.         $paymentIntent $stripe->paymentIntents->retrieve(
  1240.             $order->getTokenStripe(),
  1241.             []
  1242.           );
  1243.         if($paymentIntent->status == "succeeded"){
  1244.             return $this->redirectToRoute("bookingSuccess");
  1245.         }else{
  1246.             $paymentIntent $stripe->paymentIntents->update(
  1247.                 $order->getTokenStripe(),
  1248.                 [
  1249.                     'amount' => $amountToPay 100 ,
  1250.                     'currency' => 'eur',
  1251.                     
  1252.                 ]
  1253.               );
  1254.         }
  1255.         
  1256.        
  1257.           
  1258.     }
  1259.     
  1260.     $client_secret $paymentIntent->client_secret;
  1261.     
  1262.         return $this->render('@Flexy/FrontBundle/Themes/'.$this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName().'/templates/missions/_completBookingFormStep4.html.twig', [
  1263.             "order"=>$order,
  1264.             "missions"=>$missions,
  1265.             "CLIENT_SECRET"=>$client_secret,
  1266.         ]);
  1267.          
  1268.     }
  1269.     #[Route('/booking-success'name'bookingSuccess'methods: ['POST',"GET"])]
  1270.     public function bookingSuccess(Request $requestOrderRepository $orderRepository,ManagerRegistry $doctrine){
  1271.         $tokenTripe $request->query->all()["payment_intent"];
  1272.        
  1273.         $order $orderRepository->findOneBy(["tokenStripe"=>$tokenTripe]);
  1274.         
  1275.         if($order and $request->query->all()["redirect_status"] == "succeeded"){
  1276.             $paymentMethod $doctrine->getManager()->getRepository(PaymentMethod::class)->findOneBy(["code"=>"stripe"]);
  1277.             $order->setStatus("waiting");
  1278.             $order->setPayedAmount($order->getTotalAmount());
  1279.             $order->setPaymentMethod($paymentMethod);
  1280.             if($order->getWalletPaymentAmount()>0){
  1281.                 $customerWalletPoints = new CustomerWalletPoint();
  1282.                 $customerWalletPoints->setPoints(-$order->getWalletPaymentAmount());
  1283.                 $customerWalletPoints->setCustomer($order->getCustomer());
  1284.                 $customerWalletPoints->setOriginOrder($order);
  1285.                 $customerWalletPoints->setNote("Paiement par wallet en combinaison avec stripe");
  1286.                 $doctrine->getManager()->persist($customerWalletPoints);
  1287.             }else{
  1288.                 $customerWalletPoints = new CustomerWalletPoint();
  1289.                 $valuePoints 3;
  1290.                 $currency $this->container->get("twig")->getGlobals()["settings"]->get()->getCurrency();
  1291.                 $customerWalletPoints->setPoints(3);
  1292.                 $customerWalletPoints->setCustomer($order->getCustomer());
  1293.                 $customerWalletPoints->setOriginOrder($order);
  1294.                 $customerWalletPoints->setNote("Vous avez gagné ".$valuePoints." ".$currency." suite à votre réservation (Ref facture : ".$order->getOrderNumber().")");
  1295.                 $doctrine->getManager()->persist($customerWalletPoints);
  1296.             }
  1297.             $doctrine->getManager()->persist($order);
  1298.             $doctrine->getManager()->flush();
  1299.             return $this->render("@Flexy/FrontBundle/Themes/".$this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName()."/checkout/success.html.twig",["order"=>$order]);
  1300.         }
  1301.         
  1302.         return $this->redirectToRoute("front_home");
  1303.         
  1304.     }
  1305.     #[Route('/preview-mail/{id}'name'previewMail'methods: ['POST',"GET"])]
  1306.     public function previewMail(Order $order,Request $requestOrderRepository $orderRepository,ManagerRegistry $doctrine){
  1307.         return $this->render("@Flexy/ShopBundle/templates/mails/order/success.html.twig",["order"=>$order]);
  1308.     }
  1309.         #[Route('/request-mission'name'requestMission'methods: ['POST',"GET"])]
  1310.     public function requestMission(Request $requestOrderRepository $orderRepository,ManagerRegistry $doctrine){
  1311.         $requestMission = new RequestMission();
  1312.         $form $this->createForm(RequestMissionType::class,$requestMission);
  1313.         $form->handleRequest($request);
  1314.         if($form->isSubmitted() and $form->isValid()){
  1315.             $doctrine->getManager()->persist($requestMission);
  1316.             $doctrine->getManager()->flush();
  1317.             return $this->redirectToRoute("front_home");
  1318.         }
  1319.         return $this->render("@Flexy/FrontBundle/Themes/".$this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName()."/missions/request.html.twig",["form"=>$form->createView()]);
  1320.     }
  1321.     // AJAX 
  1322.     #[Route('/ajax-get-time'name'ajaxGetTime'methods: ['POST',"GET"])]
  1323.     public function ajaxGetTime(Request $request){
  1324.         $currentDateTime = new \DateTime();
  1325.         $tomorrowDateTime = new \DateTime("tomorrow");
  1326.         $startDateTime = new \DateTime("tomorrow +1 hours");
  1327.         
  1328.         if($startDateTime->format("i") != "00"){
  1329.             $startDateTime->modify("+1 hours ".$startDateTime->format("H:00"));
  1330.         }
  1331.         
  1332.         if($request->query->get("selectedDate")){
  1333.             $correctFormatDate $this->dateToMySQL($request->query->get("selectedDate"));
  1334.             
  1335.             //dd($request->query->get("selectedDate"));
  1336.             $startDateTime->modify($correctFormatDate);
  1337.             
  1338.         }
  1339.         if((int)$startDateTime->format("ymd") > (int)$tomorrowDateTime->format("ymd")){
  1340.             $startDateTime->modify("00:00");
  1341.         }else{
  1342.             $startDateTime->modify($currentDateTime->format("H").":00");
  1343.             $startDateTime->modify("+1 hours");
  1344.             //dd($startDateTime);
  1345.         }
  1346.         //dd($startDateTime);
  1347.         $optionsHTML "";
  1348.         //$startDateTime->modify(" +5 minutes");
  1349.         while($startDateTime->format("H:i") != "23:56" ){
  1350.             
  1351.             $optionsHTML $optionsHTML'<option value="'.$startDateTime->format("H:i").'" >'.$startDateTime->format("H:i").'</option>';
  1352.             if($startDateTime->format("H:i")=="23:55"){
  1353.                 $startDateTime->modify(" +1 minutes");
  1354.             }else{
  1355.                 $startDateTime->modify(" +5 minutes");
  1356.             }
  1357.             
  1358.         }
  1359.         return $this->render('@Flexy/FrontBundle/Themes/'.$this->container->get('twig')->getGlobals()["settings"]->get()->getAssetFolderName().'/templates/ajax/ajaxGetTime.html.twig',
  1360.             ["optionsHTML"=>$optionsHTML]
  1361.         );
  1362.     }
  1363.     private function dateToMySQL($date){
  1364.         $tabDate explode('/' , (string) $date);
  1365.         $date  $tabDate[2].'-'.$tabDate[1].'-'.$tabDate[0];
  1366.         $date date'Y-m-d'strtotime($date) );
  1367.         return $date;
  1368.     }
  1369. }