src/Controller/PageController.php line 156

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\AifredRestaurants;
  4. use App\Entity\GiftCards;
  5. use App\Entity\QrRedirection;
  6. use App\Entity\User;
  7. use App\Entity\UserRestaurant;
  8. use App\Repository\RestaurantsRepository;
  9. use App\Services\EventLog;
  10. use App\Services\Postgre;
  11. use DateTime;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Dompdf\Dompdf;
  14. use Dompdf\Options;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\Security\Core\Security;
  22. use App\Repository\UserRepository;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpKernel\HttpKernelInterface;
  25. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  26. use Symfony\Component\Validator\Constraints\Date;
  27. class PageController extends AbstractController
  28. {
  29.     private $user;
  30.     private $user_vendor;
  31.     private $userCurrent;
  32.     private $user_vendors=[];
  33.     private $urid_selected="";
  34.     private $user_restaurants=[];
  35.     private $user_restaurant=[];
  36.     private $nav=[];
  37.     /**
  38.      * PageController constructor.
  39.      * @param Security $security
  40.      * @param UserRepository $userRepository
  41.      * @param Postgre $postgre
  42.      */
  43.     public function __construct(Security $security,  EntityManagerInterface $em){
  44.         $this->user $security->getUser();
  45.         
  46.         $this->userCurrent =  $this->user ;
  47.       //  dd($this->user);
  48.         //  $this->user =  $this->getDoctrine()->getRepository(User::class)->find($securityUser->id);
  49.         if (!is_null($this->user)) {
  50.             // recuperer les userRestaurant par order de num_order ou id
  51.             $this->userCurrent $this->user;
  52.             if(in_array(User::ROLE_ADMIN,$this->user->getRoles())){
  53.                 $this->userCurrent =$em->getRepository(User::class)->find($this->userCurrent->getUserId());
  54.             }
  55.             $UserRestaurants =  $em->getRepository(UserRestaurant::class)->findBy(['user'=>$this->userCurrent],["num_order"=>"ASC","id"=>"ASC"]);
  56.             //recuperation de tous les restaurants associer (aifred ou corporate)
  57.             $this->user_restaurants=[];
  58.             foreach (  $UserRestaurants as  $uResto){
  59.                 $key $uResto->getId();
  60.                 $this->user_restaurants[$key]["id"]=$uResto->getId();
  61.                 $this->user_restaurants[$key]["corporate"]=[];
  62.                 $this->user_restaurants[$key]["michelin"]=[];
  63.                 $this->user_restaurants[$key]["user"]["name"]=$uResto->getUser()->getEmail();
  64.                 $this->user_restaurants[$key]["user"]["ur_id"]=$uResto->getUser()->getUrId();
  65.                 if(!is_null($uResto->getRestaurant())){
  66.                     $this->user_restaurants[$key]["corporate"]["name"]=$uResto->getRestaurant()->getName();
  67.                     $this->user_restaurants[$key]["corporate"]["prefix"]=$uResto->getRestaurant()->getShopCode();
  68.                     $this->user_restaurants[$key]["corporate"]["vendor"]=$uResto->getRestaurant()->getShopifyVendorName();
  69.                     $this->user_restaurants[$key]["corporate"]["id"]=$uResto->getRestaurant()->getId();
  70.                     $this->user_restaurants[$key]["corporate"]["city"]=$uResto->getRestaurant()->getCity();
  71.                     $this->user_restaurants[$key]["corporate"]["report"]=''// que sur aifred_restaurant
  72.                 }
  73.                 if(!is_null($uResto->getAiRestaurant())){
  74.                     $this->user_restaurants[$key]["michelin"]["name"]=$uResto->getAiRestaurant()->getName();
  75.                     $this->user_restaurants[$key]["michelin"]["prefix"]=$uResto->getAiRestaurant()->getTrigram();
  76.                     $this->user_restaurants[$key]["michelin"]["vendor"]=$uResto->getAiRestaurant()->getShopifyVendor();
  77.                     $this->user_restaurants[$key]["michelin"]["id"]=$uResto->getAiRestaurant()->getId();
  78.                     $this->user_restaurants[$key]["michelin"]["city"]=$uResto->getAiRestaurant()->getCity();
  79.                     $this->user_restaurants[$key]["michelin"]["report"]=$uResto->getAiRestaurant()->getLookerStudioUrl();
  80.                     $this->user_restaurants[$key]["michelin"]["typeform_password"]=$uResto->getAiRestaurant()->getTypeformPassword();
  81.                 }
  82.             }
  83.             //   dd($UserRestaurants,$this->user_restaurants);
  84.             if ($this->user == "NULL") {
  85.                 return $this->redirectToRoute("app_login");
  86.             }
  87.             $UserRestaurants  =  $this->user_restaurants ;
  88.             $UserRestaurant  =  array_shift($this->user_restaurants) ;
  89.             $urid_selected =  $UserRestaurant["id"]??null;
  90.             if(null !== $this->user->getUrId()){
  91.                 $urid_selected $this->user->getUrId();
  92.                 $UserRestaurant  $UserRestaurants[$this->user->getUrId()] ;
  93.             }
  94.             /*
  95.                    dd([
  96.                        'userCurrent'=>$this->userCurrent->getUrId(),
  97.                        'user'=>$this->user->getUrId(),
  98.                        '$UserRestaurant'=>$UserRestaurant,
  99.                        'UserRestaurants'=>$UserRestaurants
  100.                    ]);
  101.             */
  102.             $this->user_restaurant $UserRestaurant;
  103.             if(null !== $UserRestaurant ){
  104.                 $vendor_name = !empty($UserRestaurant["michelin"])?$UserRestaurant["michelin"]["name"] :$UserRestaurant["corporate"]["name"];
  105.                 $vendor_city = !empty($UserRestaurant["michelin"])?$UserRestaurant["michelin"]["city"] :$UserRestaurant["corporate"]["city"];
  106.                 $vendor_prefix $UserRestaurant["michelin"] ? $UserRestaurant["michelin"]['prefix']:$UserRestaurant["corporate"]['prefix'];
  107.             }else{
  108.                 $vendor_name $this->user->getUsername();
  109.                 $vendor_city ="";
  110.                 $vendor_prefix ="";
  111.             }
  112.             // $vendorsCurrent  = $this->user->getShopifyVendorName();
  113.             //$resultStripe = $postgre->query("SELECT stripe_connect_account_id FROM restaurants WHERE shopify_vendor_name='".str_replace("'","''",$this->user_vendor)."'");
  114.             // $resultStripe =[];
  115.             $this->nav = [
  116.                 'user_restaurants' =>  $UserRestaurants,
  117.                 'user_restaurant' =>    $UserRestaurant,
  118.                 'urid_selected' =>    $urid_selected,
  119.                 'vendor_name' =>    $vendor_name,
  120.                 'vendor_city' =>    $vendor_city,
  121.                 'prefix' =>$vendor_prefix,
  122.                 //  'stripe_id' =>   (!empty($resultStripe[0]) ?$resultStripe[0]["stripe_connect_account_id"]:""),
  123.                 'user' => $this->user,
  124.                 'userCurrent' => $this->userCurrent
  125.             ];
  126.         }
  127.         $this->em $em;
  128.         //instance
  129.        // $this->EventLog = new EventLog($em, $this->user );
  130.     }
  131.     public function renderHtml($view$params=[]){
  132.         $params array_merge($params,$this->nav);
  133.         return $this->render($view$params);
  134.     }
  135.     /**
  136.      * @Route("/", name="home")
  137.      * @param UserRepository $userRepository
  138.      * @param Postgre $postgre
  139.      * @return Response
  140.      */
  141.     public function index(UserRepository $userRepository)
  142.     {
  143.         $members=[];
  144.         if(in_array(User::ROLE_ADMIN,$this->user->getRoles())) {
  145.             // $members = $this->em->getRepository(User::class)->findAllByMemberUR();
  146.             //   $members = $this->em->getRepository(User::class)->findUsersWithRestaurants();
  147.             $members $this->em->getRepository(User::class)->findEmailsGroupedByRestaurant();
  148.         }
  149.         $vendors $userRepository->getVendors();
  150.         return $this->renderHtml('page/index.html.twig', [
  151.             'members' =>   $members,
  152.             'vendors' =>   $vendors,
  153.             'user' => $this->user
  154.         ]);
  155.         //  }
  156.         //return $this->renderHtml('page/stats.html.twig');
  157.     }
  158.     /**
  159.      * @Route("/gestion-des-comptes", name="manage_users")
  160.      */
  161.     public function manage_users(UserRepository $membresEntity):Response
  162.     {
  163.         if (!isset($this->user) || empty($this->user)) {
  164.             return $this->redirectToRoute("app_login");
  165.         }
  166.         if(!in_array(User::ROLE_DEV,$this->user->getRoles())){
  167.             return $this->redirectToRoute("home");
  168.         }
  169.         //recuperer les users
  170.         $membres $membresEntity->findBy(array(), array('id' => 'DESC'));
  171.         return $this->renderHtml('page/members.html.twig', [
  172.             'members' => $membres,
  173.             'user' => $this->user
  174.         ]);
  175.     }
  176.     /**
  177.      * @Route("/gestion-des-comptes/{action}/{id?}", name="manage_user")
  178.      */
  179.     public function manage_user(string $actionUser $membreEntity=null):Response
  180.     {
  181.         //edit , add, delete
  182.         if (!isset($this->user) || empty($this->user)) {
  183.             return $this->redirectToRoute("app_login");
  184.         }
  185.         if(!in_array(User::ROLE_DEV,$this->user->getRoles())){
  186.             return $this->redirectToRoute("home");
  187.         }
  188.         $url="";
  189.         $is_url=false;
  190.         if($membreEntity !==null && $membreEntity->getToken()!==null){
  191.             $url=  $this->generateUrl('resetting', ['id' => $membreEntity->getId(), 'token' => $membreEntity->getToken()],  UrlGeneratorInterface::ABSOLUTE_URL);
  192.             $is_url=ResettingController::isRequestInTime($membreEntity->getPasswordRequestedAt());
  193.         }
  194.         return $this->renderHtml('page/member.html.twig', [
  195.             'member' => $membreEntity,
  196.             'url'=>$url,
  197.             'is_url'=> $is_url ,
  198.             'action'=>$action,
  199.             'user' => $this->user
  200.         ]);
  201.     }
  202.     /**
  203.      * @Route("/user/saving", name="update_user")
  204.      */
  205.     public function update_user(Request $request):RedirectResponse{
  206.         if (!isset($this->user) || empty($this->user)) {
  207.             return $this->redirectToRoute("app_login");
  208.         }
  209.         $formDatas $request->request->all();
  210.         $formDatas["vendor"] = join("|",$formDatas["vendors"]);
  211.         unset( $formDatas["vendors"]);
  212.         if( $formDatas["password"]===""){
  213.             unset( $formDatas["password"]);
  214.         }
  215.         $formDatas["save"]=true;
  216.         $rep $this->controllerApiTiptoque('postRegister', [], json_encode(["user"=>$formDatas]));
  217.         // dd( json_encode(["user"=>$formDatas]),$rep);
  218.         if(isset($rep['user']['id'])){
  219.             return $this->redirectToRoute("manage_user",['action'=>'edit','id'=>$rep['user']['id']]);
  220.         }else{
  221.             return $this->redirectToRoute("manage_users");
  222.         }
  223.     }
  224.     /**
  225.      * @Route("/rapport", name="rapport_seo")
  226.      */
  227.     public function rapport_seo(SessionInterface $session,Request $request):Response
  228.     {
  229.         if (!isset($this->user) || empty($this->user)) {
  230.             return $this->redirectToRoute("app_login");
  231.         }
  232.         $choices_date $session->get("choices_date"'last_30_days');
  233.         $mode_display $session->get("mode_display""STANDARD");
  234.         $formDatas $request->request->all();
  235.         if(isset($formDatas["format_date"]) &&  $formDatas["format_date"]!==""){
  236.             $choices_date $formDatas["format_date"];
  237.         }
  238.         
  239.         if(isset($formDatas["mode_display"])){
  240.             $mode_display $formDatas["mode_display"]; 
  241.             // ALL_GIFTCARD , STANDARD ou DEBUG
  242.         }
  243.         $session->set("choices_date"$choices_date);
  244.         $session->set("mode_display"$mode_display);
  245.         $now = new DateTime();
  246.         switch ($choices_date){
  247.             case "now":
  248.                 $date_start $now->format('Y-m-d 00:00:00');
  249.                 $date_end $now->format('Y-m-d 23:59:59');
  250.                 break;
  251.             case "yesterday":
  252.                 $yesterday $now->modify('-1 day');
  253.                 $date_start $yesterday->format('Y-m-d 00:00:00');
  254.                 $date_end $yesterday->format('Y-m-d 23:59:59');
  255.                 break;
  256.             case "last_30_days":
  257.                 $date_end =  $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
  258.                 $date_start $now->modify('-30 days')->format('Y-m-d 00:00:00');
  259.                 break;
  260.             case "last_12_months":
  261.                 $date_end =  $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
  262.                 $date_start $now->modify('-12 months')->format('Y-m-d 00:00:00');
  263.                 break;
  264.                 
  265.             case "last_24_months":
  266.                 $date_end =  $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
  267.                 $date_start $now->modify('-24 months')->format('Y-m-d 00:00:00');
  268.                 break;
  269.             default:
  270.                 // Valeurs par défaut si aucune correspondance
  271.                 $date_start $now->format('Y-m-d 00:00:00');
  272.                 $date_end $now->format('Y-m-d 23:59:59');
  273.                 break;
  274.         }
  275.         $restaurant_id =  isset( $this->user_restaurant["corporate"]['id']) ?$this->user_restaurant["corporate"]['id'] : null;
  276.         $airestaurant_id =  isset( $this->user_restaurant["michelin"]['id']) ?$this->user_restaurant["michelin"]['id'] : null;
  277.         if(in_array(User::ROLE_ALL_GIFTCARD ,$this->user->getRoles() ) && !in_array(User::ROLE_ADMIN ,$this->user->getRoles() )){
  278.             $mode_display "ALL_GIFTCARD";
  279.         }
  280.        // dd( $mode_display);
  281.         $giftCards $this->em->getRepository(GiftCards::class)->getGiftCardTransactions(
  282.             $restaurant_id,$airestaurant_id,
  283.             $date_start,$date_end,$mode_display);
  284.           
  285.         /*
  286.         $userRestaurant = $this->em->getRepository(UserRestaurant::class)->findBy(['user'=>$this->user]);
  287.         ancienne version avec le iframe par looker studioUrl
  288.         $lookerStudioUrl ="";
  289.         if(!empty($userRestaurant)){
  290.             $lookerStudioUrl = $this->user_restaurant["michelin"]["report"];
  291.         }
  292.            
  293.         */
  294.         //recuperer les giftcards avec 2 tables
  295.            // dd($this->userCurrent);
  296.         //ou trouver le rapport ....
  297.         return $this->renderHtml('page/rapport.html.twig', [
  298.             "giftCards"=>$giftCards,
  299.             "choices_date"=>$choices_date,
  300.             "mode_display"=>$mode_display
  301.         ]);
  302.     }
  303.     /**
  304.      * @Route("/rapport/pdf/{order_id}", name="invoice_pdf")
  305.      */
  306.     public function invoice_pdf(string $order_id):Response{
  307.         if (!isset($this->user) || empty($this->user)) {
  308.             return $this->redirectToRoute("app_login");
  309.         }
  310.         // verifier si l invoice est que pour ce user
  311.         // Exemple de données pour la facture
  312.         $invoiceData = [
  313.             'id' => $order_id,
  314.             'date' => (new \DateTime())->format('Y-m-d'),
  315.             'customer' => 'John Doe',
  316.             'items' => [
  317.                 ['description' => 'Produit A''quantity' => 2'price' => 50],
  318.                 ['description' => 'Produit B''quantity' => 1'price' => 100],
  319.             ],
  320.             'total' => 200,
  321.         ];
  322.         // Options de configuration pour Dompdf
  323.         $options = new Options();
  324.         $options->set('defaultFont''Arial');
  325.         $dompdf = new Dompdf($options);
  326.         // Génération du contenu HTML pour le PDF
  327.         $html $this->render('pdf/invoice.html.twig', [
  328.             'invoice' => $invoiceData,
  329.         ]);
  330.         // Charger le HTML dans Dompdf
  331.         $dompdf->loadHtml($html);
  332.         // (Optionnel) Définir la taille et l'orientation de la page
  333.         $dompdf->setPaper('A4''portrait');
  334.         // Générer le PDF
  335.         $dompdf->render();
  336.         // Créer une réponse HTTP avec le contenu du PDF
  337.         return new Response(
  338.             $dompdf->output(),
  339.             200,
  340.             [
  341.                 'Content-Type' => 'application/pdf',
  342.                 'Content-Disposition' => 'inline; filename="invoice_' $order_id '.pdf"',
  343.             ]
  344.         );
  345.     }
  346.     /**
  347.      * @Route("/rapport/csv", name="rapport_csv")
  348.      */
  349.     public function rapport_csv(SessionInterface $session):Response{
  350.         if (!isset($this->user) || empty($this->user)) {
  351.             return $this->redirectToRoute("app_login");
  352.         }
  353.         $choices_date $session->get("choices_date"'last_12_days');
  354.         $mode_display $session->get("mode_display""STANDARD");
  355.         $now = new DateTime();
  356.         switch ($choices_date){
  357.             case "now":
  358.                 $date_start $now->format('Y-m-d 00:00:00');
  359.                 $date_end $now->format('Y-m-d 23:59:59');
  360.                 $title_csv $now->format('Y-m-d');
  361.                 break;
  362.             case "yesterday":
  363.                 $yesterday $now->modify('-1 day');
  364.                 $date_start $yesterday->format('Y-m-d 00:00:00');
  365.                 $date_end $yesterday->format('Y-m-d 23:59:59');
  366.                 $title_csv $now->format('Y-m-d');
  367.                 break;
  368.             case "last_30_days":
  369.                 $date_end $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
  370.                 $title_csv $now->format('Y-m-d');
  371.                 $date_start $now->modify('-30 days')->format('Y-m-d 00:00:00');
  372.                 $title_csv .="_".$now->format('Y-m-d');
  373.                 break;
  374.             case "last_12_months":
  375.                 $date_end =  $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
  376.                 $title_csv $now->format('Y-m-d');
  377.                 $date_start $now->modify('-12 months')->format('Y-m-d 00:00:00');
  378.                 $title_csv .= "_".$now->format('Y-m-d');
  379.                 break;
  380.                 case "last_24_months":
  381.                     $date_end =  $now->format('Y-m-d h:i:s'); // Revenir à aujourd'hui pour la fin
  382.                     $title_csv $now->format('Y-m-d');
  383.                     $date_start $now->modify('-24 months')->format('Y-m-d 00:00:00');
  384.                     $title_csv .= "_".$now->format('Y-m-d');
  385.                 break;
  386.             default:
  387.                 // Valeurs par défaut si aucune correspondance
  388.                 $date_start $now->format('Y-m-d 00:00:00');
  389.                 $date_end $now->format('Y-m-d 23:59:59');
  390.                 break;
  391.         }
  392.         
  393.         if(in_array(User::ROLE_ALL_GIFTCARD ,$this->user->getRoles() )){
  394.             $mode_display "ALL_GIFTCARD";
  395.         }
  396.         $restaurant_id =  isset( $this->user_restaurant["corporate"]['id']) ?$this->user_restaurant["corporate"]['id'] : null;
  397.         $airestaurant_id =  isset( $this->user_restaurant["michelin"]['id']) ?$this->user_restaurant["michelin"]['id'] : null;
  398.         $giftCards $this->em->getRepository(GiftCards::class)->getGiftCardTransactions(
  399.             $restaurant_id,$airestaurant_id,
  400.             $date_start,$date_end$mode_display);
  401.         $data=[
  402.             ["Date""N° de commande""Code de la carte""Montant""Date de règlement""Statut du règlement"]
  403.         ];
  404.         foreach ($giftCards as $giftCard){
  405.             $dateTransaction = new DateTime($giftCard['transaction_date']);
  406.             $dateCreation = new DateTime($giftCard['creation_date']);
  407.             array_push($data,[
  408.                 $mode_display == "STANDARD" ?$dateTransaction->format('d/m/Y'):$dateCreation->format('d/m/Y')
  409.                 ,
  410.                 $giftCard['orders_name'],
  411.                 $giftCard['code'],
  412.                 $giftCard['original_balance'],
  413.                 $giftCard['transaction_id'] ==''  ?"":$dateTransaction->format('d/m/Y'),
  414.                 $giftCard['transaction_id'] =='' ?"non utilisé":"payé"
  415.             ]);
  416.         }
  417.         // Génération du contenu CSV
  418.         $csvContent $this->generateCsv($data);
  419.         // Création d'une réponse HTTP pour le téléchargement du fichier
  420.         $response = new Response($csvContent);
  421.         // Configuration des en-têtes pour le fichier CSV
  422.         $response->headers->set('Content-Type''text/csv; charset=UTF-8');
  423.         $response->headers->set('Content-Disposition''attachment; filename="rapport_' $title_csv '.csv"');
  424.         return $response;
  425.     }
  426.     /**
  427.      * Génère le contenu CSV à partir d'un tableau de données
  428.      */
  429.     private function generateCsv(array $data): string
  430.     {
  431.         // Utilisation de la fonction PHP output buffering pour générer le CSV
  432.         ob_start();
  433.         $output fopen('php://output''w');
  434.         foreach ($data as $row) {
  435.             fputcsv($output$row);
  436.         }
  437.         fclose($output);
  438.         return ob_get_clean();
  439.     }
  440.     /**
  441.      * @Route("/carte_cadeau", name="gift_card")
  442.      */
  443.     public function gift_card(Request $request):Response
  444.     {
  445.         if (empty($this->user)) {
  446.             return $this->redirectToRoute("app_login");
  447.         }
  448.         //  $userCurrent = $this->em->getRepository(UserRestaurant::class)->findBy(["user"=>$this->user]);
  449.         $giftcard=[];
  450.         if($request->getMethod()=="POST"){
  451.             // cree l url du typeform dans qr_redirection
  452.             $code $request->request->get("code");
  453.             $code trim($code);
  454.             if($code !==''){
  455.                 /** @var GiftCards[] $giftcards */
  456.                 $giftcards $this->em->getRepository(GiftCards::class)->findBy(['code'=>$code]);
  457.                 $giftcard=   $giftcards[0]??[];
  458.                 if($giftcard!==[]){
  459.                     $shopCode $giftcard->getShopCode();
  460.                     if($shopCode==="CCT"){
  461.                         $shopCode $shopCode.'_LOGGED';
  462.                     }
  463.                     $qrRedir $this->em->getRepository(QrRedirection::class)->find('GCA'.$shopCode);
  464.                     $gcaUrl $qrRedir->getTarget();
  465.                     /*
  466.                     https://tiptoque.typeform.com/to/x9iRwMho#num_carte_cadeau=FAH_6148510482774_0
  467.                     &solde_restant=362
  468.                     &vendor=Chef Kelly Rangama
  469.                     &restaurant=Faham
  470.                     &expiration=Non
  471.                     &date_expiration=04/07/2025
  472.                     &prid=1670321471830
  473.                     &nomcarte=Menu Insulaire (4 séquences) - accords mets et vins
  474.                   
  475.                     erreur
  476.                     https://tiptoque.typeform.com/to/ToCWEu4A#
  477.                     num_carte_cadeau=LODASROUEN_11411244286336_0
  478.                     &amp;solde_restant=190
  479.                     &amp;vendor=Restaurant L Odas - Rouen
  480.                     &amp;restaurant=L'Odas&amp;expiration=Non
  481.                     &amp;date_expiration=05/01/2026
  482.                     &amp;prid=14957864550784
  483.                     &amp;nomcarte=DE L’ODAS EN 5 SERVICES - 2 personnes
  484.                     
  485.                   dans un autre script
  486.                       $page_to='https://tiptoque.typeform.com/to/ToCWEu4A#
  487.                         num_carte_cadeau='.$gift_card[0]['code'].
  488.                         '&product_name='.$product_name.
  489.                         '&solde_restant='.$gift_card[0]['balance'].
  490.                         '&vendor='.$gift_card[0]['vendor'].
  491.                         '&restaurant='.$password_restaurant[0]['name'].
  492.                         '&date_expiration='.$formatted_date.
  493.                         '&nomcarte='.$gift_card[0]['code'];
  494.                         -->GCACCT_LOGGED
  495.                         https://tiptoque.typeform.com/to/ToCWEu4A#num_carte_cadeau=__CARD_NUM__
  496.                         
  497.                         &solde_restant=__BALANCE__
  498.                         &vendor=__VENDOR__
  499.                         &restaurant=__RESTAURANT__
  500.                         &expiration=__EXPIRED__
  501.                         &date_expiration=__EXPIRATION__
  502.                         &prid=__PRID__
  503.                         &product_name=__PNAME__
  504.                         &nomcarte=__PNAME__
  505.                     * */
  506.                     $restaurantName =$this->user_restaurant["michelin"] ? $this->user_restaurant["michelin"]['name']:$this->user_restaurant["corporate"]['name'];
  507.                     $dateNow = new \DateTime();
  508.                     $isExpired = ($dateNow->getTimestamp()>$giftcard->getExpirationDate()->getTimestamp())?"Oui":"Non";
  509.                     $gcaUrl=str_replace"__CARD_NUM__",$giftcard->getCode(),$gcaUrl);
  510.                     $gcaUrl=str_replace"__BALANCE__",$giftcard->getBalance(),$gcaUrl);
  511.                     $gcaUrl=str_replace"__VENDOR__",$giftcard->getVendor(),$gcaUrl);
  512.                     $gcaUrl=str_replace"__RESTAURANT__",$restaurantName,$gcaUrl);
  513.                     $gcaUrl=str_replace"__EXPIRED__",$isExpired,$gcaUrl);
  514.                     $gcaUrl=str_replace"__EXPIRATION__",$giftcard->getExpirationDate()->format("d/m/Y"),$gcaUrl);
  515.                     $gcaUrl=str_replace"__PRID__",$giftcard->getProductsId(),$gcaUrl);
  516.                     $gcaUrl=str_replace"__PNAME__",$giftcard->getProductName(),$gcaUrl);
  517.                     if(isset($this->user_restaurant["michelin"])){
  518.                         $gcaUrl=str_replace"__PASSWORD__",$this->user_restaurant["michelin"]['typeform_password'],$gcaUrl);
  519.                     }
  520.                 }
  521.             }
  522.         }
  523.         //   dd($formDatas);
  524.         //ou trouver le rapport ....
  525.         return $this->renderHtml('page/giftcard.html.twig', [
  526.             'giftcard' =>$giftcard,
  527.             'gcaUrl' =>$gcaUrl ?? '',
  528.             'prefix' =>$this->user_restaurant["michelin"] ? $this->user_restaurant["michelin"]['prefix']:$this->user_restaurant["corporate"]['prefix']
  529.         ]);
  530.     }
  531.     /**
  532.      * @Route("/user/deleted/{id}", name="delete_user")
  533.      */
  534.     public function delete_user(int $id):RedirectResponse{
  535.         if (!isset($this->user) || empty($this->user)) {
  536.             return $this->redirectToRoute("app_login");
  537.         }
  538.         // dd( json_encode(["user"=>$formDatas]),$rep);
  539.         $entityManager $this->getDoctrine()->getManager();
  540.         $member $entityManager->getRepository(User::class)->find($id);
  541.         $entityManager->remove($member);
  542.         $entityManager->flush();
  543.         return $this->redirectToRoute("manage_users");
  544.     }
  545.     /**
  546.      * @Route("/mes-commandes", name="orders")
  547.      */
  548.     public function orders():Response
  549.     {
  550.         $dateDujour explode("/",date("Y/m/d/"));
  551.         $dateDemain explode("/",date("Y/m/d/",strtotime("+1 DAY")));
  552.         return $this->renderHtml('tcd/index.html.twig', [
  553.             'annee_n'=>$dateDujour[0],
  554.             'mois_n'=>$dateDujour[1],
  555.             'jour_n'=>$dateDujour[2],
  556.             'annee_t'=>$dateDemain[0],
  557.             'mois_t'=>$dateDemain[1],
  558.             'jour_t'=>$dateDemain[2]
  559.         ]);
  560.     }
  561.     /**
  562.      * @Route("/mes-commandes/{annee}/{mois}/{jour}", name="orders_date")
  563.      * @param $annee
  564.      * @param $mois
  565.      * @param $jour
  566.      * @return Response
  567.      */
  568.     public function orders_date($annee$mois$jour):Response
  569.     {
  570.         return $this->renderHtml('tcd/date.html.twig', ['annee' => $annee'mois' => $mois'jour' => $jour]);
  571.     }
  572.     /**
  573.      * @Route("/change-vendor", name="change_vendor")
  574.      * @param Request $request
  575.      * @return RedirectResponse
  576.      */
  577.     public function changeVendor(Request $request):RedirectResponse
  578.     {
  579.         if (!isset($this->user) || empty($this->user)) {
  580.             return $this->redirectToRoute("app_login");
  581.         }
  582.         $urSelected $request->request->get("urid");
  583.         //  dd($urSelected);
  584.         // exit($urSelected);
  585.         $this->user->setUrId($urSelected);
  586.         $this->em->persist($this->user);
  587.         $this->em->flush();
  588.         return $this->redirectToRoute("home");
  589.     }
  590.     /**
  591.      * @Route("/change-member", name="change_member")
  592.      * @param Request $request
  593.      * @return RedirectResponse
  594.      */
  595.     public function changeMember(Request $request):RedirectResponse
  596.     {
  597.       
  598.         if (!isset($this->user) || empty($this->user)) {
  599.             return $this->redirectToRoute("app_login");
  600.         }
  601.         if(!in_array(User::ROLE_ADMIN,$this->user->getRoles())){
  602.             return $this->redirectToRoute("home");
  603.         }
  604.         $userSelected $request->request->get("user_id");
  605.         $this->user->setUrId(null);
  606.         $this->user->setUserId($userSelected);
  607.         $this->em->persist($this->user);
  608.         $this->em->flush();
  609.         return $this->redirectToRoute("home");
  610.     }
  611.     /**
  612.      * @Route("/cache/init", name="initCacheProduct")
  613.      * @param Request $request
  614.      * @return RedirectResponse
  615.      */
  616.     public function initCacheProduct(Request $request):RedirectResponse
  617.     {
  618.         $dirCacheJson '../var/cache/' $_ENV['APP_ENV'] . '/products';
  619.         $fileCacheJson $dirCacheJson '/' ApiController::strToHandle($this->user_vendor) . '.json';
  620.         if (\is_file($fileCacheJson)) {
  621.             unlink($fileCacheJson);
  622.         }
  623.         //recharge le json
  624.         $this->forward(ApiController::class . '::getProducts');
  625.         return $this->redirectToRoute("home");
  626.     }
  627.     /**
  628.      * @Route("/mes_menus_et_mes_cartes", name="products")
  629.      * @param UserRepository $userRepository
  630.      * @return Response
  631.      */
  632.     public function products(UserRepository $userRepository):Response
  633.     {
  634.         if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
  635.             return $this->redirectToRoute("home");
  636.         }
  637.         //prepare dossier temporaire pour les updload image
  638.         $directoryTmp $this->getParameter("upload_tmp");
  639.         if (!is_dir($directoryTmp)) {
  640.             mkdir($directoryTmp);
  641.         }
  642.         $directoryTmpVendor $directoryTmp ApiController::strToHandle($this->user_vendor) . '/';
  643.         if (is_dir($directoryTmp)) {
  644.             $this->deleteDirectory($directoryTmpVendor);
  645.         }
  646.         $responseJson $this->forward(ApiController::class . '::getSettings', ["type" => "allergens"]);
  647.         $allergens json_decode($responseJson->getContent(), true);
  648.         $vendors $userRepository->getVendors();
  649.         $daysWeek = ["Lundi""Mardi""Mercredi""Jeudi""Vendredi""Samedi""Dimanche"];
  650.         $daysWeekMin = ["Lu""Ma""Me""Je""Ve""Sa""Di"];
  651.         $timesSlot = ["10h - 12h""12h - 14h""14h - 16h""16h - 18h""18h - 20h"];
  652.         $intervalsSlot = [[1011], [1213], [1415], [1617], [1819]];
  653.         //recuperer les produits avec le json de apiController
  654.         $responseJson $this->forward(ApiController::class . '::getProducts');
  655.         $datas json_decode($responseJson->getContent(), true);
  656.         // $types = json_decode($this->forward(ApiController::class . '::getCategories')->getContent(), true);
  657.         $types ApiController::getTypes();
  658.         //  $gammes = ApiController::getTypes();
  659.         //supprimer les produits autres
  660.         $types array_filter($types, function ($element) {
  661.             return ($element["code"] != "XX" && $element["code"] != "09");
  662.         });
  663.         if (!isset($datas["products"])) {
  664.             $datas["products"] = [];
  665.         }
  666.         $typesProductOrder = [
  667.             ["show" => true"title" => "Mes menus""type_slug" => "menu""type" => "Menu""sort" => ["Menu"]],
  668.             ["show" => false"title" => "A la carte""type_slug" => "a-la-carte""type" => "A la carte""sort" => ["Entrée""Plat""Dessert"]],
  669.             ["show" => false"title" => "A partager""type_slug" => "a-partager""type" => "A partager""sort" => ["A partager"]],
  670.             ["show" => false"title" => "Autres articles""type_slug" => "autre-article""type" => "Autre article""sort" => ["Autre article"]],
  671.             ["show" => false"title" => "Vins, sipiritueux et autres alcools""type_slug" => "boissons-alcoolise""type" =>  "Boissons alcoolisé"  "sort" => [ "Vin blanc","Vin rosé","Vin rouge","Bière","Champagne et bulle","Spiritueux","Autre boisson alcoolisée"]],
  672.             ["show" => false"title" => "Boissons non alcoolisees""type_slug" => "boissons-non-alcoolise""type" => "Boissons non alcoolisé""sort" => ["Eau minérale","Soft"]],
  673.         ];
  674.         $listeTypeProducts = [];
  675.         foreach ($typesProductOrder as $type_index => $typesorder) {
  676.             $cptProduct 0;
  677.             $listeTypeProducts[$type_index]["types"] = $typesorder["sort"];
  678.             $listeTypeProducts[$type_index]["type"] = $typesorder["type"];
  679.             $listeTypeProducts[$type_index]["type_slug"] = $typesorder["type_slug"];
  680.             $listeTypeProducts[$type_index]["title"] = $typesorder["title"];
  681.             $listeTypeProducts[$type_index]["show"] = $typesorder["show"];
  682.             foreach ($typesorder["sort"] as $typeorder) {
  683.                 if (isset($datas["types"][$typeorder]) && !empty($datas["types"][$typeorder])) {
  684.                     foreach ($datas["types"][$typeorder] as $product_id) {
  685.                         if (empty($datas["products"][$product_id]["tags"]) || in_array(ApiController::TAG_MENU_ITEM$datas["products"][$product_id]["tags"])) {
  686.                             continue;
  687.                         }
  688.                         // obliger d avoir l offre particulier
  689.                         if(in_array(ApiController::TAG_OFFRE_PARTICULIER$datas["products"][$product_id]["tags"])) {
  690.                             $listeTypeProducts[$type_index]["products"][$product_id] = $datas["products"][$product_id];
  691.                             $cptProduct++;
  692.                         }
  693.                     }
  694.                 }
  695.             }
  696.             $listeTypeProducts[$type_index]["total"] =   $cptProduct;
  697.         }
  698.         return $this->renderHtml('page/products.html.twig', [
  699.             'tag_particulier'=>ApiController::TAG_OFFRE_PARTICULIER,
  700.             'vendors' => $vendors,
  701.             'daysWeekMin' => $daysWeekMin,
  702.             'daysWeek' => $daysWeek,
  703.             'timesSlot' => $timesSlot,
  704.             'intervalsSlot' => $intervalsSlot,
  705.             'allergens' => $allergens,
  706.             'menuItems' => $datas["products"],
  707.             'types_products' => $listeTypeProducts
  708.         ]);
  709.     }
  710.     /**
  711.      * @Route("/mes_jours_d_ouvertures", name="disponibility")
  712.      * @param UserRepository $userRepository
  713.      * @return Response
  714.      */
  715.     public function disponibility(UserRepository $userRepository):Response
  716.     {
  717.         //prepare dossier temporaire pour les updload image
  718.         $directoryTmp $this->getParameter("upload_tmp");
  719.         if (!is_dir($directoryTmp)) {
  720.             mkdir($directoryTmp);
  721.         }
  722.         $directoryTmpVendor $directoryTmp ApiController::strToHandle($this->user_vendor) . '/';
  723.         if (is_dir($directoryTmp)) {
  724.             $this->deleteDirectory($directoryTmpVendor);
  725.         }
  726.         $responseJson $this->forward(ApiController::class . '::getSettings', ["type" => "allergens"]);
  727.         $vendors $userRepository->getVendors();
  728.         $daysWeek = ["Lundi""Mardi""Mercredi""Jeudi""Vendredi""Samedi""Dimanche"];
  729.         $daysWeekMin = ["Lu""Ma""Me""Je""Ve""Sa""Di"];
  730.         //TODO reflechir a gerer les horaires par une base de donnée en postgre pour des configs special pour ic_configs (label,value)?
  731.         $timesSlot = ["10h - 12h""12h - 14h""14h - 16h""16h - 18h""18h - 20h"];//, "20h - 22h"
  732.         $intervalToString = [
  733.             "10-11" => "10h - 12h",
  734.             "12-13" => "12h - 14h",
  735.             "14-15" => "14h - 16h",
  736.             "16-17" => "16h - 18h",
  737.             "18-19" => "18h - 20h"
  738.         ];
  739.         /*,"20-21" => "20h - 22h"*/
  740.         //INFO liste interval autoriser pour la page des disponiblités
  741.         $intervalsSlot = [[1011], [1213], [1415], [1617], [1819]];//, [20, 21]
  742.         //recuperer les produits avec le json de apiController
  743.         $responseJson $this->forward(ApiController::class . '::getProducts');
  744.         $datas json_decode($responseJson->getContent(), true);
  745.         // $types = json_decode($this->forward(ApiController::class . '::getCategories')->getContent(), true);
  746.         $types ApiController::getTypes();
  747.         //supprimer les produits autres
  748.         $types array_filter($types, function ($element) {
  749.             return ($element["code"] != "XX" && $element["code"] != "09");
  750.         });
  751.         if (!isset($datas["products"])) {
  752.             $datas["products"] = [];
  753.         }
  754.         //preparer de l arborescence pour generer un tableau pour le formulaire
  755.         $disponibility = [];
  756.         if (isset($datas["disponibilities"]) && !empty($datas["disponibilities"])) {
  757.             foreach ($datas["disponibilities"] as $type => $dispoDays) {
  758.                 foreach ($intervalsSlot as $intervalSlot) {
  759.                     foreach ($daysWeek as $day) {
  760.                         $index_interval join("-"$intervalSlot);
  761.                         if (isset($dispoDays[$day]) && !empty($dispoDays[$day])) {
  762.                             $dispoHours $dispoDays[$day]["hours"];
  763.                             if(isset( $dispoHours) && !empty( $dispoHours)){
  764.                                 foreach ($dispoHours as $hour) {
  765.                                     if (intVal($hour) >= $intervalSlot[0]  && intVal($hour) < $intervalSlot[1] || intVal($hour) == $intervalSlot[1] ) {
  766.                                         // $disponibility[$type][$keyTimeSlot][$keyDay]["status"]  = true;
  767.                                         $disponibility[$day][$index_interval][$type] = true;
  768.                                     } else {
  769.                                         if (!isset($disponibility[$day][$index_interval][$type])) {
  770.                                             // $disponibility[$type][$keyTimeSlot][$keyDay]["status"] = false;
  771.                                             $disponibility[$day][$index_interval][$type] = false;
  772.                                         }
  773.                                     }
  774.                                 }
  775.                             }else{
  776.                                 $disponibility[$day][$index_interval][$type] = false;
  777.                             }
  778.                         } else {
  779.                             $disponibility[$day][$index_interval][$type]  = false;
  780.                         }
  781.                     }
  782.                 }
  783.             }
  784.         }
  785.         return $this->renderHtml('page/disponibilities.html.twig', [
  786.             'vendors' => $vendors,
  787.             'daysWeekMin' => $daysWeekMin,
  788.             'daysWeek' => $daysWeek,
  789.             'timesSlot' => $timesSlot,
  790.             'intervalToString' => $intervalToString,
  791.             'disponibility' => $disponibility
  792.         ]);
  793.     }
  794.     /**
  795.      * @Route("/mes_menus_et_mes_cartes/edit/{id?}", name="product_edit")
  796.      * @param null $id
  797.      * @param UserRepository $userRepository
  798.      * @return Response
  799.      */
  800.     public function productForm($id nullUserRepository $userRepository):Response
  801.     {
  802.         if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
  803.             return $this->redirectToRoute("home");
  804.         }
  805.         $directoryTmp $this->getParameter("upload_tmp");
  806.         if (!is_dir($directoryTmp)) {
  807.             mkdir($directoryTmp);
  808.         }
  809.         $directoryTmpVendor $directoryTmp ApiController::strToHandle($this->user_vendor) . '/';
  810.         if (is_dir($directoryTmp)) {
  811.             $this->deleteDirectory($directoryTmpVendor);
  812.         }
  813.         $title_page "Ajouter un produit";
  814.         $theme $_GET["t"] ?? "autre-article";
  815.         $typesProductOrder = [
  816.             "add" => "Ajouter un produit",
  817.             "menu" => "ajouter un menu",
  818.             "a-la-carte" => "ajouter un produit à la carte",
  819.             "entree" => "ajouter un produit à la carte",
  820.             "plat" => "ajouter un produit à la carte",
  821.             "dessert" => "ajouter un produit à la carte",
  822.             "a-partager" => "ajouter un produit à partager",
  823.             "autre-article" => "ajouter un produit",
  824.             "boissons-alcoolise" => "ajouter un vin, sipiritueux et autre alcool",
  825.             "boissons-non-alcoolise" => "ajouter une boisson non alcoolisée"
  826.         ];
  827.         //recuperer les produits avec le json de apiController
  828.         $responseJson $this->forward(ApiController::class . '::getProducts');
  829.         $datas json_decode($responseJson->getContent(), true);
  830.         $types ApiController::getTypes();
  831.         $menu_items = [];
  832.         if (is_null($id) || !isset($datas["products"][$id]) || empty($datas["products"][$id])) {
  833.             if ($theme != "a-la-carte") {
  834.                 $types_selected array_filter($types, function ($type) use ($theme) {
  835.                     return $type["slug"] ==  $theme;
  836.                 });
  837.                 $types_selected array_shift($types_selected);
  838.             }
  839.             $product = ["id" => "Add","title" => "","disponibility_dates" => "","max_per_day" => "","price" => "","type" =>   $types_selected["type"] ?? "","allergens" => "","pack" => [],"description" => ""];
  840.             $title_page =  $typesProductOrder[$theme];
  841.         } else {
  842.             $product $datas["products"][$id];
  843.             $product["allergens"] = array_unique($product["allergens"]);
  844.             $list_menu_items = isset($datas["menu_item"]) && !empty($datas["menu_item"]) ? $datas["menu_item"] : [];
  845.             $menu_items array_filter(
  846.                 $datas["products"],
  847.                 function ($prod) use ($list_menu_items) {
  848.                     return in_array($prod["id"], $list_menu_items);
  849.                 }
  850.             );
  851.             $title_page =   $typesProductOrder[$product["type_slug"]] ?? $title_page;
  852.             $theme $product["type_slug"];
  853.         }
  854.         $types_theme = [];
  855.         switch ($theme){
  856.             case "a-la-carte":
  857.                 $types_theme array_filter($types, function ($type) {
  858.                     return $type["slug"] == "a-la-carte";
  859.                 });
  860.                 break;
  861.             case "boissons-alcoolise":
  862.                 $types_theme array_filter($types, function ($type) {
  863.                     return $type["slug"] == "boissons-alcoolise";
  864.                 });
  865.                 break;
  866.             case "boissons-non-alcoolise":
  867.                 $types_theme array_filter($types, function ($type) {
  868.                     return $type["slug"] == "boissons-non-alcoolise";
  869.                 });
  870.                 break;
  871.             case "autre-article":
  872.                 $types_theme $types;
  873.                 break;
  874.         }
  875.         $types_menuitem = ["Entrée","Plat","Dessert","A partager","Autre boisson alcoolisée","Bière","Champagne et bulle","Cocktail","Vin blanc","Vin rosé","Vin rouge","Spiritueux","Eau minérale","Soft"];
  876.         $types_title=["Menu"=>"Nos Menus","A partager"=> "A partager","Entrée"=>"Nos Entrées","Plat"=>"Nos Plats","Dessert"=>"Nos Desserts","Vin blanc"=>"Nos Vins Blancs","Vin rosé"=>"Nos Vins Rosés","Vin rouge"=>"Nos Vins Rouges","Soft"=>"Nos softs et eaux minérales","Eau minérale"=>"Nos softs et eaux minérales","Champagne et bulle"=>"Nos champagnes et bulles","Spiritueux"=>"Nos spiritueux et autres boissons","Bière"=>"Nos spiritueux et autres boissons","Autre boisson alcoolisée"=>"Nos spiritueux et autres boissons","Autre article"=>"Nos autres articles"];
  877.         //  "Menu"=>"Nos autres articles"
  878.         return $this->renderHtml('page/product_form.html.twig', [
  879.             'user' =>  $this->user,
  880.             'types' =>  $types,
  881.             'types_theme' => $types_theme,
  882.             'types_menuitem' => $types_menuitem,
  883.             'product' =>  $product,
  884.             'theme' =>  $theme,
  885.             'title_page' =>  $title_page,
  886.             'types_title' =>  $types_title,
  887.             'menu_items' =>  $menu_items
  888.         ]);
  889.     }
  890.     /**
  891.      * @Route("/mes_menus_et_mes_cartes/update", name="update_product")
  892.      * @param Request $request
  893.      * @return RedirectResponse
  894.      */
  895.     public function updateProduct(Request $request):RedirectResponse
  896.     {
  897.         //Check l autorisation
  898.         if (!isset($this->user) || empty($this->user)) {
  899.             return $this->redirectToRoute("app_login");
  900.         }
  901.         if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
  902.             return $this->redirectToRoute("home");
  903.         }
  904.         //recuperation des informations du formulaire
  905.         $formDatas $request->request->all();
  906.         $formDatas["tags"] = explode("|"$formDatas["tags"]);
  907.         if (isset($formDatas["allergens"]) && !empty($formDatas["allergens"])) {
  908.             foreach ($formDatas["allergens"] as $allergen) {
  909.                 $formDatas["tags"][] = ApiController::TAG_PREFIX_ALLERGEN $allergen;
  910.             }
  911.             unset($formDatas["allergens"]);
  912.         }
  913.         // translate dataform shelfs to tags shopify
  914.         if (isset($formDatas["shelfs"]) && !empty($formDatas["shelfs"])) {
  915.             foreach ($formDatas["shelfs"] as $shelf) {
  916.                 $formDatas["tags"][] = ApiController::TAG_PREFIX_SHELF $shelf;
  917.             }
  918.             unset($formDatas["shelfs"]);
  919.         }
  920.         // Changer les virgule dans les titre en 2 underscores
  921.         if (isset($formDatas["title"]) && !empty($formDatas["title"])   && strpos($formDatas["title"],",")!==-1) {
  922.             $formDatas["title"]= str_replace(",","__",$formDatas["title"]);
  923.         }
  924.         //init variable
  925.         $reps = [];
  926.         //si pack existe
  927.         $pack_tags = [];
  928.         $packsDel=[];
  929.         $post_menu_item = [];
  930.         //si pack existe
  931.         if (isset($formDatas["pack"]) && !empty($formDatas["pack"])) {
  932.             $oldPack=[];
  933.             if(isset($formDatas["id"]) && !empty($formDatas["id"])){
  934.                 $allTagsPackTmp =   $this->controllerApiTiptoque('getTags', ["type" => "pack"]);
  935.                 if(isset( $allTagsPackTmp[$formDatas["id"]]) && !empty(isset($allTagsPackTmp[$formDatas["id"]]))){
  936.                     $oldPack$allTagsPackTmp[$formDatas["id"]];
  937.                 }
  938.             }
  939.             $newPack array_keys($formDatas["pack"]);
  940.             $packsDel array_diff($oldPack,$newPack);
  941.             foreach ($formDatas["pack"] as $menuItem) {
  942.                 if(!isset($menuItem["title"])){
  943.                     continue;
  944.                 }
  945.                 $menuItem["tags"][] = ApiController::TAG_MENU_ITEM;
  946.                 $menuItem["tags"][] = ApiController::TAG_OFFRE_PARTICULIER;
  947.                 if(isset($formDatas["id"]) && !empty($formDatas["id"])){
  948.                     $menuItem["tags"][] = ApiController::TAG_PREFIX_MAIN.$formDatas["id"];
  949.                 }
  950.                 //si menu_item id ajout du produit dans shopify et mise en place de reps pour le json
  951.                 if (isset($menuItem["id"]) && !empty($menuItem["id"])) {
  952.                     $menuItem_id $menuItem["id"];
  953.                     $pack_tags[] = ApiController::TAG_PREFIX_PACK $menuItem["index"] . "|" $menuItem_id "_" $menuItem["handle"];
  954.                     unset($menuItem["id"]);
  955.                     $datasJson["product"] = $menuItem;
  956.                     //TODO faut il verifier si le produit a ete modifier?
  957.                     $reps[] =  $this->controllerApiTiptoque('putProduct', ["id" => $menuItem_id], json_encode($datasJson));
  958.                 } else {
  959.                     $datasJson["product"] = $menuItem;
  960.                     $resProduit $this->controllerApiTiptoque('postProduct', [], json_encode($datasJson));
  961.                     $pack_tags[] = ApiController::TAG_PREFIX_PACK $menuItem["index"] . "|" $resProduit["product"]["id"] . "_" $resProduit["product"]["handle"];
  962.                     $reps[] = $resProduit;
  963.                     //variable pour preparer l update avec le tags MAIN|%id product%
  964.                     $post_menu_item[]=$resProduit["product"];
  965.                 }
  966.             }
  967.             $formDatas["tags"] = array_merge($formDatas["tags"], $pack_tags);
  968.             unset($formDatas["pack"]);
  969.         }
  970.         //preparation des valeur pour le produit principal
  971.         $formDatas["max_per_day"] = ($formDatas["max_per_day"] == "") ? "-1" $formDatas["max_per_day"];
  972.         $formDatas["disponibility_dates"] = $formDatas["dispo_date"];
  973.         unset($formDatas["dispo_date_start"]);
  974.         unset($formDatas["dispo_date_end"]);
  975.         unset($formDatas["put_product"]);
  976.         if (isset($formDatas["id"]) && !empty($formDatas["id"])) {
  977.             $pId $formDatas["id"];
  978.             unset($formDatas["id"]);
  979.             $datasJson["product"] = $formDatas;
  980.             $prodMain  $reps[] =   $this->controllerApiTiptoque('putProduct', ["id" => $pId], json_encode($datasJson));
  981.             //info Suppression des menu_items qui sont supprimer
  982.             if(isset($packsDel) && !empty($packsDel)){
  983.                 foreach ($packsDel as $packDel){
  984.                     $this->controllerApiTiptoque('delProduct', ["id" => $packDel"force" => true]);//
  985.                 }
  986.             }
  987.         } else {
  988.             $datasJson["product"] = $formDatas;
  989.             $prodMain  $reps[] =  $this->controllerApiTiptoque('postProduct', [], json_encode($datasJson));
  990.             //info update les pack avec le tag MAIN|%id%
  991.             if (isset($post_menu_item) && !empty($post_menu_item)) {
  992.                 foreach ($post_menu_item as $menuItem) {
  993.                     $menuItem["tags"][] = ApiController::TAG_PREFIX_MAIN.$prodMain["product"]["id"];
  994.                     $datasJson["product"] = $menuItem;
  995.                     $this->controllerApiTiptoque('putProduct', ["id" => $menuItem["id"]], json_encode($datasJson));
  996.                 }
  997.             }
  998.         }
  999.         if((strpos(  $prodMain["product"]["type"],"Dispo")===false)){
  1000.             return $this->redirectToRoute("product_edit",["id"=>$prodMain["product"]["id"]]);
  1001.         }else{
  1002.             return $this->redirectToRoute("products");
  1003.         }
  1004.     }
  1005.     /**
  1006.      * @Route("/mes_menus_et_mes_cartes/delete", name="delete_product")
  1007.      * @param Request $request
  1008.      * @return RedirectResponse
  1009.      */
  1010.     public function deleteProduct(Request $request):RedirectResponse
  1011.     {
  1012.         if (!isset($this->user) || empty($this->user)) {
  1013.             return $this->redirectToRoute("app_login");
  1014.         }
  1015.         if(in_array(User::ROLE_USER_OPS,$this->user->getRoles())){
  1016.             return $this->redirectToRoute("home");
  1017.         }
  1018.         $pId $request->query->get("product_id"null);
  1019.         //info récupérer le produit et verifier si il y a des menus_items pour les supprimer en cascade
  1020.         $responseProduct $this->controllerApiTiptoque('getProduct',["id"=>$pId]);
  1021.         if(isset($responseProduct["product"]["pack"]) && !empty($responseProduct["product"]["pack"])){
  1022.             foreach ($responseProduct["product"]["pack"] as $menu_item_id){
  1023.                 $this->controllerApiTiptoque("delProduct", ["id" => $menu_item_id"force" => true]);
  1024.             }
  1025.         }
  1026.         $this->controllerApiTiptoque('delProduct', ["id" => $pId"force" => true]);
  1027.         return $this->redirectToRoute("products");
  1028.     }
  1029.     /**
  1030.      * @Route("/imageDelete", name="imageDelete")
  1031.      * @param Request $request
  1032.      * @return JsonResponse
  1033.      */
  1034.     public function imageDelete(Request $request):JsonResponse
  1035.     {
  1036.         //supprimer image d'un produit
  1037.         $image_id $request->request->get("iid");
  1038.         $produit_id $request->request->get("pid");
  1039.         if (is_numeric($image_id)) {
  1040.             // var_dump("delete image shopify", $produit_id, $image_id);
  1041.             $reponseDeleteImage $this->controllerApiTiptoque('delImage', ["pid" => $produit_id"id" => $image_id]);
  1042.             if(is_null($reponseDeleteImage)){
  1043.                 return $this->json(["error"=> ["pid" => $produit_id"id" => $image_id,"reponse"=>$reponseDeleteImage]], 404 );
  1044.             }
  1045.             return $this->json(["message"=>$reponseDeleteImage], 200);
  1046.             //  return $this->json(["message" => "suppression de image id:" . $image_id], 200);
  1047.         } else {
  1048.             $directoryTmp $this->getParameter("upload_tmp");
  1049.             $directoryTmpVendor $directoryTmp ApiController::strToHandle($this->user_vendor) . '/';
  1050.             $directoryTmpVendorProduct $directoryTmpVendor $produit_id '/';
  1051.             unlink($directoryTmpVendorProduct $image_id);
  1052.             //si le dossier vide le supprimer ??
  1053.             $countImg count(scandir($directoryTmpVendorProduct ))-2;
  1054.             if( $countImg === 0){
  1055.                 $this->deleteDirectory$directoryTmpVendor);
  1056.             }
  1057.             return $this->json(["message" => "suppression de image " $image_id " dans le cache"], 200);
  1058.         }
  1059.     }
  1060.     /**
  1061.      * @Route("/file-upload", name="tmpUploadFile")
  1062.      * @param Request $request
  1063.      * @return JsonResponse
  1064.      */
  1065.     public function tmpUploadFile(Request $request):JsonResponse
  1066.     {
  1067.         $produit_id $request->request->get("pid"null);
  1068.         $produit_id = ($produit_id == "_add" || $produit_id == "Add")  ? "add" $produit_id;
  1069.         $directoryTmp $this->getParameter("upload_tmp");
  1070.         if (!is_dir($directoryTmp)) {
  1071.             mkdir($directoryTmp);
  1072.         }
  1073.         $directoryTmpVendor $directoryTmp ApiController::strToHandle($this->user_vendor);
  1074.         if (!is_dir($directoryTmpVendor)) {
  1075.             mkdir($directoryTmpVendor);
  1076.         }
  1077.         $directoryTmpVendorProduct $directoryTmpVendor '/' $produit_id;
  1078.         if (!is_dir($directoryTmpVendorProduct)) {
  1079.             mkdir($directoryTmpVendorProduct);
  1080.         }
  1081.         if (is_null($produit_id)) {
  1082.             $produit_id "add";
  1083.         }
  1084.         $file =  $request->files->get("file");
  1085.         $file->move($directoryTmpVendorProduct,$file->getClientOriginalName());
  1086.         return $this->json(["dir"=> $directoryTmpVendor,"filename" => $file->getClientOriginalName() , "id" => $produit_id], 200);
  1087.     }
  1088.     /**
  1089.      * suppression d'un dossier et ses fichiers
  1090.      * @param $dir
  1091.      * @return bool
  1092.      */
  1093.     private function deleteDirectory($dir):bool
  1094.     {
  1095.         if (!file_exists($dir)) {return true;}
  1096.         if (!is_dir($dir)) { return unlink($dir); }
  1097.         foreach (scandir($dir) as $item) {
  1098.             if ($item == '.' || $item == '..') {
  1099.                 continue;
  1100.             }
  1101.             if (!$this->deleteDirectory($dir DIRECTORY_SEPARATOR $item)) {
  1102.                 return false;
  1103.             }
  1104.         }
  1105.         return rmdir($dir);
  1106.     }
  1107.     /**
  1108.      * @param string $function
  1109.      * @param array $path
  1110.      * @param array $datasJson
  1111.      * @return mixed
  1112.      */
  1113.     private function controllerApiTiptoque($function "getProducts",$path = [],$datasJson = [])
  1114.     {
  1115.         $request = new Request([], [], [], [], [], [], $datasJson);
  1116.         $request->headers->set('content-type'"application/json");
  1117.         $path['_controller'] = ApiController::class . '::' $function;
  1118.         $subRequest $request->duplicate([], null$path);
  1119.         $response $this->container->get('http_kernel')->handle($subRequestHttpKernelInterface::SUB_REQUEST);
  1120.         // $response = $this->forward(ApiController::class . '::' . $function, $path);
  1121.         // var_dump($response->getContent());exit();
  1122.         return isset($response) && !empty($response) ? \json_decode($response->getContent(), true) : \json_decode('{"message":"Error not response"}'true);
  1123.     }
  1124.     /**
  1125.      * @param string $entree
  1126.      * @param string $plat
  1127.      * @param string $dessert
  1128.      * @return string
  1129.      */
  1130.     public function menuToDescription(string $entree,string $plat,string $dessert): string
  1131.     {
  1132.         $description "";
  1133.         if ($entree != "") {
  1134.             $description .= "<entree><span>Entrée :</span> <descr>" $entree "</descr></entree><br>";
  1135.         }
  1136.         if ($plat != "") {
  1137.             $description .= "<plat><span>Plat :</span> <descr>" $plat "</descr></plat><br>";
  1138.         }
  1139.         if ($dessert != "") {
  1140.             $description .= "<dessert><span>Dessert :</span> <descr>" $dessert "</descr></dessert>";
  1141.         }
  1142.         return $description;
  1143.     }
  1144. }