src/Controller/DefaultController.php line 63

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use PDO;
  5. use PDOException;
  6. use PhpImap\Mailbox;
  7. use App\Service\MBEClient;
  8. use App\Service\UtilsService;
  9. use App\Form\ResetPasswordType;
  10. use App\Service\BandeauService;
  11. use App\Service\EmailGenerator;
  12. use TeamTNT\TNTSearch\TNTSearch;
  13. use App\Repository\UserRepository;
  14. use Symfony\Component\Mime\Address;
  15. use App\Repository\ClientRepository;
  16. use App\Form\ClientFinalValidateType;
  17. use App\Repository\BandeauRepository;
  18. use App\Controller\CommandeController;
  19. use App\Form\ResetPasswordRequestType;
  20. use App\Repository\CommandeRepository;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use App\Repository\ClientFinalRepository;
  23. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  24. use Symfony\Component\HttpFoundation\Cookie;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\Mailer\MailerInterface;
  27. use Symfony\Component\HttpFoundation\Response;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\HttpFoundation\JsonResponse;
  30. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  31. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  32. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  33. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  34. class DefaultController extends AbstractController
  35. {
  36.     private $utilsService;
  37.     private $emailGeneratorService;
  38.     private $roleAdmin;
  39.     private $baseDomain 'https://wine.mbebordeaux.fr';
  40.     private $fuzzy_storage "/home/mbe/public_html/www";
  41.     private $mailer;
  42.     private $bandeauService;
  43.     //private $fuzzy_storage = "/Users/mbk15/Documents/aSchone/mbeplateforme";
  44.     //private $fuzzy_storage = "C:\wamp64\www\mbeplateforme";
  45.     //private $fuzzy_storage = "C:\Users\bleu-\OneDrive\Bureau\aschone\mbeplateforme";
  46.     public function __construct(UtilsService $utilsServiceBandeauService $bandeauServiceEmailGenerator $emailGeneratorServiceMailerInterface $mailer)
  47.     {
  48.         $this->utilsService $utilsService;
  49.         $this->emailGeneratorService $emailGeneratorService;
  50.         $this->roleAdmin $this->utilsService->isAdmin();
  51.         $this->mailer $mailer;
  52.         $this->bandeauService $bandeauService;
  53.     }
  54.     /**
  55.      * @Route("/", name="default")
  56.      */
  57.     public function index(BandeauRepository $BandeauRepositoryRequest $request): Response
  58.     {
  59.         return $this->render('default/index.html.twig'
  60.             array('controller_name' => 'DefaultController',
  61.             'bandeau' => $this->bandeauService->displayPopup()
  62.         ));
  63.     }
  64.     private function sendErrorEmail($errorDetails$excelFilePath)
  65.     {
  66.         $email = (new TemplatedEmail())
  67.             ->from('no-reply@mbe.vent-en-poupe.fr')
  68.             ->to(new Address('linnea.cederblad@mbebordeaux.fr'))
  69.             ->bcc(new Address('bpouverel@mbefrance.fr'))
  70.             ->bcc(new Address('support@bleu-digital.fr'))
  71.             ->subject('MBE - Problème import script')
  72.             ->htmlTemplate('emails/error_template.html.twig'// Assurez-vous d'avoir ce template Twig
  73.             ->context([
  74.                 'errorDetails' => $errorDetails,
  75.             ]);
  76.         foreach ($excelFilePath as $key => $file) {
  77.             $email->attachFromPath($file);
  78.         }
  79.         try {
  80.             $this->mailer->send($email);
  81.             echo "E-mail envoyé avec succès.";
  82.         } catch (TransportExceptionInterface $e) {
  83.             echo "L'e-mail n'a pas pu être envoyé. Erreur: {$e->getMessage()}";
  84.         }
  85.     }
  86.     private function sendErrorEmailIdealWine($errorDetails$excelFilePath)
  87.     {
  88.         $email = (new TemplatedEmail())
  89.             ->from('no-reply@mbe.vent-en-poupe.fr')
  90.             ->to(new Address('linnea.cederblad@mbebordeaux.fr'))
  91.             ->bcc(new Address('bpouverel@mbefrance.fr'))
  92.             ->bcc(new Address('support@bleu-digital.fr'))
  93.             ->subject('MBE - Problème import script')
  94.             ->htmlTemplate('emails/error_template.html.twig'// Assurez-vous d'avoir ce template Twig
  95.             ->context([
  96.                 'errorDetails' => $errorDetails,
  97.             ]);
  98.         foreach ($excelFilePath as $key => $file) {
  99.             $email->attachFromPath($file);
  100.         }
  101.         try {
  102.             $this->mailer->send($email);
  103.             echo "E-mail envoyé avec succès.";
  104.         } catch (TransportExceptionInterface $e) {
  105.             echo "L'e-mail n'a pas pu être envoyé. Erreur: {$e->getMessage()}";
  106.         }
  107.     }
  108.     /**
  109.      * @Route("/create_commande_par_email_Wf74oVv7WY4QLu1YqSad ", name="create_commande_par_email", methods={"GET", "POST"})
  110.      */
  111.     public function createCommandeParEmail(CommandeController $commandeControllerClientRepository $clientRepositoryCommandeRepository $commandeRepository)
  112.     {
  113.         // Paramètres de connexion IMAP
  114.         $server '{ssl0.ovh.net:993/imap/ssl}INBOX';
  115.         $username 'usa@mbebordeaux.fr';
  116.         $password 'R2rFMxYgN5dw5cMMbpta';
  117.         //https://mail.ovh.net/roundcube/
  118.         // Créer une instance de la boîte aux lettres
  119.         $mailbox = new Mailbox($server$username$password);
  120.         // Récupérer tous les e-mails
  121.         $emails $mailbox->searchMailbox('UNSEEN');
  122.         // $emails = $mailbox->searchMailbox('ALL');                    
  123.         // Parcourir les e-mails
  124.         foreach ($emails as $emailUid) {
  125.             $email $mailbox->getMail($emailUid);
  126.             // Vérifier si le from est Charlotte ou Florian ou Benoit ou Lilly (Après, les adresses du client )
  127.             if ($email->fromAddress === 'cbrisson@bleu-digital.fr' || $email->fromAddress === 'fdieu@bleu-digital.fr' || $email->fromAddress === 'linnea.cederblad@mbebordeaux.fr' || $email->fromAddress === 'bpouverel@mbefrance.fr' || $email->fromAddress === 'aschone@bleu-digital.fr' || $email->fromAddress == 'mbe011@mbefrance.fr' || $email->fromAddress == 'mbe2727@mbefrance.fr') {
  128.                 // Vérifier s'il existe des pièces jointes
  129.                 if ($email->hasAttachments()) {
  130.                     // Parcourir les pièces jointes
  131.                     foreach ($email->getAttachments() as $attachment) {
  132.                         // Vérifier si la pièce jointe est un fichier Excel
  133.                         $mimeType $attachment->mime;
  134.                         $fileName $attachment->name;
  135.                         if ($mimeType === 'application/vnd.ms-excel; charset=binary' || $mimeType "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=binary" || $mimeType === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || $mimeType === 'application/vnd.ms-excel') {
  136.                             // Déterminez l'encodage manuellement si mb_detect_encoding() échoue
  137.                             $current_encoding 'ISO-8859-1'// Par exemple, supposons que l'encodage est ISO-8859-1                            
  138.                             // Conversion de l'encodage si nécessaire (ex. vers UTF-8)
  139.                             if ($current_encoding !== 'UTF-8') {
  140.                                 $filename mb_convert_encoding($fileName'UTF-8'$current_encoding);
  141.                             }
  142.                             // Suppression des caractères non valides
  143.                             $filenameNew preg_replace('/[^\p{L}\p{N}\s\-_\.]/u'''$filename);
  144.                             // Vérifier si l'objet de l'email contient le mot "IDEALWINE"
  145.                             if (strpos(strtolower($email->subject), 'idealwine') !== false) {
  146.                                 file_put_contents(__DIR__ "/../../public/VK74QTZTBQax9SkdDuax/" $filenameNew$attachment->getContents());
  147.                             } else {
  148.                                 if (strpos(strtolower($email->subject), '0001210531') !== false) {
  149.                                     file_put_contents(__DIR__ "/../../public/kdoezjfiorfjioerjfrp/" $filenameNew$attachment->getContents());
  150.                                 }else{
  151.                                     if (strpos(strtolower($email->subject), '0001203942') !== false) {
  152.                                         file_put_contents(__DIR__ "/../../public/ferijfreoifjreoppehjei/" $filenameNew$attachment->getContents());
  153.                                     }else{
  154.                                         if (strpos(strtolower($email->subject), '0002115725') !== false) {
  155.                                             file_put_contents(__DIR__ "/../../public/popkkrozjfopezofdzfdfergrt/" $filenameNew$attachment->getContents());
  156.                                         }else{
  157.                                             file_put_contents(__DIR__ "/../../public/xdeUEDJuejUDEiduhEDIOehdEUDHe/" $filenameNew$attachment->getContents());
  158.                                         }
  159.                                     }
  160.                                 }
  161.                                 
  162.                             }
  163.                             // kdoezjfiorfjioerjfrp 0001210531
  164.                             // ferijfreoifjreoppehjei 0001203942
  165.                             // popkkrozjfopezofdzfdfergrt 0002115725
  166.                         }
  167.                     }
  168.                 }
  169.                 $mailbox->markMailAsRead($emailUid);
  170.             }
  171.         }
  172.         $createCommandeResponse $commandeController->create_via_import($clientRepository$commandeRepository);
  173.         $createCommandeResponseIdealWine $commandeController->create_via_import_idealwine($clientRepository$commandeRepository);
  174.         $createCommandeResponseGlobal $commandeController->create_via_import_global($clientRepository$commandeRepository);
  175.         $errorFound $createCommandeResponse['errorFound'];
  176.         // Si le script merde alors on send un email pour expliquer l'erreur
  177.         if ($errorFound) {
  178.             $errorDetails $createCommandeResponse['errorDetails'];
  179.             $excelFilePath $createCommandeResponse['excelFilePath'];
  180.             $this->sendErrorEmail($errorDetails$excelFilePath);
  181.         } else {
  182.             echo "Aucune erreur trouvée dans le fichier Excel Martin.";
  183.         }
  184.         $errorFound $createCommandeResponseIdealWine['errorFound'];
  185.         // Si le script merde alors on send un email pour expliquer l'erreur pour IDEALWINE
  186.         if ($errorFound) {
  187.             $errorDetails $createCommandeResponseIdealWine['errorDetails'];
  188.             $excelFilePath $createCommandeResponseIdealWine['excelFilePath'];
  189.             $this->sendErrorEmailIdealWine($errorDetails$excelFilePath);
  190.         } else {
  191.             echo "Aucune erreur trouvée dans le fichier Excel IDEALWINE.";
  192.         }
  193.         $errorFound $createCommandeResponseGlobal['errorFound'];
  194.         // Si le script merde alors on send un email pour expliquer l'erreur
  195.         if ($errorFound) {
  196.             $errorDetails $createCommandeResponseGlobal['errorDetails'];
  197.             $excelFilePath $createCommandeResponseGlobal['excelFilePath'];
  198.             $this->sendErrorEmailIdealWine($errorDetails$excelFilePath);
  199.         } else {
  200.             echo "Aucune erreur trouvée dans le fichier Excel Global.";
  201.         }
  202.         return new Response("OK");
  203.     }
  204.     /**
  205.      * @Route("/admin", name="admin_default")
  206.      */
  207.     public function indexAdmin(): Response
  208.     {
  209.         if ($this->roleAdmin) {
  210.             return $this->render('default/indexAdmin.html.twig', [
  211.                 'controller_name' => 'DefaultController',
  212.             ]);
  213.         }
  214.         return $this->redirectToRoute('app_commande_new', [], Response::HTTP_SEE_OTHER);
  215.     }
  216.     /**
  217.      * @Route("/mdpoublier ", name="app_client_forgot_pwd", methods={"GET", "POST"})
  218.      */
  219.     public function askResetPassword(Request $requestUserRepository $userRepository): Response
  220.     {
  221.         $form $this->createForm(ResetPasswordRequestType::class);
  222.         $form->handleRequest($request);
  223.         if ($form->isSubmitted()) {
  224.             $email $_POST['reset_password_request']['email'];
  225.             $user $userRepository->findByEmail($email);
  226.             if (count($user) > 0) {
  227.                 $payload = [
  228.                     'id' => $user[0]->getId(),
  229.                     'exp' => time() + 900
  230.                 ];
  231.                 $token $this->utilsService->generateJWT($payload);
  232.                 $url $this->baseDomain $this->generateUrl('reset_password', array('token' => $token));
  233.                 // TODO send the link by email
  234.                 $this->emailGeneratorService->sendResetPassword($user[0], $url);
  235.             }
  236.             $this->addFlash(
  237.                 'info',
  238.                 'Si votre email est lié à un compte nous vous avons envoyé un lien par mail'
  239.             );
  240.         }
  241.         return $this->render('client/forgot_password.html.twig', [
  242.             'form' => $form->createView(),
  243.         ]);
  244.     }
  245.     /**
  246.      * @Route("/changermdp", name="reset_password", methods={"GET", "POST"})
  247.      */
  248.     public function resetPassword(Request $requestUserRepository $userRepositoryUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $entityManager)
  249.     {
  250.         $token $request->query->get('token');
  251.         if ($token == null) {
  252.             return $this->redirectToRoute('default', [], Response::HTTP_SEE_OTHER);
  253.         }
  254.         $payload $this->utilsService->validateJWT($token);
  255.         //TODO decode the token present in the get request
  256.         $user $userRepository->find($payload['id']);
  257.         $form $this->createForm(ResetPasswordType::class);
  258.         $form->handleRequest($request);
  259.         if ($form->isSubmitted() && $form->isValid()) {
  260.             $user->setPassword(
  261.                 $userPasswordHasher->hashPassword(
  262.                     $user,
  263.                     $form->get('plainPassword')->getData()
  264.                 )
  265.             );
  266.             $entityManager->persist($user);
  267.             $entityManager->flush();
  268.             return $this->redirectToRoute('login');
  269.         }
  270.         return $this->render('client/reset_password.html.twig', [
  271.             'form' => $form->createView(),
  272.         ]);
  273.     }
  274.     /**
  275.      * @Route("/validate", name="app_client_final_validate", methods={"GET", "POST"})
  276.      */
  277.     public function validate(CommandeRepository $commandeRepository,  Request $request)
  278.     {
  279.         $token $request->query->get('token');
  280.         if ($token == null) {
  281.             return $this->redirectToRoute('default', [], Response::HTTP_SEE_OTHER);
  282.         }
  283.         $payload $this->utilsService->validateJWT($token);
  284.         $commande $commandeRepository->find($payload['id']);
  285.         if ($commande->isIsValideeParClient() == true) {
  286.             //Le client a déjà validé ses infos et revient sur le lien, on redirige direct vers la page "Vos informations ont bien été validées"
  287.             return $this->render('client_final/informations_validees.html.twig');
  288.         }
  289.         /* if($commande->getState() == 'valide' 
  290.         || $commande->getState() == 'emballage' 
  291.         || $commande->getState() == 'archive'){
  292.             return $this->redirectToRoute('default', [], Response::HTTP_SEE_OTHER); 
  293.         } */
  294.         $em $this->getDoctrine()->getManager();
  295.         $form $this->createForm(ClientFinalValidateType::class, $commande);
  296.         $form->handleRequest($request);
  297.         $dateCreneau1Clone = clone $commande->getDateCollecte();
  298.         $dateCreneau2Clone = clone $commande->getDateCollecte();
  299.         if ($commande->isEmballageLivraison()) {
  300.             $dateCreneau1Brut $dateCreneau1Clone->modify("+7 days");
  301.             $dateCreneau2Brut $dateCreneau2Clone->modify("+12 days");
  302.         } else {
  303.             $dateCreneau1Brut $dateCreneau1Clone->modify("+22 days");
  304.             $dateCreneau2Brut $dateCreneau2Clone->modify("+27 days");
  305.         }
  306.         $dateCreneau1 $dateCreneau1Brut->format('d/m/Y');
  307.         $dateCreneau2 $dateCreneau2Brut->format('d/m/Y');
  308.         if ($form->isSubmitted() && $form->isValid()) {
  309.             $postCommande $_POST['client_final_validate'];
  310.             $etatUs $_POST['input_etat_us'];
  311.             //Client final
  312.             $clientFinal $commande->getClientFinal();
  313.             $clientFinal->setTelephone($postCommande['telephone']);
  314.             if (strlen($postCommande['fullName']) > 70) {
  315.                 $this->addFlash("error"'The fullname is too long');
  316.                 return $this->render('client_final/validate.html.twig', [
  317.                     'commande' => $commande,
  318.                     'form' => $form->createView(),
  319.                     'dateCreneau1' => $dateCreneau1,
  320.                     'dateCreneau2' => $dateCreneau2,
  321.                 ]);
  322.             }
  323.             if (strlen($postCommande['telephone']) > 14) {
  324.                 $this->addFlash("error"'The phone number must be composed of 10 digits.');
  325.                 return $this->render('client_final/validate.html.twig', [
  326.                     'commande' => $commande,
  327.                     'form' => $form->createView(),
  328.                     'dateCreneau1' => $dateCreneau1,
  329.                     'dateCreneau2' => $dateCreneau2,
  330.                 ]);
  331.             }
  332.             $clientFinal->setFullName($postCommande['fullName']);
  333.             // $clientFinal->setPrenom($postCommande['clientFinal']['prenom']);
  334.             // $clientFinal->setNom($postCommande['clientFinal']['nom']);
  335.             $em->persist($clientFinal);
  336.             $em->flush();
  337.             //Commande
  338.             $commande->setCodePostalLivraison(str_replace(' '''$postCommande['codePostalLivraison']));
  339.             $commande->setVilleLivraison(trim($postCommande['villeLivraison']));
  340.             $commande->setAdresseLivraison($postCommande['adresseLivraison']);
  341.             $commande->setComplementAdresseLivraison($postCommande['complementAdresseLivraison']);
  342.             $commande->setEtatUs($etatUs);
  343.             $commande->setProvince($this->utilsService->getProvinceByEtatUs($etatUs));
  344.             //Si le statut de la commande a déjà avancé et que la suite était conditionnée à la validation des infos du client, on passe au state suivant
  345.             if ($commande->getState() == "attente_client") {
  346.                 if ($commande->isEmballageLivraison() == true) {
  347.                     $commande->setState('attente_pec_transporteur');
  348.                 } else {
  349.                     $commande->setState('attente_collecte_mbe');
  350.                 }
  351.             }
  352.             /* $commande->setState($commande->isEmballageLivraison() ? 'valide' : 'emballage'); */
  353.             $commande->setIsValideeParClient(true);
  354.             $em->persist($commande);
  355.             $em->flush();
  356.             $this->addFlash(
  357.                 'info',
  358.                 'Order validated'
  359.             );
  360.             //On redirige direct vers la page "Vos informations ont bien été validées"
  361.             /* return $this->redirectToRoute('default', [], Response::HTTP_SEE_OTHER);  */
  362.             return $this->render('client_final/informations_validees.html.twig');
  363.         }
  364.         return $this->render('client_final/validate.html.twig', [
  365.             'commande' => $commande,
  366.             'form' => $form->createView(),
  367.             'dateCreneau1' => $dateCreneau1,
  368.             'dateCreneau2' => $dateCreneau2,
  369.         ]);
  370.     }
  371.     /**
  372.      * @Route("/updateFirstConnexion", name="update_first_connexion")
  373.      */
  374.     public function updateFirstConnexion(): Response
  375.     {
  376.         $user $this->getUser();
  377.         $em $this->getDoctrine()->getManager();
  378.         $user->setIsFirstConnexion(false);
  379.         $em->persist($user);
  380.         $em->flush();
  381.         return new Response("OK");
  382.     }
  383.     /**
  384.      * @Route("/cron_BJbOT7r0aa/adminEmballages", name="admin_emballages")
  385.      */
  386.     public function adminEmballages(CommandeRepository $commandeRepository): Response
  387.     {
  388.         //On recup la valeur de today
  389.         $jourDebut intval(date("d"));
  390.         $moisDebut intval(date("m"));
  391.         $anneeDebut intval(date("Y"));
  392.         if (intval($moisDebut) == 12) {
  393.             $moisSuivant '01';
  394.             $anneeFin $anneeDebut 1;
  395.         } else {
  396.             $moisSuivant intval($moisDebut) + 1;
  397.             $anneeFin $anneeDebut;
  398.         }
  399.         switch (true) {
  400.             case $jourDebut == 5:
  401.                 $dateFinCreneau strval($anneeDebut) . '-' sprintf('%02d'strval($moisDebut)) . '-' $this->utilsService->getDernierJourMois($moisDebut$anneeDebut);
  402.                 break;
  403.             case $jourDebut == 10:
  404.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-05';
  405.                 break;
  406.             case $jourDebut == 15:
  407.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-10';
  408.                 break;
  409.             case $jourDebut == 20:
  410.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-15';
  411.                 break;
  412.             case $jourDebut == 25:
  413.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-20';
  414.                 break;
  415.             case $jourDebut == 30:
  416.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-25';
  417.                 break;
  418.             default:
  419.                 $dateFinCreneau '';
  420.                 break;
  421.         }
  422.         //If today ne correspond pas aux jours, on ne lance pas le script 
  423.         if ($dateFinCreneau != '') {
  424.             $commandes $commandeRepository->findCommandesAEmballerParCreneau($dateFinCreneau);
  425.             if ($commandes) {
  426.                 $res $this->emailGeneratorService->sendEmailPrepareEmballage($commandes);
  427.                 if ($res) {
  428.                     return new Response("OK");
  429.                 } else {
  430.                     return new Response("ErreurMail");
  431.                 }
  432.                 exit();
  433.             }
  434.             return new Response("Pas d'\'envoi ce jour");
  435.             die();
  436.         }
  437.         return new Response("Pas d'\'envoi ce jour");
  438.         die();
  439.     }
  440.     /**
  441.      * @Route("/cron_BJbOT7r0aa/preparationColisCavistes", name="preparation_colis_cavistes")
  442.      */
  443.     public function preparationColisCavistes(ClientRepository $clientRepositoryCommandeRepository $commandeRepository): Response
  444.     {
  445.         //On recup la valeur de today
  446.         $jourDebut intval(date("d"));
  447.         $moisDebut intval(date("m"));
  448.         $anneeDebut intval(date("Y"));
  449.         if (intval($moisDebut) == 12) {
  450.             $moisSuivant '01';
  451.             $anneeFin $anneeDebut 1;
  452.         } else {
  453.             $moisSuivant intval($moisDebut) + 1;
  454.             $anneeFin $anneeDebut;
  455.         }
  456.         switch (true) {
  457.             case $jourDebut == 5:
  458.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisDebut)) . '-25';
  459.                 break;
  460.             case $jourDebut == 10:
  461.                 $dateFinCreneau strval($anneeDebut) . '-' sprintf('%02d'strval($moisDebut)) . '-' $this->utilsService->getDernierJourMois($moisDebut$anneeDebut);
  462.                 break;
  463.             case $jourDebut == 15:
  464.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-05';
  465.                 break;
  466.             case $jourDebut == 20:
  467.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-10';
  468.                 break;
  469.             case $jourDebut == 25:
  470.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-15';
  471.                 break;
  472.             case $jourDebut == 30:
  473.                 $dateFinCreneau strval($anneeFin) . '-' sprintf('%02d'strval($moisSuivant)) . '-20';
  474.                 break;
  475.             default:
  476.                 $dateFinCreneau '';
  477.                 break;
  478.         }
  479.         //If today ne correspond pas aux jours, on ne lance pas le script 
  480.         if ($dateFinCreneau != '') {
  481.             $clients $clientRepository->findAll();
  482.             $mailsEnvoyes = [];
  483.             $mailsErreur = [];
  484.             foreach ($clients as $key => $client) {
  485.                 //Pour chaque client, on recherche si il a des commandes à envoyer avant la date de fin
  486.                 $commandes $commandeRepository->findCommandesAEnvoyerCaviste($dateFinCreneau$client);
  487.                 if ($commandes) {
  488.                     $res $this->emailGeneratorService->sendEmailPrepareCommandesCaviste($client$commandes);
  489.                     if ($res) {
  490.                         $mailsEnvoyes[] = $client->getId();
  491.                     } else {
  492.                         $mailsErreur[] = $client->getId();
  493.                     }
  494.                 }
  495.             }
  496.             if ($mailsErreur) {
  497.                 $response = new Response();
  498.                 $response->setContent(json_encode([
  499.                     '$mailsErreur' => $mailsErreur,
  500.                 ]));
  501.                 $response->headers->set('Content-Type''application/json');
  502.                 return $response;
  503.             }
  504.             return new Response("OK");
  505.             exit();
  506.         }
  507.         return new Response("Pas d'\'envoi ce jour");
  508.         die();
  509.     }
  510.     private function getTNTSearchConfiguration()
  511.     {
  512.         $databaseURL $_ENV['DATABASE_URL'];
  513.         $databaseParameters parse_url($databaseURL);
  514.         $config = [
  515.             'driver'    => $databaseParameters["scheme"],
  516.             'host'      => $databaseParameters["host"],
  517.             'database'  => str_replace("/"""$databaseParameters["path"]),
  518.             'username'  => $databaseParameters["user"],
  519.             'password'  => $databaseParameters["pass"],
  520.             'storage'   => $this->fuzzy_storage '/fuzzy_storage_aeZAdJfvVpgZGTvh/',
  521.             'stemmer'   => \TeamTNT\TNTSearch\Stemmer\PorterStemmer::class
  522.         ];
  523.         return $config;
  524.     }
  525.     /**
  526.      * @Route("/generate-index_AiNnDiIPx7C9ZcWmoiO4", name="app_generate-index")
  527.      */
  528.     public function generate_index(): JsonResponse
  529.     {
  530.         $tnt = new TNTSearch;
  531.         // Obtain and load the configuration that can be generated with the previous described method
  532.         $configuration $this->getTNTSearchConfiguration();
  533.         $tnt->loadConfig($configuration);
  534.         $indexerCommande $tnt->createIndex('commande.index');
  535.         $indexerCommande->query('SELECT id, numero_facture, code_postal_livraison, ville_livraison, tracking_number FROM commande');
  536.         $indexerCommande->run();
  537.         $indexerClientFinal $tnt->createIndex('clientFinal.index');
  538.         $indexerClientFinal->query('SELECT id, full_name FROM client_final');
  539.         $indexerClientFinal->run();
  540.         $indexerClient $tnt->createIndex('client.index');
  541.         $indexerClient->query('SELECT id, raison_sociale FROM client');
  542.         $indexerClient->run();
  543.         return new JsonResponse('done');
  544.     }
  545.     /**
  546.      * @route("/fedexTest", name="instable")
  547.      */
  548.     public function cancelFedex()
  549.     {
  550.         $trackingNumber '773704227696';
  551.         $fedexEndpoint 'https://apis.fedex.com/ship/v1/shipments/cancel';
  552.         $payload '{
  553.             "trackingNumber": " ' $trackingNumber ' ",
  554.             "senderCountryCode": "FR",
  555.             "deletionControl": "DELETE_ALL_PACKAGES",
  556.             "accountNumber": {
  557.                 "value": "782780123"
  558.             }
  559.         }';
  560.         $curl curl_init();
  561.         curl_setopt_array($curl, array(
  562.             CURLOPT_URL => $fedexEndpoint,
  563.             CURLOPT_RETURNTRANSFER => true,
  564.             CURLOPT_ENCODING => '',
  565.             CURLOPT_MAXREDIRS => 10,
  566.             CURLOPT_TIMEOUT => 0,
  567.             CURLOPT_FOLLOWLOCATION => true,
  568.             CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  569.             CURLOPT_CUSTOMREQUEST => 'PUT',
  570.             CURLOPT_POSTFIELDS => $payload,
  571.             CURLOPT_HTTPHEADER => array(
  572.                 'x-customer-transaction-id: 624deea6-b709-470c-8c39-4b5511281492',
  573.                 'x-locale: en_US',
  574.                 'Content-Type: application/json',
  575.                 'Authorization: Bearer ' $this->getFedexToken()
  576.             ),
  577.         ));
  578.         $response curl_exec($curl);
  579.         $json json_decode($responsetrue);
  580.         var_dump($response);
  581.     }
  582.     public function getFedexToken()
  583.     {
  584.         $url "https://apis.fedex.com/oauth/token";
  585.         $payload "grant_type=client_credentials&client_id=l7c771e0d2fd444799b4ce63c4ccd10032&client_secret=7dacb43d3ecc4d239d27236f37a39075";
  586.         $ch curl_init($url);
  587.         curl_setopt($chCURLOPT_POST1);
  588.         curl_setopt($chCURLOPT_POSTFIELDS$payload);
  589.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  590.         $response curl_exec($ch);
  591.         $json json_decode($responsetrue);
  592.         curl_close($ch);
  593.         return $json['access_token'];
  594.     }
  595.     /**
  596.      * @route("/recapFedex_zS4DvryqHjVQdXCeRsgpP5JWc9tKn32Af8bLxE7B", name="recapFedex")
  597.      */
  598.     public function testDateCondition(CommandeRepository $commandeRepository): JsonResponse
  599.     {
  600.         $currentDayOfWeek date("w");
  601.         if ($currentDayOfWeek == || $currentDayOfWeek == 6) {
  602.             return new JsonResponse('ok');
  603.         }
  604.         // Iterate over the next seven days
  605.         for ($i 0$i 9$i++) {
  606.             if (intval(date('w'strtotime("+$i days"))) != && intval(date('w'strtotime("+$i days"))) != 0) {
  607.                 $dayName date("D"strtotime("+$i days"));
  608.                 switch ($dayName) {
  609.                     case 'Mon':
  610.                         $day 'Lundi';
  611.                         break;
  612.                     case 'Tue':
  613.                         $day 'Mardi';
  614.                         break;
  615.                     case 'Wed':
  616.                         $day 'Mercredi';
  617.                         break;
  618.                     case 'Thu':
  619.                         $day 'Jeudi';
  620.                         break;
  621.                     case 'Fri':
  622.                         $day 'Vendredi';
  623.                         break;
  624.                     default:
  625.                         $day '';
  626.                         break;
  627.                 }
  628.                 $mmddyyyyValue date("Y-m-d"strtotime("+$i days"));
  629.                 $days[] = array('name' => $day'mmddyyyy' => $mmddyyyyValue);
  630.             }
  631.         }
  632.         $daysInfo = [];
  633.         for ($i 0$i 5$i++) {
  634.             $datas $commandeRepository->findBy([
  635.                 'dateCollecte' => new DateTime($days[$i]['mmddyyyy']),
  636.                 'fedexPdfAvailable' => '0',
  637.                 'state' => 'attente_pec_transporteur'
  638.             ]);
  639.             $x 0;
  640.             foreach ($datas as $data) {
  641.                 $x++;
  642.             }
  643.             $daysInfo[] = array('dayDate' => $days[$i]['mmddyyyy'], 'dayName' => $days[$i]['name'], 'total' => $x);
  644.         }
  645.         $this->emailGeneratorService->sendFedexRecap($daysInfo);
  646.         return new JsonResponse('ok');
  647.     } 
  648.     /**
  649.      * @Route("/updatepresta", name="update_presta", methods={"POST", "GET"})
  650.      */
  651.     public function updatepresta(Request $requestEntityManagerInterface $emClientRepository $clientRepoMBEClient $mbe): JsonResponse
  652.     {
  653.         // paramètres à définir selon tes besoins
  654.         $internalReferenceID uniqid(); // identifiant unique de ta requête
  655.         $dateFrom '2023-01-01'// Date de début
  656.         $dateTo   date('Y-m-d'); // Date de fin (aujourd’hui par exemple)
  657.         $page     1// Première page
  658.         $toBeClosed null// true ou false, si tu veux filtrer
  659.         $departmentID null// Si nécessaire
  660.         // Appel à la méthode
  661.         $response $mbe->getShipmentsList(
  662.             $internalReferenceID,
  663.             $dateFrom,
  664.             $dateTo,
  665.             $page,
  666.             $toBeClosed,
  667.             $departmentID
  668.         );
  669.         // Supposons que $json contient la réponse de getShipmentsList
  670.         $shipments $response->ShipmentsFullInfo->ShipmentFullInfo// tableau d'expés
  671.         echo '<pre>';
  672.         foreach ($shipments as $shipment) {
  673.             // Récupérer la référence interne
  674.             $reference null;
  675.             $reference $shipment->ShipmentInfo->Referring ?? null;
  676.             
  677.             // On récupère le tracking MBE principal
  678.             $trackingMBE null;
  679.             if (isset($shipment->TrackingInfo->MasterTrackingMBE)) {
  680.                 $trackingMBE $shipment->TrackingInfo->MasterTrackingMBE;
  681.             } elseif (isset($shipment->TrackingInfo->TrackingsMBE->TrackingMBE)) {
  682.                 $trackingMBE $shipment->TrackingInfo->TrackingsMBE->TrackingMBE;
  683.             }
  684.             // On saute s'il n'y a pas de tracking
  685.             if (!$trackingMBE) continue;
  686.             // L'identifiant interne (peut être utilisé pour l'appel tracking)
  687.             $internalReferenceID $response->InternalReferenceID ?? uniqid();
  688.             // Appel à la méthode de tracking (ton wrapper PHP)
  689.             $trackingResponse $mbe->Tracking($internalReferenceID$trackingMBE);
  690.             $statut null;
  691.             if (isset($trackingResponse->TrackingStatus)) {
  692.                 $statut $trackingResponse->TrackingStatus;
  693.             } elseif (isset($trackingResponse->RequestContainer->TrackingStatus)) {
  694.                 $statut $trackingResponse->RequestContainer->TrackingStatus;
  695.             }
  696.             if($statut != null){
  697.                 
  698.                 if($statut == "WAITING_DELIVERY"){
  699.                                         
  700.                     
  701.                     if($reference != null && $reference != "0"){                        
  702.                         $host $_ENV['PRESTA_DB_HOST'] ?? getenv('PRESTA_DB_HOST');
  703.                         $db $_ENV['PRESTA_DB_NAME'] ?? getenv('PRESTA_DB_NAME');
  704.                         $user $_ENV['PRESTA_DB_USER'] ?? getenv('PRESTA_DB_USER');
  705.                         $pass $_ENV['PRESTA_DB_PASSWORD'] ?? getenv('PRESTA_DB_PASSWORD');
  706.                         $port $_ENV['PRESTA_DB_PORT'] ?? getenv('PRESTA_DB_PORT');
  707.     
  708.                         $charset 'utf8mb4';
  709.     
  710.                         $dsn "mysql:host=$host;dbname=$db;charset=$charset";
  711.     
  712.                         try {
  713.                             $pdoPresta = new PDO($dsn$user$pass, [
  714.                                 PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
  715.                                 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  716.                                 PDO::ATTR_EMULATE_PREPARES   => false,
  717.                             ]);
  718.     
  719.                             $stmt2 $pdoPresta->prepare("
  720.                                 UPDATE mbe_orders SET current_state = :new_state WHERE id_order = :id_order
  721.                             ");
  722.                             $save $stmt2->execute([
  723.                                 'new_state' => 4,
  724.                                 'id_order' => $reference,
  725.                             ]);
  726.                             $stmt3 $pdoPresta->prepare("
  727.                                 INSERT INTO mbe_order_history (id_employee, id_order, id_order_state, date_add)
  728.                                 VALUES (:id_employee, :id_order, :id_order_state, NOW())
  729.                             ");
  730.                             $stmt3->execute([
  731.                                 'id_employee'     => 0,
  732.                                 'id_order'        => $reference,
  733.                                 'id_order_state'  => 
  734.                             ]);                            
  735.     
  736.                         } catch (\PDOException $e) {
  737.                             throw new \RuntimeException('Erreur de connexion à la base Prestashop : ' $e->getMessage());
  738.                         } 
  739.                     }
  740.                 }
  741.             }
  742.             
  743.         }
  744.         echo '</pre>';
  745.         exit();
  746.     }
  747. }