src/Controller/Front/FrontBasketController.php line 157

Open in your IDE?
  1. <?php
  2. namespace Acme\SudcmsBundle\Controller\Front;
  3. use Acme\SudcmsBundle\Entity\ApiSettings;
  4. use Acme\SudcmsBundle\Entity\Cure;
  5. use Acme\SudcmsBundle\Entity\CureOrder;
  6. use Acme\SudcmsBundle\Entity\CureProductOrder;
  7. use Acme\SudcmsBundle\Entity\CureProductSoinsOrder;
  8. use Acme\SudcmsBundle\Entity\EcoCustomers;
  9. use Acme\SudcmsBundle\Entity\EcoDiscountOrders;
  10. use Acme\SudcmsBundle\Entity\EcoOrders;
  11. use Acme\SudcmsBundle\Entity\EcoPlanning;
  12. use Acme\SudcmsBundle\Entity\EcoProductsBundle;
  13. use Acme\SudcmsBundle\Entity\EcoProductsReferences;
  14. use Acme\SudcmsBundle\Entity\EcoSettings;
  15. use Acme\SudcmsBundle\Entity\EcoShippingCarriers;
  16. use Acme\SudcmsBundle\Entity\Site;
  17. use Acme\SudcmsBundle\Entity\SiteCoordonnees;
  18. use Acme\SudcmsBundle\EventListener\BaseListener;
  19. use Acme\SudcmsBundle\Repository\EcoCustomersAddressesRepository;
  20. use Acme\SudcmsBundle\Repository\EcoCustomersRepository;
  21. use Acme\SudcmsBundle\Repository\EcoDiscountRepository;
  22. use Acme\SudcmsBundle\Repository\EcoOrdersProductsRepository;
  23. use Acme\SudcmsBundle\Repository\EcoOrdersRepository;
  24. use Acme\SudcmsBundle\Repository\SiteCoordonneesRepository;
  25. use Acme\SudcmsBundle\Service\ApiLogsService;
  26. use Acme\SudcmsBundle\Service\ApiService;
  27. use Acme\SudcmsBundle\Service\Ecommerce\BasketService;
  28. use Acme\SudcmsBundle\Service\Ecommerce\DiscountService;
  29. use Acme\SudcmsBundle\Service\Ecommerce\LoyaltySystemService;
  30. use Acme\SudcmsBundle\Service\Ecommerce\OrderService;
  31. use Acme\SudcmsBundle\Service\Ecommerce\PayboxService;
  32. use Acme\SudcmsBundle\Service\MailerService;
  33. use Acme\SudcmsBundle\Service\OtideaUtils;
  34. use DateTime;
  35. use DateTimeZone;
  36. use Doctrine\ORM\EntityManagerInterface;
  37. use Exception;
  38. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  39. use Symfony\Component\HttpFoundation\JsonResponse;
  40. use Symfony\Component\HttpFoundation\RedirectResponse;
  41. use Symfony\Component\HttpFoundation\Request;
  42. use Symfony\Component\HttpFoundation\Response;
  43. use Symfony\Component\HttpFoundation\Session\Session;
  44. use Symfony\Component\Routing\Annotation\Route;
  45. use Throwable;
  46. use const SITE_NAME;
  47. #[Route(path'/panier')]
  48. class FrontBasketController extends AbstractController
  49. {
  50.     private $session;
  51.     private $orderService;
  52.     private $entityManager;
  53.     private $mailerService;
  54.     private $otideaUtils;
  55.     private $loyaltySystem;
  56.     private $basketService;
  57.     private $baseListener;
  58.     private $repoDiscount;
  59.     private $discountService;
  60.     private $currentUserConnected;
  61.     private ApiService $apiService;
  62.     private ApiLogsService $logsService;
  63.     private Site $site;
  64.     private array $recipients = [
  65.         [
  66.             "nom" => "Otidea",
  67.             "prenom" => "Debug",
  68.             "email" => "mail@otidea.com",
  69.             "type" => 'to'
  70.         ]
  71.     ];
  72.     private ?ApiSettings $apiSettings;
  73.     public function __construct(
  74.         EntityManagerInterface $entityManager,
  75.         OrderService $orderService,
  76.         MailerService $mailerService,
  77.         OtideaUtils $otideaUtils,
  78.         LoyaltySystemService $loyaltySystem,
  79.         BasketService $basketService,
  80.         BaseListener $baseListener,
  81.         EcoDiscountRepository $repoDiscount,
  82.         DiscountService $discountService,
  83.         ApiService $apiService,
  84.         ApiLogsService $logsService
  85.     ) {
  86.         $this->session = new Session();
  87.         $this->entityManager $entityManager;
  88.         $this->orderService $orderService;
  89.         $this->mailerService $mailerService;
  90.         $this->otideaUtils $otideaUtils;
  91.         $this->loyaltySystem $loyaltySystem;
  92.         $this->basketService $basketService;
  93.         $this->baseListener $baseListener;
  94.         $this->repoDiscount $repoDiscount;
  95.         $this->discountService $discountService;
  96.         $this->currentUserConnected $otideaUtils->getUserConnected();
  97.         $this->apiService $apiService;
  98.         $this->logsService $logsService;
  99.         $this->site $this->entityManager->getRepository(Site::class)->findOneBy(
  100.             ['id' => defined('CURRENT_SITE_ID') ? CURRENT_SITE_ID 1]
  101.         );
  102.         $this->apiSettings $this->entityManager->getRepository(ApiSettings::class)->findOneBy(
  103.             ['siteId' => CURRENT_SITE_ID]
  104.         );
  105.         if (!IS_ECOMMERCE) {
  106.             header('Location: ' WEBSITEROOT);
  107.             exit;
  108.         }
  109.     }
  110.     private function validateSession()
  111.     {
  112.         $customerIdOdyssee $this->session->get('customerIdOdyssee');
  113.         if ($this->session->has('order_id')) {
  114.             $order $this->entityManager->getRepository(EcoOrders::class)->find($this->session->get('order_id'));
  115.             if (!is_string($this->session->get('order_id')) && $this->session->get('order_id') == 0) {
  116.                 $this->session->remove('order_id');
  117.                 return $this->redirectToRoute('front_basket_index');
  118.             }
  119.             //Vérification de la commande en cours, si le statut n'est pas failure on supprime toutes les sessions
  120.             //pour éviter de modifier une commande validée
  121.             if (($order && $order->getOrderStatus() != 'failure') || $this->session->get('order_valid') == 'valid') {
  122.                 //Suppression des sessions
  123.                 $this->session->remove('basket');
  124.                 $this->session->remove('order_id');
  125.                 $this->session->remove('order_valid');
  126.                 $this->session->remove('carrier_id');
  127.                 $this->session->remove('discount_id');
  128.                 $this->session->remove('loyalty_point_used');
  129.                 $this->session->remove('giftText');
  130.                 $this->session->remove('cgv');
  131.                 $this->session->remove('customerIdOdyssee');
  132.                 $this->session->remove('cureIdForAssociatedProducts');
  133.                 return $this->redirectToRoute('front_basket_index');
  134.             }
  135.         }
  136.         $this->session->set('customerIdOdyssee'$customerIdOdyssee);
  137.         return null;
  138.     }
  139.     #[Route(path'/'name'front_basket_index')]
  140.     public function index(
  141.         Request $request,
  142.         BasketService $basketService,
  143.         EcoDiscountRepository $repoDiscount,
  144.         LoyaltySystemService $loyaltySystem
  145.     ): Response {
  146.         //Valider les sessions
  147.         $this->validateSession();
  148.         //Affichage popup
  149.         $this->displayPopup();
  150.         //        //Appliquer un code de réduction
  151.         //        if ($request->isMethod('POST') && $request->get('discount_code')) {
  152.         //
  153.         //            $articles = $basketService->getFormatedBasketProducts();
  154.         //            $ds->initService($articles, $this->session->has('customer') ? $this->session->get('customer') : null);
  155.         //            $discount = $ds->discountValidation($request->get('discount_code'));
  156.         //
  157.         //            if($discount['status']){
  158.         //                $this->session->set('discount_id', $ds->discount_id);
  159.         //                $basketService->applyDiscountBasket($request->get('discount_code'));
  160.         //            } else {
  161.         //                $this->otideaUtils->createPopup(["title" => 'Problème avec votre remise',
  162.         //                        "message" => $discount['message'],
  163.         //                        "btn2" => null]
  164.         //                );
  165.         //            }
  166.         //        }
  167.         $discount null;
  168.         if ($this->session->has('discount_id') && $this->session->get('discount_id') > 0) {
  169.             $discount $repoDiscount->find($this->session->get('discount_id'));
  170.         }
  171.         //Remise fidélité
  172.         if ($this->currentUserConnected != null) {
  173.             $loyaltySystem->init($this->currentUserConnected->getId());
  174.         }
  175.         $now = new \DateTime('', new DateTimeZone('Europe/Paris'));
  176.         $now->format('Y-m-d H:i:s');
  177.         $currentSaisonStart $this->apiSettings->getCurrentYearStartDate();
  178.         $currentSaisonEnd $this->apiSettings->getCurrentYearEndDate();
  179.         $nextSaisonStart $this->apiSettings->getNextYearStartDate();
  180.         $nextSaisonEnd $this->apiSettings->getNextYearEndDate();
  181.         $startYear $currentSaisonStart->format('Y');
  182.         $endYear $nextSaisonEnd->format('Y');
  183.         $datesExcluded = [];
  184.         // Parcourir toutes les dates de l'année en cours
  185.         for ($year $startYear$year <= $endYear$year++) {
  186.             for ($month 1$month <= 12$month++) {
  187.                 $daysInMonth cal_days_in_month(CAL_GREGORIAN$month$year);
  188.                 for ($day 1$day <= $daysInMonth$day++) {
  189.                     // Date du jour testé
  190.                     $dateActuelle = new DateTime("$year-$month-$day");
  191.                     // Si la date est en dehors des saisons en cours et à venir
  192.                     if (($dateActuelle $currentSaisonStart || $dateActuelle $currentSaisonEnd) &&
  193.                         ($dateActuelle $nextSaisonStart || $dateActuelle $nextSaisonEnd)) {
  194.                         $datesExcluded[] = $dateActuelle->format('Y-m-d');
  195.                     }
  196.                 }
  197.             }
  198.         }
  199.         $allSoinsReservation false;
  200.         $basketHasSoin false;
  201.         foreach ($this->session->get('basket') as $item) {
  202.             if (!is_string($item['referenceObject']) && $item['referenceObject']->getTypeOdyssee() == "soin") {
  203.                 $basketHasSoin true;
  204.             }
  205.             if (!is_string($item['referenceObject']) && $item['referenceObject']->getIsReservable(
  206.                 ) === true && $item['referenceObject']->getTypeOdyssee() == "soin") {
  207.                 $allSoinsReservation true;
  208.             }
  209.         }
  210.         if ($this->currentUserConnected == null) {
  211.             return $this->redirectToRoute('front_app_login');
  212.         } else {
  213.             $odysseeCustomers $this->apiService->rechercherClient(
  214.                 adrCourriel$this->currentUserConnected->getAuthUserId()->getEmail()
  215.             );
  216.         }
  217.         $isCure false;
  218.         foreach ($this->session->get('basket') as $key => $basket) {
  219.             if (strpos($key'CURE') === 0) {
  220.                 $isCure true;
  221.             }
  222.         }
  223.         return $this->render('@main-app/front/front_basket/basket.html.twig', [
  224.             'isCure' => $isCure,
  225.             'basket' => $this->session->get('basket'),
  226.             'subtotal' => $basketService->getSubtotal(),
  227.             'defaultShippingFees' => $basketService->getDefaultShippingFees(),
  228.             'discount' => $discount,
  229.             'loyaltyDiscount' => $loyaltySystem->getTotalDiscount(),
  230.             'loyaltyPoints' => $loyaltySystem->getTotalPoint(),
  231.             'step' => 'basket',
  232.             'datesExcluded' => $datesExcluded,
  233.             'startYear' => $startYear,
  234.             'endYear' => $endYear,
  235.             'basketHasSoin' => $basketHasSoin,
  236.             'odysseeCustomers' => $odysseeCustomers,
  237.             'allSoinsReservation' => $allSoinsReservation
  238.         ]);
  239.     }
  240.     /**
  241.      * @throws Throwable
  242.      */
  243.     #[Route(path'/livraison/{carrier_id}'name'front_basket_delivery'defaults: ['carrier_id' => 1])]
  244.     public function delivery(
  245.         Request $request,
  246.         EcoCustomersRepository $repoCustomers,
  247.         BasketService $basketService,
  248.         EcoCustomersAddressesRepository $repoAddress,
  249.         OtideaUtils $otideaUtils,
  250.         EcoDiscountRepository $repoDiscount,
  251.         ApiService $api,
  252.         $carrier_id 1
  253.     ): Response {
  254.         //Valider les sessions
  255.         $this->validateSession();
  256.         if (ODYSSEE_TYPE == 'CURE') {
  257.             $carrier_id 'cure';
  258.         }
  259.         if ((ODYSSEE_TYPE == 'SPA' && (!$this->session->get('customerIdOdyssee') || ($request->get(
  260.                         'valueCustomerIdOdyssee'
  261.                     ) && $this->session->get('customerIdOdyssee') != $request->get('valueCustomerIdOdyssee'))))) {
  262.             $this->session->set('customerIdOdyssee'$request->get('valueCustomerIdOdyssee'));
  263.         }
  264.         // Si la connexion à Odyssee est impossible, on redirige vers la page d'accueil
  265.         if (!$api->testConnexion()) {
  266.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  267.             return $this->redirectToRoute('front_home');
  268.         }
  269.         //Si l'utilisateur n'est pas connecté
  270.         if (!$this->currentUserConnected || $this->currentUserConnected === null) {
  271.             $this->session->set('returnToBasket'true);
  272.             return $this->redirectToRoute('front_app_login');
  273.         }
  274.         $patient $this->getUser()->getCustomer()[0]->getOdysseeReference();
  275.         $odysseeCustomer $api->rechercherClient(idOdyssee: (int)$patient)[0];
  276.         //Enregistrement du message cadeau
  277.         $this->giftText($request);
  278.         //Vérification du choix de la glacière
  279.         if ($request->get('valueGlaciere') != null) {
  280.             $this->session->set('valueGlaciere'$request->get('valueGlaciere'));
  281.         }
  282.         //Vérification de l'acceptation des CGV
  283.         if ($request->get('cgv') == null && $this->session->get('cgv') == null) {
  284.             $this->session->set('displayPopup''cgv-error');
  285.             return $this->redirectToRoute('front_basket_index');
  286.         } else {
  287.             if ($request->get('cgv') != null && $this->session->get('cgv') == null) {
  288.                 $this->session->set('cgv'$request->get('cgv'));
  289.             }
  290.         }
  291.         // <-- DEBUT --> Récupération carrierList
  292.         $customer $repoCustomers->find($this->currentUserConnected->getId());
  293.         $carrierList $basketService->getCarriersList($this->currentUserConnected);
  294.         // <-- FIN --> Récupération carrierList
  295.         // <-- DEBUT --> Récupération planning
  296.         $now = new \DateTime('', new DateTimeZone('Europe/Paris'));
  297.         $now->format('Y-m-d H:i:s');
  298.         // <-- FIN --> Récupération planning
  299.         // <-- DEBUT --> Récupération remise
  300.         $discount null;
  301.         if ($this->session->has('discount_id') && $this->session->get('discount_id') > 0) {
  302.             $discount $repoDiscount->find($this->session->get('discount_id'));
  303.         }
  304.         // <-- FIN --> Récupération remise
  305.         // Vérifie si il y a des produits dans le panier qui ne sont pas des cures et si il y en à au moins un de non livrable
  306.         $basketAsProduct false;
  307.         $basketAsProductNotDeliverable false;
  308.         foreach ($this->session->get('basket') as $items) {
  309.             if (!is_string($items['referenceObject'])) {
  310.                 $basketAsProduct true;
  311.                 if ($items['productObject']->getIsDeliverable() !== 'livrable') {
  312.                     $basketAsProductNotDeliverable true;
  313.                 }
  314.             }
  315.         }
  316.         $this->session->set('cureIdForAssociatedProducts'null);
  317.         // Par défaut sur une CURE, on définie la date de début
  318.         if ($this->session->get('basket')) {
  319.             $firstProductInBasket $this->session->get('basket')[array_key_first(
  320.                 $this->session->get('basket')
  321.             )]['productObject'];
  322.         } else {
  323.             return $this->redirectToRoute('front_basket_index');
  324.         }
  325.         $dateDebut is_object($firstProductInBasket) ? null : new \DateTime($firstProductInBasket['dateDebut']);
  326.         // Si il y a des produits dans le panier qui ne sont pas des cures, on récupère les cures disponibles et valides
  327.         $allAvailablesResaCures = [];
  328.         if ($basketAsProduct and ODYSSEE_TYPE == 'CURE') {
  329.             // On récupère toutes les Cures de tous les patients associés à ce compte
  330.             $customers $this->currentUserConnected->getAuthUserId()->getCustomer();
  331.             $orders = [];
  332.             foreach ($customers as $customer) {
  333.                 // Récupération des commandes du client
  334.                 $order $api->rechercherResaCure(idOdysseeClient: (int)$customer->getOdysseeReference());
  335.                 if (!isset($order->status)) {
  336.                     $orders[] = $api->rechercherResaCure(idOdysseeClient: (int)$customer->getOdysseeReference());
  337.                 }
  338.             }
  339.             // On parcours les cures, on ne garde que celles dont la date de début est supérieure à la date du jour
  340.             foreach ($orders as $cust) {
  341.                 foreach ($cust as $cure) {
  342.                     $dateDebut = new \DateTime($cure->{'Date_Debut_Resa'});
  343.                     $dateJour = new \DateTime();
  344.                     if ($dateDebut $dateJour) {
  345.                         // On remplace le code de l'indication principale par son nom et l'ID patient de la cure par son nom
  346.                         $cure->{'Indication_Principale'} = $this->entityManager->getRepository(Cure::class)->findOneBy(
  347.                             ['odysseeReference' => $cure->{'Indication_Principale'}]
  348.                         )->getTitle();
  349.                         $cure->{'IdOdysseeClient'} = $api->rechercherClient(
  350.                                 idOdyssee: (int)$cure->{'IdOdysseeClient'}
  351.                             )[0]->{'Nom'} . ' ' $api->rechercherClient(
  352.                                 idOdyssee: (int)$cure->{'IdOdysseeClient'}
  353.                             )[0]->{'Prenom'};
  354.                         $allAvailablesResaCures[] = $cure;
  355.                     }
  356.                 }
  357.             }
  358.             if (!empty($allAvailablesResaCures) && $carrier_id == 'cure') {
  359.                 $dateDebut = new \DateTime($allAvailablesResaCures[0]->{'Date_Debut_Resa'});
  360.                 $this->session->set(
  361.                     'cureIdForAssociatedProducts',
  362.                     (int)$allAvailablesResaCures[array_key_first($allAvailablesResaCures)]->{'IdOdysseeResa'}
  363.                 );
  364.             }
  365.         }
  366.         if (empty($this->session->get('basket'))) {
  367.             return $this->redirectToRoute('front_home');
  368.         }
  369.         // Si on est sur un site de CURE, on désactive les transporteurs
  370.         if (ODYSSEE_TYPE == 'CURE') {
  371.             $basketAsProductNotDeliverable true;
  372.         } elseif (ODYSSEE_TYPE == 'SPA') {
  373.             $dateDebut $request->get('wantResa') == '1' ? new \DateTime(
  374.                 str_replace('/''-'$request->get('date_debut'))
  375.             ) : null;
  376.             $wantResa $request->get('wantResa');
  377.             //            if ($dateDebut == null) {
  378.             //                $basketAsProductNotDeliverable = false;
  379.             //            }
  380.         }
  381.         $currentSaisonStart $this->apiSettings->getCurrentYearStartDate();
  382.         $currentSaisonEnd $this->apiSettings->getCurrentYearEndDate();
  383.         $nextSaisonStart $this->apiSettings->getNextYearStartDate();
  384.         $nextSaisonEnd $this->apiSettings->getNextYearEndDate();
  385.         $startYear $currentSaisonStart->format('Y');
  386.         $endYear $nextSaisonEnd->format('Y');
  387.         $datesExcluded = [];
  388.         // Parcourir toutes les dates de l'année en cours
  389.         for ($year $startYear$year <= $endYear$year++) {
  390.             for ($month 1$month <= 12$month++) {
  391.                 $daysInMonth cal_days_in_month(CAL_GREGORIAN$month$year);
  392.                 for ($day 1$day <= $daysInMonth$day++) {
  393.                     // Date du jour testé
  394.                     $dateActuelle = new DateTime("$year-$month-$day");
  395.                     // Si la date est en dehors des saisons en cours et à venir
  396.                     if (($dateActuelle $currentSaisonStart || $dateActuelle $currentSaisonEnd) &&
  397.                         ($dateActuelle $nextSaisonStart || $dateActuelle $nextSaisonEnd)) {
  398.                         $datesExcluded[] = $dateActuelle->format('Y-m-d');
  399.                     }
  400.                 }
  401.             }
  402.         }
  403.         //Définir le transporteur
  404.         $this->session->set('carrier_id'$basketAsProductNotDeliverable $carrier_id);
  405.         $step "";
  406.         if (ODYSSEE_TYPE == 'CURE') {
  407.             $step "CURE";
  408.         } elseif (ODYSSEE_TYPE == 'SPA') {
  409.             $step "SPA";
  410.         } else {
  411.             $step "delivery";
  412.         }
  413.         return $this->render('@main-app/front/front_basket/delivery.html.twig', [
  414.             'subtotal' => $basketService->getSubtotal(),
  415.             'odysseeCustomer' => $odysseeCustomer,
  416.             'defaultShippingFees' => $basketAsProductNotDeliverable $basketService->getDefaultShippingFees(
  417.                 $carrier_id,
  418.                 1
  419.             ),
  420.             'shippingFeesFree' => $basketService->getShippingFeesFree($basketAsProductNotDeliverable $carrier_id),
  421.             'carriersList' => $carrierList,
  422.             'customer' => $customer,
  423.             'discount' => $discount,
  424.             'carrier_id' => $carrier_id,
  425.             'step' => $step,
  426.             'glaciere' => $this->session->get('valueGlaciere'),
  427.             'basketAsProduct' => $basketAsProduct,
  428.             'basketAsProductNotDeliverable' => $basketAsProductNotDeliverable,
  429.             'allAvailablesResaCures' => !isset($allAvailablesResaCures->status) ? $allAvailablesResaCures : [],
  430.             'wantResa' => $wantResa ?? 'false',
  431.             'dateDebut' => $dateDebut $dateDebut->format('d/m/Y') : null,
  432.             'datesExcluded' => $datesExcluded,
  433.             'startYear' => $startYear,
  434.             'endYear' => $endYear
  435.         ]);
  436.     }
  437.     // Requête AJAX pour setter en session PHP l'ID de la cure sélectionnée
  438.     #[Route(path'/axCureIdForAssociatedProducts'name'front_basket_set_cure_associated')]
  439.     public function axCureIdForAssociatedProducts(Request $requestApiService $api): JsonResponse
  440.     {
  441.         if ($request->isXmlHttpRequest()) {
  442.             $this->session->set('cureIdForAssociatedProducts', (int)$request->get('cureId'));
  443.             return new JsonResponse(['status' => 'success']);
  444.         }
  445.         return new JsonResponse(['status' => 'error']);
  446.     }
  447.     // Requête AJAX qui va récupérer les soins d'un produit
  448.     #[Route(path'/axGetSoinOnProduct'name'front_basket_get_soin_on_product')]
  449.     public function axGetSoinOnProduct(Request $requestApiService $api): JsonResponse
  450.     {
  451.         if ($request->isXmlHttpRequest()) {
  452.             $soinProduct $api->rechSoinResaSpaParCodeProduit($request->get('reference'));
  453.             return new JsonResponse(
  454.                 [
  455.                     'status' => true,
  456.                     'soinProductComposition' => $soinProduct[0]->{'Composition'}
  457.                 ]
  458.             );
  459.         }
  460.         return new JsonResponse(
  461.             [
  462.                 'status' => 'error'
  463.             ]
  464.         );
  465.     }
  466.     // Requête AJAX qui va récupérer les disponibilité d'un soin avec son ID
  467.     #[Route(path'/axGetSoinAvailability'name'front_basket_get_soin_availability')]
  468.     public function axGetSoinAvailability(Request $requestApiService $api): JsonResponse
  469.     {
  470.         if ($request->isXmlHttpRequest()) {
  471.             $basket $this->session->get('basket');
  472.             //On sépare chaque élément de la date dans un tableau
  473.             $date explode('/'$request->get('dateDebut'));
  474.             //On vérifie que le tableau de date contient bien 3 éléments
  475.             if (count($date) != 3) {
  476.                 return new JsonResponse(
  477.                     [
  478.                         'date' => $date,
  479.                         'status' => 'error'
  480.                     ]
  481.                 );
  482.             }
  483.             // On converti la date récupérée au format dd/mm/YYYY au format YYYY-mm-ddT00:00:00
  484.             $dateDebut = (new \DateTime($date[2] . '-' $date[1] . '-' $date[0]))->format('Y-m-d') . 'T00:00:00';
  485.             // On créer la date de fin en ajoutant 7 jours à la date de début
  486.             $dateFin = (new \DateTime($date[2] . '-' $date[1] . '-' $date[0]))->modify(
  487.                     '+' $this->apiSettings->getNbDaysAvailableSearch() . ' day'
  488.                 )->format('Y-m-d') . 'T00:00:00';
  489.             $disposSoin $api->dispoSoin((string)$request->get('codeSoin'), $dateDebut$dateFin);
  490.             $error = isset($disposSoin->status);
  491.             try {
  492.                 $disposSoin $api->dispoSoin((string)$request->get('codeSoin'), $dateDebut$dateFin);
  493.             } catch (Exception $e) {
  494.                 return new JsonResponse(
  495.                     [
  496.                         'status' => true,
  497.                         'disposSoin' => $disposSoin,
  498.                         'codeSoin' => $request->get('codeSoin'),
  499.                         'error' => $e->getMessage()
  500.                     ]
  501.                 );
  502.             }
  503.             $disposSoin $api->dispoSoin((string)$request->get('codeSoin'), $dateDebut$dateFin);
  504.             $error = isset($disposSoin->status);
  505.             if (!$error) {
  506.                 foreach ($basket as $key => $product) {
  507.                     if (!is_string($product['referenceObject']) && $product['referenceObject']->getId(
  508.                         ) == (int)$request->get('prodId')) {
  509.                         $basket[$key]['disposSoins'][$request->get('codeSoin')]['day'] = $disposSoin[0]->{'Jour'};
  510.                         $basket[$key]['disposSoins'][$request->get('codeSoin')]['hour'] = $disposSoin[0]->{'Horaire'};
  511.                     }
  512.                 }
  513.             }
  514.             $this->session->set('basket'$basket);
  515.             return new JsonResponse(
  516.                 [
  517.                     'status' => true,
  518.                     'disposSoin' => $disposSoin,
  519.                     'codeSoin' => $request->get('codeSoin'),
  520.                     'error' => $error
  521.                 ]
  522.             );
  523.         }
  524.         return new JsonResponse(
  525.             [
  526.                 'status' => 'error'
  527.             ]
  528.         );
  529.     }
  530.     // Requête AJAX pour setter en session PHP les dispos des soins choisies
  531.     #[Route(path'/axSetSoinDispo'name'front_basket_set_soin_dispo')]
  532.     public function axSetSoinDispo(Request $request): JsonResponse
  533.     {
  534.         if ($request->isXmlHttpRequest()) {
  535.             $basket $this->session->get('basket');
  536.             $day $request->get('day');
  537.             $hour $request->get('hour');
  538.             $prodId $request->get('prodId');
  539.             foreach ($basket as $key => $product) {
  540.                 if (!is_string($product['referenceObject']) && $product['referenceObject']->getId() == (int)$prodId) {
  541.                     $basket[$key]['disposSoins'][$request->get('codeSoin')]['day'] = $day;
  542.                     $basket[$key]['disposSoins'][$request->get('codeSoin')]['hour'] = $hour;
  543.                 }
  544.             }
  545.             $this->session->set('basket'$basket);
  546.             return new JsonResponse(
  547.                 [
  548.                     'status' => 'success',
  549.                     'basket' => $this->session->get('basket')
  550.                 ]
  551.             );
  552.         }
  553.         return new JsonResponse(
  554.             [
  555.                 'status' => 'error'
  556.             ]
  557.         );
  558.     }
  559.     private function giftText($request)
  560.     {
  561.         if ($request->get('giftText')) {
  562.             $this->session->set('giftText'$request->get('giftText'));
  563.         }
  564.         //        elseif($this->session->has('giftText')) {
  565.         //            $this->session->remove('giftText');
  566.         //        }
  567.     }
  568.     /**
  569.      * @throws Throwable
  570.      */
  571.     #[Route(path'/paiement/{paymentMode}'name'front_basket_payment'defaults: ['paymentMode' => 'bank'])]
  572.     public function payment(
  573.         BasketService $basketService,
  574.         EcoCustomersRepository $customersRepository,
  575.         EcoCustomersAddressesRepository $repoAddress,
  576.         EcoOrdersRepository $repoOrder,
  577.         EcoDiscountRepository $repoDiscount,
  578.         ApiService $api,
  579.         $paymentMode 'bank'
  580.     ): Response {
  581.         // Si la connexion à Odyssee est impossible, on redirige vers la page d'accueil
  582.         if (!$api->testConnexion()) {
  583.             $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  584.             return $this->redirectToRoute('front_home');
  585.         }
  586.         //Si l'utilisateur n'est pas connecté
  587.         if (!$this->currentUserConnected || $this->currentUserConnected === null) {
  588.             $this->session->set('returnToBasket'true);
  589.             return $this->redirectToRoute('front_app_login');
  590.         }
  591.         //Valider les sessions
  592.         $this->validateSession();
  593.         $patient $this->getUser()->getCustomer()[0]->getOdysseeReference();
  594.         $odysseeCustomer $api->rechercherClient(idOdyssee: (int)$patient)[0];
  595.         $deliveryAddress $odysseeCustomer->{'Adresse1'} . ' ' $odysseeCustomer->{'Adresse2'} . ' ' $odysseeCustomer->{'Adresse3'} . ' ' $odysseeCustomer->{'CodePostal'} . ' ' $odysseeCustomer->{'Ville'};
  596.         //Vérification des informations obligatoires
  597.         //        if (!$this->session->has('customer') || $this->session->get('customer') === null || $this->session->get('carrier_id') === null || $this->session->get('basket') === null) {
  598.         //            return $this->redirectToRoute('front_customer_connection');
  599.         //        }
  600.         // <-- DEBUT --> Récupération remise
  601.         $discount null;
  602.         if ($this->session->has('discount_id') && $this->session->get('discount_id') > 0) {
  603.             $discount $repoDiscount->find($this->session->get('discount_id'));
  604.         }
  605.         // <-- FIN --> Récupération remise
  606.         //Enregistrer la commande avant de passer au paiement
  607.         //$this->insertOrder($basketService, $deliveryAddress[0]->getId(), $paymentMode, $discount);
  608.         $date = new \DateTime();
  609.         $dateString $date->format('Y-m-d');
  610.         $this->session->set('order_id'$dateString '-' $patient);
  611.         return $this->render('@main-app/front/front_basket/payment.html.twig', [
  612.             'subtotal' => $subtotal $basketService->getSubtotal(),
  613.             'defaultShippingFees' => $basketService->getDefaultShippingFees(
  614.                 $this->session->get('carrier_id'),
  615.                 1
  616.             ),
  617.             //            'order'               => $repoOrder->find($this->session->get('order_id')),
  618.             'step' => 'payment',
  619.             'discount' => $discount,
  620.             'currentUser' => $this->currentUserConnected
  621.         ]);
  622.     }
  623.     private function insertOrder($basketService$shipping_id$paymentMode$discountCode)
  624.     {
  625.         if ($shipping_id == null) {
  626.             return $this->redirectToRoute('front_app_login');
  627.         }
  628.         if (!$this->session->has('order_id') || $this->session->get('order_id') === null) {
  629.             $this->session->set('order_id'0);
  630.         }
  631.         //Récupération de la date de livraison
  632.         $now = new \DateTime('', new DateTimeZone('Europe/Paris'));
  633.         $now $now->format('Y-m-d H:i:s');
  634.         $company 0;
  635.         if ($this->currentUserConnected && $this->currentUserConnected->getCustAccountType() == 'company') {
  636.             $company $this->currentUserConnected->getId();
  637.         } else {
  638.             if ($this->currentUserConnected && $this->currentUserConnected->getCustAccountType() == 'employee') {
  639.                 $company $this->currentUserConnected->getCompany()->getId();
  640.             }
  641.         }
  642.         $planning $this->entityManager->getRepository(EcoPlanning::class)->getCurrentDeliveryAndOrder($now$company);
  643.         if (!$planning) {
  644.             $planning $this->entityManager->getRepository(EcoPlanning::class)->getNextDeliveryAndOrder(
  645.                 $now,
  646.                 $company
  647.             );
  648.         }
  649.         $params = [
  650.             'customer_id' => $this->currentUserConnected->getId(),
  651.             'shipping_id' => $shipping_id,
  652.             'carrier_id' => $this->session->get('carrier_id'),
  653.             'payment_mode' => $paymentMode,
  654.             'order_status' => 'failure',
  655.             'order_shipping_fees_free' => $basketService->getShippingFeesFree(),
  656.             'productsList' => $basketService->getFormatedBasketProducts(),
  657.             'order_actual_weight' => $basketService->getBasketWeight(),
  658.             'order_loyalty_point_used' => $this->session->has('loyalty_point_used') ? true false,
  659.             'order_gift_text' => $this->session->has('giftText') ? $this->session->get('giftText') : null,
  660.             'planning' => $planning,
  661.             'glaciere' => $this->session->get('valueGlaciere'),
  662.             'discountCode' => $discountCode
  663.         ];
  664.         $order_id $this->orderService->saveOrder($this->session->get('order_id'), $params);
  665.         $this->session->set('order_id'$order_id);
  666.         //Liaison avec un code de réduction s'il elle existe
  667.         $discount_id $this->session->has('discount_id') ? $this->session->get('discount_id') : null;
  668.         if ($discount_id !== null && $discount_id 0) {
  669.             $discount = new EcoDiscountOrders;
  670.             $discount->setDiscountId($discount_id);
  671.             $discount->setOrderId($order_id);
  672.             $this->entityManager->persist($discount);
  673.             $this->entityManager->flush();
  674.         }
  675.     }
  676.     /**
  677.      * @throws Throwable
  678.      */
  679.     #[Route(path'/payment_selection'name'front_basket_payment_selection')]
  680.     public function payment_selection(
  681.         Request $request,
  682.         BasketService $basketService,
  683.         EcoOrdersRepository $repoOrder,
  684.         ApiService $api
  685.     ) {
  686.         if ($request->isMethod('POST')) {
  687.             switch ($request->get('paiement')) {
  688.                 case 'cheque' :
  689.                     $this->addFlash(
  690.                         'danger',
  691.                         'Une erreur est survenue avec cette commande, veuillez nous contacter'
  692.                     );
  693.                     return $this->redirectToRoute('front_home');
  694.                     //                    $order = $repoOrder->find($this->session->get('order_id'));
  695.                     //                    $order->setOrderPayment('cheque');
  696.                     //                    $this->entityManager->persist($order);
  697.                     //                    $this->entityManager->flush();
  698.                     //
  699.                     //                    return $this->redirectToRoute('front_basket_payment_cheque');
  700.                     break;
  701.                 case 'bank' :
  702.                     $carriers $basketService->getCarriersList($this->currentUserConnected);
  703.                     $selectedCarrierAmount 0;
  704.                     foreach ($carriers as $carrier) {
  705.                         if ($carrier['detail']->getId() == $this->session->get('carrier_id')) {
  706.                             $selectedCarrierAmount = (double)$carrier['total'];
  707.                         }
  708.                     }
  709.                     $saveCure $this->saveApiOrder($selectedCarrierAmount);
  710.                     if (in_array('error'$saveCure)) {
  711.                         $this->addFlash('danger''Une erreur est survenue, veuillez réessayer ultérieurement.');
  712.                         return $this->redirectToRoute('front_basket_index');
  713.                     }
  714.                     return $this->redirectToRoute('front_payzen_paiement', [
  715.                         'orderId' => $saveCure[0],
  716.                         'totalOrder' => $saveCure[1] + $selectedCarrierAmount,
  717.                     ]);
  718.                     //                    $order = $repoOrder->find($this->session->get('order_id'));
  719.                     //                    $order->setOrderPayment('bank');
  720.                     //                    $this->entityManager->persist($order);
  721.                     //                    $this->entityManager->flush();
  722.                     //
  723.                     //                    return $this->redirectToRoute('front_basket_payment_paybox');
  724.                     break;
  725.                 case 'nopayment' :
  726.                     $this->addFlash(
  727.                         'danger',
  728.                         'Une erreur est survenue avec cette commande, veuillez nous contacter'
  729.                     );
  730.                     return $this->redirectToRoute('front_home');
  731.                     //                    $order = $repoOrder->find($this->session->get('order_id'));
  732.                     //                    $order->setOrderPayment('nopayment');
  733.                     //                    $this->entityManager->persist($order);
  734.                     //                    $this->entityManager->flush();
  735.                     //
  736.                     //                    $this->validateOrder($order->getId());
  737.                     //
  738.                     //                    return $this->redirectToRoute('front_basket_confirmation');
  739.                     break;
  740.                 case 'store' :
  741.                     $this->addFlash(
  742.                         'danger',
  743.                         'Une erreur est survenue avec cette commande, veuillez nous contacter'
  744.                     );
  745.                     return $this->redirectToRoute('front_home');
  746.                     //                    $order = $repoOrder->find($this->session->get('order_id'));
  747.                     //                    $order->setOrderPayment('store');
  748.                     //                    $this->entityManager->persist($order);
  749.                     //                    $this->entityManager->flush();
  750.                     //
  751.                     //                    $this->validateOrder($order->getId());
  752.                     //                    return $this->redirectToRoute('front_basket_confirmation');
  753.                     break;
  754.             }
  755.         }
  756.         return $this->redirectToRoute('front_basket_index');
  757.     }
  758.     private function saveApiOrder($selectedCarrierAmount): array
  759.     {
  760.         $orderRef null;
  761.         $totalOrder null;
  762.         //Créer une référence unique pour la commande à partir de la date et de l'heure si la commande n'est pas nulle et de l'ID Odyssee du patient
  763.         foreach ($this->session->get('basket') as $product) {
  764.             if (is_string($product['referenceObject'])) {
  765.                 $orderRef = (new \DateTime(
  766.                         '',
  767.                         new DateTimeZone('Europe/Paris')
  768.                     ))->format('Y-m-d-H-i-s') . '-' $product['productObject']['idOdyssee'];
  769.             }
  770.         }
  771.         // On parcourt tous les produits du panier
  772.         foreach ($this->session->get('basket') as $product) {
  773.             // Si le produit est une cure
  774.             if (is_string($product['referenceObject'])) {
  775.                 $dateDebut $product['productObject']['dateDebut']
  776.                     ? (new \DateTime($product['productObject']['dateDebut'], new DateTimeZone('Europe/Paris')))->format(
  777.                         'Y-m-d'
  778.                     ) . 'T00:00:00'
  779.                     : (new \DateTime('tomorrow', new DateTimeZone('Europe/Paris')))->format('Y-m-d') . 'T00:00:00';
  780.                 $dateFin $product['productObject']['dateFin']
  781.                     ? (new \DateTime($product['productObject']['dateFin'], new DateTimeZone('Europe/Paris')))->format(
  782.                         'Y-m-d'
  783.                     ) . 'T00:00:00'
  784.                     : (new \DateTime('tomorrow + 7 days', new DateTimeZone('Europe/Paris')))->format(
  785.                         'Y-m-d'
  786.                     ) . 'T00:00:00';
  787.                 try {
  788.                     // On enregistre la cure dans Odyssee
  789.                     $returnAddCure $this->apiService->creerResaCure(
  790.                         idOdysseeClient$product['productObject']['idOdyssee'],
  791.                         idExterneResa$product['productObject']['idExterne'],
  792.                         cureP$product['productObject']['cureP'],
  793.                         cureS$product['productObject']['cureS'],
  794.                         dateDebut$dateDebut,
  795.                         dateFin$dateFin,
  796.                         nss$product['productObject']['nss'],
  797.                         medTherm$product['productObject']['medTherm'],
  798.                         medPresc$product['productObject']['medPresc'],
  799.                         plageHoraire$product['productObject']['plageHoraire'],
  800.                         commentaire$product['productObject']['commentaire'],
  801.                         quota$product['productObject']['quota'],
  802.                         etab$product['productObject']['etab'],
  803.                         pdv$this->site->getOdysseePdvId()
  804.                     );
  805.                     // On enregistre la cure dans la BDD
  806.                     $newCureOrder = new CureOrder();
  807.                     $newCureOrder->setIdOdysseeClient($product['productObject']['idOdyssee']);
  808.                     $newCureOrder->setIdExterne($product['productObject']['idExterne']);
  809.                     $newCureOrder->setCureP($product['productObject']['cureP']);
  810.                     $newCureOrder->setCureS($product['productObject']['cureS']);
  811.                     $newCureOrder->setDateDebut(new \DateTime($dateDebut));
  812.                     $newCureOrder->setDateFin(new \DateTime($dateFin));
  813.                     $newCureOrder->setPlageHoraire($product['productObject']['plageHoraire']);
  814.                     $newCureOrder->setNss($product['productObject']['nss']);
  815.                     $newCureOrder->setMedTherm($product['productObject']['medTherm']);
  816.                     $newCureOrder->setMedPresc($product['productObject']['medPresc']);
  817.                     $newCureOrder->setCommentaire($product['productObject']['commentaire']);
  818.                     $newCureOrder->setArrhes($product['productObject']['arrhes']);
  819.                     $newCureOrder->setQuota($product['productObject']['quota']);
  820.                     $newCureOrder->setEtab($product['productObject']['etab']);
  821.                     $newCureOrder->setPdv($product['productObject']['pdv']);
  822.                     $newCureOrder->setCureOrderRef($orderRef);
  823.                     $newCureOrder->setSavePaymentInOdyssee(0);
  824.                     // On met à jour la cure dans la BDD suivant le retour de l'API
  825.                     if (!isset($returnAddCure->status)) { // Si l'API ne retourne pas d'erreurs
  826.                         $newCureOrder->setIdOdysseeResa($returnAddCure[0]->IdOdysseeResa);
  827.                         $newCureOrder->setSaveInOdyssee(true);
  828.                         $newCureOrder->setSaveInOdysseeDate(
  829.                             new \DateTime(
  830.                                 '',
  831.                                 new DateTimeZone('Europe/Paris')
  832.                             )
  833.                         );
  834.                     } else { // Sinon, on indique l'erreur en BDD pour la traçabilité
  835.                         $newCureOrder->setSaveInOdyssee(false);
  836.                         $newCureOrder->setSaveInOdysseeDate(null);
  837.                         // Si c'est une erreur unique
  838.                         if (is_string(json_decode($returnAddCure)->errors)) {
  839.                             $content "<p><strong style='color:red;'>Erreur :</strong> " json_decode(
  840.                                     $returnAddCure
  841.                                 )->errors "</p>";
  842.                         } else { // Si c'est un tableau d'erreurs
  843.                             $content "<p><strong style='color:red;'>Erreurs :</strong></p>";
  844.                             foreach (json_decode($returnAddCure)->errors as $key => $error) {
  845.                                 $content .= "<br><br><p><strong style='color:red;'>Erreur " $key " :</strong> " $error[0] . "</p>";
  846.                             }
  847.                         }
  848.                         $newCureOrder->setSaveInOdysseeError($content);
  849.                     }
  850.                     $this->entityManager->persist($newCureOrder);
  851.                 } catch (Throwable $apiException) {
  852.                     // Si l'erreur est une erreur de connexion à l'API, on envoie un mail aux admins
  853.                     try {
  854.                         $htmlContent "<br><br><p><strong style='color:red;'>Erreur :</strong> " $apiException->getMessage(
  855.                             ) . "</p>";
  856.                         $this->mailerService->subject 'Erreur du serveur API - ' $this->site->getSiteName();
  857.                         $this->mailerService->sendMail(
  858.                             $this->recipients,
  859.                             $htmlContent
  860.                         );
  861.                     } catch (Throwable $emailException) {
  862.                         // Si on a une erreur lors de l'envoi du mail, on écrit dans le fichier de log
  863.                         $this->mailerService->writeLog(json_encode([
  864.                             "apiException : " $apiException->getMessage(),
  865.                             "eMailException : " $emailException->getMessage()
  866.                         ]),
  867.                             'FrontBasketController ligne 801 - Try/Catch <creerResaCure\>');
  868.                     }
  869.                     // On retourne une erreur pour afficher un message à l'utilisateur
  870.                     return ['error'];
  871.                 }
  872.                 $totalOrder += $product['productObject']['arrhes'];
  873.             } else { // Si le produit n'est pas une cure
  874.                 if (!$orderRef) {
  875.                     //Créer une référence unique pour la commande à partir de la date et de l'heure si la commande n'est pas nulle et de l'ID Odyssee du patient
  876.                     $orderRef = (new \DateTime(
  877.                             '',
  878.                             new DateTimeZone('Europe/Paris')
  879.                         ))->format('Y-m-d-H-i-s') . '-' . ($this->session->get('cureIdForAssociatedProducts') ?: 'SPA');
  880.                 }
  881.                 // TODO : remplacer la récupération du client par celui inséré en SESSION lors de la commande
  882.                 if (ODYSSEE_TYPE == 'CURE') {
  883.                     $customerOdyssee $this->apiService->rechercherResaCure(
  884.                         idOdysseeResa$this->session->get(
  885.                         'cureIdForAssociatedProducts'
  886.                     )
  887.                     )[0]->{'IdOdysseeClient'};
  888.                 } elseif (ODYSSEE_TYPE == 'SPA') {
  889.                     $customerOdyssee $this->session->get('customerIdOdyssee');
  890.                 }
  891.                 // On enregistre le produit en BDD
  892.                 $newCureProductOrder = new CureProductOrder();
  893.                 $newCureProductOrder->setCodeProduit(
  894.                     $product['referenceObject']->getTypeOdyssee(
  895.                     ) == 'bkdovalue' $product['referenceObject']->getTypeOdyssee(
  896.                     ) : $product['referenceObject']->getRefReference()
  897.                 );
  898.                 $newCureProductOrder->setTypeOdyssee($product['referenceObject']->getTypeOdyssee());
  899.                 $newCureProductOrder->setQteProduit($product['qte']);
  900.                 $newCureProductOrder->setOrderShippingCost($selectedCarrierAmount);
  901.                 $newCureProductOrder->setPrixUnitTtc(
  902.                     $product['referenceObject']->getTypeOdyssee(
  903.                     ) == 'bkdovalue' $product['referenceObject']->getRefReferencePrice(
  904.                     ) : $product['referenceObject']->getRefSellingPrice()
  905.                 );
  906.                 $newCureProductOrder->setTvaProduit($product['referenceObject']->getRefTva());
  907.                 $newCureProductOrder->setPrcRemise(0);
  908.                 $newCureProductOrder->setPdv(null);
  909.                 $newCureProductOrder->setOrderRef($orderRef);
  910.                 $newCureProductOrder->setOdysseeId(
  911.                     ODYSSEE_TYPE == 'CURE' $this->session->get('cureIdForAssociatedProducts') : null
  912.                 );
  913.                 $newCureProductOrder->setOdysseeClientId((int)$customerOdyssee ?? null);
  914.                 $newCureProductOrder->setSaveInOdyssee(false);
  915.                 $newCureProductOrder->setSavePaymentInOdyssee(0);
  916.                 $newCureProductOrder->setSiteId(CURRENT_SITE_ID);
  917.                 $this->entityManager->persist($newCureProductOrder);
  918.                 // Si i ly a des dispos soins, on les enregistre
  919.                 if (isset($product['disposSoins'])) {
  920.                     foreach ($product['disposSoins'] as $key => $soin) {
  921.                         $newCureProductSoinsOrder = new CureProductSoinsOrder();
  922.                         $newCureProductSoinsOrder->setCureProductOrder($newCureProductOrder);
  923.                         $newCureProductSoinsOrder->setCodeSoin($key);
  924.                         $newCureProductSoinsOrder->setDateSoin(new \DateTime($soin['day']));
  925.                         $newCureProductSoinsOrder->setHeureSoin($soin['hour']);
  926.                         $this->entityManager->persist($newCureProductSoinsOrder);
  927.                         $newCureProductOrder->addCureProductSoinsOrder($newCureProductSoinsOrder);
  928.                     }
  929.                 }
  930.                 // Suivant la nature du produit, on ajoute le bon montant au total
  931.                 if ($product['referenceObject']->getTypeOdyssee() == 'bkdovalue') {
  932.                     $totalOrder += $product['qte'] * ($product['referenceObject']->getRefReferencePrice(
  933.                             ) - ($product['referenceObject']->getRefReferencePrice() / 100));
  934.                 } else {
  935.                     $totalOrder += $product['qte'] * ($product['referenceObject']->getRefSellingPrice(
  936.                             ) - ($product['referenceObject']->getRefSellingPrice() / 100));
  937.                 }
  938.             }
  939.         }
  940.         $this->entityManager->flush();
  941.         // On récupère tous les produits enregistrés pour la commande en cours
  942.         $cureProductsOrder $this->entityManager->getRepository(CureProductOrder::class)->findBy(
  943.             [
  944.                 'orderRef' => $orderRef
  945.             ]
  946.         );
  947.         // Si on est pas sur un BON CADEAU, on enregistre les produits dans Odyssee
  948.         if ($cureProductsOrder && $cureProductsOrder[0]->getTypeOdyssee(
  949.             ) != 'bkdo' && $cureProductsOrder[0]->getTypeOdyssee() != 'bkdovalue') {
  950.             // Récupération des informations de la cure associée aux produits
  951.             if (ODYSSEE_TYPE == 'CURE') {
  952.                 try {
  953.                     $cureAssociated $this->apiService->rechercherResaCure(
  954.                         idOdysseeResa$this->session->get(
  955.                         'cureIdForAssociatedProducts'
  956.                     )
  957.                     );
  958.                 } catch (Throwable $apiException) {
  959.                     // Si l'erreur est une erreur de connexion à l'API, on envoie un mail aux admins
  960.                     try {
  961.                         $htmlContent "<br><br><p><strong style='color:red;'>Erreur :</strong> " $apiException->getMessage(
  962.                             ) . "</p>";
  963.                         $this->mailerService->subject 'Erreur du serveur API - ' $this->site->getSiteName();
  964.                         $this->mailerService->sendMail(
  965.                             $this->recipients,
  966.                             $htmlContent
  967.                         );
  968.                     } catch (Throwable $emailException) {
  969.                         // Si on a une erreur lors de l'envoi du mail, on écrit dans le fichier de log
  970.                         $this->mailerService->writeLog(json_encode([
  971.                             "apiException : " $apiException->getMessage(),
  972.                             "eMailException : " $emailException->getMessage()
  973.                         ]),
  974.                             'FrontBasketController ligne 801 - Try/Catch <creerResaCure\>');
  975.                     }
  976.                     // On retourne une erreur pour afficher un message à l'utilisateur
  977.                     return ['error'];
  978.                 }
  979.             }
  980.             $produits = [];
  981.             $mntRemise 0;
  982.             $mntTotalTtc 0;
  983.             $mntTotalHt 0;
  984.             $mntTotalTva 0;
  985.             // Enregistrement des produits dans Odyssee
  986.             foreach ($cureProductsOrder as $cureProduct) {
  987.                 // Calcul des montants
  988.                 $ttc $cureProduct->getQteProduit() * ($cureProduct->getPrixUnitTtc() - ($cureProduct->getPrcRemise(
  989.                             ) * $cureProduct->getPrixUnitTtc() / 100));
  990.                 $ht $cureProduct->getQteProduit() * ($cureProduct->getPrixUnitTtc() - ($cureProduct->getPrcRemise(
  991.                             ) * $cureProduct->getPrixUnitTtc() / 100)) / ($cureProduct->getTvaProduit() / 100);
  992.                 $tva $cureProduct->getQteProduit() * ($cureProduct->getPrixUnitTtc() - ($cureProduct->getPrcRemise(
  993.                             ) * $cureProduct->getPrixUnitTtc() / 100)) - ($cureProduct->getQteProduit(
  994.                         ) * ($cureProduct->getPrixUnitTtc() - ($cureProduct->getPrcRemise(
  995.                                 ) * $cureProduct->getPrixUnitTtc() / 100)) / ($cureProduct->getTvaProduit() / 100));
  996.                 $soinsPlanifs = [];
  997.                 foreach ($cureProduct->getCureProductSoinsOrders() as $soin) {
  998.                     $soinsPlanifs[] = [
  999.                         'Code_Soin' => $soin->getCodeSoin(),
  1000.                         'Date_Soin' => $soin->getDateSoin()->format('Y-m-d'),
  1001.                         'Heure_Soin' => $soin->getHeureSoin()
  1002.                     ];
  1003.                 }
  1004.                 $produits[] = [
  1005.                     'Code_Produit' => $cureProduct->getCodeProduit(),
  1006.                     'Qte_Produit' => $cureProduct->getQteProduit(),
  1007.                     'Prix_Unit_Ttc' => $cureProduct->getPrixUnitTtc(),
  1008.                     'Tva_Produit' => $cureProduct->getTvaProduit(),
  1009.                     'Prc_Remise' => $cureProduct->getPrcRemise(),
  1010.                     'Mnt_Ttc' => $ttc,
  1011.                     'Mnt_Ht' => $ht,
  1012.                     'Mnt_Tva' => $tva,
  1013.                     'Soins_Planifs' => $soinsPlanifs
  1014.                 ];
  1015.                 $mntRemise += $cureProduct->getPrcRemise() * $cureProduct->getQteProduit(
  1016.                     ) * $cureProduct->getPrixUnitTtc() / 100;
  1017.                 $mntTotalTtc += $ttc;
  1018.                 $mntTotalHt += $ht;
  1019.                 $mntTotalTva += $tva;
  1020.             }
  1021.             if ($selectedCarrierAmount 0) {
  1022.                 $produits[] = [
  1023.                     'Code_Produit' => 'FPT',
  1024.                     'Qte_Produit' => 1,
  1025.                     'Prix_Unit_Ttc' => $selectedCarrierAmount,
  1026.                     'Tva_Produit' => 20,
  1027.                     'Prc_Remise' => 0,
  1028.                     'Mnt_Ttc' => $selectedCarrierAmount,
  1029.                     'Mnt_Ht' => $selectedCarrierAmount,
  1030.                     'Mnt_Tva' => 0,
  1031.                     'Soins_Planifs' => []
  1032.                 ];
  1033.             }
  1034.             $returnAddProd '';
  1035.             try {
  1036.                 if (ODYSSEE_TYPE == 'CURE') { // Si on est sur le site de cure, on ajoute les produits à la cure correspondante
  1037.                     $returnAddProd $this->apiService->ajoutProduitResaCure(
  1038.                         idOdysseeClient$cureAssociated[0]->{'IdOdysseeClient'},
  1039.                         idOdysseeResa$cureProductsOrder[0]->getOdysseeId(),
  1040.                         idExterneResa$cureAssociated[0]->{'IdExterneResa'},
  1041.                         produits$produits,
  1042.                         Mnt_Remise$mntRemise,
  1043.                         Mnt_Regler0,
  1044.                         Mnt_Total_Ttc$mntTotalTtc,
  1045.                         Mnt_Total_Ht$mntTotalHt,
  1046.                         Mnt_Total_Tva$mntTotalTva
  1047.                     );
  1048.                 } elseif (ODYSSEE_TYPE == 'SPA') { // Si on est sur le site de spa, on créer la réservation avec vente de produits
  1049.                     $returnAddProd $this->apiService->creerResaSpa(
  1050.                         idOdysseeClient$cureProductsOrder[0]->getOdysseeClientId(),
  1051.                         idExterneClient"",
  1052.                         idOdysseeSpa0,
  1053.                         idExterneSpa$cureProductsOrder[0]->getId() . '-' $cureProductsOrder[0]->getCodeProduit(),
  1054.                         dateDebut: (new \DateTime(
  1055.                             'now',
  1056.                             new DateTimeZone('Europe/Paris')
  1057.                         ))->format('Y-m-d') . 'T00:00:00',
  1058.                         dateFin: (new \DateTime('now', new DateTimeZone('Europe/Paris')))
  1059.                             ->modify('+1 year')
  1060.                             ->format('Y-m-d') . 'T00:00:00',
  1061.                         produits$produits,
  1062.                         Mnt_Remise$mntRemise,
  1063.                         Mnt_Regler0,
  1064.                         Mnt_Total_Ttc$mntTotalTtc,
  1065.                         Mnt_Total_Ht$mntTotalHt,
  1066.                         Mnt_Total_Tva$mntTotalTva,
  1067.                         pdv$this->site->getOdysseePdvId()
  1068.                     );
  1069.                 }
  1070.                 // Ajout du statut sauvegardé dans Odyssée de la cure dans la BDD
  1071.                 foreach ($cureProductsOrder as $cureProduct) {
  1072.                     // Si le statut du paiement est valide et que le retour de l'API est ok
  1073.                     if (!isset($returnAddProd->status)) {
  1074.                         if (ODYSSEE_TYPE == 'SPA') {
  1075.                             $cureProduct->setOdysseeId($returnAddProd->IdOdysseeSpa);
  1076.                         }
  1077.                         $cureProduct->setSaveInOdyssee(true);
  1078.                         $cureProduct->setSaveInOdysseeDate(
  1079.                             new \DateTime(
  1080.                                 '',
  1081.                                 new DateTimeZone('Europe/Paris')
  1082.                             )
  1083.                         );
  1084.                     } else {
  1085.                         $cureProduct->setSaveInOdysseeError(
  1086.                             is_object($returnAddProd->errors) ? json_encode(
  1087.                                 $returnAddProd->errors
  1088.                             ) : $returnAddProd->errors
  1089.                         );
  1090.                         return ['error'];
  1091.                     }
  1092.                     $this->entityManager->flush($cureProduct);
  1093.                 }
  1094.             } catch (\Throwable $apiException) {
  1095.                 // Si l'erreur est une erreur de connexion à l'API, on envoie un mail aux admins
  1096.                 try {
  1097.                     $htmlContent "<br><br><p><strong style='color:red;'>Erreur :</strong> " $apiException->getMessage(
  1098.                         ) . "</p>";
  1099.                     $this->mailerService->subject 'Erreur du serveur API - ' $this->site->getSiteName();
  1100.                     $this->mailerService->sendMail(
  1101.                         $this->recipients,
  1102.                         $htmlContent
  1103.                     );
  1104.                 } catch (Throwable $emailException) {
  1105.                     // Si on a une erreur lors de l'envoi du mail, on écrit dans le fichier de log
  1106.                     $this->mailerService->writeLog(json_encode([
  1107.                         "apiException : " $apiException->getMessage(),
  1108.                         "eMailException : " $emailException->getMessage()
  1109.                     ]),
  1110.                         'FrontBasketController ligne 801 - Try/Catch <creerResaCure\>');
  1111.                 }
  1112.                 // On retourne une erreur pour afficher un message à l'utilisateur
  1113.                 return ['error'];
  1114.             }
  1115.         }
  1116.         return [$orderRef$totalOrder];
  1117.     }
  1118.     #[Route(path'/paiement-paybox'name'front_basket_payment_paybox')]
  1119.     public function payment_paybox(
  1120.         Request $request,
  1121.         PayboxService $paybox,
  1122.         EcoOrdersRepository $repoOrders,
  1123.         EcoCustomersRepository $repoCustomers,
  1124.         BasketService $basketService,
  1125.         EcoCustomersAddressesRepository $repoAddress,
  1126.         EcoOrdersProductsRepository $repoProductsOrder,
  1127.         EcoDiscountRepository $repoDiscount
  1128.     ) {
  1129.         //Valider les sessions
  1130.         $this->validateSession();
  1131.         $order $repoOrders->find($this->session->get('order_id'));
  1132.         $orderProducts $repoProductsOrder->findBy(["order_id" => $this->session->get('order_id')]);
  1133.         $customer $repoCustomers->find($order->getCustomerId());
  1134.         $deliveryAddress null;
  1135.         if ($this->currentUserConnected->getCustAccountType(
  1136.             ) == 'company' && $this->currentUserConnected->getAddressesId() !== null && sizeof(
  1137.                 $this->currentUserConnected->getAddressesId()->getValues()
  1138.             ) > 0) {
  1139.             $deliveryAddress $this->currentUserConnected->getAddressesId()->getValues()[0];
  1140.         } else {
  1141.             if ($this->currentUserConnected->getCustAccountType(
  1142.                 ) == 'employee' && $this->currentUserConnected->getCompany()->getAddressesId() !== null && sizeof(
  1143.                     $this->currentUserConnected->getCompany()->getAddressesId()->getValues()
  1144.                 ) > 0) {
  1145.                 $company $this->currentUserConnected->getCompany();
  1146.                 $deliveryAddress $company->getAddressesId()->getValues()[0];
  1147.             }
  1148.         }
  1149.         $fp $basketService->getDefaultShippingFees(
  1150.             $this->session->get('carrier_id'),
  1151.             $deliveryAddress->getCountryId()
  1152.         );
  1153.         $totalTTC sprintf('%.2f'$basketService->getSubtotal() + $fp);
  1154.         if ($this->session->get('valueGlaciere') == 1) {
  1155.             $totalTTC += 6;
  1156.         }
  1157.         // <-- DEBUT --> Récupération remise
  1158.         if ($this->session->has('discount_id') && $this->session->get('discount_id') > 0) {
  1159.             $discount $repoDiscount->find($this->session->get('discount_id'));
  1160.             if ($discount->getDiscountAmount() != null) {
  1161.                 $totalTTC -= $discount->getDiscountAmount();
  1162.             } elseif ($discount->getDiscountPercentage() != null) {
  1163.                 $totalTTC $totalTTC - ($totalTTC * ($discount->getDiscountPercentage() / 100));
  1164.             }
  1165.         }
  1166.         // <-- FIN --> Récupération remise
  1167.         if ($totalTTC 0) {
  1168.             $totalTTC 0;
  1169.         }
  1170.         $paybox->payboxInit([
  1171.             "cmd" => $order->getOrderReference(),
  1172.             "email" => $customer->getAuthUserId()->getEmail(),
  1173.             "total" => $totalTTC 100,
  1174.         ]);
  1175.         $paybox->launch_payment();
  1176.     }
  1177.     #[Route(path'/validate-paybox'name'front_basket_validate_payment_paybox')]
  1178.     public function validate_paybox(Request $requestPayboxService $payboxEcoOrdersRepository $repoOrders)
  1179.     {
  1180.         //mail('steeven@otidea.com', 'calesia', print_r($request->query->all(), true));
  1181.         if ($request->get('ident') && $request->get('ident') != '' && $request->get('auto') && $request->get(
  1182.                 'amount'
  1183.             ) && $request->get('reponse')) {
  1184.             if ($paybox->validationTransaction($request->get('reponse'))) {
  1185.                 $order $repoOrders->findOneBy(['order_reference' => $request->get('ident')]);
  1186.                 $this->validateOrder($order->getId(), $request->get('amount') / 100);
  1187.             }
  1188.         }
  1189.         return new Response(''200);
  1190.     }
  1191.     #[Route(path'/payment_cheque'name'front_basket_payment_cheque')]
  1192.     public function payment_cheque(
  1193.         Request $request,
  1194.         SiteCoordonneesRepository $coordonneesRepository,
  1195.         BasketService $basketService,
  1196.         EcoOrdersRepository $repoOrder,
  1197.         EcoCustomersRepository $repoCustomer
  1198.     ) {
  1199.         //Valider les sessions
  1200.         $this->validateSession();
  1201.         $addressBank $coordonneesRepository->findOneBy(['siteUid' => CURRENT_SITE_ID'type' => 'bank-check']);
  1202.         if ($addressBank == null) {
  1203.             $addressBank = new SiteCoordonnees();
  1204.         }
  1205.         //Valider la commande
  1206.         if ($request->isMethod('POST')) {
  1207.             $this->validateOrder($this->session->get('order_id'));
  1208.             return $this->redirectToRoute('front_basket_confirmation');
  1209.         }
  1210.         return $this->render('@main-app/front/front_basket/basket_payment_cheque.html.twig', [
  1211.             'subtotal' => $subtotal $basketService->getSubtotal(),
  1212.             'addressBank' => $addressBank,
  1213.             'siteName' => SITE_NAME,
  1214.             'order' => $order $repoOrder->find($this->session->get('order_id')),
  1215.             'defaultShippingFees' => $basketService->getDefaultShippingFees(
  1216.                 $this->session->get('carrier_id'),
  1217.                 $order->getLivrCountryId()
  1218.             ),
  1219.             'customer' => $repoCustomer->find($this->currentUserConnected->getId()),
  1220.             'step' => 'payment',
  1221.         ]);
  1222.     }
  1223.     /**
  1224.      * Défini les procédures à exécuter quand une commande est payée (pour tous les modes de paiement)
  1225.      * @param integer $order_id
  1226.      * @param integer $amount
  1227.      */
  1228.     private function validateOrder($order_id 0$amount 0)
  1229.     {
  1230.         if ($order_id 0) {
  1231.             //Modification du statut de la commande
  1232.             $order $this->entityManager->getRepository(EcoOrders::class)->find($order_id);
  1233.             if ($order != null && $order != false && $order->getId() > && $order->getOrderStatus() != "valid") {
  1234.                 $order->setOrderStatus('valid');
  1235.                 $order->setOrderPaymentDate(new \DateTime());
  1236.                 $order->setOrderTotalPaid($amount);
  1237.                 $this->entityManager->persist($order);
  1238.                 $this->entityManager->flush();
  1239.                 //Notification confirmation de commande
  1240.                 $this->sendNotification($order);
  1241.                 //Mise à jour des stocks
  1242.                 $this->updateStock($order_id);
  1243.             }
  1244.         } else {
  1245.             return false;
  1246.         }
  1247.     }
  1248.     private function updateStock($order_id)
  1249.     {
  1250.         $orderProducts $this->entityManager->getRepository(EcoOrders::class)->findByOrdersProducts($order_id);
  1251.         foreach ($orderProducts as $prod) {
  1252.             $reference $this->entityManager->getRepository(EcoProductsReferences::class)->find($prod['reference_id']);
  1253.             //Cas d'un pack, on déduit le stock des articles qui composent le pack
  1254.             if ($prod['prod_type'] == 'bundle') {
  1255.                 $productsBundle $this->entityManager->getRepository(EcoProductsBundle::class)->findBy(
  1256.                     ['product_id' => $prod['product_id']]
  1257.                 );
  1258.                 foreach ($productsBundle as $prodBundle) {
  1259.                     $refBundle $this->entityManager->getRepository(EcoProductsReferences::class)->find(
  1260.                         $prodBundle->getReferenceId()
  1261.                     );
  1262.                     $newQte $refBundle->getRefQuantity() - ($prodBundle->getBundleQte() * $prod['op_qte']);
  1263.                     $refBundle->setRefQuantity($newQte $newQte 0);
  1264.                     $this->entityManager->persist($refBundle);
  1265.                 }
  1266.                 $this->entityManager->flush();
  1267.             }
  1268.             //On déduit le stock
  1269.             $newQte $reference->getRefQuantity() - $prod['op_qte'];
  1270.             $reference->setRefQuantity($newQte $newQte 0);
  1271.             //Passage du produit en indispo si stock à 0 et option activée dans les settings Ecommerce
  1272.             $ecoSettings $this->entityManager->getRepository(EcoSettings::class)->findOneBy(
  1273.                 ['siteId' => CURRENT_SITE_ID]
  1274.             );
  1275.             if ($ecoSettings->getUnavailableProductNoStock() && $newQte <= 0) {
  1276.                 $reference->setRefOutOfOrder(true);
  1277.             }
  1278.             $this->entityManager->persist($reference);
  1279.         }
  1280.         $this->entityManager->flush();
  1281.         //        $orderProducts = $this->entityManager->getRepository(EcoOrdersProducts::class)->findBy(['order_id' => $order_id]);
  1282.         //
  1283.         //        foreach ($orderProducts as $prod){
  1284.         //
  1285.         //            $reference = $this->entityManager->getRepository(EcoProductsReferences::class)->find($prod->getReferenceId());
  1286.         ////            $product = $this->entityManager->getRepository(EcoProducts::class)->find($reference->getProductId());
  1287.         //
  1288.         //            $newQte = $reference->getRefQuantity() - $prod->getOpQte();
  1289.         //            $reference->setRefQuantity($newQte > 0 ? $newQte : 0);
  1290.         //            $this->entityManager->persist($reference);
  1291.         //        }
  1292.         //
  1293.         //        $this->entityManager->flush();
  1294.     }
  1295.     /**
  1296.      * Envoi un mail de confirmation de commande au client + copie à l'admin
  1297.      * @param object $order
  1298.      */
  1299.     private function sendNotification($order)
  1300.     {
  1301.         $this->mailerService->fromName SITE_NAME;
  1302.         $this->mailerService->subject SITE_NAME " - Confirmation de votre commande " $order->getOrderReference();
  1303.         $customer $this->entityManager->getRepository(EcoCustomers::class)->find($order->getCustomerId());
  1304.         $allRecipients[] = [
  1305.             "nom" => $order->getFactLastname(),
  1306.             "prenom" => $order->getFactFirstname(),
  1307.             "email" => $customer->getAuthUserId()->getEmail(),
  1308.             "type" => 'to'
  1309.         ];
  1310.         //Remise fidélité
  1311.         if ($this->currentUserConnected && $this->currentUserConnected != null) {
  1312.             $this->loyaltySystem->init($this->currentUserConnected->getId());
  1313.         }
  1314.         $htmlContent $this->renderView('layouts/layouts_emails/notification_order_confirmation.html.twig', [
  1315.             'references' => $this->entityManager->getRepository(
  1316.                 EcoProductsReferences::class
  1317.             )->findByProductReferencesOrder(
  1318.                 $order->getId(),
  1319.                 $isCanceled 0
  1320.             ),
  1321.             'carrier' => $this->entityManager->getRepository(EcoShippingCarriers::class)->find($order->getCarrierId()),
  1322.             'order' => $order,
  1323.             'loyaltyDiscount' => $this->loyaltySystem->getTotalDiscount(),
  1324.             'loyaltyPoints' => $this->loyaltySystem->getTotalPoint(),
  1325.             'siteName' => SITE_NAME,
  1326.         ]);
  1327.         $this->mailerService->sendMail($allRecipients$htmlContentnull'admin');
  1328.     }
  1329.     #[Route(path'/confirmation'name'front_basket_confirmation')]
  1330.     public function confirmation(
  1331.         BasketService $basketService,
  1332.         EcoOrdersRepository $repoOrder,
  1333.         EcoDiscountRepository $repoDiscount
  1334.     ): Response {
  1335.         if (!$this->session->has('basket') || $this->session->get('basket') == null) {
  1336.             return $this->redirectToRoute('front_home');
  1337.         }
  1338.         //        $order = $repoOrder->find($this->session->get('order_id'));
  1339.         $subtotal $basketService->getSubtotal();
  1340.         $defaultShippingFees $basketService->getDefaultShippingFees(
  1341.             $this->session->get('carrier_id'),
  1342.             1
  1343.         );
  1344.         // <-- DEBUT --> Récupération remise
  1345.         $discount null;
  1346.         if ($this->session->has('discount_id') && $this->session->get('discount_id') > 0) {
  1347.             $discount $repoDiscount->find($this->session->get('discount_id'));
  1348.         }
  1349.         // <-- FIN --> Récupération remise
  1350.         $this->session->set('order_valid''valid');
  1351.         //Valider les sessions/*a commenté pour test*/
  1352.         $this->validateSession();
  1353.         return $this->render('@main-app/front/front_basket/confirmation.html.twig', [
  1354.             'subtotal' => $subtotal,
  1355.             'discount' => $discount,
  1356.             'user' => $this->currentUserConnected,
  1357.             'defaultShippingFees' => $defaultShippingFees,
  1358.             'step' => 'confirmation',
  1359.             'siteName' => SITE_NAME
  1360.         ]);
  1361.     }
  1362.     #[Route(path'/paiement-refuse'name'front_basket_payment_refuse')]
  1363.     public function payment_refuse(): Response
  1364.     {
  1365.         if (!$this->session->has('basket') || $this->session->get('basket') == null) {
  1366.             return $this->redirectToRoute('front_home');
  1367.         }
  1368.         //Valider les sessions /*a commenté pour test*/
  1369.         $this->validateSession();
  1370.         $site $this->entityManager->getRepository(Site::class)->find(CURRENT_SITE_ID);
  1371.         if ($site == null) {
  1372.             $site = new Site();
  1373.         }
  1374.         return $this->render('@main-app/front/front_basket/payment_refuse.html.twig', [
  1375.             'step' => 'confirmationRefused',
  1376.             'site' => $site,
  1377.         ]);
  1378.     }
  1379.     #[Route(path'/paiement-attente'name'front_basket_payment_pending')]
  1380.     public function payment_pending(): Response
  1381.     {
  1382.         if (!$this->session->has('basket') || $this->session->get('basket') == null) {
  1383.             return $this->redirectToRoute('front_home');
  1384.         }
  1385.         $site $this->entityManager->getRepository(Site::class)->find(CURRENT_SITE_ID);
  1386.         if ($site == null) {
  1387.             $site = new Site();
  1388.         }
  1389.         return $this->render('@main-app/front/front_basket/payment_pending.html.twig', [
  1390.             'step' => 'confirmationPending',
  1391.             'site' => $site,
  1392.         ]);
  1393.     }
  1394.     #[Route(path'/paiement-annule'name'front_basket_payment_canceled')]
  1395.     public function payment_canceled(): Response
  1396.     {
  1397.         if (!$this->session->has('basket') || $this->session->get('basket') == null) {
  1398.             return $this->redirectToRoute('front_home');
  1399.         }
  1400.         //Valider les sessions/*a commenté pour test*/
  1401.         $this->validateSession();
  1402.         $site $this->entityManager->getRepository(Site::class)->find(CURRENT_SITE_ID);
  1403.         if ($site == null) {
  1404.             $site = new Site();
  1405.         }
  1406.         return $this->render('@main-app/front/front_basket/payment_canceled.html.twig', [
  1407.             'step' => 'confirmationCacelled',
  1408.             'site' => $site,
  1409.         ]);
  1410.     }
  1411.     /*
  1412.      * Permet d'initialiser le template du panneau latéral du panier
  1413.      * @var string $fromBasket page du panier ou l'internaute se trouve
  1414.      * @return string le template du panier latéral
  1415.      */
  1416.     private function initBasketPanel($fromBasket "")
  1417.     {
  1418.         return $this->renderView('@main-app/layouts/layouts_front/tpl_basket_panel.html.twig', [
  1419.             'basket' => $this->session->get('basket'),
  1420.             'fromBasket' => $fromBasket,
  1421.             'subtotal' => $this->basketService->getSubtotal(),
  1422.             'defaultShippingFees' => $this->basketService->getDefaultShippingFees()
  1423.         ]);
  1424.     }
  1425.     /*
  1426.      * Permet d'initialiser le template de la page récap du panier
  1427.      * @return string le template du contenu du panier
  1428.      */
  1429.     private function initBasketPage()
  1430.     {
  1431.         $discount null;
  1432.         if ($this->session->has('discount_id') && $this->session->get('discount_id') > 0) {
  1433.             $discount $this->repoDiscount->find($this->session->get('discount_id'));
  1434.         }
  1435.         //Remise fidélité
  1436.         if ($this->currentUserConnected) {
  1437.             $this->loyaltySystem->init($this->currentUserConnected->getId());
  1438.         }
  1439.         $now = new \DateTime('', new DateTimeZone('Europe/Paris'));
  1440.         $now->format('Y-m-d H:i:s');
  1441.         $basketHasSoin false;
  1442.         foreach ($this->session->get('basket') as $item) {
  1443.             if ($item['referenceObject']->getTypeOdyssee() == "soin") {
  1444.                 $basketHasSoin true;
  1445.             }
  1446.         }
  1447.         $isCure false;
  1448.         if ($this->session->has('basket')) {
  1449.             foreach ($this->session->get('basket') as $key => $basket) {
  1450.                 if (strpos($key'CURE') === 0) {
  1451.                     $isCure true;
  1452.                 }
  1453.             }
  1454.         }
  1455.         $odysseeCustomers $this->apiService->rechercherClient(
  1456.             adrCourriel$this->currentUserConnected->getAuthUserId()->getEmail()
  1457.         );
  1458.         return $this->renderView('@main-app/front/front_basket/tpl_basket_page.html.twig', [
  1459.             'isCure' => $isCure,
  1460.             'basket' => $this->session->get('basket'),
  1461.             'subtotal' => $this->basketService->getSubtotal(),
  1462.             'defaultShippingFees' => $this->basketService->getDefaultShippingFees(),
  1463.             'discount' => $discount,
  1464.             'loyaltyDiscount' => $this->loyaltySystem->getTotalDiscount(),
  1465.             'loyaltyPoints' => $this->loyaltySystem->getTotalPoint(),
  1466.             'step' => 'basket',
  1467.             'basketHasSoin' => $basketHasSoin,
  1468.             'odysseeCustomers' => $odysseeCustomers,
  1469.         ]);
  1470.     }
  1471.     /**
  1472.      * Permet l'ajout d'un produit au panier
  1473.      */
  1474.     #[Route(path'/axAddToBasket'name'front_axAddToBasket')]
  1475.     public function axAddToBasket(Request $request): JsonResponse
  1476.     {
  1477.         if (!$this->currentUserConnected) {
  1478.             $url $this->generateUrl('front_app_login');
  1479.             return new JsonResponse(
  1480.                 [
  1481.                     'status' => false,
  1482.                     'route' => $url
  1483.                 ]
  1484.             );
  1485.         }
  1486.         if ($request->isXmlHttpRequest() && $request->get('reference_id') > && $request->get('qte') > 0) {
  1487.             $refForAdd $this->entityManager->getRepository(EcoProductsReferences::class)->find(
  1488.                 $request->get('reference_id')
  1489.             );
  1490.             foreach ($this->session->get('basket') as $items) {
  1491.                 // Vérifie si il y a une cure dans le panier, on ne peut pas ajouter de produits
  1492.                 if (is_string($items['referenceObject'])) {
  1493.                     $url $this->generateUrl('front_shopping_categorie');
  1494.                     $this->addFlash(
  1495.                         'danger',
  1496.                         'Vous ne pouvez pas ajouter de produits lors de la réservation d\'une Cure'
  1497.                     );
  1498.                     return new JsonResponse(
  1499.                         [
  1500.                             'status' => false,
  1501.                             'route' => $url
  1502.                         ]
  1503.                     );
  1504.                 }
  1505.                 // Vérifie si il y a un Bon Cadeau dans le panier, on ne peut pas ajouter de produits
  1506.                 if (($items['referenceObject']->getTypeOdyssee() == "bkdo" && $refForAdd->getTypeOdyssee(
  1507.                         ) != 'bkdo') || ($items['referenceObject']->getTypeOdyssee(
  1508.                         ) == "bkdovalue" && $refForAdd->getTypeOdyssee() != 'bkdovalue')) {
  1509.                     $url $this->generateUrl('front_shopping_categorie');
  1510.                     $this->addFlash(
  1511.                         'danger',
  1512.                         'Vous ne pouvez pas ajouter de produits lors de l\'achat d\'un Bon Cadeau'
  1513.                     );
  1514.                     return new JsonResponse(
  1515.                         [
  1516.                             'status' => false,
  1517.                             'route' => $url
  1518.                         ]
  1519.                     );
  1520.                 }
  1521.                 // Vérifie si il y a un produit dans le panier, on ne peut pas ajouter de Bon Cadeau
  1522.                 if ($items['referenceObject']->getTypeOdyssee() != "bkdo" && $items['referenceObject']->getTypeOdyssee(
  1523.                     ) != "bkdovalue" && ($refForAdd->getTypeOdyssee() == 'bkdo' || $refForAdd->getTypeOdyssee(
  1524.                         ) == 'bkdovalue')) {
  1525.                     $url $this->generateUrl('front_shopping_categorie');
  1526.                     $this->addFlash(
  1527.                         'danger',
  1528.                         'Vous ne pouvez pas ajouter de Bon Cadeau lors de l\'achat de produits'
  1529.                     );
  1530.                     return new JsonResponse(
  1531.                         [
  1532.                             'status' => false,
  1533.                             'route' => $url
  1534.                         ]
  1535.                     );
  1536.                 }
  1537.             }
  1538.             // ajout du produit au panier
  1539.             $this->basketService->addProduct(
  1540.                 $request->get('reference_id'),
  1541.                 $request->get('qte'),
  1542.                 $request->get('bkdoValueAmount')
  1543.             );
  1544.             return new JsonResponse(
  1545.                 [
  1546.                     'status' => true,
  1547.                     'basketPanel' => html_entity_decode($this->initBasketPanel($request->get('fromBasket'))),
  1548.                     // refresh du panneau panier
  1549.                     'totalCountBasket' => $this->baseListener->getProductSumOnBasket()
  1550.                 ]
  1551.             );
  1552.         }
  1553.         return new JsonResponse(
  1554.             [
  1555.                 'status' => false,
  1556.                 'basketPanel' => html_entity_decode($this->initBasketPanel($request->get('fromBasket'))),
  1557.             ]
  1558.         );
  1559.     }
  1560.     /**
  1561.      * Permet de mettre à jour une quantité pour un produit dans le panier
  1562.      * en + ou en -
  1563.      * @param Request $request
  1564.      */
  1565.     #[Route(path'/axUpdateQteBasket'name'front_axUpdateQteBasket')]
  1566.     public function axUpdateQteBasket(Request $request)
  1567.     {
  1568.         if ($request->isXmlHttpRequest() && $request->get('reference_id') > 0) {
  1569.             $qte 0;
  1570.             if ($request->get('qte')) {
  1571.                 $qte $request->get('qte');
  1572.             }
  1573.             $ref_id $request->get('reference_id');
  1574.             $direction $request->get('direction');
  1575.             $this->basketService->updateProductQte($ref_id$direction$qte);
  1576.             //Mise à jour des remises dans le cas d'une remise fidélité
  1577.             if ($this->currentUserConnected && $this->session->has('loyalty_point_used') && $this->session->get(
  1578.                     'loyalty_point_used'
  1579.                 ) > 0) {
  1580.                 $this->loyaltySystem->init($this->currentUserConnected->getId());
  1581.                 $this->basketService->applyDiscountLoyaltyBasket($this->loyaltySystem->getTotalDiscount());
  1582.             }
  1583.             $isCure false;
  1584.             foreach ($this->session->get('basket') as $key => $basket) {
  1585.                 if (strpos($key'CURE') === 0) {
  1586.                     $isCure true;
  1587.                 }
  1588.             }
  1589.             // refresh du panier dans la page si besoin
  1590.             $basketPage "";
  1591.             if ($request->get('fromBasket') == "panier") {
  1592.                 $basketPage html_entity_decode($this->initBasketPage());
  1593.             }
  1594.             return new JsonResponse([
  1595.                 'isCure' => $isCure,
  1596.                 'status' => true,
  1597.                 'basketPanel' => html_entity_decode($this->initBasketPanel($request->get('fromBasket'))),
  1598.                 // refresh du panneau panier
  1599.                 'basketPage' => $basketPage,
  1600.                 'totalCountBasket' => $this->baseListener->getProductSumOnBasket()
  1601.             ]);
  1602.         }
  1603.         return new JsonResponse([
  1604.             'status' => false,
  1605.         ]);
  1606.     }
  1607.     /**
  1608.      * Permet la suppression d'un produit qui est au panier
  1609.      * @param Request $request
  1610.      */
  1611.     #[Route(path'/axRemoveProductBasket'name'front_axRemoveProductBasket')]
  1612.     public function axRemoveProductBasket(Request $request)
  1613.     {
  1614.         if ($request->isXmlHttpRequest() && $request->get('reference_id') > 0) {
  1615.             $ref_id $request->get('reference_id');
  1616.             $this->basketService->removeProduct($ref_id);
  1617.             // refresh du panier dans la page si besoin
  1618.             $basketPage "";
  1619.             if ($request->get('fromBasket') == "panier") {
  1620.                 $basketPage html_entity_decode($this->initBasketPage());
  1621.             }
  1622.             return new JsonResponse([
  1623.                 'status' => true,
  1624.                 'script' => '$("#articlePanier-' $ref_id '").remove();',
  1625.                 'basketPanel' => html_entity_decode($this->initBasketPanel()),
  1626.                 // refresh du panneau panier
  1627.                 'basketPage' => $basketPage,
  1628.                 'totalCountBasket' => $this->baseListener->getProductSumOnBasket()
  1629.             ]);
  1630.         }
  1631.         return new JsonResponse([
  1632.             'status' => false,
  1633.         ]);
  1634.     }
  1635.     #[Route(path'/deleteProductBasket/{productId}'name'front_deleteProductBasket')]
  1636.     public function deleteProductBasket($productId): RedirectResponse
  1637.     {
  1638.         if ($productId 0) {
  1639.             $this->basketService->removeProduct($productId);
  1640.         }
  1641.         return $this->redirectToRoute('front_basket_delivery');
  1642.     }
  1643.     /**
  1644.      * Permet de supprimer l'utilisation des points de fidélité sur un panier
  1645.      * @param Request $request
  1646.      */
  1647.     #[Route(path'/axRemoveLoyaltyDiscount'name'front_axRemoveLoyaltyDiscount')]
  1648.     public function axRemoveLoyaltyDiscount(Request $request)
  1649.     {
  1650.         if ($request->isXmlHttpRequest() && $this->session->has('loyalty_point_used')) {
  1651.             //            $this->session->set('loyalty_point_used', null);
  1652.             //            $this->session->remove('loyalty_point_used');
  1653.             $this->basketService->removeLoyaltyDiscountBasket();
  1654.             return new JsonResponse([
  1655.                 'status' => true,
  1656.                 'basketPanel' => html_entity_decode($this->initBasketPanel('panier')),
  1657.                 // refresh du panneau panier
  1658.                 'basketPage' => html_entity_decode($this->initBasketPage()),
  1659.                 'totalCountBasket' => $this->baseListener->getProductSumOnBasket()
  1660.             ]);
  1661.         }
  1662.         return new JsonResponse([
  1663.             'status' => false,
  1664.         ]);
  1665.     }
  1666.     /**
  1667.      * Permet d'ajouter des points de fidélité sur un panier
  1668.      * @param Request $request
  1669.      */
  1670.     #[Route(path'/axAddLoyaltyDiscount'name'front_axAddLoyaltyDiscount')]
  1671.     public function axAddLoyaltyDiscount(Request $request)
  1672.     {
  1673.         if ($request->isXmlHttpRequest() && $this->currentUserConnected) {
  1674.             $this->loyaltySystem->init($this->currentUserConnected->getId());
  1675.             $this->session->set('loyalty_point_used'true);
  1676.             $this->basketService->applyDiscountLoyaltyBasket($this->loyaltySystem->getTotalDiscount());
  1677.             return new JsonResponse([
  1678.                 'status' => true,
  1679.                 'basketPanel' => html_entity_decode($this->initBasketPanel('panier')),
  1680.                 // refresh du panneau panier
  1681.                 'basketPage' => html_entity_decode($this->initBasketPage()),
  1682.                 'totalCountBasket' => $this->baseListener->getProductSumOnBasket()
  1683.             ]);
  1684.         }
  1685.         return new JsonResponse([
  1686.             'status' => false,
  1687.         ]);
  1688.     }
  1689.     /**
  1690.      * Permet de supprimer une remise sur un panier
  1691.      * @param Request $request
  1692.      */
  1693.     #[Route(path'/axRemoveDiscount'name'front_axRemoveDiscount')]
  1694.     public function axRemoveDiscount(Request $request)
  1695.     {
  1696.         if ($request->isXmlHttpRequest()) {
  1697.             $this->basketService->removeDiscountBasket();
  1698.             return new JsonResponse([
  1699.                 'status' => true,
  1700.                 'basketPanel' => html_entity_decode($this->initBasketPanel('panier')),
  1701.                 // refresh du panneau panier
  1702.                 'basketPage' => html_entity_decode($this->initBasketPage()),
  1703.                 'totalCountBasket' => $this->baseListener->getProductSumOnBasket()
  1704.             ]);
  1705.         }
  1706.         return new JsonResponse([
  1707.             'status' => false,
  1708.         ]);
  1709.     }
  1710.     /**
  1711.      * Permet d'ajouter une remise sur un panier
  1712.      * @param Request $request
  1713.      */
  1714.     #[Route(path'/axAddDiscount'name'front_axAddDiscount')]
  1715.     public function axAddDiscount(Request $request)
  1716.     {
  1717.         if ($request->isXmlHttpRequest() && $request->get('discount_code')) {
  1718.             $popup "";
  1719.             $articles $this->basketService->getFormatedBasketProducts();
  1720.             $this->discountService->initService(
  1721.                 $articles,
  1722.                 $this->currentUserConnected $this->currentUserConnected null
  1723.             );
  1724.             $discount $this->discountService->discountValidation($request->get('discount_code'));
  1725.             if ($discount['status']) {
  1726.                 $this->session->set('discount_id'$this->discountService->discount_id);
  1727.                 //Mise en commentaire du DiscountService actuel => non fonctionnel
  1728.                 //$this->basketService->applyDiscountBasket($request->get('discount_code'));
  1729.             } else {
  1730.                 $popup $this->renderView('layouts/layouts_front/tpl_popup.html.twig', [
  1731.                     'popupTitle' => "Problème avec votre remise",
  1732.                     'popupMessage' => isset($discount['message']) && trim(
  1733.                         $discount['message']
  1734.                     ) != "" $discount['message'] : "Code promo invalide",
  1735.                     'popupBtn2' => null,
  1736.                 ]);
  1737.             }
  1738.             return new JsonResponse([
  1739.                 'popup' => $popup,
  1740.                 'status' => true,
  1741.                 'basketPanel' => html_entity_decode($this->initBasketPanel('panier')),
  1742.                 // refresh du panneau panier
  1743.                 'basketPage' => html_entity_decode($this->initBasketPage()),
  1744.                 'totalCountBasket' => $this->baseListener->getProductSumOnBasket()
  1745.             ]);
  1746.         }
  1747.         return new JsonResponse([
  1748.             'status' => false,
  1749.         ]);
  1750.     }
  1751.     private function displayPopup()
  1752.     {
  1753.         if ($this->session->has('displayPopup')) {
  1754.             //Erreur de connexion
  1755.             if ($this->session->get('displayPopup') == 'delivery-account-error') {
  1756.                 $this->otideaUtils->createPopup([
  1757.                         "title" => 'Adresse de livraison indisponible',
  1758.                         "message" => "Aucune adresse de livraison n'est défini dans votre espace client.",
  1759.                         "btn2" => null
  1760.                     ]
  1761.                 );
  1762.             }
  1763.             //Acceptation des CGV
  1764.             if ($this->session->get('displayPopup') == 'cgv-error') {
  1765.                 $this->otideaUtils->createPopup([
  1766.                         "title" => 'CGV',
  1767.                         "message" => "Vous devez accepter les conditions générales de vente pour valider votre commande.",
  1768.                         "btn2" => null
  1769.                     ]
  1770.                 );
  1771.             }
  1772.             $this->session->set('displayPopup'null);
  1773.         }
  1774.     }
  1775. }