src/Controller/CommandeController.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use DateTime;
  4. use App\Entity\User;
  5. use App\Form\UserType;
  6. use App\Entity\Adresse;
  7. use App\Entity\Produit;
  8. use App\Entity\Commande;
  9. use App\Form\CommandeType;
  10. use App\Entity\LigneCommande;
  11. use Doctrine\ORM\EntityManager;
  12. use Symfony\Component\Mime\Address;
  13. use App\Repository\AdresseRepository;
  14. use App\Repository\CommandeRepository;
  15. use App\Repository\ProduitRepository;
  16. use App\Security\SecurityAuthenticator;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Security\Core\Security;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\HttpFoundation\Session\Session;
  25. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  28. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  29. use PayPal\Api\Amount;
  30. use PayPal\Api\Details;
  31. use PayPal\Api\Item;
  32. use PayPal\Api\ItemList;
  33. use PayPal\Api\Payer;
  34. use PayPal\Api\Payment;
  35. use PayPal\Api\PaymentExecution;
  36. use PayPal\Api\RedirectUrls;
  37. use PayPal\Api\Transaction;
  38. class CommandeController extends AbstractController
  39. {
  40.     /**
  41.      * @Route("/preparer-commande", name="preparer-commande")
  42.      */
  43.     public function preparerCommande(EntityManagerInterface $managerRequest $requestSecurity $securityUserPasswordHasherInterface $encoder,UserAuthenticatorInterface $userAuthenticatorSecurityAuthenticator $authenticator,  SessionInterface $session): Response
  44.     {
  45.         $user $this->getUser();
  46.         $session->set('commande',true); // booleen pour changer le redirect dans la fonction Role appelée après connexion
  47.         if ($user == null){  // si l'utilisateur n'est pas inscrit
  48.             $user = new User;
  49.             $form =$this->createForm(UserType::class, $user, ['inscription' => true]);
  50.             $form->handleRequest($request);
  51.  
  52.             if ($form->isSubmitted() && $form->isValid()) {
  53.  
  54.              $password=$user->getpassword();
  55.              $hash $encoder->hashPassword($user,$password);
  56.              $user->setPassword($hash);
  57.              $manager->persist($user);
  58.              $manager->flush();
  59.  
  60.              $userAuthenticator->authenticateUser($user,$authenticator$request);
  61.  
  62.              return $this->redirectToRoute('commande');
  63.              } 
  64.          
  65.              return $this->render('security/inscription_connexion.html.twig', [
  66.                  'formUser' => $form->createView(),
  67.           ]);
  68.         }
  69.         $adresses=$user->getAdresses();
  70.         $adresses$adresses->toArray();
  71.         $panier $session->get('panier_ligne');
  72.         $panierStr json_encode($panier);
  73.    
  74.     
  75.         return $this->render('commande/commande_preparer.html.twig', [
  76.             'panier' => $panier,
  77.             'panierStr' => $panierStr,
  78.             'user'=>$user,
  79.             'adresses'=>$adresses
  80.         ]);
  81.     }
  82.     /**
  83.      * @Route("payer-commande", name="payer-commande")
  84.      */
  85.     public function payerCommande(SessionInterface $sessionRequest $requestAdresseRepository $repoadresse): Response
  86.     {
  87.         
  88.     
  89.         $user=$this->getUser();
  90.         $panier $session->get('panier_ligne');
  91.        if (count($panier)>0) {
  92.         $produit =$panier [0]['produit'];
  93.         $nomProduit $produit->getNom();
  94.        }
  95.        else {
  96.         return $this->redirectToRoute('panier');
  97.          
  98.        }
  99.       
  100.       
  101.     
  102.         $montant=$request->get('montant-total');
  103.         $adresse_id$request->get('adresse-livraison');
  104.         // dd($adresse);
  105.         $prenom$user->getPrenom();
  106.         $nom$user->getNom();
  107.         $mail=$user->getEmail();
  108.         $adresse $repoadresse->find$adresse_id);
  109.         $cp $adresse->getCp();
  110.         $rue $adresse->getAdresse();
  111.         $ville =$adresse->getVille();
  112.         $coutLivraison $request->get('cout-livraison');
  113.         $data_commande = [
  114.             'livraison'=> $request->get('cout-livraison'),
  115.             'adresse_id'=> $request->get('adresse-livraison'),
  116.             'montant'=>  $montant,
  117.         ]; 
  118.        
  119.         $session->set('data_commande',$data_commande);
  120.     
  121.         return $this->render('commande/afficher_paiement.html.twig', [
  122.           
  123.             'prenom'=>$prenom,
  124.             'nom'=> $nom,
  125.             'email'=> $mail,
  126.             'rue'=> $rue,
  127.             'ville'=> $ville,
  128.             'cp'=> $cp,
  129.             'montant'=>$montant,
  130.             'panier'=>$panier,
  131.             'livraison'=>$coutLivraison,
  132.         ]);
  133.      
  134.         //return $this->redirect("ajouter-commande");
  135.     
  136.     }
  137.     /**
  138.      * @Route("ajouter-commande", name="ajouter_commande")
  139.      */
  140.     public function ajouterCommande(Request $requestSession $sessionAdresseRepository $repoadresseEntityManagerInterface $managerCommandeRepository $repocommande,ProduitRepository $repoproduitMailerInterface $mailer): Response
  141.     {   
  142.       
  143.        
  144.     
  145.         // on récupère les variables
  146.        
  147.         $user=$this->getUser();
  148.        $transaction_id $_POST ['transaction_id'];
  149.         //$payment_id =$data_commande['payment_id'];
  150.         $role=$user->getRoles()[0];
  151.       
  152.         $data_commande $session->get('data_commande');
  153.      
  154.       
  155.         $adresse_id $data_commande['adresse_id'];
  156.         $adresse $repoadresse->find$adresse_id);
  157.         $montant$data_commande['montant'];
  158.         $livraison $data_commande['livraison'];
  159.         $panier $session->get('panier_ligne');
  160.         $date = new \DateTimeImmutable('now');
  161.         $delai = new \DateInterval('P5D');
  162.         $date_livraison $date->add($delai );
  163.         
  164.         
  165.         //on entregistre la commande 
  166.         $commande = new Commande;
  167.         $commande->setUser($user);
  168.         $commande->setAdresseLivraison($adresse);
  169.         $commande->setMontant($montant);
  170.         $commande->setMontantHT($montant 1.055);
  171.         $commande->setCoutLivraison($livraison);
  172.         $commande->setDateCommande($date);
  173.         $commande->setDateLivraison($date_livraison);
  174.         $commande->setStatut('preparation');
  175.         $commande->setNumero('');
  176.         $commande->setPaiement$transaction_id);
  177.         $manager->persist($commande);
  178.         $manager->flush();
  179.       
  180.         // on recupère l'id commande pour créé le numero de commande
  181.         $id_commande =$commande->getId();
  182.         $commande $repocommande->find($id_commande);
  183.         $numero=date('Ymd').'-'.$id_commande;
  184.         $commande->setNumero($numero);
  185.         $manager->persist($commande);
  186.         $manager->flush();
  187.         // on remplit les lignes de commandes
  188.         foreach ( $panier as $ligne){
  189.             // necessaire pour éviter de persister $produit commme un nouveau produit
  190.             $produit$ligne ["produit"];
  191.             $id_produit$produit->getId();
  192.             $produit $repoproduit->find($id_produit);
  193.             //--------------------------------------------------
  194.             $ligneCommande= new LigneCommande;
  195.             $ligneCommande->setCommande($commande);
  196.             $ligneCommande->setProduit($produit);
  197.             $ligneCommande->setQty($ligne ['quantite']);
  198.             $ligneCommande->setPrix($ligne ['prix']);
  199.             $sous_total$ligne ['quantite']*$ligne ['prix'];
  200.             $ligneCommande->setSstotal($sous_total);
  201.           
  202.             $manager->persist($ligneCommande);
  203.             $manager->flush();
  204.         }
  205.         // on envoie l'email de confirmation
  206.         $dateLivraison =   date_format($date_livraison,"d/m/Y");
  207.         $email = (new TemplatedEmail())
  208.         ->from(new Address('contact@lebiodelo.com''Le Bio d\'Elo'))
  209.         ->to($user->getEmail())
  210.         ->subject('Confirmation de commande le bio d\'Elo')
  211.         ->htmlTemplate('commande/email_confirm_commande.html.twig')
  212.         ->context([
  213.             'commande'=>$commande,
  214.             'user'=> $user,
  215.             'panier'=>$panier,
  216.             'date'=>$dateLivraison
  217.     
  218.         ]);
  219.       
  220.     ;
  221.     
  222.         $mailer->send($email);
  223.         // on nettoie la session 
  224.         $session ->remove ('panier');
  225.         $session ->remove ('panier_ligne');
  226.         $session ->remove ('panier_item');
  227.         $session ->remove ('commande');
  228.         $session ->remove ('data_commande');
  229.        
  230.         
  231.         return $this->redirectToRoute('accueil');
  232.     }
  233. }// fin de classe