src/Controller/GestionController.php line 82

Open in your IDE?
  1. <?php
  2. // src/Controller/EntrepriseController.php
  3. namespace App\Controller;
  4. use App\Entity\SujetFAQ;
  5. use App\Entity\Article;
  6. use App\Entity\AppUser;
  7. use App\Entity\Product;
  8. use App\Entity\Review;
  9. use App\Entity\Devis;
  10. use App\Entity\Category;
  11. use App\Entity\Commande;
  12. use App\Entity\Conversation;
  13. use App\Entity\Service;
  14. use App\Entity\ProductOrder;
  15. use App\Entity\Entreprise;
  16. use App\Entity\Notification;
  17. use App\Entity\ProductMisDeCote;
  18. use App\Entity\SubCategory;
  19. use App\Entity\AvisUtilisateur;
  20. use App\Form\SujetFAQType;
  21. use App\Form\AvisUtilisateurType;
  22. use App\Form\AvisUtilisateurEditType;
  23. use App\Form\ProductType;
  24. use App\Entity\ShippingMethod;
  25. use App\Entity\RoleBoutique;
  26. use App\Entity\Boutique;
  27. use App\Form\BoutiqueType;
  28. use App\Entity\Plan;
  29. use App\Entity\ValiditeService;
  30. use App\Entity\UserBoutique;
  31. use App\Entity\RequeteAjoutBoutique;
  32. use App\Entity\TVA;
  33. use Spipu\Html2Pdf\Html2Pdf;
  34. use App\Entity\CategorieEntreprise;
  35. use App\Entity\Produit;
  36. use App\Entity\ProductPhoto;
  37. use App\Entity\OffreDevis;
  38. use App\Form\ProduitType;
  39. use App\Form\ProduitEditType;
  40. use App\Entity\Ticket;
  41. use App\Entity\Message;
  42. use App\Services\CinetPay;
  43. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  44. use App\Form\TicketType;
  45. use App\Entity\CommentaireTicket;
  46. use App\Form\CommentaireTicketType;
  47. use App\Entity\PaiementService;
  48. use App\Form\SettingBoutiqueOngletEntrepriseType;
  49. use App\Form\SettingBoutiqueOngletBanqueType;
  50. use App\Form\SettingBoutiqueOngletInfoLegaleType;
  51. use App\Form\SettingBoutiqueOngletDocumentType;
  52. use App\Form\SettingBoutiqueOngletEmailType;
  53. use Symfony\Component\HttpFoundation\Response;
  54. use Symfony\Component\HttpFoundation\JsonResponse;
  55. use Symfony\Component\HttpFoundation\RedirectResponse;
  56. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  57. use Symfony\Component\HttpFoundation\Request;
  58. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  59. use Symfony\Component\Routing\Annotation\Route;
  60. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  61. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security as Security;
  62. /**
  63.  * @Route("/{_locale}/gestion")
  64.  */
  65. class GestionController extends AbstractController
  66. {    
  67.     private $session;
  68.     
  69.     public function __construct(SessionInterface $session)
  70.     {
  71.         $this->session = $session;
  72.     }
  73.     
  74.     /**
  75.      * @Route("/mes-entreprises/", name="gestion_mes_entreprises")
  76.      * @return \Symfony\Component\HttpFoundation\Response
  77.      */
  78.     public function mesEntrepriseAction(Request $request)
  79.     {
  80.         $em = $this->getDoctrine()
  81.                     ->getManager();
  82.     
  83.         $user = $this->getUser();
  84.         $userBoutiques = $em->getRepository(UserBoutique::class)
  85.                         ->findByUser($user);
  86.         return $this->render('gestion/mes_entreprise.html.twig', [
  87.             'userBoutiques' => $userBoutiques
  88.         ]);
  89.     }
  90.     
  91.     
  92.     /**
  93.      * @Route("/shop/{slug}", name="gestion.show_shop")
  94.      * @return \Symfony\Component\HttpFoundation\Response
  95.      */
  96.     public function afficherBoutiqueAction(Request $request, Boutique $boutique)
  97.     {
  98.         $em = $this->getDoctrine()
  99.                     ->getManager();
  100.         $user = $this->getUser();
  101.         $userBoutique = $em->getRepository(UserBoutique::class)
  102.                         ->findOneBy(
  103.                             array(
  104.                             'user' => $user->getId(),
  105.                             'boutique' => $boutique->getId()
  106.                             )
  107.                         );
  108.         
  109.         if(null == $userBoutique){
  110.             return $this->redirectToRoute('security_login');
  111.         }
  112.         $abonnement = $em->getRepository(Commande::class)
  113.                         ->findBy(
  114.                             array(
  115.                                 'boutique' => $boutique 
  116.                             ),
  117.                             array(
  118.                                 'laDate' => 'DESC'
  119.                             ),
  120.                             1
  121.                         );    
  122.         if(!empty($abonnement)){
  123.             $abonnement = $abonnement[0];
  124.         }
  125.             
  126.         return $this->render('gestion/afficher_boutique.html.twig', [
  127.             'boutique' => $boutique,
  128.             'userBoutique' => $userBoutique,
  129.             'abonnement' => $abonnement
  130.             
  131.         ]);
  132.     }
  133.     
  134.     /**
  135.      * @Route("/devenir-premium/", name="gestion.devenir_premium")
  136.      * @return \Symfony\Component\HttpFoundation\Response
  137.      */
  138.     public function devenirPremiumAction(Request $request, Boutique $boutique)
  139.     {
  140.         $em = $this->getDoctrine()
  141.                     ->getManager();
  142.                     
  143.         $user = $this->getUser();
  144.         $userBoutique = $em->getRepository(UserBoutique::class)
  145.                         ->findOneBy(
  146.                             array(
  147.                             'user' => $user->getId(),
  148.                             'boutique' => $boutique->getId()
  149.                             )
  150.                         );
  151.         $transId = rand(4560, 100000);
  152.         $transDate = new \DateTime();
  153.         $amount = 15000;
  154.         if('POST' == $request->getMethod()){
  155.             var_dump($_POST);
  156.         }
  157.         
  158.         
  159.     $commande = new Commande;
  160.     //transaction id
  161.     $id_transaction = rand(); //CinetPay::generateTransId();
  162.     // Payment description
  163.     $description_du_paiement = "Devenir premium";
  164.     // Payment Date must be on date format
  165.     $date_transaction = date("Y-m-d H:i:s");
  166.     // Amount
  167.     $montant_a_payer = 15000;
  168.     // put a value that you can use to identify the buyer in your system
  169.     $identifiant_du_payeur = $user->getId().'@@@'.$boutique->getId();
  170.     //Veuillez entrer votre apiKey
  171.     $apiKey = "1182873575626ba8e6c712e9.05305545";
  172.     //Secret Key: 127127447062796bafS
  173.     //Veuillez entrer votre siteId
  174.     $site_id = "792421";
  175.     //platform ,  utiliser PROD si vous avez créé votre compte sur www.cinetpay.com  ou TEST si vous avez créé votre compte sur www.sandbox.cinetpay.com
  176.     $plateform = "PROD";
  177.     //la version ,  utilisé V1 si vous voulez utiliser la version 1 de l'api
  178.     $version = "V2";
  179.     // nom du formulaire CinetPay
  180.     $formName = "goCinetPay";
  181.     // notify url
  182.     $notify_url = $this->generateUrl('gestion.cinetpay_notify', array('transaction' => $id_transaction), UrlGeneratorInterface::ABSOLUTE_URL);
  183.     // return url
  184.     $return_url =  $this->generateUrl('gestion.cinetpay_return', array('transaction' => $id_transaction), UrlGeneratorInterface::ABSOLUTE_URL);
  185.     // cancel url
  186.     $cancel_url =  $this->generateUrl('gestion.cinetpay_cancel', array('transaction' => $id_transaction), UrlGeneratorInterface::ABSOLUTE_URL);
  187.     // cinetpay button type, must be 1, 2, 3, 4 or 5
  188.     $btnType = 4;
  189.     // button size, can be 'small' , 'large' or 'larger'
  190.     $btnSize = 'large';
  191.     // fill command class
  192.     $commande->setCpmTransId($id_transaction);
  193.     $commande->setCpmAmount($montant_a_payer);
  194.     $commande->setUser($user);
  195.     $commande->setBoutique($boutique);
  196.     $em->persist($commande);
  197.     $em->flush();
  198.    
  199.         return $this->render('gestion/devenir_premium.html.twig', [
  200.             'user' => $user,
  201.             'transId' => $transId,
  202.             'transDate' => $transDate,
  203.             'amount' => $amount,
  204.             'plan' => $plan,
  205.             'transaction' => $id_transaction,
  206.             'formName' => $formName,
  207.             'btnType' => $btnType,
  208.             'btnSize' => $btnSize,
  209.             'boutique' => $boutique,
  210.             'userBoutique' => $userBoutique,
  211.         ]);
  212.         
  213.         return $this->redirectToRoute('gestion.show_shop', array('slug' => $boutique->getSlug()));
  214.             
  215.     }
  216.     /**
  217.      * @Route("/table-formule-pour-paiement/{slug}", name="gestion_table_formule_pour_paiement")
  218.      * @return \Symfony\Component\HttpFoundation\Response
  219.      */
  220.     public function tableFormulePourPaiementAction(Request $request, Boutique $boutique)
  221.     {
  222.         $em = $this->getDoctrine()
  223.                     ->getManager();
  224.                     
  225.         $plans = $em->getRepository(Plan::class)
  226.                     ->paidPlan();
  227.         return $this->render('gestion/table_formule_pour_paiement.html.twig', [
  228.             'boutique' => $boutique,
  229.             'plans' => $plans
  230.         ]);
  231.     }
  232.     /**
  233.      * @Route("/paiement-abonnement/{idEntreprise}/{idPlan}/{idUser}/{plateforme}", name="gestion_paiement_abonnement")
  234.      * @return \Symfony\Component\HttpFoundation\Response
  235.      */
  236.     public function paiementAbonnementAction(Request $request,  $idEntreprise, $idPlan, $idUser, $plateforme)
  237.     {
  238.         $em = $this->getDoctrine()
  239.                     ->getManager();
  240.         $user = $this->getUser();
  241.         $boutique =  $em->getRepository(Boutique::class)
  242.                         ->findOneById($idEntreprise);
  243.         if($plateforme == 'mobile'){
  244.             $user =  $em->getRepository(AppUser::class)
  245.                         ->findOneById($idUser);
  246.         }
  247.         
  248.         $userBoutique = $em->getRepository(UserBoutique::class)
  249.                         ->findOneBy(
  250.                             array(
  251.                             'user' => $user->getId(),
  252.                             'boutique' => $boutique->getId()
  253.                             )
  254.                         );
  255.         if(null == $userBoutique){
  256.             return $this->createNotFoundException();
  257.         }
  258.         $plan = $em->getRepository(Plan::class)
  259.                     ->findOneById($idPlan);
  260.         //Authentification
  261.     /*
  262.     $ch = curl_init($this->getJekoBaseUrl().'/stores');
  263.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  264.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
  265.         'X-API-KEY:'. $this->getJekoAPI(),
  266.         'X-API-KEY-ID:'.$this->getJekoAPIID(),
  267.         'Content-Type: application/json'
  268.     ]);
  269.     
  270.     $response = curl_exec($ch);
  271.     curl_close($ch);
  272.     $paymentRequest = json_decode($response, true);
  273.     
  274.     */
  275.         $transId = rand(4560, 100000);
  276.         $transDate = new \DateTime();
  277.         $amount = 15000;
  278.         $message = '';
  279.         $error = '';
  280.         $qrUrl = '';
  281.         $authenticationUrl = 'https://billpayment.api.prod.run.billmap.net/api/authentication/token';
  282.         $id_transaction = '';
  283.         $apiKeyAndSecret = array(
  284.             'orangekey' => '2CSLsG7IDYHmR8Wp',
  285.             'orangesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  286.             'mtnkey' => '3AXHb9Q0ctzSJqbV',
  287.             'mtnsecret' => 'oDXwYw4XwervcUHof7u7M0tRfRuAYf9aGmgOWYF9y1aMjkWX3lZx312X5ge8L8I9',
  288.             'moovkey' => 'GX7fNUtKpzbaZbrM',
  289.             'moovesecret' => '2OZpbuvcRCDNapJrsVkHTE6gqocNdeN1DxIQIlEpBZjbR6GuQaBYkbim05fDbK1i',
  290.             'wavekey' => '2CSLsG7IDYHmR8Wp',
  291.             'wavesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF'
  292.         );
  293.         
  294.         //variable mise pour la compatibilité mobile
  295.         $keyOperateur = array(
  296.             'orangekey' => '2CSLsG7IDYHmR8Wp',
  297.             'orangesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  298.             'orangedebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/Bill/orange/webpayment',
  299.             'orangecode' => 'MYHELPPLACE_ORANGE',
  300.             'mtnkey' => '2CSLsG7IDYHmR8Wp',
  301.             'mtnsecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  302.             'mtndebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/Bill/debit/openapi',
  303.             'mtncode' => 'MYHELPPLACE_MTNCI',
  304.             'moovkey' => 'GX7fNUtKpzbaZbrM',
  305.             'moovsecret' => '2OZpbuvcRCDNapJrsVkHTE6gqocNdeN1DxIQIlEpBZjbR6GuQaBYkbim05fDbK1i',
  306.             'moovdebiturl' =>'https://billpayment.api.prod.run.billmap.net/api/Bill/debit/moov',
  307.             'moovcode' => 'MYHELPPLACE_MOOVCI',
  308.             'wavekey' => '2CSLsG7IDYHmR8Wp',
  309.             'wavesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  310.             'wavedebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/bill/wave/checkout',
  311.             'wavecode' => 'MYHELPPLACE_WAVE'
  312.         );
  313.         
  314.         if('POST' == $request->getMethod()){
  315.             $formData = json_decode($request->getContent());
  316.             if($plateforme == 'web'){
  317.                 $operateurPaiement = $request->request->get('operateur_paiement');
  318.                 $numeroDeTelephone = $request->request->get('numero_de_telephone');
  319.                 $indicatifPays = $request->request->get('indicatif_pays');
  320.                 $mois = (float)$request->request->get('mois');
  321.                 //$montantTransaction = (float)$request->request->get('montant_transaction');
  322.                 $montantTransaction = $plan->getTarif() * $mois;
  323.                 $key = $request->request->get($operateurPaiement.'key');
  324.                 $secret =  $request->request->get($operateurPaiement.'secret');
  325.                 $debitURL =  $request->request->get($operateurPaiement.'debiturl');
  326.                 $code =  $request->request->get($operateurPaiement.'code');
  327.                 $otp = $request->request->get('otp');
  328.             }else{
  329.                 // mobile
  330.             
  331.                 $operateurPaiement = $formData->operateur_paiement;
  332.                 $numeroDeTelephone = $formData->numero_de_telephone;
  333.                 $indicatifPays = $formData->indicatif_pays;
  334.                 $mois = (float)$formData->mois;
  335.                 //$montantTransaction = (float)$formData->montant_transaction;
  336.                 $montantTransaction = $plan->getTarif() * $mois;
  337.                 $key = $keyOperateur[$operateurPaiement.'key'];
  338.                 $secret =  $keyOperateur[$operateurPaiement.'secret'];
  339.                 $debitURL =  $keyOperateur[$operateurPaiement.'debiturl'];
  340.                 $code =  $keyOperateur[$operateurPaiement.'code'];
  341.                 $otp = $formData->otp;
  342.             }        
  343.             
  344.             $id_transaction = '';
  345.             
  346.                 $commande = new Commande;
  347.                 $commande->setPlan($plan);
  348.                 //transaction id
  349.                 
  350.                 // Payment description
  351.                 $description_du_paiement = "Devenir premium";
  352.                 // Payment Date must be on date format
  353.                 $date_transaction = date("Y-m-d H:i:s");
  354.                 // Amount
  355.                 $montant_a_payer = $montantTransaction;
  356.                 // put a value that you can use to identify the buyer in your system
  357.                 $identifiant_du_payeur = $user->getId().'@@@'.$boutique->getId();
  358.                 $commande->setCpmTransId($id_transaction);
  359.                 $commande->setCpmAmount($montant_a_payer);
  360.                 $commande->setUser($user);
  361.                 $commande->setBoutique($boutique);
  362.                 $em->persist($commande);
  363.                 $em->flush();
  364.                 $laReference =  $commande->getId().'@ABONNEMENT'.'@'.$mois;
  365.                 // notify url
  366.                 $returnUrls = $this->getJekoReturnUrls($laReference, $plateforme);
  367.                 $successUrl = $returnUrls['successUrl'];
  368.                 // return url
  369.                 $errorUrl = $returnUrls['errorUrl'];
  370.                 
  371.                 $ch = curl_init($this->getJekoBaseUrl().'/payment_requests');
  372.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  373.                 curl_setopt($ch, CURLOPT_POST, true);
  374.                 curl_setopt($ch, CURLOPT_HTTPHEADER, [
  375.                     'X-API-KEY:'. $this->getJekoAPI(),
  376.                     'X-API-KEY-ID:'.$this->getJekoAPIID(),
  377.                     'Content-Type: application/json'
  378.                 ]);
  379.                 $amountCents = (int) round((float) $montantTransaction * 100);
  380.                 
  381.                 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
  382.                     'storeId' => $this->getJekoStoreId(),
  383.                     'amountCents' => $amountCents,
  384.                     'currency' => 'XOF',
  385.                     'reference' =>$laReference,
  386.                     'paymentDetails' => [
  387.                         'type' => 'redirect',
  388.                         'data' => [
  389.                             'paymentMethod' => $operateurPaiement,
  390.                             'successUrl' => $successUrl,
  391.                             'errorUrl' => $errorUrl
  392.                         ]
  393.                     ]
  394.                 ]));
  395.                 
  396.                 $response = curl_exec($ch);
  397.                 $curlError = curl_error($ch);
  398.                 $httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
  399.                 curl_close($ch);
  400.                 $paymentRequest = json_decode($response, true);
  401.                 if ($response === false || $curlError || !is_array($paymentRequest) || empty($paymentRequest['redirectUrl'])) {
  402.                     return $this->allowRemoteRequest(new JsonResponse([
  403.                         'error' => 'Unable to create Jèko payment',
  404.                         'providerStatus' => $httpCode,
  405.                     ], Response::HTTP_BAD_GATEWAY));
  406.                 }
  407.                 
  408.                 $commande->setCpmTransId($paymentRequest['id'] ?? $id_transaction);
  409.                 $commande->setCpmAmount($montant_a_payer);
  410.                 $em->flush();
  411.                 if($plateforme == 'web'){
  412.                     return $this->redirect($paymentRequest['redirectUrl']);
  413.                 }else{
  414.                     return $this->allowRemoteRequest(new JsonResponse([
  415.                         'error' => '',
  416.                         'message' => '',
  417.                         'redirectUrl' => $paymentRequest['redirectUrl'],
  418.                         'reference' => $laReference,
  419.                         'paymentReference' => $laReference,
  420.                         'successUrl' => $successUrl,
  421.                         'errorUrl' => $errorUrl,
  422.                     ]));
  423.                 }
  424.                 return $this->redirectToRoute('gestion_finaliser_abonnement', array('slug' => $boutique->getSlug(), 'plan' => $plan->getSlug()));
  425.             
  426.         }
  427.         
  428.         if($plateforme == 'mobile'){
  429.             return $this->render('api/paiement_abonnement.html.twig', [
  430.                 'user' => $user,
  431.                 'transId' => $transId,
  432.                 'transDate' => $transDate,
  433.                 'amount' => $amount,
  434.                 'plan' => $plan,
  435.                 'boutique' => $boutique,
  436.                 'userBoutique' => $userBoutique,
  437.                 'transaction' => $id_transaction,
  438.                 'keyOperateur' => $keyOperateur
  439.                 ]);
  440.         }
  441.         return $this->render('gestion/paiement_abonnement.html.twig', [
  442.             'user' => $user,
  443.             'transId' => $transId,
  444.             'transDate' => $transDate,
  445.             'amount' => $amount,
  446.             //'CinetPay' => $CinetPay,
  447.             'plan' => $plan,
  448.             'boutique' => $boutique,
  449.             'userBoutique' => $userBoutique,
  450.             'transaction' => $id_transaction
  451.         ]);    
  452.     }
  453.     /**
  454.      * @Route("/paiement-frais-de-service/{idUser}/{typeService}/{plateforme}", name="gestion_paiement_frais_de_service")
  455.      * @return \Symfony\Component\HttpFoundation\Response
  456.     */
  457.     public function paiementFraisDeServiceAction(Request $request,  $idUser, $typeService, $plateforme)
  458.     {
  459.         $em = $this->getDoctrine()
  460.                     ->getManager();
  461.         $user = $em->getRepository(AppUser::class)
  462.                     ->findOneById($idUser);
  463.         
  464.         if(null == $user){
  465.             throw $this->createNotFoundException();
  466.         }
  467.         
  468.         $transId = rand(4560, 100000);
  469.         $transDate = new \DateTime();
  470.         $amount = 15000;
  471.         $message = '';
  472.         $error = '';
  473.         $qrUrl = '';
  474.         $authenticationUrl = 'https://billpayment.api.prod.run.billmap.net/api/authentication/token';
  475.         $id_transaction = '';
  476.         $apiKeyAndSecret = array(
  477.             'orangekey' => '2CSLsG7IDYHmR8Wp',
  478.             'orangesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  479.             'mtnkey' => '3AXHb9Q0ctzSJqbV',
  480.             'mtnsecret' => 'oDXwYw4XwervcUHof7u7M0tRfRuAYf9aGmgOWYF9y1aMjkWX3lZx312X5ge8L8I9',
  481.             'moovkey' => 'GX7fNUtKpzbaZbrM',
  482.             'moovesecret' => '2OZpbuvcRCDNapJrsVkHTE6gqocNdeN1DxIQIlEpBZjbR6GuQaBYkbim05fDbK1i',
  483.             'wavekey' => '2CSLsG7IDYHmR8Wp',
  484.             'wavesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF'
  485.         );
  486.         //variable mise pour la compatibilité mobile
  487.         $keyOperateur = array(
  488.             'orangekey' => '2CSLsG7IDYHmR8Wp',
  489.             'orangesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  490.             'orangedebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/Bill/orange/webpayment',
  491.             'orangecode' => 'MYHELPPLACE_ORANGE',
  492.             'mtnkey' => '2CSLsG7IDYHmR8Wp',
  493.             'mtnsecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  494.             'mtndebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/Bill/debit/openapi',
  495.             'mtncode' => 'MYHELPPLACE_MTNCI',
  496.             'moovkey' => 'GX7fNUtKpzbaZbrM',
  497.             'moovsecret' => '2OZpbuvcRCDNapJrsVkHTE6gqocNdeN1DxIQIlEpBZjbR6GuQaBYkbim05fDbK1i',
  498.             'moovdebiturl' =>'https://billpayment.api.prod.run.billmap.net/api/Bill/debit/moov',
  499.             'moovcode' => 'MYHELPPLACE_MOOVCI',
  500.             
  501.             'wavekey' => '2CSLsG7IDYHmR8Wp',
  502.             'wavesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  503.             'wavedebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/bill/wave/checkout',
  504.             'wavecode' => 'MYHELPPLACE_WAVE'
  505.         );
  506.         if('POST' == $request->getMethod()){
  507.             $formData = json_decode($request->getContent(), true);
  508.             if (!is_array($formData)) {
  509.                 $formData = $request->request->all();
  510.             }
  511.             $getInput = static function (array $data, string $camel, ?string $snake = null) {
  512.                 return $data[$camel] ?? ($snake !== null ? ($data[$snake] ?? null) : null);
  513.             };
  514.             if($plateforme == 'web'){
  515.                 $operateurPaiement = strtolower(trim((string)$request->request->get('operateurPaiement')));
  516.                 $numeroDeTelephone = $request->request->get('numeroDeTelephone');
  517.                 $indicatifPays = $request->request->get('indicatifPays');
  518.                 $montantTransaction = (float)$request->request->get('montant');
  519.                 $key = $request->request->get($operateurPaiement.'key');
  520.                 $secret =  $request->request->get($operateurPaiement.'secret');
  521.                 $debitURL =  $request->request->get($operateurPaiement.'debiturl');
  522.                 $code =  $request->request->get($operateurPaiement.'code');
  523.                 $otp = $request->request->get('otp');
  524.             }else{
  525.                 // mobile
  526.             
  527.                 $operateurPaiement = strtolower(trim((string)$getInput($formData, 'operateurPaiement', 'operateur_paiement')));
  528.                 $numeroDeTelephone = $getInput($formData, 'numeroDeTelephone', 'numero_de_telephone');
  529.                 $indicatifPays = $getInput($formData, 'indicatifPays', 'indicatif_pays');
  530.                 $montantTransaction = (float)$getInput($formData, 'montant');
  531.                 $key = $keyOperateur[$operateurPaiement.'key'] ?? null;
  532.                 $secret =  $keyOperateur[$operateurPaiement.'secret'] ?? null;
  533.                 $debitURL =  $keyOperateur[$operateurPaiement.'debiturl'] ?? null;
  534.                 $code =  $keyOperateur[$operateurPaiement.'code'] ?? null;
  535.                 $otp = $getInput($formData, 'otp');
  536.             }
  537.             
  538.                 $id_transaction = '';
  539.         
  540.                 $paiementService = new PaiementService;
  541.                 $paiementService->setMontant($montantTransaction);
  542.                 $paiementService->setUser($user);
  543.                 $requestedPaymentType = strtoupper(trim((string)$typeService));
  544.                 if ($requestedPaymentType === 'PRESTATION') {
  545.                     $paymentType = 'PRESTATION';
  546.                 } elseif (in_array($requestedPaymentType, ['DISCUTER', 'DISCUSSION'], true)) {
  547.                     $paymentType = 'DISCUSSION';
  548.                 } elseif (in_array($requestedPaymentType, ['DEVIS', 'DEMANDE_DEVIS', 'DEMANDE-DE-DEVIS'], true)) {
  549.                     $paymentType = 'DEVIS';
  550.                 } else {
  551.                     $paymentType = 'SERVICE';
  552.                 }
  553.                 $idOffreDevis = $plateforme === 'web'
  554.                     ? $request->request->get('idOffreDevis')
  555.                     : ($getInput($formData, 'idOffreDevis', 'id_offre_devis')
  556.                         ?? $getInput($formData, 'offreDevisId', 'offre_devis_id'));
  557.                 $offreDevis = $idOffreDevis
  558.                     ? $em->getRepository(OffreDevis::class)->findOneById($idOffreDevis)
  559.                     : null;
  560.                 if ($offreDevis) {
  561.                     $clientDuDevis = $offreDevis->getDevis() ? $offreDevis->getDevis()->getUser() : null;
  562.                     if (!$clientDuDevis || (int) $clientDuDevis->getId() !== (int) $user->getId()) {
  563.                         return $this->allowRemoteRequest(new JsonResponse([
  564.                             'error' => 'Accès refusé',
  565.                             'message' => 'Ce devis appartient à un autre compte client.',
  566.                         ], Response::HTTP_FORBIDDEN));
  567.                     }
  568.                     $paymentType = 'PRESTATION';
  569.                     $montantTransaction = $this->montantFinalOffre($offreDevis);
  570.                 }
  571.                 if (in_array($paymentType, ['DISCUSSION', 'DEVIS'], true)
  572.                     && $this->paiementFraisDuJourExiste($em, $user, $paymentType)) {
  573.                     return $this->allowRemoteRequest(new JsonResponse([
  574.                         'error' => 'Frais déjà demandés',
  575.                         'message' => 'Les frais de ' . strtolower($paymentType) . ' ne peuvent être demandés qu’une seule fois par jour.',
  576.                         'typeService' => $paymentType,
  577.                     ], Response::HTTP_CONFLICT));
  578.                 }
  579.                 if (!$operateurPaiement || $montantTransaction <= 0 || !isset($keyOperateur[$operateurPaiement.'key'])) {
  580.                     return $this->allowRemoteRequest(new JsonResponse(['error' => 'Invalid payment parameters'], Response::HTTP_BAD_REQUEST));
  581.                 }
  582.                 // Le montant final vient toujours de l'offre pour une prestation.
  583.                 $paiementService->setMontant($montantTransaction);
  584.                 $paiementService->setTypeService($paymentType);
  585.                 $paiementService->setLaDate(new \DateTime());
  586.                 if ($paymentType === 'PRESTATION') {
  587.                     if (!$offreDevis || !$offreDevis->getBoutique()) {
  588.                         return $this->allowRemoteRequest(new JsonResponse([
  589.                             'error' => 'idOffreDevis obligatoire pour un paiement de prestation',
  590.                         ], Response::HTTP_BAD_REQUEST));
  591.                     }
  592.                     $paiementService->setOffreDevis($offreDevis);
  593.                 }
  594.                 //transaction id
  595.                 
  596.                 // Payment description
  597.                 $description_du_paiement = "Devenir premium";
  598.                 // Payment Date must be on date format
  599.                 $date_transaction = date("Y-m-d H:i:s");
  600.                 // Amount
  601.                 $montant_a_payer = $montantTransaction;
  602.                 //$commande->setCpmTransId($id_transaction);
  603.                 //$commande->setCpmAmount($montant_a_payer);
  604.                 //$commande->setUser($user);
  605.                 $em->persist($paiementService);
  606.                 $em->flush();    
  607.                 
  608.                 $laReference = $paiementService->getId() . '@' . $paymentType;
  609.                 if ($paymentType === 'PRESTATION' && $offreDevis) {
  610.                     $laReference .= '@' . $offreDevis->getId();
  611.                 }
  612.                 // notify url
  613.                 $returnUrls = $this->getJekoReturnUrls($laReference, $plateforme);
  614.                 $successUrl = $returnUrls['successUrl'];
  615.                 // return url
  616.                 $errorUrl = $returnUrls['errorUrl'];
  617.                 
  618.                 $ch = curl_init($this->getJekoBaseUrl().'/payment_requests');
  619.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  620.                 curl_setopt($ch, CURLOPT_POST, true);
  621.                 curl_setopt($ch, CURLOPT_HTTPHEADER, [
  622.                     'X-API-KEY:'. $this->getJekoAPI(),
  623.                     'X-API-KEY-ID:'.$this->getJekoAPIID(),
  624.                     'Content-Type: application/json'
  625.                 ]);
  626.                 $amountCents = (int) round((float) $montantTransaction * 100);
  627.                 
  628.                 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
  629.                     'storeId' => $this->getJekoStoreId(),
  630.                     'amountCents' => $amountCents,
  631.                     'currency' => 'XOF',
  632.                     'reference' =>$laReference,
  633.                     'paymentDetails' => [
  634.                         'type' => 'redirect',
  635.                         'data' => [
  636.                             'paymentMethod' => $operateurPaiement,
  637.                             'successUrl' => $successUrl,
  638.                             'errorUrl' => $errorUrl
  639.                         ]
  640.                     ]
  641.                 ]));
  642.                 
  643.                 $response = curl_exec($ch);
  644.                 $curlError = curl_error($ch);
  645.                 $httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
  646.                 curl_close($ch);
  647.                 $paymentRequest = json_decode($response, true);
  648.                 if ($response === false || $curlError || !is_array($paymentRequest) || empty($paymentRequest['redirectUrl'])) {
  649.                     $providerMessage = is_array($paymentRequest)
  650.                         ? ($paymentRequest['message'] ?? $paymentRequest['error'] ?? 'Jèko n’a pas fourni de redirectUrl')
  651.                         : 'Réponse Jèko invalide';
  652.                     $providerResponse = is_array($paymentRequest) ? $paymentRequest : ['raw' => substr((string)$response, 0, 2000)];
  653.                     $providerDetails = $providerResponse['extras'] ?? $providerResponse['errors'] ?? $providerResponse['errorReason'] ?? null;
  654.                     if ($providerDetails !== null) {
  655.                         $providerMessage .= ' - ' . (is_string($providerDetails) ? $providerDetails : json_encode($providerDetails));
  656.                     }
  657.                     return $this->allowRemoteRequest(new JsonResponse([
  658.                         'error' => 'Unable to create Jèko payment',
  659.                         'message' => $providerMessage,
  660.                         'details' => $providerDetails,
  661.                         'providerResponse' => $providerResponse,
  662.                         'providerStatus' => $httpCode,
  663.                     ], Response::HTTP_BAD_GATEWAY));
  664.                 }
  665.                 
  666.                 
  667.                 $paiementService->setCpmTransId($paymentRequest['id'] ?? $id_transaction);
  668.                 $em->flush();
  669.                 if($plateforme == 'web'){
  670.                     return $this->redirect($paymentRequest['redirectUrl']);
  671.                 }else{
  672.                 
  673.                     $data = array(
  674.                             'error' => '',
  675.                             'message' => '',
  676.                             'redirectUrl' => $paymentRequest['redirectUrl'],
  677.                             'successUrl' => $successUrl,
  678.                             'errorUrl' => $errorUrl,
  679.                             'reference' => $laReference,
  680.                             'paymentReference' => $laReference
  681.                             
  682.                     );
  683.                     
  684.                     $response = new JsonResponse;
  685.         
  686.                     $response = $this->allowRemoteRequest($response);
  687.                     
  688.                     $response->setContent(json_encode($data));
  689.                     return $response;
  690.                 }
  691.                 $em->flush();
  692.                 
  693.                 //return $this->redirectToRoute('gestion_finaliser_abonnement', array('slug' => $boutique->getSlug(), 'plan' => $plan->getSlug()));
  694.             
  695.         }
  696.         
  697.         if($plateforme == 'mobile'){
  698.             return $this->render('api/paiement_service.html.twig', [
  699.                 
  700.                 ]);
  701.         }
  702.         return $this->render('gestion/paiement_abonnement.html.twig', [
  703.             'user' => $user,
  704.             'transId' => $transId,
  705.             'transDate' => $transDate,
  706.             'amount' => $amount,
  707.             
  708.             
  709.             'boutique' => $boutique,
  710.             'userBoutique' => $userBoutique,
  711.             'transaction' => $id_transaction
  712.         ]);    
  713.         if($request->getMethod() == 'POST'){
  714.             
  715.             $formData = json_decode($request->getContent());
  716.             
  717.             $dateDebut = $formData->dateDebut;
  718.             $dateDebut = new \DateTime($dateDebut);
  719.             $dateDebut->setTime(0, 0);
  720.             
  721.             $dateFin = $formData->dateFin;
  722.             //$dateFin = $request->request->get('dateFin');
  723.             
  724.             $dateFin = new \DateTime($dateFin);
  725.             $dateFin->setTime(23, 59);
  726.             $demandeRetraits = $em->getRepository(DemandeRetrait::class)
  727.                                 ->demandeDUnePeriode($boutique->getId(), $dateDebut, $dateFin, true);
  728.         }
  729.         $data = array(
  730.                 'error' => '',
  731.                 'message' => '',
  732.                 'demandeRetraits' => $demandeRetraits
  733.                 
  734.         );
  735.         $response = new JsonResponse;
  736.         
  737.         $response = $this->allowRemoteRequest($response);
  738.         
  739.         $response->setContent(json_encode($data));
  740.         return $response;
  741.         
  742.         return $this->render('api/envoyer_push_notification.html.twig', [ 
  743.             
  744.         ]);        
  745.     }
  746.     /**
  747.      * @Route("/paiement-prestation/{idUser}/{idOffreDevis}/{plateforme}", name="gestion_paiement_de_prestation")
  748.      * @return \Symfony\Component\HttpFoundation\Response
  749.     */
  750.     public function paiementPrestationAction(Request $request,  $idUser, $idOffreDevis, $plateforme)
  751.     {
  752.         $em = $this->getDoctrine()
  753.                     ->getManager();
  754.         $user = $em->getRepository(AppUser::class)
  755.                     ->findOneById($idUser);
  756.         
  757.         if(null == $user){
  758.             return $this->createNotFoundException();
  759.         }
  760.         $offreDevis =  $em->getRepository(OffreDevis::class)
  761.                     ->findOneById($idOffreDevis);
  762.         if (!$offreDevis || !$offreDevis->getBoutique()) {
  763.             return new JsonResponse(['error' => 'Offre de devis introuvable ou sans prestataire'], Response::HTTP_BAD_REQUEST);
  764.         }
  765.         $clientDuDevis = $offreDevis->getDevis() ? $offreDevis->getDevis()->getUser() : null;
  766.         if (!$clientDuDevis || (int) $clientDuDevis->getId() !== (int) $user->getId()) {
  767.             return new JsonResponse([
  768.                 'error' => 'Accès refusé',
  769.                 'message' => 'Ce devis appartient à un autre compte client.',
  770.             ], Response::HTTP_FORBIDDEN);
  771.         }
  772.         
  773.         $transId = rand(4560, 100000);
  774.         $transDate = new \DateTime();
  775.         $amount = 15000;
  776.         $message = '';
  777.         $error = '';
  778.         $qrUrl = '';
  779.         $authenticationUrl = 'https://billpayment.api.prod.run.billmap.net/api/authentication/token';
  780.         $id_transaction = '';
  781.         $apiKeyAndSecret = array(
  782.             'orangekey' => '2CSLsG7IDYHmR8Wp',
  783.             'orangesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  784.             'mtnkey' => '3AXHb9Q0ctzSJqbV',
  785.             'mtnsecret' => 'oDXwYw4XwervcUHof7u7M0tRfRuAYf9aGmgOWYF9y1aMjkWX3lZx312X5ge8L8I9',
  786.             'moovkey' => 'GX7fNUtKpzbaZbrM',
  787.             'moovesecret' => '2OZpbuvcRCDNapJrsVkHTE6gqocNdeN1DxIQIlEpBZjbR6GuQaBYkbim05fDbK1i',
  788.             'wavekey' => '2CSLsG7IDYHmR8Wp',
  789.             'wavesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF'
  790.         );
  791.         //variable mise pour la compatibilité mobile
  792.         $keyOperateur = array(
  793.             'orangekey' => '2CSLsG7IDYHmR8Wp',
  794.             'orangesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  795.             'orangedebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/Bill/orange/webpayment',
  796.             'orangecode' => 'MYHELPPLACE_ORANGE',
  797.             'mtnkey' => '2CSLsG7IDYHmR8Wp',
  798.             'mtnsecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  799.             'mtndebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/Bill/debit/openapi',
  800.             'mtncode' => 'MYHELPPLACE_MTNCI',
  801.             'moovkey' => 'GX7fNUtKpzbaZbrM',
  802.             'moovsecret' => '2OZpbuvcRCDNapJrsVkHTE6gqocNdeN1DxIQIlEpBZjbR6GuQaBYkbim05fDbK1i',
  803.             'moovdebiturl' =>'https://billpayment.api.prod.run.billmap.net/api/Bill/debit/moov',
  804.             'moovcode' => 'MYHELPPLACE_MOOVCI',
  805.             
  806.             'wavekey' => '2CSLsG7IDYHmR8Wp',
  807.             'wavesecret' => '3puc5vA7cySjUGoCkAJZ5nzIesMg0uWdLVsNchbvClZz8ZqtBwzz1bdOMSxnWEzF',
  808.             'wavedebiturl' => 'https://billpayment.api.prod.run.billmap.net/api/bill/wave/checkout',
  809.             'wavecode' => 'MYHELPPLACE_WAVE'
  810.         );
  811.         if('POST' == $request->getMethod()){
  812.             $formData = json_decode($request->getContent());
  813.             if($plateforme == 'web'){
  814.                 $operateurPaiement = $request->request->get('operateurPaiement');
  815.                 $numeroDeTelephone = $request->request->get('numeroDeTelephone');
  816.                 $indicatifPays = $request->request->get('indicatifPays');
  817.                 $montantTransaction = $this->montantFinalOffre($offreDevis);
  818.                 $otp = $request->request->get('otp');
  819.             }else{
  820.                 // mobile
  821.             
  822.                 $operateurPaiement = $formData->operateurPaiement;
  823.                 $numeroDeTelephone = $formData->numeroDeTelephone;
  824.                 $indicatifPays = $formData->indicatifPays;
  825.                 $montantTransaction = $this->montantFinalOffre($offreDevis);
  826.                 $otp = $formData->otp;
  827.             }
  828.             
  829.             $id_transaction = '';
  830.             if ($montantTransaction <= 0) {
  831.                 return $this->allowRemoteRequest(new JsonResponse([
  832.                     'error' => 'Montant de prestation invalide',
  833.                     'message' => 'Cette offre de devis ne possède pas de montant payable.',
  834.                 ], Response::HTTP_BAD_REQUEST));
  835.             }
  836.             
  837.                 $paiementService = new PaiementService;
  838.                 $paiementService->setMontant($montantTransaction);
  839.                 $paiementService->setUser($user);
  840.                 $paiementService->setTypeService('PRESTATION');
  841.                 $paiementService->setLaDate(new \DateTime());
  842.                 $paiementService->setOffreDevis($offreDevis);
  843.                 //transaction id
  844.                 
  845.                 // Payment description
  846.                 $description_du_paiement = "Devenir premium";
  847.                 // Payment Date must be on date format
  848.                 $date_transaction = date("Y-m-d H:i:s");
  849.                 // Amount
  850.                 $montant_a_payer = $montantTransaction;
  851.                 //$commande->setCpmTransId($id_transaction);
  852.                 //$commande->setCpmAmount($montant_a_payer);
  853.                 //$commande->setUser($user);
  854.                 $em->persist($paiementService);
  855.                 $em->flush();
  856.                 
  857.                 //Ici debute le paiement par Jeko
  858.                 $laReference = $paiementService->getId() . '@PRESTATION@' . $offreDevis->getId();
  859.                 // notify url
  860.                 $returnUrls = $this->getJekoReturnUrls($laReference, $plateforme);
  861.                 $successUrl = $returnUrls['successUrl'];
  862.                 // return url
  863.                 $errorUrl = $returnUrls['errorUrl'];
  864.                 
  865.                 $ch = curl_init($this->getJekoBaseUrl().'/payment_requests');
  866.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  867.                 curl_setopt($ch, CURLOPT_POST, true);
  868.                 curl_setopt($ch, CURLOPT_HTTPHEADER, [
  869.                     'X-API-KEY:'. $this->getJekoAPI(),
  870.                     'X-API-KEY-ID:'.$this->getJekoAPIID(),
  871.                     'Content-Type: application/json'
  872.                 ]);
  873.                 $amountCents = (int) round($montantTransaction * 100);
  874.                 
  875.                 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
  876.                     'storeId' => $this->getJekoStoreId(),
  877.                     'amountCents' => $amountCents,
  878.                     'currency' => 'XOF',
  879.                     'reference' =>$laReference,
  880.                     'paymentDetails' => [
  881.                         'type' => 'redirect',
  882.                         'data' => [
  883.                             'paymentMethod' => $operateurPaiement,
  884.                             'successUrl' => $successUrl,
  885.                             'errorUrl' => $errorUrl
  886.                         ]
  887.                     ]
  888.                 ]));
  889.                 
  890.                 $response = curl_exec($ch);
  891.                 $curlError = curl_error($ch);
  892.                 $httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
  893.                 curl_close($ch);
  894.                 $paymentRequest = json_decode($response, true);
  895.                 if ($response === false || $curlError || !is_array($paymentRequest) || empty($paymentRequest['redirectUrl'])) {
  896.                     $providerMessage = is_array($paymentRequest)
  897.                         ? ($paymentRequest['message'] ?? $paymentRequest['error'] ?? 'Jèko n’a pas fourni de redirectUrl')
  898.                         : 'Réponse Jèko invalide';
  899.                     $providerResponse = is_array($paymentRequest) ? $paymentRequest : ['raw' => substr((string)$response, 0, 2000)];
  900.                     $providerDetails = $providerResponse['extras'] ?? $providerResponse['errors'] ?? $providerResponse['errorReason'] ?? null;
  901.                     if ($providerDetails !== null) {
  902.                         $providerMessage .= ' - ' . (is_string($providerDetails) ? $providerDetails : json_encode($providerDetails));
  903.                     }
  904.                     return $this->allowRemoteRequest(new JsonResponse([
  905.                         'error' => 'Unable to create Jèko payment',
  906.                         'message' => $providerMessage,
  907.                         'details' => $providerDetails,
  908.                         'providerResponse' => $providerResponse,
  909.                         'providerStatus' => $httpCode,
  910.                     ], Response::HTTP_BAD_GATEWAY));
  911.                 }
  912.                 
  913.                 $paiementService->setCpmTransId($paymentRequest['id'] ?? $id_transaction);
  914.                 $em->flush();
  915.                 if($plateforme == 'web'){
  916.                     return $this->redirect($paymentRequest['redirectUrl']);
  917.                 }else{
  918.                     $data = array(
  919.                             'error' => '',
  920.                             'message' => '',
  921.                             'redirectUrl' => $paymentRequest['redirectUrl'],
  922.                             'successUrl' => $successUrl,
  923.                             'errorUrl' => $errorUrl,
  924.                             'reference' => $laReference,
  925.                             'paymentReference' => $laReference
  926.                             
  927.                     );
  928.                     
  929.                     $response = new JsonResponse;
  930.         
  931.                     $response = $this->allowRemoteRequest($response);
  932.                     
  933.                     $response->setContent(json_encode($data));
  934.                     return $response;
  935.                 }
  936.                 //là se termine le paiement par Jeko
  937.                 $em->flush();
  938.         }
  939.         
  940.         if($plateforme == 'mobile'){
  941.             return $this->render('api/paiement_prestation.html.twig', [
  942.                 
  943.                 ]);
  944.         }
  945.         return $this->render('gestion/paiement_prestation.html.twig', [
  946.             
  947.         ]);    
  948.         if($request->getMethod() == 'POST'){
  949.             
  950.             $formData = json_decode($request->getContent());
  951.             
  952.             $dateDebut = $formData->dateDebut;
  953.             $dateDebut = new \DateTime($dateDebut);
  954.             $dateDebut->setTime(0, 0);
  955.             
  956.             $dateFin = $formData->dateFin;
  957.             //$dateFin = $request->request->get('dateFin');
  958.             
  959.             $dateFin = new \DateTime($dateFin);
  960.             $dateFin->setTime(23, 59);
  961.             $demandeRetraits = $em->getRepository(DemandeRetrait::class)
  962.                                 ->demandeDUnePeriode($boutique->getId(), $dateDebut, $dateFin, true);
  963.         }
  964.         $data = array(
  965.                 'error' => '',
  966.                 'message' => '',
  967.                 'demandeRetraits' => $demandeRetraits
  968.                 
  969.         );
  970.         $response = new JsonResponse;
  971.         
  972.         $response = $this->allowRemoteRequest($response);
  973.         
  974.         $response->setContent(json_encode($data));
  975.         return $response;
  976.         
  977.         return $this->render('api/envoyer_push_notification.html.twig', [ 
  978.             
  979.         ]);        
  980.     }
  981.     /**
  982.      * @Route("/finaliser-abonnement/{slug}/{plan}", name="gestion_finaliser_abonnement")
  983.      * @return \Symfony\Component\HttpFoundation\Response
  984.      */
  985.     public function finaliserAction(Request $request, Boutique $boutique, $plan)
  986.     {
  987.         $em = $this->getDoctrine()
  988.                     ->getManager();
  989.                     
  990.         $user = $this->getUser();
  991.         $userBoutique = $em->getRepository(UserBoutique::class)
  992.                         ->findOneBy(
  993.                             array(
  994.                             'user' => $user->getId(),
  995.                             'boutique' => $boutique->getId()
  996.                             )
  997.                         );
  998.         $plan = $em->getRepository(Plan::class)
  999.                         ->findOneBySlug($plan);
  1000.         return $this->render('gestion/finaliser_abonnement.html.twig', [
  1001.                 'user' => $user,
  1002.                 'boutique' => $boutique,
  1003.                 'userBoutique' => $userBoutique,
  1004.                 'plan' => $plan
  1005.             ]);
  1006.     }
  1007.     /**
  1008.     * @Route("/payment/billmap-return", name="gestion_billmap_return")
  1009.     */
  1010.     public function billmapReturnAction(Request $request)
  1011.     {
  1012.         $em = $this->getDoctrine()
  1013.                     ->getManager();
  1014.         $user = $this->getUser();
  1015.         /* 
  1016.         https://www.myhelpplace.com/fr/gestion/payment/billmap-return?
  1017.         // Reference=66&
  1018.         // Amount=100.00&
  1019.         // MSISDN=2250574053562&
  1020.         // NetworkMSISDN=2250574053562&
  1021.         // BillMapTransactionId=T4398121&
  1022.         // ExternalTransactionId=16464863303&
  1023.         // ResponseCode=01&
  1024.         // ResponseMessage=Successfully
  1025.         */
  1026.         $reference = $request->query->get('Reference'); //Ici, c'est bien la valeur qui avait été passé dans "metaData" lors de la requete 
  1027.         $montant = $request->query->get('Amount');
  1028.         $mois = $request->query->get('MetaData');
  1029.         $numeroDeTelephone = $request->query->get('MSISDN');
  1030.         $billMapTransactionId = $request->query->get('BillMapTransactionId');
  1031.         $responseMessage = $request->query->get('ResponseMessage');
  1032.         $responseCode = $request->query->get('ResponseCode');
  1033.         
  1034.         if($responseCode == '01'){
  1035.             $reference = explode('@', $reference); //'metaData' => ''.$paiementService->getId().'@SERVICE',
  1036.             if($reference[1] == 'ABONNEMENT'){
  1037.                 //Si la transaction a marché 
  1038.                 $commande = $em->getRepository(Commande::class)
  1039.                         ->findOneByCpmTransId($billMapTransactionId);
  1040.                 $dateFin  =  new \DateTime();
  1041.                 //
  1042.                 $dateFin->modify('+'.$mois .' month');
  1043.                 $commande->setDateFin($dateFin);
  1044.                 $em->flush();
  1045.             }
  1046.             if($reference[1] == 'SERVICE'){
  1047.                 //Si la transaction a marché 
  1048.                 $paiementService = $em->getRepository(PaiementService::class)
  1049.                         ->findOneByCpmTransId($billMapTransactionId);
  1050.                 $paiementService->setEtat('VALIDE');
  1051.                 
  1052.                 $em->flush();
  1053.             }
  1054.             if($reference[1] == 'PRESTATION'){
  1055.                 // Le lien paiement -> offre permet d'identifier le prestataire.
  1056.                 // La référence contient l'id du paiement, pas "PRESTATION".
  1057.                 $paiementService = $em->getRepository(PaiementService::class)
  1058.                         ->findOneById($reference[0]);
  1059.                 if ($paiementService) {
  1060.                     $previousStatus = $paiementService->getEtat();
  1061.                     $paiementService->setEtat('VALIDE');
  1062.                     $offreDevis = $paiementService->getOffreDevis();
  1063.                     $boutique = $offreDevis ? $offreDevis->getBoutique() : null;
  1064.                     if ($boutique && $previousStatus !== 'VALIDE') {
  1065.                         $boutique->setSolde((float) ($boutique->getSolde() ?? 0) + ((float) $paiementService->getMontant() * 90 / 100));
  1066.                     }
  1067.                     $paiementService->setCpmTransId($billMapTransactionId);
  1068.                     $em->flush();
  1069.                 }
  1070.             }
  1071.             
  1072.         }
  1073.         $response = new JsonResponse;
  1074.         $data = array(
  1075.             'mois' => 'Mois souscrit '. $mois,
  1076.             'montant' => 'Montant ' . $montant,
  1077.             'bonjour' => 'Bonjour tout le monde'
  1078.         );
  1079.         $response = $this->allowRemoteRequest($response);
  1080.         
  1081.         $response->setContent(json_encode($data));
  1082.         return $response;
  1083.         return $this->render('gestion/billmap_return.html.twig', [
  1084.             
  1085.             'user' => $user
  1086.         ]);
  1087.     }
  1088.     /**
  1089.      * Jèko is the source of truth for payment state. The return URLs only
  1090.      * notify the client that it can ask this backend for the current state.
  1091.      *
  1092.      * @Route("/payment/jeko-webhook", name="gestion_jeko_webhook", methods={"POST"})
  1093.      */
  1094.     public function jekoWebhookAction(Request $request)
  1095.     {
  1096.         $rawPayload = $request->getContent();
  1097.         $signature = $request->headers->get('Jeko-Signature');
  1098.         $secret = $this->getJekoWebhookSecret();
  1099.         if (!$secret || !$signature || !hash_equals(hash_hmac('sha256', $rawPayload, $secret), $signature)) {
  1100.             return new Response('Invalid webhook signature', Response::HTTP_UNAUTHORIZED);
  1101.         }
  1102.         $payload = json_decode($rawPayload, true);
  1103.         if (!is_array($payload)) {
  1104.             return new Response('Invalid webhook payload', Response::HTTP_BAD_REQUEST);
  1105.         }
  1106.         // Selon le produit/version Jèko, la référence peut être dans
  1107.         // transactionDetails ou directement à la racine du payload.
  1108.         $reference = $payload['transactionDetails']['reference'] ?? ($payload['reference'] ?? null);
  1109.         $rawStatus = strtolower((string)($payload['status'] ?? ''));
  1110.         $statusMap = [
  1111.             'success' => 'success',
  1112.             'completed' => 'success',
  1113.             'paid' => 'success',
  1114.             'pending' => 'pending',
  1115.             'processing' => 'pending',
  1116.             'error' => 'error',
  1117.             'failed' => 'error',
  1118.         ];
  1119.         $status = $statusMap[$rawStatus] ?? null;
  1120.         if (($payload['transactionType'] ?? null) !== 'PaymentRequest' || !$reference || $status === null) {
  1121.             return new Response('Invalid webhook payload', Response::HTTP_BAD_REQUEST);
  1122.         }
  1123.         $parts = explode('@', $reference);
  1124.         $paymentId = $parts[0] ?? null;
  1125.         $paymentType = $parts[1] ?? null;
  1126.         $em = $this->getDoctrine()->getManager();
  1127.         if ($paymentType === 'ABONNEMENT') {
  1128.             $commande = $em->getRepository(Commande::class)->findOneById($paymentId);
  1129.             if (!$commande) {
  1130.                 return new Response('Unknown payment reference', Response::HTTP_NOT_FOUND);
  1131.             }
  1132.             // Jèko may retry a webhook. Do not extend an abonnement twice.
  1133.             if ($commande->getCpmTransStatus() !== 'success' && $status === 'success') {
  1134.                 $months = (int)($parts[2] ?? 0);
  1135.                 $dateFin = new \DateTime();
  1136.                 $dateFin->modify('+' . $months . ' month');
  1137.                 $commande->setDateFin($dateFin);
  1138.             }
  1139.             $commande->setCpmTransStatus($status);
  1140.             $em->flush();
  1141.         } elseif (in_array($paymentType, ['SERVICE', 'DISCUSSION', 'DEVIS', 'PRESTATION'], true)) {
  1142.             $paiementService = $em->getRepository(PaiementService::class)->findOneById($paymentId);
  1143.             if (!$paiementService) {
  1144.                 return new Response('Unknown payment reference', Response::HTTP_NOT_FOUND);
  1145.             }
  1146.             $this->rattacherOffreDepuisReference($paiementService, $parts, $em);
  1147.             // Keep the status vocabulary already used by PaiementService.
  1148.             $previousStatus = $paiementService->getEtat();
  1149.             $paiementService->setEtat($status === 'success' ? 'VALIDE' : ($status === 'error' ? 'ECHEC' : 'EN ATTENTE'));
  1150.             // Credit the provider only once, after Jeko confirms the prestation payment.
  1151.             if ($paymentType === 'PRESTATION' && $status === 'success' && $previousStatus !== 'VALIDE') {
  1152.                 $offreDevis = $paiementService->getOffreDevis();
  1153.                 $boutique = $offreDevis ? $offreDevis->getBoutique() : null;
  1154.                 if ($boutique) {
  1155.                     $boutique->setSolde((float) ($boutique->getSolde() ?? 0) + ((float) $paiementService->getMontant() * 90 / 100));
  1156.                 }
  1157.             }
  1158.             $transactionDetails = is_array($payload['transactionDetails'] ?? null) ? $payload['transactionDetails'] : [];
  1159.             $transaction = is_array($payload['transaction'] ?? null) ? $payload['transaction'] : [];
  1160.             $transactionId = $transactionDetails['id']
  1161.                 ?? ($transaction['id'] ?? ($payload['transactionId'] ?? ($payload['id'] ?? $paiementService->getCpmTransId())));
  1162.             $paiementService->setCpmTransId((string)$transactionId);
  1163.             $em->flush();
  1164.             if ($paymentType === 'PRESTATION' && $status === 'success' && $previousStatus !== 'VALIDE') {
  1165.                 $this->notifierPaiementValide($paiementService);
  1166.             }
  1167.         } else {
  1168.             return new Response('Unknown payment reference', Response::HTTP_NOT_FOUND);
  1169.         }
  1170.         // Jèko considère uniquement HTTP 200 comme accusé de réception.
  1171.         return new Response('', Response::HTTP_OK);
  1172.     }
  1173.     /**
  1174.      * @Route("/payment/status/{reference}", name="gestion_payment_status", requirements={"reference"=".+"}, methods={"GET"})
  1175.      */
  1176.     public function paymentStatusAction(Request $request, $reference)
  1177.     {
  1178.         $user = $this->getUser();
  1179.         $reference = rawurldecode($reference);
  1180.         $parts = explode('@', $reference);
  1181.         $paymentId = $parts[0] ?? null;
  1182.         $paymentType = $parts[1] ?? null;
  1183.         $em = $this->getDoctrine()->getManager();
  1184.         $status = null;
  1185.         $owner = null;
  1186.         $payment = null;
  1187.         if ($paymentType === 'ABONNEMENT') {
  1188.             $payment = $em->getRepository(Commande::class)->findOneById($paymentId);
  1189.             if ($payment) {
  1190.                 $status = $payment->getCpmTransStatus();
  1191.                 $owner = $payment->getUser();
  1192.             }
  1193.         } elseif (in_array($paymentType, ['SERVICE', 'DISCUSSION', 'DEVIS', 'PRESTATION'], true)) {
  1194.             $payment = $em->getRepository(PaiementService::class)->findOneById($paymentId);
  1195.             if ($payment) {
  1196.                 $status = $payment->getEtat();
  1197.                 $owner = $payment->getUser();
  1198.                 $this->rattacherOffreDepuisReference($payment, $parts, $em);
  1199.             }
  1200.         }
  1201.         if (!$payment) {
  1202.             return new JsonResponse(['error' => 'Payment not found'], Response::HTTP_NOT_FOUND);
  1203.         }
  1204.         // Fallback recommandé par Jèko : si la webhook est retardée, confirmer
  1205.         // le statut directement auprès de l’API avec l’ID de la demande.
  1206.         $providerId = $payment instanceof Commande ? $payment->getCpmTransId() : $payment->getCpmTransId();
  1207.         if ($providerId && in_array($status, [null, 'EN ATTENTE'], true)) {
  1208.             $providerPayment = $this->getJekoPaymentRequest($providerId);
  1209.             $providerStatus = strtolower((string)($providerPayment['status'] ?? ''));
  1210.             $providerStatusMap = [
  1211.                 'success' => 'success',
  1212.                 'completed' => 'success',
  1213.                 'paid' => 'success',
  1214.                 'pending' => 'pending',
  1215.                 'processing' => 'pending',
  1216.                 'error' => 'error',
  1217.                 'failed' => 'error',
  1218.             ];
  1219.             $confirmedStatus = $providerStatusMap[$providerStatus] ?? null;
  1220.             if ($confirmedStatus !== null) {
  1221.                 $status = $confirmedStatus;
  1222.                 if ($paymentType === 'ABONNEMENT') {
  1223.                     $payment->setCpmTransStatus($confirmedStatus);
  1224.                     $months = (int)($parts[2] ?? 0);
  1225.                     if ($confirmedStatus === 'success' && $months > 0 && !$payment->getDateFin()) {
  1226.                         $dateFin = new \DateTime();
  1227.                         $dateFin->modify('+' . $months . ' month');
  1228.                         $payment->setDateFin($dateFin);
  1229.                     }
  1230.                 } else {
  1231.                     $previousStatus = $payment->getEtat();
  1232.                     $payment->setEtat($confirmedStatus === 'success' ? 'VALIDE' : ($confirmedStatus === 'error' ? 'ECHEC' : 'EN ATTENTE'));
  1233.                     if ($paymentType === 'PRESTATION' && $confirmedStatus === 'success' && $previousStatus !== 'VALIDE') {
  1234.                         $offreDevis = $payment->getOffreDevis();
  1235.                         $boutique = $offreDevis ? $offreDevis->getBoutique() : null;
  1236.                         if ($boutique) {
  1237.                             $boutique->setSolde((float) ($boutique->getSolde() ?? 0) + ((float) $payment->getMontant() * 90 / 100));
  1238.                         }
  1239.                     }
  1240.                     $payment->setCpmTransId($providerId);
  1241.                 }
  1242.                 $em->flush();
  1243.                 if ($paymentType === 'PRESTATION' && $confirmedStatus === 'success' && $previousStatus !== 'VALIDE') {
  1244.                     $this->notifierPaiementValide($payment);
  1245.                 }
  1246.             }
  1247.         }
  1248.         // Le mobile consulte le statut après le retour Jèko et ne possède pas
  1249.         // forcément une session Symfony. Une session connectée reste contrôlée.
  1250.         if ($user && $owner && $owner->getId() !== $user->getId()) {
  1251.             return new JsonResponse(['error' => 'Payment not found'], Response::HTTP_NOT_FOUND);
  1252.         }
  1253.         $jekoStatus = $status;
  1254.         if ($status === 'VALIDE') {
  1255.             $jekoStatus = 'success';
  1256.         } elseif ($status === 'ECHEC') {
  1257.             $jekoStatus = 'error';
  1258.         } elseif ($status === 'EN ATTENTE') {
  1259.             $jekoStatus = 'pending';
  1260.         }
  1261.         $response = new JsonResponse([
  1262.             'reference' => $reference,
  1263.             'paymentReference' => $reference,
  1264.             'status' => $status,
  1265.             'localStatus' => $status,
  1266.             'jekoStatus' => $jekoStatus,
  1267.             'success' => $jekoStatus === 'success',
  1268.         ]);
  1269.         return $this->allowRemoteRequest($response);
  1270.     }
  1271.     /**
  1272.      * Enregistre les notifications après confirmation Jèko. Le subscriber
  1273.      * Doctrine se charge ensuite de l'envoi push Firebase.
  1274.      * Cette méthode n'est appelée que lors du passage vers VALIDE, donc les
  1275.      * webhooks répétés ne créent pas de doublons.
  1276.      */
  1277.     private function rattacherOffreDepuisReference(PaiementService $paiement, array $parts, $em): void
  1278.     {
  1279.         if ($paiement->getOffreDevis() || empty($parts[2]) || !ctype_digit((string) $parts[2])) {
  1280.             return;
  1281.         }
  1282.         $offreDevis = $em->getRepository(OffreDevis::class)->findOneById((int) $parts[2]);
  1283.         if ($offreDevis && $offreDevis->getBoutique()) {
  1284.             $paiement->setOffreDevis($offreDevis);
  1285.             $em->persist($paiement);
  1286.             $em->flush();
  1287.         }
  1288.     }
  1289.     private function notifierPaiementValide(PaiementService $paiement): void
  1290.     {
  1291.         $offreDevis = $paiement->getOffreDevis();
  1292.         $prestataire = $offreDevis ? $offreDevis->getUser() : null;
  1293.         // Certaines anciennes offres n'ont pas de user renseigné alors que la
  1294.         // boutique possède bien un propriétaire dans UserBoutique. Dans ce cas,
  1295.         // la notification doit quand même parvenir au prestataire.
  1296.         if (!$prestataire && $offreDevis && $offreDevis->getBoutique()) {
  1297.             $prestataire = $this->getDoctrine()->getManager()
  1298.                 ->getRepository(UserBoutique::class)
  1299.                 ->findOneBy(['boutique' => $offreDevis->getBoutique()]);
  1300.             $prestataire = $prestataire ? $prestataire->getUser() : null;
  1301.         }
  1302.         $client = $paiement->getUser();
  1303.         $destinataires = [];
  1304.         if ($prestataire) {
  1305.             $destinataires[$prestataire->getId()] = [
  1306.                 'user' => $prestataire,
  1307.                 'title' => 'Paiement reçu',
  1308.                 'body' => 'Le paiement de votre prestation a été confirmé.',
  1309.             ];
  1310.         }
  1311.         if ($client && !isset($destinataires[$client->getId()])) {
  1312.             $destinataires[$client->getId()] = [
  1313.                 'user' => $client,
  1314.                 'title' => 'Paiement confirmé',
  1315.                 'body' => 'Votre paiement de ' . (float) $paiement->getMontant() . ' XOF a été confirmé.',
  1316.             ];
  1317.         }
  1318.         $em = $this->getDoctrine()->getManager();
  1319.         foreach ($destinataires as $destinataire) {
  1320.             $notification = new Notification();
  1321.             $notification->setUser($destinataire['user']);
  1322.             $notification->setTypeNotification('paiement');
  1323.             $notification->setDescription($destinataire['body']);
  1324.             $notification->setExtraData((string) $paiement->getId());
  1325.             $notification->setLien('');
  1326.             $em->persist($notification);
  1327.         }
  1328.         $em->flush();
  1329.     }
  1330.     private function montantFinalOffre(OffreDevis $offreDevis): float
  1331.     {
  1332.         $valeurFinanciere = $offreDevis->getValeurFinanciere();
  1333.         if ($valeurFinanciere !== null && (float) $valeurFinanciere > 0) {
  1334.             return (float) $valeurFinanciere;
  1335.         }
  1336.         $contreProposition = $offreDevis->getContrePropositionFinanciere();
  1337.         if ($contreProposition !== null && (float) $contreProposition > 0) {
  1338.             return (float) $contreProposition;
  1339.         }
  1340.         // Les anciennes demandes directes vers une boutique créaient une offre
  1341.         // sans montant propre, alors que leur devis possède un budget fixe.
  1342.         // Ce fallback est volontairement limité au cas min == max afin de ne
  1343.         // jamais transformer une fourchette budgétaire en montant payable.
  1344.         $devis = $offreDevis->getDevis();
  1345.         if ($devis) {
  1346.             $budgetMin = is_numeric($devis->getBudgetMin()) ? (float) $devis->getBudgetMin() : 0.0;
  1347.             $budgetMax = is_numeric($devis->getBudgetMax()) ? (float) $devis->getBudgetMax() : 0.0;
  1348.             if ($budgetMin > 0 && $budgetMin === $budgetMax) {
  1349.                 return $budgetMin;
  1350.             }
  1351.         }
  1352.         return 0.0;
  1353.     }
  1354.     /**
  1355.      * Retourne vrai si un paiement de frais non échoué existe déjà aujourd'hui.
  1356.      * Les paiements échoués restent retentables ; les paiements en attente ou
  1357.      * validés réservent le droit quotidien.
  1358.      */
  1359.     private function paiementFraisDuJourExiste($em, AppUser $user, string $paymentType): bool
  1360.     {
  1361.         $debut = new \DateTime('today');
  1362.         $fin = (clone $debut)->modify('+1 day');
  1363.         $paiement = $em->getRepository(PaiementService::class)
  1364.             ->createQueryBuilder('p')
  1365.             ->where('p.user = :user')
  1366.             ->andWhere('p.typeService = :typeService')
  1367.             ->andWhere('p.laDate >= :debut')
  1368.             ->andWhere('p.laDate < :fin')
  1369.             ->andWhere('p.etat IN (:etats)')
  1370.             ->setParameter('user', $user)
  1371.             ->setParameter('typeService', $paymentType)
  1372.             ->setParameter('debut', $debut)
  1373.             ->setParameter('fin', $fin)
  1374.             ->setParameter('etats', ['EN ATTENTE', 'VALIDE'])
  1375.             ->setMaxResults(1)
  1376.             ->getQuery()
  1377.             ->getOneOrNullResult();
  1378.         return $paiement !== null;
  1379.     }
  1380.     private function getJekoPaymentRequest($paymentRequestId)
  1381.     {
  1382.         $ch = curl_init($this->getJekoBaseUrl() . '/payment_requests/' . rawurlencode($paymentRequestId));
  1383.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  1384.         curl_setopt($ch, CURLOPT_HTTPHEADER, [
  1385.             'X-API-KEY:' . $this->getJekoAPI(),
  1386.             'X-API-KEY-ID:' . $this->getJekoAPIID(),
  1387.         ]);
  1388.         curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  1389.         $body = curl_exec($ch);
  1390.         $httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
  1391.         curl_close($ch);
  1392.         if ($body === false || $httpCode < 200 || $httpCode >= 300) {
  1393.             return null;
  1394.         }
  1395.         $data = json_decode($body, true);
  1396.         return is_array($data) ? $data : null;
  1397.     }
  1398.     private function getJekoReturnUrls($reference, $plateforme)
  1399.     {
  1400.         if ($plateforme === 'mobile') {
  1401.             return [
  1402.                 // Jèko exige une URL HTTP(S) valide dans la requête. Ces routes
  1403.                 // redirigeront ensuite vers le deep link de l’application mobile.
  1404.                 'successUrl' => $this->generateUrl('gestion_payment_success', ['transaction' => $reference, 'plateforme' => 'mobile'], UrlGeneratorInterface::ABSOLUTE_URL),
  1405.                 'errorUrl' => $this->generateUrl('gestion_payment_error', ['transaction' => $reference, 'plateforme' => 'mobile'], UrlGeneratorInterface::ABSOLUTE_URL),
  1406.             ];
  1407.         }
  1408.         return [
  1409.             'successUrl' => $this->generateUrl('gestion_payment_success', ['transaction' => $reference, 'plateforme' => 'web'], UrlGeneratorInterface::ABSOLUTE_URL),
  1410.             'errorUrl' => $this->generateUrl('gestion_payment_error', ['transaction' => $reference, 'plateforme' => 'web'], UrlGeneratorInterface::ABSOLUTE_URL),
  1411.         ];
  1412.     }
  1413.     private function getJekoWebhookSecret()
  1414.     {
  1415.         return $_ENV['JEKO_WEBHOOK_SECRET'] ?? getenv('JEKO_WEBHOOK_SECRET') ?: null;
  1416.     }
  1417.     /**
  1418.     * @Route("/payment/success/{transaction}/{plateforme}", name="gestion_payment_success")
  1419.     */
  1420.     public function paymentSuccessAction(Request $request, $transaction, $plateforme)
  1421.     {
  1422.         $user = $this->getUser();
  1423.         if($plateforme == 'web'){
  1424.             return $this->render('entreprise/payment_success.html.twig', ['user' => $user]);
  1425.         }else{
  1426.             return new RedirectResponse('helpplace://payment/success?reference=' . rawurlencode($transaction));
  1427.         }
  1428.         
  1429.         return new Response('', Response::HTTP_NO_CONTENT);
  1430.     }
  1431.     
  1432.     /**
  1433.     * @Route("/payment/error/{transaction}/{plateforme}", name="gestion_payment_error")
  1434.      */
  1435.     public function paymentErrorAction(Request $request, $transaction, $plateforme)
  1436.     {
  1437.         if($plateforme == 'web'){
  1438.             return $this->render('entreprise/payment_error.html.twig', []);
  1439.         }else{
  1440.             return new RedirectResponse('helpplace://payment/error?reference=' . rawurlencode($transaction));
  1441.         }
  1442.         
  1443.         
  1444.         
  1445.         return new Response('', Response::HTTP_NO_CONTENT);
  1446.     }
  1447.     
  1448.     /**
  1449.     * @Route("/payment/cancel/{transaction}", name="gestion_payment_cancel")
  1450.      */
  1451.     public function paymentCancelction($transaction)
  1452.     {
  1453.         $em = $this->getDoctrine()
  1454.                     ->getManager();
  1455.         $user = $this->getUser();
  1456.         
  1457.         $requestStack = $this->get('request_stack');
  1458.         $request = $requestStack->getCurrentRequest();
  1459.         $ok_submission = '';
  1460.         $error = '';
  1461.         
  1462.         $commande = $em->getRePository(Commande::class)
  1463.                             ->findOneByCpmTransId($transaction);
  1464.                             
  1465.         $messageRequete = '';        
  1466.         
  1467.         
  1468.         if('POST' == $request->getMethod()){
  1469.             var_dump($_POST);
  1470.         }
  1471.         return $this->render('gestion/cinetpay_cancel.html.twig', [
  1472.             
  1473.             'user' => $user
  1474.         ]);
  1475.     }
  1476.     
  1477.         /**
  1478.      * @Route("/shop/{slug}/mini-statistic", name="gestion.mini_statistic")
  1479.      * @return \Symfony\Component\HttpFoundation\Response
  1480.      */
  1481.     public function miniStatisticAction(Request $request, Boutique $boutique)
  1482.     {
  1483.         $em = $this->getDoctrine()
  1484.                     ->getManager();
  1485.         
  1486.         $user = $this->getUser();
  1487.               
  1488.         
  1489.         $mois = date('mY');
  1490.         $annee = date('Y');
  1491.         
  1492.         $nombreOffreDevis = $em->getRepository(OffreDevis::class)
  1493.                         ->nombreOffreDevis($boutique->getId());
  1494.         
  1495.         $conversations = $em->getRepository(Conversation::class)
  1496.                         ->nombreMessageDUneBoutique($boutique->getId());    
  1497.             
  1498.         $nombreTiers = 0;
  1499.         
  1500.         $userBoutique = $em->getRepository(UserBoutique::class)
  1501.                         ->findOneBy(
  1502.                             array(
  1503.                             'user' => $user->getId(),
  1504.                             'boutique' => $boutique->getId()
  1505.                             )
  1506.                         );
  1507.                         
  1508.         return $this->render('gestion/mini_statistic.html.twig', [
  1509.            'boutique' => $boutique,
  1510.            'userBoutique' => $userBoutique,
  1511.            'nombreOffreDevis' => $nombreOffreDevis,
  1512.            'conversations' => $conversations
  1513.         ]);
  1514.     }
  1515.     
  1516.     
  1517.         
  1518.     /**
  1519.      * @Route("/{slug}/settings", name="gestion.settings")
  1520.      * @return \Symfony\Component\HttpFoundation\Response
  1521.      */
  1522.     public function settingsAction(Request $request, Boutique $boutique)
  1523.     {
  1524.         $em = $this->getDoctrine()
  1525.                     ->getManager();
  1526.         $user = $this->getUser();        
  1527.         $userBoutique = $em->getRepository(UserBoutique::class)
  1528.                         ->findOneBy(
  1529.                             array(
  1530.                             'user' => $user->getId(),
  1531.                             'boutique' => $boutique->getId()
  1532.                             )
  1533.                         );
  1534.         $form = $this->createForm(SettingBoutiqueOngletEntrepriseType::class, $boutique);
  1535.         $aUnAbonnementPayant = false;
  1536.         $commande = $em->getRepository(Commande::class)
  1537.                     ->findOneBy(
  1538.                         array(
  1539.                             'boutique' => $boutique
  1540.                         ),
  1541.                         array(
  1542.                             'dateFin' => 'DESC'
  1543.                         )
  1544.                     );
  1545.         if($commande != null){
  1546.             $aujourdhui = new \DateTime();
  1547.             if($commande->getDateFin() > $aujourdhui){
  1548.                 $aUnAbonnementPayant = true;
  1549.             }
  1550.         }
  1551.         if($request->getMethod() == 'POST'){
  1552.                $form->handleRequest($request);
  1553.                if($form->isValid()){
  1554.                    $em->flush();
  1555.                 } else {
  1556.                     $error =" Veillez corrigez vos erreurs";
  1557.                 }
  1558.         }
  1559.         return $this->render('gestion/settings.html.twig', [
  1560.            'boutique' => $boutique,
  1561.             'form' => $form->createView(),
  1562.             'userBoutique' => $userBoutique,
  1563.             'aUnAbonnementPayant' => $aUnAbonnementPayant
  1564.         ]);
  1565.     }
  1566.     
  1567.     
  1568.     /**
  1569.      * @Route("/{slug}/edit-entreprise", name="gestion.edit_entreprise")
  1570.      * @return \Symfony\Component\HttpFoundation\Response
  1571.      */
  1572.     public function editEntrepriseAction(Request $request, Boutique $boutique)
  1573.     {
  1574.         $em = $this->getDoctrine()
  1575.                     ->getManager();
  1576.         $user = $this->getUser();        
  1577.         $userBoutique = $em->getRepository(UserBoutique::class)
  1578.                         ->findOneBy(
  1579.                             array(
  1580.                             'user' => $user->getId(),
  1581.                             'boutique' => $boutique->getId()
  1582.                             )
  1583.                         );    
  1584.         $form = $this->createForm(SettingBoutiqueOngletEntrepriseType::class, $boutique);
  1585.         $aUnAbonnementPayant = false;
  1586.         $commande = $em->getRepository(Commande::class)
  1587.                     ->findOneBy(
  1588.                         array(
  1589.                             'boutique' => $boutique
  1590.                         ),
  1591.                         array(
  1592.                             'dateFin' => 'DESC'
  1593.                         )
  1594.                     );
  1595.         if($commande != null){
  1596.             $aujourdhui = new \DateTime();
  1597.             if($commande->getDateFin() >= $aujourdhui){
  1598.                 $aUnAbonnementPayant = true;
  1599.             }
  1600.         }
  1601.         if($request->getMethod() == 'POST'){
  1602.                $form->handleRequest($request);
  1603.                if($form->isValid()){
  1604.                   
  1605.                    if(isset($_FILES['logo']) && $_FILES['logo']['error'] == 0 ){
  1606.                        $this->gererFichierMultipleLogo($boutique, $_FILES['logo']);
  1607.                       
  1608.                    }
  1609.                    $em->flush();
  1610.                 } else {
  1611.                     $error =" Veillez corrigez vos erreurs";
  1612.                 }
  1613.         }
  1614.         return $this->render('gestion/edit_entreprise.html.twig', [
  1615.            'boutique' => $boutique,
  1616.             'form' => $form->createView(),
  1617.             'userBoutique' => $userBoutique,
  1618.             'aUnAbonnementPayant' => $aUnAbonnementPayant
  1619.         ]);
  1620.     }
  1621.     
  1622.     /**
  1623.     * @Route("/{slug}/products", name="gestion.products")
  1624.      */
  1625.     public function productsAction(Boutique $boutique)
  1626.     {
  1627.         $em = $this->getDoctrine()
  1628.                     ->getManager();
  1629.                     
  1630.         $products = $em->getRePository(Produit::class)
  1631.                             ->findByBoutique($boutique);
  1632.          
  1633.          return $this->render('gestion/products.html.twig', [
  1634.             'products' => $products,
  1635.             'boutique' => $boutique
  1636.         ]);
  1637.     }
  1638.     
  1639.     /**
  1640.      * @Route("/{slug}/new-product", name="gestion.new_product")
  1641.      */
  1642.     public function newProductAction(Boutique $boutique)
  1643.     {
  1644.         $requestStack = $this->get('request_stack');
  1645.         $request = $requestStack->getCurrentRequest();
  1646.     
  1647.         $em = $this->getDoctrine()
  1648.                     ->getManager();
  1649.         $ok_submission = '';
  1650.         $error = '';        
  1651.         $produit = new Produit;
  1652.         $form = $this->createForm(ProduitType::class, $produit);
  1653.         $user = $this->getUser();
  1654.         
  1655.                             
  1656.         if('POST' == $request->getMethod() )
  1657.         {
  1658.             $form->handleRequest($request);
  1659.             if( $form->isValid()){
  1660.                 $produit->setBoutique($boutique);
  1661.                 if(isset($_FILES['imagePrincipale']) && $_FILES['imagePrincipale']['error'] == 0){
  1662.                     //var_dump($_FILES['fichier']);
  1663.                     
  1664.                     $em->persist($produit);
  1665.                     $em->flush();
  1666.                     
  1667.                     $this->gererFichierMultiple($produit, $_FILES['imagePrincipale'], true);
  1668.                     
  1669.                     $ok_submission = 'Enregistrement effectué';
  1670.     
  1671.                 } else{
  1672.                     $error = 'Veuillez indiquer l\'image principale';
  1673.                 }
  1674.                 
  1675.                 
  1676.                 if(isset($_FILES['photos']) && $_FILES['photos']['name'][0] != ''){
  1677.                         
  1678.                         $this->gererFichierMultiple($produit, $_FILES['photos']);
  1679.                 }
  1680.                 $produit = new Produit;
  1681.                 $form = $this->createForm(ProduitType::class, $produit);
  1682.                 
  1683.                 
  1684.             } else {
  1685.                 $form->getErrors(true, false); 
  1686.                 $error = 'Une erreur s\'est produite';
  1687.             }
  1688.         }
  1689.         return $this->render('gestion/new_product.html.twig', [
  1690.             'form' => $form->createView(),
  1691.             'error' => $error,
  1692.             'ok_submission' => $ok_submission,
  1693.             'boutique' => $boutique
  1694.         ]);
  1695.     }
  1696.     
  1697.     /**
  1698.      * @Route("/edit-main-image/{id}", name="gestion.edit_main_image")
  1699.      */
  1700.     public function editMainImageAction(Produit $produit)
  1701.     {
  1702.         $requestStack = $this->get('request_stack');
  1703.         $request = $requestStack->getCurrentRequest();
  1704.     
  1705.         $em = $this->getDoctrine()
  1706.                     ->getManager();
  1707.         $ok_submission = '';
  1708.         $error = '';        
  1709.         $user = $this->getUser();
  1710.         if('POST' == $request->getMethod()){
  1711.             $image = $produit->getImagePrincipale();
  1712.             if(isset($_FILES['imagePrincipale']) && $_FILES['imagePrincipale']['error'] == 0){
  1713.                 $data = $_FILES['imagePrincipale'];
  1714.                 $ex = pathinfo($data['name'])['extension'];
  1715.                 $exA = array('jpg', 'jpeg', 'png', 'gif');
  1716.                 
  1717.                 if (in_array(strtolower($ex), $exA)){
  1718.                 
  1719.                     $image->setExtension($ex);
  1720.                 } else {
  1721.                     throw new \RuntimeException('Désolé, vous n\'avez pas le droit de télécharger ce type de fichier: '.$ex);
  1722.                 }
  1723.                 
  1724.                 $name = $produit->getId().time().'.'.$ex;
  1725.                 //Delete old image
  1726.                 
  1727.                     unlink($image->getUploadRootDir().'/original/'.$image->getUrl());
  1728.                     if(!is_dir($image->getUploadRootDir().'/original/') && !mkdir($image->getUploadRootDir().'/original', 0777, true))
  1729.                     {
  1730.                         throw new \RuntimeException('Impossible de créer le dossier de destination');
  1731.                     }
  1732.                     
  1733.                     if (!move_uploaded_file($data['tmp_name'], $image->getUploadRootDir().'/original/'.$name))
  1734.                     {
  1735.                         throw new \RuntimeException('Désolé, une erreur s\'est produite.');
  1736.                     }
  1737.                     $image->setUrl($name);
  1738.                 } else{
  1739.                     $error = 'Veuillez indiquer l\'image principale';
  1740.                 }
  1741.             
  1742.             $ok_submission = 'Enregistrement effectué';
  1743.             $em->flush();
  1744.         }
  1745.         
  1746.         return $this->render('gestion/edit_main_image.html.twig', [
  1747.             'produit' => $produit,
  1748.             'error' => $error,
  1749.             'ok_submission' => $ok_submission
  1750.         ]);
  1751.     }
  1752.     
  1753.     
  1754.     
  1755.     /**
  1756.      * @Route("/delete-prodcut-image/{id}/{photo}", name="gestion.delete_product_image")
  1757.      */
  1758.     public function deleteProductImageAction(Produit $produit, $photo)
  1759.     {
  1760.         
  1761.         $em = $this->getDoctrine()
  1762.                     ->getManager();
  1763.         $photo = $em->getRePository(ProductPhoto::class)
  1764.                     ->findOneById($photo);
  1765.         $em->remove($photo);    
  1766.         $link = substr($photo->getUrl(), 32); //taille de https://www.lika.ci/uploads/img/
  1767.         
  1768.         unlink($photo->getUploadRootDir().'/'.$link);
  1769.         $em->flush();    
  1770.             
  1771.         return $this->redirectToRoute('gestion.products', array('slug' => $produit->getBoutique()->getSlug()));
  1772.                     
  1773.         
  1774.     }
  1775.     
  1776.     /**
  1777.      * @Route("/{slug}/add-more-image/{id}", name="gestion.add_more_image")
  1778.      */
  1779.     public function addMoreImageAction(Request $request,  $slug,  $id)
  1780.     {
  1781.         
  1782.         $em = $this->getDoctrine()
  1783.                     ->getManager();
  1784.         $boutique = $em->getRepository(Boutique::class)
  1785.                         ->findOneBySlug($slug);
  1786.         $produit = $em->getRepository(Produit::class)
  1787.                         ->findOneById($id);
  1788.         $ok_submission = '';
  1789.         $error = '';        
  1790.         $user = $this->getUser();
  1791.         
  1792.         if('POST' == $request->getMethod() )
  1793.         {
  1794.             if(isset($_FILES['photos'])){
  1795.                 $this->gererFichierMultiple($produit, $_FILES['photos']);
  1796.                 $ok_submission = 'Enregistrement effectué';
  1797.             }
  1798.             
  1799.         }
  1800.         
  1801.         return $this->render('gestion/add_more_image.html.twig', [
  1802.             'produit' => $produit,
  1803.             'error' => $error,
  1804.             'ok_submission' => $ok_submission,
  1805.             'boutique' => $boutique
  1806.         ]);
  1807.     }
  1808.     
  1809.     
  1810.     /**
  1811.      * @Route("/edit-product/{boutique}/{produit}", name="gestion.edit_product")
  1812.      */
  1813.     public function editProductAction($boutique, $produit)
  1814.     {
  1815.         $requestStack = $this->get('request_stack');
  1816.         $request = $requestStack->getCurrentRequest();
  1817.     
  1818.         $em = $this->getDoctrine()
  1819.                     ->getManager();
  1820.         $boutique = $em->getRepository(Boutique::class)
  1821.                         ->findOneById($boutique);
  1822.         
  1823.         $produit = $em->getRepository(Produit::class)
  1824.                         ->findOneById($produit);
  1825.         $ok_submission = '';
  1826.         $error = '';        
  1827.         $form = $this->createForm(ProduitEditType::class, $produit);
  1828.         $user = $this->getUser();
  1829.         if('POST' == $request->getMethod())
  1830.         {
  1831.             $form->handleRequest($request);
  1832.             if( $form->isValid()){
  1833.                 $em->flush();
  1834.                 $ok_submission = 'Enregistrement effectué';
  1835.                 if(isset($_FILES['imagePrincipale']) && $_FILES['imagePrincipale']['error'] == 0){
  1836.                     //var_dump($_FILES['fichier']);
  1837.                     
  1838.                     $em->persist($produit);
  1839.                     $em->flush();
  1840.                     
  1841.                     $this->gererFichierMultiple($produit, $_FILES['imagePrincipale'], true);
  1842.                     
  1843.                     $ok_submission = 'Enregistrement effectué';
  1844.     
  1845.                 } 
  1846.                 
  1847.                 if(isset($_FILES['photos']) && $_FILES['photos']['name'][0] != ''){
  1848.                         
  1849.                         $this->gererFichierMultiple($produit, $_FILES['photos']);
  1850.                 }
  1851.             } else {
  1852.                 $error = 'Une erreur s\'est produite';
  1853.             }
  1854.         }
  1855.         return $this->render('gestion/edit_product.html.twig', [
  1856.             'form' => $form->createView(),
  1857.             'error' => $error,
  1858.             'ok_submission' => $ok_submission,
  1859.             'boutique' => $boutique
  1860.         ]);
  1861.     }        
  1862.     
  1863.     //Produit/Service
  1864.     /**
  1865.      * @Route("/{slug}/delete-product/{id}", name="gestion.delete_product")
  1866.      * @return \Symfony\Component\HttpFoundation\Response
  1867.      */
  1868.     public function deleteProductAction(Request $request,  $slug, $id)
  1869.     { 
  1870.         $em = $this->getDoctrine()
  1871.                     ->getManager();
  1872.         $boutique = $em->getRepository(Boutique::class)
  1873.                         ->findOneBySlug($slug);
  1874.         
  1875.         $product = $em->getRepository(Produit::class)
  1876.                         ->findOneBy(
  1877.                         array(
  1878.                             'boutique' => $boutique->getId(),
  1879.                             'id' => $id
  1880.                         )
  1881.                         );
  1882.         if(null !== $product){
  1883.             //les auttres images
  1884.             foreach($product->getPhotos() as $photo){
  1885.                 $link = substr($photo->getUrl(), 32); //taille de https://www.lika.ci/uploads/img/
  1886.                 unlink($photo->getUploadRootDir().'/'.$link);
  1887.                 $em->remove($photo);
  1888.             }
  1889.             $em->flush();
  1890.             $em->remove($product);
  1891.             //Image principale
  1892.             if($product->getImagePrincipale() != null){
  1893.                 $link = substr($product->getImagePrincipale()->getUrl(), 32); //taille de https://www.lika.ci/uploads/img/
  1894.                 unlink($product->getImagePrincipale()->getUploadRootDir().'/'.$link);
  1895.                 
  1896.                 $em->remove($product->getImagePrincipale());
  1897.             }
  1898.             
  1899.         
  1900.             $em->flush();
  1901.         }
  1902.         return $this->redirectToRoute('gestion.products', array('slug' => $boutique->getSlug()));
  1903.     
  1904.     }
  1905.     
  1906.     
  1907.     /**
  1908.      * @Route("/{slug}/proposals", name="gestion.proposals")
  1909.      * @return \Symfony\Component\HttpFoundation\Response
  1910.      */
  1911.     public function proposalsAction(Request $request, Boutique $boutique)
  1912.     {
  1913.               
  1914.         $em = $this->getDoctrine()
  1915.                     ->getManager();
  1916.         
  1917.         $offreDevis = $em->getRepository(OffreDevis::class)
  1918.                         ->findByBoutique($boutique);
  1919.                         
  1920.         $devis = $em->getRepository(Devis::class)
  1921.                         ->findByCategorieEntreprise($boutique->getCategorieEntreprise());
  1922.         
  1923.         $user = $this->getUser();
  1924.         $notifications = $em->getRepository(Notification::class)
  1925.                                         ->findBy(
  1926.                                             array(
  1927.                                             'user' => $user,
  1928.                                             'vu'  => false,
  1929.                                             'typeNotification' => 'devis'
  1930.                                             )
  1931.                                         );
  1932.         foreach($notifications as $notification){
  1933.             $notification->setVu(true);
  1934.         }
  1935.         $em->flush();
  1936.         
  1937.         return $this->render('gestion/proposals.html.twig', [
  1938.            'offreDevis' => $offreDevis,
  1939.            'devis' => $devis,
  1940.            'boutique' => $boutique
  1941.         ]);
  1942.         
  1943.     }
  1944.     
  1945.     /**
  1946.      * @Route("/{slug}/my-tickets", name="gestion.my_tickets")
  1947.      */
  1948.     public function ticketsAction(Boutique $boutique)
  1949.     {
  1950.         $em = $this->getDoctrine()->getManager();
  1951.         
  1952.         $tickets = $em->getRepository(Ticket::class)
  1953.                         ->findByBoutique($boutique);
  1954.     
  1955.           return $this->render('gestion/tickets.html.twig', [
  1956.           'tickets' => $tickets,
  1957.           'boutique' => $boutique
  1958.         ]);
  1959.         
  1960.     }
  1961.     
  1962.     /**
  1963.      * @Route("/{slug}/new-ticket", name="gestion.new_ticket")
  1964.      * @return \Symfony\Component\HttpFoundation\Response
  1965.      */
  1966.     public function newTicketAction(Request $request, $slug)
  1967.     {
  1968.         $em = $this->getDoctrine()
  1969.                     ->getManager();
  1970.                     
  1971.         $boutique = $em->getRepository(Boutique::class)
  1972.                         ->findOneBySlug($slug);
  1973.         $user = $this->getUser();
  1974.         
  1975.         $ticket = new Ticket;
  1976.         
  1977.         $user = $this->getUser();
  1978.         $userBoutique = $em->getRepository(UserBoutique::class)
  1979.                         ->findOneBy(
  1980.                             array(
  1981.                             'user' => $user->getId(),
  1982.                             'boutique' => $boutique->getId()
  1983.                             )
  1984.                         );
  1985.         $form = $this->createForm(TicketType::class, $ticket);
  1986.         
  1987.         $ok_soumission = '';
  1988.         $error = '';
  1989.         
  1990.         if($request->getMethod() == 'POST'){
  1991.             
  1992.                $form->handleRequest($request);
  1993.                if($form->isValid()){
  1994.                    $ticket->setBoutique($boutique);
  1995.                    $ticket->setUser($user);
  1996.                    
  1997.                   $em->persist($ticket);
  1998.                   $em->flush();
  1999.                   
  2000.                 return $this->redirectToRoute('gestion.display_ticket', array('slug' => $boutique->getSlug(), 'id' => $ticket->getId()));
  2001.                 $ok_soumission =" Votre message a été pris en compte";
  2002.                     
  2003.                 $ticket = new Ticket;
  2004.                 
  2005.                 $form = $this->createForm(TicketType::class, $ticket);
  2006.                     
  2007.                 } else {
  2008.                     $error =" Veillez corrigez vos erreurs";
  2009.                 }
  2010.         }
  2011.         
  2012.         return $this->render('gestion/new_ticket.html.twig', [
  2013.            'boutique' => $boutique,
  2014.            'form' => $form->createView(),
  2015.            'userBoutique' => $userBoutique
  2016.         ]);
  2017.     }
  2018.     
  2019.     /**
  2020.      * @Route("/{slug}/display-ticket/{id}", name="gestion.display_ticket")
  2021.      * @return \Symfony\Component\HttpFoundation\Response
  2022.      */
  2023.     public function displayTicketAction(Request $request, $slug, $id)
  2024.     {
  2025.         $em = $this->getDoctrine()
  2026.                     ->getManager();
  2027.                     
  2028.         $boutique = $em->getRepository(Boutique::class)
  2029.                         ->findOneBySlug($slug);
  2030.         $user = $this->getUser();
  2031.         $userBoutique = $em->getRepository(UserBoutique::class)
  2032.                         ->findOneBy(
  2033.                             array(
  2034.                             'user' => $user->getId(),
  2035.                             'boutique' => $boutique->getId()
  2036.                             )
  2037.                         );
  2038.         
  2039.         $ticket = $em->getRepository(Ticket::class)
  2040.                     ->findOneBy(
  2041.                         array(
  2042.                             'boutique' => $boutique->getId(),
  2043.                             'id' => $id
  2044.                         )
  2045.                     );
  2046.         $commentaires = $em->getRepository(CommentaireTicket::class)
  2047.                             ->findByTicket($ticket->getId());
  2048.         $commentaireTicket = new CommentaireTicket;
  2049.         
  2050.         $user = $this->getUser();
  2051.         $form = $this->createForm(CommentaireTicketType::class, $commentaireTicket);
  2052.         
  2053.         $ok_soumission = '';
  2054.         $error = '';
  2055.         
  2056.         if($request->getMethod() == 'POST'){
  2057.             
  2058.                $form->handleRequest($request);
  2059.                if($form->isValid()){
  2060.                    
  2061.                    $commentaireTicket->setTicket($ticket);
  2062.                    $commentaireTicket->setUser($user);
  2063.                    
  2064.                   $em->persist($commentaireTicket);
  2065.                   $em->flush();
  2066.                 
  2067.                 $commentaires = $em->getRepository(CommentaireTicket::class)
  2068.                             ->findByTicket($ticket->getId());
  2069.                 $ok_soumission =" Votre message a été pris en compte";
  2070.                     
  2071.                 $commentaireTicket = new CommentaireTicket;
  2072.                 
  2073.                 
  2074.                 $form = $this->createForm(CommentaireTicketType::class, $commentaireTicket);
  2075.                     
  2076.                 } else {
  2077.                     $error =" Veillez corrigez vos erreurs";
  2078.                 }
  2079.         }
  2080.         
  2081.         return $this->render('gestion/display_ticket.html.twig', [
  2082.            'boutique' => $boutique,
  2083.            'ticket' => $ticket,
  2084.            'form' => $form->createView(),
  2085.            'commentaires' => $commentaires,
  2086.            'userBoutique' => $userBoutique
  2087.         ]);
  2088.     }
  2089.     
  2090.     /**
  2091.      * @Route("/{slug}/close-ticket/{id}", name="gestion.close_ticket")
  2092.      * @return \Symfony\Component\HttpFoundation\Response
  2093.      */
  2094.     public function closeTicketAction(Request $request, $slug, $id)
  2095.     {
  2096.         $em = $this->getDoctrine()
  2097.                     ->getManager();
  2098.                     
  2099.         $boutique = $em->getRepository(Boutique::class)
  2100.                         ->findOneBySlug($slug);
  2101.         
  2102.         $ticket = $em->getRepository(Ticket::class)
  2103.                     ->findOneBy(
  2104.                         array(
  2105.                             'boutique' => $boutique->getId(),
  2106.                             'id' => $id
  2107.                         )
  2108.                     );
  2109.         
  2110.         if(null !== $ticket){
  2111.             $ticket->setLesCommentairesSontFermes(true);
  2112.             $em->flush();
  2113.         }
  2114.         
  2115.         return $this->redirectToRoute('gestion.display_ticket',array('slug'=>$boutique->getSlug(), 'id'=>$ticket->getId()));
  2116.     }
  2117.     
  2118.     
  2119.     /**
  2120.      * @Route("/{slug}/delete-ticket/{id}", name="gestion.delete_ticket")
  2121.      * @return \Symfony\Component\HttpFoundation\Response
  2122.      */
  2123.     public function deleteTicketAction(Request $request, $slug, $id)
  2124.     {
  2125.         $em = $this->getDoctrine()
  2126.                     ->getManager();
  2127.                     
  2128.         $boutique = $em->getRepository(Boutique::class)
  2129.                         ->findOneBySlug($slug);
  2130.         $user = $this->getUser();
  2131.         
  2132.         
  2133.         $ok_soumission = '';
  2134.         $error = '';
  2135.         
  2136.         $ticket = $em->getRepository(Ticket::class)
  2137.                     ->findOneBy(
  2138.                         array(
  2139.                             'boutique' => $boutique->getId(),
  2140.                             'id' => $id
  2141.                         )
  2142.                     );
  2143.         if(null !== $ticket){
  2144.             $commentaireTickets = $em->getRepository(CommentaireTicket::class)
  2145.                                     ->findByTicket($ticket->getId());
  2146.             foreach($commentaireTickets as $commentaireTicket)
  2147.             {
  2148.                 $em->remove($commentaireTicket);
  2149.             }
  2150.             $em->remove($ticket);
  2151.             $em->flush();
  2152.         }
  2153.         
  2154.         return $this->redirectToRoute('gestion.tickets',array('slug'=>$boutique->getSlug(), 'id'=>$user->getId()));
  2155.     }
  2156.     
  2157.     
  2158.     /**
  2159.      * @Route("/{slug}/delete-commentaire-ticket/{id}", name="gestion.delete_commentaire_ticket")
  2160.      * @return \Symfony\Component\HttpFoundation\Response
  2161.      */
  2162.     public function deleteCommentaireTicketAction(Request $request, $slug, $id)
  2163.     {
  2164.         $em = $this->getDoctrine()
  2165.                     ->getManager();
  2166.                     
  2167.         $boutique = $em->getRepository(Boutique::class)
  2168.                         ->findOneBySlug($slug);
  2169.         $user = $this->getUser();
  2170.     
  2171.         $commentaireTicket = $em->getRepository(CommentaireTicket::class)
  2172.                     ->findOneById($id);
  2173.                     
  2174.         if(null !== $commentaireTicket){
  2175.             
  2176.             $em->remove($commentaireTicket);
  2177.             $em->flush();
  2178.         }
  2179.         
  2180.         return $this->redirectToRoute('gestion.tickets',array('slug'=>$boutique->getSlug(), 'id'=>$user->getId()));
  2181.     }
  2182.     
  2183.     /**
  2184.      * @Route("/{slug}/reviews", name="gestion.reviews")
  2185.      */
  2186.     public function reviewsAction(Boutique $boutique)
  2187.     {
  2188.         $em = $this->getDoctrine()->getManager();
  2189.         $user = $this->getUser();
  2190.         $reviews = $em->getRepository(AvisUtilisateur::class)
  2191.                         ->findByBoutique($boutique);
  2192.         $notifications = $em->getRepository(Notification::class)
  2193.                                         ->findBy(
  2194.                                             array(
  2195.                                             'user' => $user,
  2196.                                             'vu'  => false,
  2197.                                             'typeNotification' => 'avis'
  2198.                                             )
  2199.                                         );
  2200.         foreach($notifications as $notification){
  2201.             $notification->setVu(true);
  2202.         }
  2203.         $em->flush();
  2204.           return $this->render('gestion/reviews.html.twig', [
  2205.           'reviews' => $reviews,
  2206.           'boutique' => $boutique
  2207.         ]);
  2208.         
  2209.     }
  2210.     
  2211.     /**
  2212.      * @Route("/{id}/delete-review", name="gestion.delete_review")
  2213.      */
  2214.     public function deleteReviewAction(AvisUtilisateur $review)
  2215.     {
  2216.         $em = $this->getDoctrine()->getManager();
  2217.         $slug = $review->getBoutique()->getSlug();
  2218.         $em->remove($review);
  2219.         $em->flush();
  2220.         
  2221.         return $this->redirectToRoute('gestion.reviews', array('slug' => $slug));
  2222.     }
  2223.     
  2224.     /**
  2225.      * @Route("/{id}/reply-review", name="gestion.reply_review")
  2226.      */
  2227.     public function replyReviewAction(Request $request, AvisUtilisateur $review)
  2228.     {
  2229.         $em = $this->getDoctrine()->getManager();
  2230.         
  2231.         if($request->getMethod() == 'POST'){
  2232.             $reponseAvis = $request->request->get('reponseAvis');
  2233.             $review->setReponseAvis($reponseAvis);
  2234.             $em->flush();
  2235.             
  2236.             $slug = $review->getBoutique()->getSlug();
  2237.             return $this->redirectToRoute('gestion.reviews', array('slug' => $slug));
  2238.         }
  2239.     
  2240.           return $this->render('gestion/reply_review.html.twig', [
  2241.           'review' => $review,
  2242.           'boutique' => $review->getBoutique()
  2243.         ]);
  2244.         
  2245.     }
  2246.     
  2247.     /**
  2248.      * @Route("/{slug}/messages", name="gestion.messages")
  2249.      */
  2250.     public function messagesAction(Boutique $boutique)
  2251.     {
  2252.         $em = $this->getDoctrine()->getManager();
  2253.         
  2254.         $conversations = $em->getRepository(Conversation::class)
  2255.                         ->findByBoutique($boutique);
  2256.         $user = $this->getUser();
  2257.         
  2258.         
  2259.     
  2260.         return $this->render('gestion/messages.html.twig', [
  2261.           'conversations' => $conversations,
  2262.           'boutique' => $boutique
  2263.         ]);
  2264.         
  2265.     }
  2266.     
  2267.     /**
  2268.      * @Route("/{slug}/{id}/conversation", name="gestion.one_conversation")
  2269.      */
  2270.     public function oneConversationAction(Request $request, $slug, $id)
  2271.     {
  2272.         $em = $this->getDoctrine()->getManager();
  2273.         
  2274.         $boutique = $em->getRepository(Boutique::class)
  2275.                         ->findOneBySlug($slug);
  2276.         $user = $this->getUser();                
  2277.         $notifications = $em->getRepository(Notification::class)
  2278.                                         ->findBy(
  2279.                                             array(
  2280.                                             'user' => $user,
  2281.                                             'vu'  => false,
  2282.                                             'typeNotification' => 'message',
  2283.                                             'extraData' => $id
  2284.                                             )
  2285.                                         );
  2286.         foreach($notifications as $notification){
  2287.             $notification->setVu(true);
  2288.         }
  2289.         $em->flush();
  2290.         
  2291.         $conversation = $em->getRepository(Conversation::class)
  2292.                         ->findOneById($id);
  2293.                         
  2294.         if($request->getMethod() == 'POST'){
  2295.             $reponseMessage = $request->request->get('reponseMessage');
  2296.             
  2297.             $message = new Message;
  2298.             $message->setContenu($reponseMessage);
  2299.             $message->setConversation($conversation);
  2300.             $em->persist($message);
  2301.             $em->flush();
  2302.             
  2303.             $notification = new Notification;
  2304.             $notification->setUser($conversation->getUser());
  2305.             $lien =  $this->generateUrl('profile.one_conversation', array('slug'=>$conversation->getBoutique()->getSlug(), 'id' => $conversation->getId()));
  2306.             $notification->setExtraData($conversation->getId());
  2307.             $notification->setLien($lien);
  2308.             $notification->setTypeNotification('message');
  2309.             $notification->setDescription('Vous avez un nouveau message');
  2310.             
  2311.             $conversation->setLastMessage($reponseMessage);
  2312.         
  2313.             $em->persist($notification);
  2314.             $em->flush();    
  2315.             
  2316.         }
  2317.         
  2318.         $messages = $em->getRepository(Message::class)
  2319.                     ->findBy(
  2320.                         array(
  2321.                             'conversation' => $conversation
  2322.                         )
  2323.             );
  2324.     
  2325.           return $this->render('gestion/one_conversation.html.twig', [
  2326.           'conversation' => $conversation,
  2327.           'boutique' => $boutique,
  2328.           'messages' => $messages
  2329.         ]);
  2330.     }
  2331.     
  2332.     /**
  2333.      * @Route("/notification-to-join-team/{email}", name="notification_requette_ajout_boutique")
  2334.      * @return \Symfony\Component\HttpFoundation\Response
  2335.      */
  2336.     public function notificationRequetteAjoutBoutiqueAction(Request $request,  $email)
  2337.     {
  2338.               
  2339.         $em = $this->getDoctrine()
  2340.                     ->getManager();
  2341.         
  2342.             
  2343.         $requeteBoutiques = $em->getRepository(RequeteAjoutBoutique::class)
  2344.                         ->findBy(
  2345.                             array(
  2346.                                 'email' => $email
  2347.                             )
  2348.                             );
  2349.                             
  2350.         $nbRequete = count($requeteBoutiques);
  2351.         
  2352.         return $this->render('entreprise/notification_requette_ajout_boutique.html.twig', [
  2353.            'nbRequete' => $nbRequete
  2354.         ]);
  2355.         
  2356.     }
  2357.     
  2358.     /**
  2359.      * @Route("/request-to-join-team/{email}", name="afficher_requette_ajout_boutique")
  2360.      * @return \Symfony\Component\HttpFoundation\Response
  2361.      */
  2362.     public function afficherRequetteAjoutBoutiqueAction(Request $request,  $email)
  2363.     {
  2364.               
  2365.         $em = $this->getDoctrine()
  2366.                     ->getManager();
  2367.             
  2368.         $requeteBoutiques = $em->getRepository(RequeteAjoutBoutique::class)
  2369.                         ->findByEmail($email);
  2370.                         
  2371.         foreach($requeteBoutiques as $requeteBoutique){
  2372.             $requeteBoutique->setVu(true);
  2373.         }
  2374.         
  2375.         $em->flush();
  2376.         
  2377.         return $this->render('entreprise/afficher_requette_ajout_boutique.html.twig', [
  2378.            'requeteBoutiques' => $requeteBoutiques
  2379.         ]);
  2380.         
  2381.     }
  2382.     
  2383.     /**
  2384.      * @Route("/respond-request-to-join-team/{id}/{status}", name="repondre_requette_ajout_boutique")
  2385.      * @return \Symfony\Component\HttpFoundation\Response
  2386.      */
  2387.     public function repondreRequetteAjoutBoutiqueAction(Request $request,  $id, $status)
  2388.     {
  2389.               
  2390.         $em = $this->getDoctrine()
  2391.                     ->getManager();
  2392.             
  2393.         $requeteAjout = $em->getRepository(RequeteAjoutBoutique::class)
  2394.                         ->findOneById($id);
  2395.         $user = $this->getUser();    
  2396.         if($status){
  2397.             $userBoutique = $em->getRepository(UserBoutique::class)
  2398.                                 ->findOneBy(
  2399.                                     array(
  2400.                                         'user' => $user->getId(),
  2401.                                         'boutique' => $requeteAjout->getBoutique()->getId()
  2402.                                     )
  2403.                                 );
  2404.             if(null === $userBoutique){
  2405.                 $userBoutique = new UserBoutique;
  2406.                 $userBoutique->setUser($user);
  2407.                 $userBoutique->setBoutique($requeteAjout->getBoutique());
  2408.                 $userBoutique->setRole($requeteAjout->getRole());
  2409.                 $em->persist($userBoutique);
  2410.             }
  2411.         } 
  2412.         $em->remove($requeteAjout);
  2413.         $em->flush();
  2414.         
  2415.         return $this->redirectToRoute('home');
  2416.         
  2417.     }
  2418.     
  2419.     public function getDomain()
  2420.     {
  2421.         $domaine = $_SERVER['HTTP_HOST'];
  2422.         $protocol = '';
  2423.         if(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'){
  2424.             $protocol = 'https://';
  2425.         } else{
  2426.             $protocol = 'http://';
  2427.         }
  2428.         
  2429.         return $protocol.$domaine;
  2430.     }
  2431.     
  2432.         public function gererFichierMultipleLogo(\App\Entity\Boutique $boutique, $data)
  2433.         {
  2434.             
  2435.             $ex = pathinfo($data['name'])['extension'];
  2436.             $exA = array('jpg', 'jpeg', 'png', 'gif', 'svg');
  2437.             
  2438.             if (!in_array(strtolower($ex), $exA)){
  2439.                 throw new \RuntimeException('Désolé, vous n\'avez pas le droit de télécharger ce type de fichier: '.$ex);
  2440.             }
  2441.             
  2442.             $name = $boutique->getId().time();
  2443.             $namePourRepertoire = $name;
  2444.             //hydratation des attributs de l'objet
  2445.             
  2446.             $domaine = $_SERVER['HTTP_HOST'];
  2447.             $protocol = '';
  2448.             if(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'){
  2449.                 $protocol = 'https://';
  2450.             } else{
  2451.                 $protocol = 'http://';
  2452.             }
  2453.             $url = $protocol.$domaine.'/uploads/img/logo/'.$name.'.'.$ex;
  2454.             $boutique->getLogo()->setUrl($url);
  2455.             $boutique->getLogo()->setAlt('Logo '.$boutique->getNom());
  2456.             
  2457.             //deplacement (création de l'image original)
  2458.             //$this->file->move($photo->getUploadRootDir().'/original/', $name.'.'.photo->getExtension()));
  2459.             
  2460.             
  2461.             if(!is_dir($boutique->getLogo()->getUploadRootDir().'/featured/') && !mkdir($boutique->getLogo()->getUploadRootDir().'/featured', 0777, true))
  2462.             {
  2463.                 throw new \RuntimeException('Impossible de créer le dossier de destination');
  2464.             }
  2465.             
  2466.             if (!move_uploaded_file($data['tmp_name'], $boutique->getLogo()->getUploadRootDir().'/featured/'.$name.'.'.$ex))
  2467.             {
  2468.                 throw new \RuntimeException('Désolé, une erreur s\'est produite.');
  2469.             }
  2470.                     
  2471.         $name = $boutique->getLogo()->getUploadRootDir().'/featured/'.$name.'.'.$ex;
  2472.         $extension = strtolower($ex);
  2473.             try{
  2474.                         $nvlleImgMenu = ( $extension =='jpg' || $extension == 'jpeg') ? imagecreatefromjpeg($name) : imagecreatefrompng($name);
  2475.                         
  2476.                         $miniatureMenu = imagecreatetruecolor(48, 48);
  2477.                         
  2478.                         $largeurNvlleImgMenu = imagesx($nvlleImgMenu);
  2479.                         $hauteurNvlleImgMenu = imagesy($nvlleImgMenu);
  2480.                         $largeurMiniatureMenu = imagesx($miniatureMenu);
  2481.                         $hauteurMiniatureMenu = imagesy($miniatureMenu);
  2482.                         
  2483.                         //fusion et generation des miniatures
  2484.                         
  2485.                         imagecopyresampled($miniatureMenu, $nvlleImgMenu, 0, 0, 0, 0, $largeurMiniatureMenu, $hauteurMiniatureMenu,
  2486.                                    $largeurNvlleImgMenu, $hauteurNvlleImgMenu);
  2487.                         
  2488.                         //deplacer les nouvelles images(miniatures) dans les repertoires correspondants
  2489.                         
  2490.                         if(!is_dir($boutique->getLogo()->getUploadRootDir().'/logo/') && !mkdir($boutique->getLogo()->getUploadRootDir().'/logo/', 0777, true)){
  2491.                             throw \RuntimeException('Impossible de créer le dossier de destination');
  2492.                         }
  2493.                         $name = $boutique->getLogo()->getUploadRootDir().'/logo/'.$namePourRepertoire.'.'.$extension;
  2494.                         if($extension == 'jpg' || $extension == 'jpeg'){
  2495.                             imagejpeg($miniatureMenu, $name, 90);
  2496.                         } else{
  2497.                             imagepng($miniatureMenu, $name, 9);
  2498.                         }
  2499.                         $fromSecure = 'http://';
  2500.                         if( isset($_SERVER['HTTPS'] ) ){
  2501.                             $fromSecure = 'https://';
  2502.                         }
  2503.                         $boutique->getLogo()->setUrl($fromSecure.$_SERVER['HTTP_HOST'].'/uploads/img/logo/'.$namePourRepertoire.'.'.$extension);
  2504.                     
  2505.                         //
  2506.                     } catch(Exception $e){
  2507.                     }
  2508.                     
  2509.         
  2510.         
  2511.         $this->getDoctrine()->getManager()->flush();
  2512.         
  2513.     }
  2514.     
  2515.     public function gererFichierMultiple(\App\Entity\Produit $produit, $data, $imagePrincipale = false)
  2516.     {
  2517.         $nbFichier = 0; 
  2518.         
  2519.         if($imagePrincipale){
  2520.             
  2521.                 $photo = new ProductPhoto;
  2522.                 $photo->setFile($data);
  2523.                 
  2524.                 $produit->setImagePrincipale($photo);
  2525.                 
  2526.                 $ex = pathinfo($data['name'])['extension'];
  2527.                 $exA = array('jpg', 'jpeg', 'png', 'gif');
  2528.                 
  2529.                 if (in_array(strtolower($ex), $exA)){
  2530.                 
  2531.                     $photo->setExtension($ex);
  2532.                 } else {
  2533.                     throw new \RuntimeException('Désolé, vous n\'avez pas le droit de télécharger ce type de fichier: '.$ex);
  2534.                 }
  2535.                 
  2536.                 $name = $produit->getId().time();
  2537.                 $namePourRepertoire = $name;
  2538.                 //hydratation des attributs de l'objet
  2539.                 $photo->setUrl($name.'.'.$photo->getExtension());
  2540.                 $photo->setAlt('Image de '.$produit->getNom());
  2541.                 $extension = $photo->getExtension();
  2542.                 //deplacement (création de l'image original)
  2543.                 //$this->file->move($photo->getUploadRootDir().'/original/', $name.'.'.photo->getExtension()));
  2544.                 
  2545.                 
  2546.                 if(!is_dir($photo->getUploadRootDir().'/original/') && !mkdir($photo->getUploadRootDir().'/original', 0777, true))
  2547.                 {
  2548.                     throw new \RuntimeException('Impossible de créer le dossier de destination');
  2549.                 }
  2550.                 
  2551.                 if (!move_uploaded_file($data['tmp_name'], $photo->getUploadRootDir().'/original/'.$name.'.'.$photo->getExtension()))
  2552.                 {
  2553.                     throw new \RuntimeException('Désolé, une erreur s\'est produite.');
  2554.                 }
  2555.                 try{
  2556.                     $name = $photo->getUploadRootDir().'/original/'.$name.'.'.$photo->getExtension();
  2557.                         $nvlleImgMenu = ( $ex =='jpg' || $ex == 'jpeg') ? imagecreatefromjpeg($name) : imagecreatefrompng($name);
  2558.                         
  2559.                         $miniatureMenu = imagecreatetruecolor(600, 600);
  2560.                         
  2561.                         $largeurNvlleImgMenu = imagesx($nvlleImgMenu);
  2562.                         $hauteurNvlleImgMenu = imagesy($nvlleImgMenu);
  2563.                         $largeurMiniatureMenu = imagesx($miniatureMenu);
  2564.                         $hauteurMiniatureMenu = imagesy($miniatureMenu);
  2565.                         
  2566.                         //fusion et generation des miniatures
  2567.                         
  2568.                         imagecopyresampled($miniatureMenu, $nvlleImgMenu, 0, 0, 0, 0, $largeurMiniatureMenu, $hauteurMiniatureMenu,
  2569.                                    $largeurNvlleImgMenu, $hauteurNvlleImgMenu);
  2570.                         
  2571.                         //deplacer les nouvelles images(miniatures) dans les repertoires correspondants
  2572.                         
  2573.                         if(!is_dir($photo->getUploadRootDir().'/featured/') && !mkdir($photo->getUploadRootDir().'/featured/', 0777, true)){
  2574.                             throw \RuntimeException('Impossible de créer le dossier de destination');
  2575.                         }
  2576.                         $name = $photo->getUploadRootDir().'/featured/'.$photo->getUrl();
  2577.                         if($extension == 'jpg' || $extension == 'jpeg'){
  2578.                             imagejpeg($miniatureMenu, $name, 85);
  2579.                         } else{
  2580.                             imagepng($miniatureMenu, $name, 8);
  2581.                         }
  2582.                         $fromSecure = 'http://';
  2583.                         if( isset($_SERVER['HTTPS'] ) ){
  2584.                             $fromSecure = 'https://';
  2585.                         }
  2586.                         $photo->setUrl($fromSecure.$_SERVER['HTTP_HOST'].'/'.$photo->getUploadDir().'/featured/'.$photo->getUrl());
  2587.                     
  2588.                         //
  2589.                     } catch(Exception $e){
  2590.                     }
  2591.                 $this->getDoctrine()->getManager()->persist($photo);                
  2592.         } else{
  2593.             $tableauFichier = $this->reArrayFiles($data);
  2594.             //var_dump($tableauFichier);
  2595.             $i = 0;
  2596.             foreach ($tableauFichier as $file)
  2597.             {
  2598.                 $i++;
  2599.             //print 'File Name: ' . $file['name'];
  2600.             //print 'File Type: ' . $file['type'];
  2601.             //print 'File Size: ' . $file['size'];
  2602.         
  2603.             
  2604.                 $photo = new ProductPhoto;
  2605.                 $photo->setFile($file);
  2606.                 
  2607.                 
  2608.                 
  2609.                 $ex = pathinfo($file['name'])['extension'];
  2610.                 $exA = array('jpg', 'jpeg', 'png', 'gif');
  2611.                 
  2612.                 if (in_array(strtolower($ex), $exA)){
  2613.                 
  2614.                     $photo->setExtension($ex);
  2615.                 } else {
  2616.                     throw new \RuntimeException('Désolé, vous n\'avez pas le droit de télécharger ce type de fichier: '.$ex);
  2617.                 }
  2618.                 
  2619.                 $name = $produit->getId().$i.time();
  2620.                 $namePourRepertoire = $name;
  2621.                 //hydratation des attributs de l'objet
  2622.                 $photo->setUrl($name.'.'.$photo->getExtension());
  2623.                 $photo->setAlt('Image de '.$produit->getNom());
  2624.                 $fromSecure = 'http://';
  2625.                         if( isset($_SERVER['HTTPS'] ) ){
  2626.                             $fromSecure = 'https://';
  2627.                         }
  2628.                 $photo->setUrl($fromSecure.$_SERVER['HTTP_HOST'].'/'.$photo->getUploadDir().'/original/'.$photo->getUrl());
  2629.                     
  2630.                 //deplacement (création de l'image original)
  2631.                 //$this->file->move($photo->getUploadRootDir().'/original/', $name.'.'.photo->getExtension()));
  2632.                 
  2633.                 $produit->addPhoto($photo);
  2634.                 if(!is_dir($photo->getUploadRootDir().'/original/') && !mkdir($photo->getUploadRootDir().'/original', 0777, true))
  2635.                 {
  2636.                     throw new \RuntimeException('Impossible de créer le dossier de destination');
  2637.                 }
  2638.                 
  2639.                 if (!move_uploaded_file($file['tmp_name'], $photo->getUploadRootDir().'/original/'.$name.'.'.$photo->getExtension()))
  2640.                 {
  2641.                     throw new \RuntimeException('Désolé, une erreur s\'est produite.');
  2642.                 }
  2643.                 $this->getDoctrine()->getManager()->persist($photo);
  2644.         }
  2645.         }
  2646.         
  2647.         $this->getDoctrine()->getManager()->flush();
  2648.         
  2649.     }
  2650.     
  2651.     public function reArrayFiles($file_post)
  2652.     {
  2653.         $file_ary = array();
  2654.         $file_count = count($file_post['name']);
  2655.         $file_keys = array_keys($file_post);
  2656.         for ($i=0; $i<$file_count; $i++)
  2657.         {
  2658.             foreach ($file_keys as $key)
  2659.             {
  2660.                 $file_ary[$i][$key] = $file_post[$key][$i];
  2661.             }
  2662.         }
  2663.         return $file_ary;
  2664.     }
  2665.     
  2666.     public function allowRemoteRequest($response)
  2667.     {
  2668.         
  2669.         $response->headers->set('Access-Control-Allow-Origin', '*');
  2670.         $response->headers->set('Content-Type', 'application/json;');
  2671.         $response->headers->set('Access-Control-Allow-Headers', 'Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Allow-Origin,Authorization,Access-Control-Request-Headers');
  2672.         
  2673.         //$response->headers->set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  2674.         //$response->headers->set('Access-Control-Allow-Headers', 'Origin, Accept, Access-Control-Allow-Origin, Content-Type, X-Auth-Token');
  2675.         //$response->headers->set('Access-Control-Allow-Headers', 'Content-Type');
  2676.         
  2677.         //$response->headers->set('Access-Control-Allow-Credentials', true);
  2678.         //$response->headers->set('Access-Control-Allow-Headers', 'Access-Control-Allow-Origin, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization,Access-Control-Request-Headers');
  2679.         //$response->headers->set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  2680.         
  2681.         //header("Access-Control-Allow-Headers: 'Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Allow-Origin,Authorization,Access-Control-Request-Headers'");
  2682.         return $response;
  2683.     }
  2684.     public function getJekoBaseUrl()
  2685.     {
  2686.       return 'https://api.jeko.africa/partner_api' ;
  2687.     }
  2688.     public function getJekoAPI()
  2689.     {
  2690.         return 'jeko_66ecb6a64777b553e7655db916e8cd8f3484344f86ee381d2adc80f56a1b25b6';
  2691.     }
  2692.     public function getJekoAPIID()
  2693.     {
  2694.         return $_ENV['JEKO_API_KEY_ID'] ?? getenv('JEKO_API_KEY_ID') ?: '2186eab1-2e47-47f7-98d3-71fd860fb7c2';
  2695.         
  2696.     }
  2697.     public function getJekoStoreId()
  2698.     {
  2699.         return 'e3248694-5eeb-4184-80f8-01b7c7a6e428';
  2700.     }
  2701.     
  2702. }