src/Controller/visitesCommercialeController.php line 2571

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Chantier;
  4. use App\Entity\ChantierProduit;
  5. use App\Entity\Localisation;
  6. use App\Entity\ProductMetrage;
  7. use App\Entity\Visite;
  8. use App\Entity\Revendeur;
  9. use App\Entity\ChantierProduct;
  10. use Symfony\Component\Mailer\MailerInterface;
  11. use Symfony\Component\Mime\Email;
  12. use App\Entity\TypeProduit;
  13. use App\Repository\CategoryRepository;
  14. use App\Repository\PiRepository;
  15. use App\Repository\EgcRepository;
  16. use App\Repository\ArchitecteRepository;
  17. use App\Repository\ChantierRepository;
  18. use App\Repository\ChantierProductRepository;
  19. use App\Repository\DepartementRepository;
  20. use App\Repository\TypeProduitRepository;
  21. use App\Repository\CommercialRepository;
  22. use App\Repository\DirecteurRepository;
  23. use App\Repository\IntervenantRepository;
  24. use App\Repository\NatureChantierRepository;
  25. use App\Repository\ProduitRepository;
  26. use App\Repository\RevendeurRepository;
  27. use App\Repository\TypeChantierRepository;
  28. use App\Repository\TypeIntervenantRepository;
  29. use App\Repository\VisiteRepository;
  30. use App\Repository\ZoneRepository;
  31. use App\Entity\Calendar;
  32. use App\Entity\Departement;
  33. use App\Repository\CalendarRepository;
  34. use App\Repository\DepartementRepository as RepositoryDepartementRepository;
  35. use Doctrine\ORM\EntityManagerInterface;
  36. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  37. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  38. use Symfony\Component\HttpFoundation\File\UploadedFile;
  39. use Symfony\Component\HttpFoundation\Request;
  40. use Symfony\Component\HttpFoundation\Response;
  41. use Symfony\Component\HttpFoundation\JsonResponse;
  42. use Symfony\Component\Routing\Annotation\Route;
  43. use Symfony\Component\Validator\Constraints\All;
  44. class visitesCommercialeController extends AbstractController
  45. {  private ChantierRepository $chantierRepository;
  46.     
  47.     public function __construct(ChantierRepository $chantierRepository)
  48.     {
  49.         $this->chantierRepository = $chantierRepository;
  50.     }
  51.     #[Route('/prospect/ajout', name: 'app_prospect_nouv')]
  52.     public function nouveauProspect(Request $request,MailerInterface $mailer,VisiteRepository $visiteRep,
  53.     TypeChantierRepository $typecRep ,ProduitRepository $produitRep,EntityManagerInterface $em,CommercialRepository $comrep,ProduitRepository $prodRep,IntervenantRepository $intervenetRep,TypeIntervenantRepository $typeIntRep ,NatureChantierRepository $natureRep,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep,RevendeurRepository $revendeurRep,DepartementRepository $depRep): Response
  54.     {$departements = $depRep->findAll();
  55.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  56.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  57.             return $this->redirectToRoute('app_login');
  58.         }
  59.         $produits = [];
  60.         $totalBudget = 0; // Variable to store the total budget
  61.         $user =$this->getUser();
  62.         $com=$comrep->findOneByUser($user);
  63.         $visite_id=$visiteRep->findOneById('id');
  64.         if($request->isMethod('POST')){
  65.             //dd($request->request->all());
  66.             $now = new \DateTime();
  67.             
  68.             $type=$typecRep->findOneByNom('en prospect');
  69.             $zone=$zoneRep->findOneById($request->get('zone'));
  70.             $nat=$natureRep->findOneById($request->get('naturec'));
  71.             $clientId = $request->get('nomclient');
  72.             $client = $revendeurRep->find($clientId);
  73.             $visitetDate=$request->get('date');
  74.             $visitepDate = new \DateTime($request->get('datepvisite'));
  75.             $departements=$depRep->findOneById($request->get('departements'));
  76.            
  77.             $ch=new Chantier();
  78.             $ch->setNom($request->get('nom'));
  79.             $ch->setRaidechausse('R+'.$request->get('rai'));
  80.             $ch->setDateModification(new \DateTime()); 
  81.             $ch->setValeur($request->get('valeur'));
  82.             $desProducts = $request->get('products');
  83.             $ch->setProducts($desProducts);
  84.             $ch->setConcurrent($request->get('concurrent'));
  85.             $ch->setMcarre($request->get('mcarre'));
  86.             $ch->SetVglobal($request->get('vglobal'));
  87.             $ch->setFinancement($request->get('financement'));
  88.             //$ch->setOtherclient($request->get('otherclient'));
  89.             $other=$request->get('otherclient');
  90.             if (empty($other)) {
  91.                 $ch->setOtherclient(null);
  92.             } else {
  93.                 $ch->setOtherclient($other);
  94.             }
  95.             $datedebut =$request->get('datedebut');
  96.             $ch->setDatedebut($datedebut);
  97.             
  98.             $demandeValue = $request->get('demande');
  99.             if (empty($demandeValue)) {
  100.                 $ch->setDemande(null);
  101.             } else {
  102.                 $ch->setDemande($demandeValue);
  103.             }
  104.             if($request->request->get('plan') == 'on'){
  105.                 $ch->setPlanDaction('oui');
  106.             }
  107.             else{
  108.                 $ch->setPlanDaction('non');
  109.             }
  110.             
  111.             $ch->setZone($zone);
  112.             $ch->settype($type);
  113.             $ch->setNature($nat);
  114.             $ch->setNombreVisite(1);
  115.             $ch->setCommercial($com);
  116.             $ch->setClient($client);
  117.             $ch->setDepartement($departements);
  118.             $visite= new Visite();
  119.             $visite->setObservation($request->get('observation'));
  120.             $visite->setDatevisite($visitetDate);
  121.            $visite->setDatepvisite($visitepDate);
  122.             $visite->setProducts(($desProducts));
  123.             $visite->setClassement($ch->getType()->getType());   
  124.                     
  125.             $ch->setLatitude($request->get('latitude'));
  126.             $ch->setLongitude($request->get('longitude'));
  127.             $ch->setRevendeur('non');
  128.             $data = json_decode($request->getContent(), true);
  129.             
  130.  //envoi email
  131.             if( $departements!=null){
  132.        
  133.              $email = (new Email())
  134.              ->from('crm@groupe-hammami.com.tn')
  135.              ->to($ch->getDepartement()->getEmail())
  136.              //->to('amrimaramri@gmail.com')
  137.              ->subject("Invitation")
  138.              ->text('Vous êtes invité par '.$com->getUser()->getPrenom().' '.$com->getUser()->getNom().' pour l\'accompagner dans un chantier. Merci de recontacter pour plus de détails.');
  139.              
  140.              
  141.                   $mailer->send($email);}
  142.          
  143.         
  144.             // Create Calendar entity
  145.             $calendar = new Calendar();
  146.             $calendar->setTitle($data['title'] ?? 'visite :' . $ch->getNom()); // Use null coalescing operator to handle undefined keys
  147.             $calendar->setStart(($visitepDate));
  148.             $calendar->setEnd(($visitepDate));
  149.             $calendar->setCommercial($com);
  150.             // Lier le planning à la visite réellement créée pour ce prospect
  151.             // (auparavant : recherche invalide via findOneById('id'), qui ne retournait jamais la bonne visite)
  152.             $em->persist($visite);
  153.             $calendar->setVisite($visite);
  154.             $em->persist($calendar);
  155.             $em->flush();
  156.             /* Upload Photo */ 
  157.             $uploaddir = 'telechargement/';
  158.             $file = $request->files->get('image');
  159.               
  160.             if($file != null) {
  161.                 // Vérifier si un fichier a été téléchargé
  162.                 if (!$file instanceof UploadedFile) {
  163.                     throw new FileException('pas de fichier a telechargé');
  164.                 }
  165.                 $fileName = $file->getClientOriginalName();
  166.                 $uploadfile = $uploaddir . $fileName;
  167.                 // Déplacer le fichier téléchargé vers le répertoire de destination
  168.                 try {
  169.                     $file->move($uploaddir, $fileName);
  170.                 }
  171.                     
  172.                 catch (FileException $e) {
  173.                     $this->addFlash('error','pas de fichier !!!');
  174.                 }
  175.                 $visite->setPhoto($fileName);
  176.             
  177.             }
  178.                 
  179.             else {
  180.                 $visite->setPhoto(null);
  181.             }
  182.             /* End Upload Photo */ 
  183.            
  184.             $directeurs=$directeurRep->findAll();
  185.             foreach ($directeurs as $d) {
  186.                 $ch->addDirecteur($d);
  187.               }
  188.             
  189.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomp')));
  190.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nome')));
  191.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomap')));
  192.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomar')));
  193.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nompilot')));
  194.             if(\DateTime::createFromFormat('Y-m-d', $visitetDate) >= $now)
  195.              {
  196.                 $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  197.              }
  198.              elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >$visitepDate)  
  199.              {
  200.                 $this->addFlash('error','Date de la visite est superieur a la date prochain visite!!!');
  201.              }
  202.              elseif($chantierRep->findOneByNomAndProduitandzone($request->get('nom'),$zone) != null )
  203.              {
  204.                  $this->addFlash('error','Chantier existe deja!!!');
  205.              }
  206.            else {
  207.            $this->addFlash('success','Le prospect est ajouté avec succès!!!');
  208.            $ch->addVisite($visite);
  209.            $em->persist($visite);
  210.          
  211.            $em->persist($ch);
  212.            $em->flush();
  213.            $typeProduit = $em->getRepository(TypeProduit::class)->findOneBy([]);
  214.            foreach ($request->get('produit') as $pr) {
  215.             $chantierProduct = new ChantierProduct();
  216.         
  217.             $produit = $produitRep->find($pr);
  218.             $chantierProduct->setProduit($produit);
  219.             $chantierProduct->setChantier($ch);
  220.         
  221.             $em->persist($chantierProduct);
  222.             $em->flush();
  223.         }
  224.         
  225.            //$this->addFlash('success', 'Le budget total est : ' . $totalBudget);
  226.            return $this->redirectToRoute('app_prospects');
  227.            }
  228.         }
  229.         $pis=$intervenetRep->findBytype($typeIntRep->findOneById('1'));
  230.         $egcs=$intervenetRep->findBytype($typeIntRep->findOneById('2'));
  231.         $apps=$intervenetRep->findBytype($typeIntRep->findOneById('3'));
  232.         $archs=$intervenetRep->findBytype($typeIntRep->findOneById('4'));
  233.         $pilots=$intervenetRep->findBytype($typeIntRep->findOneById('5'));
  234.         $revendeurs = $em->getRepository(Revendeur::class)->findAll();
  235.         return $this->render('commercial/nouveauprospect.html.twig', [
  236.             'Tinters'=>$typeIntRep->findAll(),
  237.             'types' => $typecRep->findAll(),'prod' =>$produitRep->findAll(),
  238.             'pis'=>$pis,
  239.             'egcs'=>$egcs ,
  240.             'apps'=>$apps,
  241.             'archs'=>$archs,
  242.             'pilots'=>$pilots,
  243.             'natures'=>$natureRep->findAll(),
  244.             'zones'=>$zoneRep->findAll(),
  245.             'user'=>$com,
  246.             'totalBudget' => $totalBudget,
  247.             'revendeurs' => $revendeurs,     
  248.             'departements'=>$depRep->findAll(),       
  249.         ]);
  250.     }
  251.     #[Route('/prospect/modifier/{id<\d+>}', name: 'app_modifier_prospect')]
  252.     public function editProspect(Request $request,TypeChantierRepository $typecRep ,ProduitRepository $produitRep,EntityManagerInterface $em,CommercialRepository $comrep,ProduitRepository $prodRep,IntervenantRepository $intervenetRep,TypeIntervenantRepository $typeIntRep ,NatureChantierRepository $natureRep,
  253.     ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep ,
  254.     VisiteRepository $visiteRep,TypeIntervenantRepository $typeIRep,$id,TypeProduitRepository $typeprodRep,DepartementRepository $depRep,MailerInterface $mailer,RevendeurRepository $revendeurRep): Response
  255.     {
  256.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  257.             $this->addFlash('error',"Vous n'avez pas le droit!!!"); 
  258.             return $this->redirectToRoute('app_login');
  259.         }
  260.         
  261.         $ch=$chantierRep->find($id);
  262.         $intervenants = $ch->getIntervenant();
  263.         
  264.         $t=$ch->getType();
  265.         $user =$this->getUser();
  266.         $com=$comrep->findOneByUser($user);
  267.         $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $ch]);
  268.         // Tableau pour stocker les identifiants des produits déjà associés au chantier
  269.         $selectedProductIds = [];
  270.         foreach ($chantierProducts as $chantierProduct) {
  271.             $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  272.         }
  273.         if($request->isMethod('POST')){
  274.             //dd($request->request->all());
  275.             //$type=$typecRep->findOneByNom('en prospect');
  276.             $now = new \DateTime();
  277.             $zone=$zoneRep->findOneById($request->get('zone'));
  278.             $nat=$natureRep->findOneById($request->get('naturec'));
  279.             $type=$typecRep->findOneById($request->get('typec'));
  280.             $clientId = $request->get('nomclient');
  281.             $client = $revendeurRep->find($clientId);
  282.             $departements=$depRep->findOneById($request->get('departement'));
  283.        
  284.             $ch->setNom($request->get('nom'));
  285.             $ch->setRaidechausse($request->get('rai'));
  286.             $ch->setMetrage(intval($request->get('metrage')));
  287.             $ch->setValeur($request->get('valeur'));
  288.             $ch->setProducts($request->get('products'));
  289.             $ch->setConcurrent($request->get('concurrent'));
  290.             $ch->setMcarre($request->get('mcarre'));
  291.             $ch->SetVglobal($request->get('vglobal'));
  292.             $ch->setFinancement($request->get('financement'));
  293.             //$ch->setOtherclient($request->get('otherclient'));
  294.             $other=$request->get('otherclient');
  295.             if (empty($other)) {
  296.                 $ch->setOtherclient(null);
  297.             } else {
  298.                 $ch->setOtherclient($other);
  299.             }
  300.             $datedebut =$request->get('datedebut');
  301.             $ch->setDatedebut($datedebut);
  302.             $ch->setDepartement($departements);
  303.             $ch->setClient($client);
  304.             
  305.             $demandeValue = $request->get('demande');
  306.             if (empty($demandeValue)) {
  307.                 $ch->setDemande(null);
  308.             } else {
  309.                 $ch->setDemande($demandeValue);
  310.             }
  311.             if($request->request->get('plan') == 'on'){
  312.                 $ch->setPlanDaction('oui');
  313.             }
  314.             else{
  315.                 $ch->setPlanDaction('non');
  316.             }
  317.             $visite = $visiteRep->findOneByChantier($ch);
  318.             $visitetDate=$request->get('date');
  319.             $visitepDate = new \DateTime($request->get('datepvisite'));
  320.             $visite->setObservation($request->get('observation'));
  321.             $visite->setDatevisite($visitetDate);
  322.             $visite->setDatepvisite($visitepDate);
  323.             $visite->setChantier($ch);
  324.             $visite->setCause($request->get('cause'));
  325.           
  326.             if ($type !== null) {
  327.                 $visite->setClassement($type->getType());
  328.             }
  329.             $em->persist($visite);
  330.             // Répercuter la nouvelle date de visite sur le planning (Calendar) déjà créé pour ce prospect
  331.             foreach ($visite->getCalendar() as $calendarEvent) {
  332.                 $calendarEvent->setStart($visitepDate);
  333.                 $calendarEvent->setEnd($visitepDate);
  334.                 $em->persist($calendarEvent);
  335.             }
  336.                     
  337.            
  338.             $products = $ch->getChantierProduits();
  339.             if (count($products) > 0) {
  340.                 foreach ($products as $key => $p) {
  341.                     if (isset($request->get('typec')[$key]) && isset($request->get('produit')[$key])) {
  342.                         $typeChantier = $typecRep->find($request->get('typec')[$key]);
  343.                         $pr = $produitRep->find($request->get('produit')[$key]);
  344.             
  345.                         $p->setType($typeChantier->getType());
  346.                         $p->setProduit($pr);
  347.                     }
  348.                 }
  349.             }            
  350.             
  351.           
  352.             $ch->setZone($zone);
  353.             $prod=$prodRep->findOneById($request->get('produit'));
  354.             $typeProduit = $em->getRepository(TypeProduit::class)->findOneBy([]);
  355.             
  356.             $existingChantierProducts = $ch->getChantierProducts();
  357.             
  358.    if( $departements!=null){
  359.         //envoi email
  360.         $email = (new Email())
  361.         ->from('crm@groupe-hammami.com.tn')
  362.       ->to($ch->getDepartement()->getEmail())
  363.       //->to('amrimaramri@gmail.com')
  364.       ->subject("Invitation")
  365.       ->text('Vous êtes invité par '.$com->getUser()->getPrenom().' '.$com->getUser()->getNom().' pour l\'accompagner dans un chantier. Merci de recontacter pour plus de détails.');      
  366.           $mailer->send($email);}
  367.             foreach ($request->get('produit') as $pr) {
  368.                 // Find the product entity
  369.                 $produit = $produitRep->find($pr);
  370.                 // Check if this product is already associated with the chantier
  371.                 $existingChantierProduct = null;
  372.                 foreach ($existingChantierProducts as $existingProduct) {
  373.                     if ($existingProduct->getProduit() === $produit) {
  374.                         $existingChantierProduct = $existingProduct;
  375.                         break;
  376.                     }
  377.                 }
  378.                 if ($existingChantierProduct === null) {
  379.                     // If the product is not associated, create a new ChantierProduct entity
  380.                     $chantierProduct = new ChantierProduct();
  381.                     $chantierProduct->setProduit($produit);
  382.                     $chantierProduct->setChantier($ch);
  383.                     $em->persist($chantierProduct);
  384.                 } else {
  385.                     // If the product is already associated, update the association (optional)
  386.                     // $existingChantierProduct->setProduit($produit); // Optionally update the product if needed
  387.                 }
  388.             }
  389.             // Remove any ChantierProduct entities associated with the chantier but not included in the submitted products (optional)
  390.             foreach ($existingChantierProducts as $existingProduct) {
  391.                 if (!in_array($existingProduct->getProduit()->getId(), $request->get('produit'))) {
  392.                     $em->remove($existingProduct);
  393.                 }
  394.             }
  395.             $em->flush();
  396.             
  397.             
  398.             // Persist all changes to the database
  399.             $em->flush();
  400.             
  401.             // Redirect or render the appropriate response
  402.                 
  403.             $ch->settype($type);
  404.             $ch->setNature($nat);  
  405.             $ch->setCommercial($com);
  406.             
  407.             $ch->setLatitude($request->get('latitude'));
  408.             $ch->setLongitude($request->get('longitude'));
  409.             $ch->setDateModification(new \DateTime()); 
  410.             
  411.             $directeurs=$directeurRep->findAll();
  412.             foreach ($directeurs as $d) {
  413.                 $ch->addDirecteur($d);
  414.             }
  415.             
  416.             foreach ($intervenants as $intervenant) {
  417.                 $ch->removeIntervenant($intervenant);
  418.             }
  419.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomp')));
  420.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nome')));
  421.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomap')));
  422.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomar')));
  423.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nompilot')));
  424.             
  425.             $existingChantier = $chantierRep->findOneBy([
  426.                 'nom' => $request->get('nom'),
  427.                 'zone' => $zone
  428.             ]);
  429.             
  430.             if ($existingChantier != null && $ch != null && $existingChantier->getId() != $ch->getId()) {
  431.                 $ChantierName = $ch->getNom(); // Store the previous name before modifying
  432.                 $this->addFlash('error', 'Le nom de chantier "' . $ChantierName . '" existe déjà. Veuillez en choisir un autre !!!');
  433.                 $ch->setNom(''); // Set the name of $ch to an empty string
  434.             } 
  435.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >= $now)
  436.             {
  437.                $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  438.             }
  439.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >$visitepDate)  
  440.             {
  441.                $this->addFlash('error','Date de la visite est superieur a la date prochain visite!!!');
  442.             }
  443.            
  444.             
  445.             else {
  446.                 $this->addFlash('success', 'Le prospect est modifié avec succès!!!');
  447.            
  448.                   
  449.             $em->persist($ch);
  450.             $em->flush();
  451.             
  452.            return $this->redirectToRoute('app_prospects');
  453.         }
  454.         }
  455.         $pis=$intervenetRep->findBytype($typeIntRep->findOneById('1'));
  456.         $egcs=$intervenetRep->findBytype($typeIntRep->findOneById('2'));
  457.         $apps=$intervenetRep->findBytype($typeIntRep->findOneById('3'));
  458.         $archs=$intervenetRep->findBytype($typeIntRep->findOneById('4'));
  459.         $pilots=$intervenetRep->findBytype($typeIntRep->findOneById('5'));
  460.         $ipi=null;
  461.         $iegc=null;
  462.         $iap=null;
  463.         $iar=null;
  464.         $ipilots=null;
  465.         $ints=$ch->getIntervenant();
  466.           foreach ($ints as $i) {
  467.             if($i->getType()==$typeIntRep->findOneById('1'))
  468.             $ipi=$i;
  469.             elseif($i->getType()==$typeIntRep->findOneById('2'))
  470.             $iegc=$i;
  471.             elseif($i->getType()==$typeIntRep->findOneById('3'))
  472.             $iap=$i;
  473.             elseif($i->getType()==$typeIntRep->findOneById('4'))
  474.             $iar=$i; 
  475.             else
  476.             $ipilots=$i; 
  477.           }
  478.         $em->persist($ch);
  479.         $em->flush();
  480.         
  481.         
  482.         $tab=[];
  483.         $chantierproduit=$ch->getChantierProduits();
  484.          foreach($chantierproduit as $chs)
  485.          {
  486.             array_push($tab,$chs->getType());
  487.          }
  488.          $revendeurs = $em->getRepository(Revendeur::class)->findAll();
  489.         return $this->render('commercial/modifierProspect.html.twig', [
  490.             'chantier'=>$ch,
  491.             'Tinters'=>$typeIntRep->findAll(),
  492.             'types' => $typecRep->findAll(),'prod' =>$produitRep->findAll(),
  493.             'pis'=>$pis,
  494.             'egcs'=>$egcs ,
  495.             'apps'=>$apps,
  496.             'archs'=>$archs,
  497.             'pilots'=>$pilots,
  498.             'natures'=>$natureRep->findAll(),
  499.             'zones'=>$zoneRep->findAll(),
  500.             'typec'=>$typecRep->findAll(),
  501.             'typeprod'=>$typeprodRep->findAll(),
  502.             'departement'=>$depRep->findAll(),
  503.             'ipi'=>$ipi,
  504.             'iegc'=>$iegc,
  505.             'iap'=>$iap,
  506.             'iar'=>$iar,
  507.             'ipilots'=>$ipilots,
  508.             'user'=>$com,
  509.             'typec'=>$typecRep->findAll(),
  510.             't'=>$t,
  511.             'iegc'=>$iegc,
  512.             'tabType'=>$tab,
  513.             'int'=>$ints,
  514.             'selectedProductIds' => $selectedProductIds,
  515.             'revendeurs' => $revendeurs, 
  516.         ]);
  517.     }
  518.          #[Route('/prospect/remove-bloc/{chantierId}/{productId}', name: 'app_remove_bloc')]
  519.          public function removeProduct($chantierId, $productId, EntityManagerInterface $em): Response
  520.          {
  521.              // Fetch the Chantier and ProductMetrage entities based on the provided IDs
  522.              $chantier = $em->getRepository(Chantier::class)->find($chantierId);
  523.              $productMetrage = $em->getRepository(ProductMetrage::class)->findOneBy(['chantier' => $chantier, 'product' => $productId]);
  524.              
  525.          
  526.              if (!$chantier || !$productMetrage) {
  527.                  return new JsonResponse(['success' => false, 'message' => 'Entity not found'], 400);
  528.              }
  529.          
  530.              // Check if the Chantier has more than one product
  531.              $chantierProductsCount = count($chantier->getProductMetrages());
  532.          
  533.              if ($chantierProductsCount > 1) {
  534.                  // Remove the ProductMetrage from the Chantier
  535.                  $chantier->removeProductMetrage($productMetrage);
  536.          
  537.                  // Remove the ProductMetrage from the database
  538.                  $em->remove($productMetrage);
  539.          
  540.                  // Persist the changes
  541.                  $em->flush();
  542.          
  543.                  $this->addFlash('error', 'Bloc de produit est supprimé avec succès!!!');
  544.          
  545.                  // Return a success response
  546.                  return new JsonResponse(['success' => true]);
  547.              } else {
  548.                  // Return a response indicating that the product cannot be removed
  549.                  return new JsonResponse(['success' => false, 'message' => 'Le chantier a un seul produit. Impossible de supprimer l\'ID du bloc.'], 400);
  550.              }
  551.          }
  552.          
  553.     #[Route('/enNegociation/modifier/{id<\d+>}', name: 'app_modifier_negociation')]
  554.     public function editNegociation(Request $request,TypeChantierRepository $typecRep ,ProduitRepository $produitRep,EntityManagerInterface $em,CommercialRepository $comrep,ProduitRepository $prodRep,IntervenantRepository $intervenetRep,TypeIntervenantRepository $typeIntRep ,
  555.     NatureChantierRepository $natureRep,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep , VisiteRepository $visiteRep,TypeIntervenantRepository $typeIRep,$id,TypeProduitRepository $typeprodRep,RevendeurRepository $revendeurRep): Response
  556.     {
  557.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  558.             $this->addFlash('error',"Vous n'avez pas le droit!!!"); 
  559.             return $this->redirectToRoute('app_login');
  560.         }
  561.         
  562.         $ch=$chantierRep->find($id);
  563.         $intervenants = $ch->getIntervenant();
  564.         $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $ch]);
  565.         // Tableau pour stocker les identifiants des produits déjà associés au chantier
  566.         $selectedProductIds = [];
  567.         foreach ($chantierProducts as $chantierProduct) {
  568.             $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  569.         }
  570.         $t=$ch->getType();
  571.         $user =$this->getUser();
  572.         $com=$comrep->findOneByUser($user);
  573.         if($request->isMethod('POST')){
  574.             $now = new \DateTime();
  575.             //dd($request->request->all());
  576.             //$type=$typecRep->findOneByNom('en prospect');
  577.             $zone=$zoneRep->findOneById($request->get('zone'));
  578.             $nat=$natureRep->findOneById($request->get('naturec'));
  579.             $type=$typecRep->findOneById($request->get('typec'));
  580.             $clientId = $request->get('nomclient');
  581.             $client = $revendeurRep->find($clientId);
  582.            
  583.             $ch->setNom($request->get('nom'));
  584.             $ch->setRaidechausse($request->get('rai'));
  585.             $ch->setMetrage(intval($request->get('metrage')));
  586.             $ch->setDateModification(new \DateTime()); 
  587.             $ch->setValeur($request->get('valeur'));
  588.             $ch->setProducts($request->get('products'));
  589.             $ch->setConcurrent($request->get('concurrent'));
  590.             $ch->setMcarre($request->get('mcarre'));
  591.             $ch->SetVglobal($request->get('vglobal'));
  592.             $ch->setFinancement($request->get('financement'));
  593.             //$ch->setOtherclient($request->get('otherclient'));
  594.             $other=$request->get('otherclient');
  595.             if (empty($other)) {
  596.                 $ch->setOtherclient(null);
  597.             } else {
  598.                 $ch->setOtherclient($other);
  599.             }
  600.             $datedebut =$request->get('datedebut');
  601.             $ch->setDatedebut($datedebut);
  602.             $ch->setClient($client);
  603.             $demandeValue = $request->get('demande');
  604.             if (empty($demandeValue)) {
  605.                 $ch->setDemande(null);
  606.             } else {
  607.                 $ch->setDemande($demandeValue);
  608.             }
  609.             if($request->request->get('plan') == 'on'){
  610.                 $ch->setPlanDaction('oui');
  611.             }
  612.             else{
  613.                 $ch->setPlanDaction('non');
  614.             }
  615.             
  616.             $visite = $visiteRep->findOneByChantier($ch);
  617.             $visitetDate=$request->get('date');
  618.             $visitepDate = new \DateTime($request->get('datepvisite'));
  619.             $visite->setObservation($request->get('observation'));
  620.             $visite->setDatevisite($visitetDate);
  621.             $visite->setDatepvisite($visitepDate);
  622.             $visite->setChantier($ch);
  623.             $visite->setCause($request->get('cause'));
  624.             if ($type !== null) {
  625.                 $visite->setClassement($type->getType());
  626.             }
  627.             $em->persist($visite);
  628.                     
  629.            
  630.             $products = $ch->getChantierProduits();
  631.             if (count($products) > 0) {
  632.                 foreach ($products as $key => $p) {
  633.                     if (isset($request->get('typec')[$key]) && isset($request->get('produit')[$key])) {
  634.                         $typeChantier = $typecRep->find($request->get('typec')[$key]);
  635.                         $pr = $produitRep->find($request->get('produit')[$key]);
  636.             
  637.                         $p->setType($typeChantier->getType());
  638.                         $p->setProduit($pr);
  639.                     }
  640.                 }
  641.             }            
  642.             
  643.             $ch->setZone($zone);
  644.             $prod=$prodRep->findOneById($request->get('produit'));
  645.             $typeProduit = $em->getRepository(TypeProduit::class)->findOneBy([]);
  646.             $existingChantierProducts = $ch->getChantierProducts();
  647.             foreach ($request->get('produit') as $pr) {
  648.                 // Find the product entity
  649.                 $produit = $produitRep->find($pr);
  650.                 // Check if this product is already associated with the chantier
  651.                 $existingChantierProduct = null;
  652.                 foreach ($existingChantierProducts as $existingProduct) {
  653.                     if ($existingProduct->getProduit() === $produit) {
  654.                         $existingChantierProduct = $existingProduct;
  655.                         break;
  656.                     }
  657.                 }
  658.                 if ($existingChantierProduct === null) {
  659.                     // If the product is not associated, create a new ChantierProduct entity
  660.                     $chantierProduct = new ChantierProduct();
  661.                     $chantierProduct->setProduit($produit);
  662.                     $chantierProduct->setChantier($ch);
  663.                     $em->persist($chantierProduct);
  664.                 } else {
  665.                     // If the product is already associated, update the association (optional)
  666.                     // $existingChantierProduct->setProduit($produit); // Optionally update the product if needed
  667.                 }
  668.             }
  669.             // Remove any ChantierProduct entities associated with the chantier but not included in the submitted products (optional)
  670.             foreach ($existingChantierProducts as $existingProduct) {
  671.                 if (!in_array($existingProduct->getProduit()->getId(), $request->get('produit'))) {
  672.                     $em->remove($existingProduct);
  673.                 }
  674.             }
  675.             $em->flush();
  676.             
  677.             
  678.             // Persist all changes to the database
  679.             $em->flush();
  680.             
  681.             // Redirect or render the appropriate response
  682.                 
  683.             $ch->settype($type);
  684.             $ch->setNature($nat);  
  685.             $ch->setCommercial($com);
  686.             
  687.             $ch->setLatitude($request->get('latitude'));
  688.             $ch->setLongitude($request->get('longitude'));
  689.             
  690.             $directeurs=$directeurRep->findAll();
  691.             foreach ($directeurs as $d) {
  692.                 $ch->addDirecteur($d);
  693.             }
  694.             
  695.             foreach ($intervenants as $intervenant) {
  696.                 $ch->removeIntervenant($intervenant);
  697.             }
  698.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomp')));
  699.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nome')));
  700.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomap')));
  701.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomar')));
  702.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nompilot')));
  703.             $existingChantier = $chantierRep->findOneBy([
  704.                 'nom' => $request->get('nom'),
  705.                 'zone' => $zone
  706.             ]);
  707.             
  708.             if ($existingChantier != null && $ch != null && $existingChantier->getId() != $ch->getId()) {
  709.                 $ChantierName = $ch->getNom(); // Store the previous name before modifying
  710.                 $this->addFlash('error', 'Le nom de chantier "' . $ChantierName . '" existe déjà. Veuillez en choisir un autre !!!');
  711.                 $ch->setNom(''); // Set the name of $ch to an empty string
  712.             }
  713.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >= $now)
  714.             {
  715.                $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  716.             }
  717.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >$visitepDate)  
  718.             {
  719.                $this->addFlash('error','Date de la visite est superieur a la date prochain visite!!!');
  720.             }
  721.            else{
  722.            $this->addFlash('success','Le chantier en negociation est modifié avec succès!!!');
  723.            
  724.                   
  725.             $em->persist($ch);
  726.             $em->flush();
  727.            return $this->redirectToRoute('app_enNegociation');
  728.            }
  729.         }
  730.         $pis=$intervenetRep->findBytype($typeIntRep->findOneById('1'));
  731.         $egcs=$intervenetRep->findBytype($typeIntRep->findOneById('2'));
  732.         $apps=$intervenetRep->findBytype($typeIntRep->findOneById('3'));
  733.         $archs=$intervenetRep->findBytype($typeIntRep->findOneById('4'));
  734.         $pilots=$intervenetRep->findBytype($typeIntRep->findOneById('5'));
  735.         $ipi=null;
  736.         $iegc=null;
  737.         $iap=null;
  738.         $iar=null;
  739.         $ipilots=null;
  740.         $ints=$ch->getIntervenant();
  741.           foreach ($ints as $i) {
  742.             if($i->getType()==$typeIntRep->findOneById('1'))
  743.             $ipi=$i;
  744.             elseif($i->getType()==$typeIntRep->findOneById('2'))
  745.             $iegc=$i;
  746.             elseif($i->getType()==$typeIntRep->findOneById('3'))
  747.             $iap=$i;
  748.             elseif($i->getType()==$typeIntRep->findOneById('4'))
  749.             $iar=$i; 
  750.             else
  751.             $ipilots=$i; 
  752.           }
  753.            
  754.         
  755.         $em->persist($ch);
  756.         $em->flush();
  757.         
  758.         
  759.         $tab=[];
  760.         $chantierproduit=$ch->getChantierProduits();
  761.          foreach($chantierproduit as $chs)
  762.          {
  763.             array_push($tab,$chs->getType());
  764.          }
  765.        
  766.          $revendeurs = $em->getRepository(Revendeur::class)->findAll();
  767.          return $this->render('commercial/modifierNeg.html.twig', [
  768.             'chantier'=>$ch,
  769.             'Tinters'=>$typeIntRep->findAll(),
  770.             'types' => $typecRep->findAll(),'prod' =>$produitRep->findAll(),
  771.             'pis'=>$pis,
  772.             'egcs'=>$egcs ,
  773.             'apps'=>$apps,
  774.             'archs'=>$archs,
  775.             'pilots'=>$pilots,
  776.             'natures'=>$natureRep->findAll(),
  777.             'zones'=>$zoneRep->findAll(),
  778.             'typec'=>$typecRep->findAll(),
  779.             'ipi'=>$ipi,
  780.             'iegc'=>$iegc,
  781.             'iap'=>$iap,
  782.             'iar'=>$iar,
  783.             'ipilots'=>$ipilots,
  784.             'user'=>$com,
  785.             'typec'=>$typecRep->findAll(),
  786.             'typeprod'=>$typeprodRep->findAll(),
  787.             't'=>$t,
  788.             'iegc'=>$iegc,
  789.             'tabType'=>$tab,
  790.             'int'=>$ints,
  791.             'selectedProductIds' => $selectedProductIds,
  792.             'revendeurs' => $revendeurs, 
  793.         ]);
  794.     
  795.     }
  796. //modification viste client en cours
  797. #[Route('commercial/revendeur/{id}/editNegos', name: 'app_revendeur_editNegos')]
  798. public function modifierRevendeurNegos(Request $request, VisiteRepository $visiteRep,EntityManagerInterface $em,
  799.  Chantier $chantier, TypeChantierRepository $typecRep, CommercialRepository $comrep, ZoneRepository $zoneRep, 
  800.  ProduitRepository $produitRep, RevendeurRepository $revendeurRep): Response
  801. {
  802.     if (!$this->isGranted('ROLE_COMMERCIAL')) {
  803.         $this->addFlash('error', "Vous n'avez pas le droit!!!");
  804.         return $this->redirectToRoute('app_login');
  805.     }
  806.     $user = $this->getUser();
  807.     $com = $comrep->findOneByUser($user);
  808.     $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $chantier]);
  809.          // Tableau pour stocker les identifiants des produits déjà associés au chantier
  810.          $selectedProductIds = [];
  811.          foreach ($chantierProducts as $chantierProduct) {
  812.              $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  813.          }
  814.     if ($request->isMethod('POST')) {
  815.         $zone = $zoneRep->findOneById($request->get('zone'));
  816.        // $typec = $typecRep->findOneByNom('en prospect');
  817.         $typec = $typecRep->findOneById($request->get('typec'));
  818.         $visitetDate = $request->get('date');
  819.         $visitepDate = new \DateTime($request->get('datepvisite'));
  820.         $chantier->setNom($request->get('nom'));
  821.         $chantier->setConcurrent($request->get('concurrent'));
  822.         $chantier->setDemande($request->get('demande') ? 'Revendeur : ' . $request->get('demande') : null);
  823.         $chantier->setBudgetrev($request->get('budgetrev'));
  824.         $chantier->setTyperev($request->get('typerev'));
  825.         $chantier->setType($typec);
  826.         $chantier->setZone($zone);
  827.         $chantier->SetVglobal($request->get('vglobal'));
  828.         // Mise à jour des produits associés au chantier
  829.         
  830.    
  831.        // $chantier->clearChantierProduits();
  832.         foreach ($request->get('produit') as $pr) {
  833.             $prod = $produitRep->findOneById($pr);
  834.             $chantierProduit = new ChantierProduit();
  835.             $chantierProduit->setChantier($chantier);
  836.             $chantierProduit->setProduit($prod);
  837.             $chantierProduit->setType('en prospect');
  838.             $chantierProduit->setBudgetrev($request->get('budgetrev'));
  839.             $chantier->addChantierProduit($chantierProduit);
  840.             $em->persist($chantierProduit);
  841.         }
  842.         //  $visite = new Visite();
  843.         $visite = $visiteRep->findOneByChantier($chantier);
  844.      
  845.         $visite->setObservation($request->get('observation'));
  846.         $visite->setDatevisite($visitetDate);
  847.         $visite->setDatepvisite($visitepDate);
  848.         $visite->setChantier($chantier);
  849.         $visite->setCause($request->get('cause'));
  850.         $em->persist($visite);
  851.         $em->persist($chantier);
  852.         $em->flush();
  853.         $this->addFlash('success', 'visite client a été modifié avec succès!!!');
  854.         return $this->redirectToRoute('app_enNegociation');
  855.     }
  856.     return $this->render('commercial/ModifVisiteRevNegos.html.twig', [
  857.         'chantier' => $chantier,
  858.         'zones' => $zoneRep->findAll(),
  859.         'prod' => $produitRep->findAll(),
  860.         'user' => $com,
  861.         'revendeurs' => $revendeurRep->findAll(),
  862.         'selectedProductIds' => $selectedProductIds,
  863.         'typec'=>$typecRep->findAll(),
  864.     ]);
  865. }
  866.     #[Route('/encours/modifier/{id<\d+>}', name: 'app_modifier_encours')]
  867.     public function editEncours(Request $request,TypeChantierRepository $typecRep ,ProduitRepository $produitRep,EntityManagerInterface $em,CommercialRepository $comrep,ProduitRepository $prodRep,IntervenantRepository $intervenetRep,TypeIntervenantRepository $typeIntRep ,NatureChantierRepository $natureRep,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep ,VisiteRepository $visiteRep,TypeIntervenantRepository $typeIRep,$id,TypeProduitRepository $typeprodRep,RevendeurRepository $revendeurRep): Response
  868.     {
  869.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  870.             $this->addFlash('error',"Vous n'avez pas le droit!!!"); 
  871.             return $this->redirectToRoute('app_login');
  872.         }
  873.        
  874.         $ch=$chantierRep->find($id);
  875.         $intervenants = $ch->getIntervenant();
  876.         $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $ch]);
  877.         // Tableau pour stocker les identifiants des produits déjà associés au chantier
  878.         $selectedProductIds = [];
  879.         foreach ($chantierProducts as $chantierProduct) {
  880.             $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  881.         }
  882.         $t=$ch->getType();
  883.         $user =$this->getUser();
  884.         $com=$comrep->findOneByUser($user);
  885.         if($request->isMethod('POST')){
  886.             //dd($request->request->all());
  887.             //$type=$typecRep->findOneByNom('en prospect');
  888.             $now = new \DateTime();
  889.             $zone=$zoneRep->findOneById($request->get('zone'));
  890.             $nat=$natureRep->findOneById($request->get('naturec'));
  891.             $type=$typecRep->findOneById($request->get('typec'));
  892.             $clientId = $request->get('nomclient');
  893.             $client = $revendeurRep->find($clientId);
  894.             $ch->setNom($request->get('nom'));
  895.             $ch->setRaidechausse($request->get('rai'));
  896.             $ch->setMetrage(intval($request->get('metrage')));
  897.             $ch->setValeur($request->get('valeur'));
  898.             $ch->setProducts($request->get('products'));
  899.             $ch->setDateModification(new \DateTime()); 
  900.             $ch->setConcurrent($request->get('concurrent'));
  901.             $ch->setMcarre($request->get('mcarre'));
  902.             $ch->SetVglobal($request->get('vglobal'));
  903.             $ch->setFinancement($request->get('financement'));
  904.             //$ch->setOtherclient($request->get('otherclient'));
  905.             $other=$request->get('otherclient');
  906.             if (empty($other)) {
  907.                 $ch->setOtherclient(null);
  908.             } else {
  909.                 $ch->setOtherclient($other);
  910.             }
  911.             $datedebut =$request->get('datedebut');
  912.             $ch->setDatedebut($datedebut);
  913.             $ch->setClient($client);
  914.             $ch->setDateModification(new \DateTime()); 
  915.             $demandeValue = $request->get('demande');
  916.             if (empty($demandeValue)) {
  917.                 $ch->setDemande(null);
  918.             } else {
  919.                 $ch->setDemande($demandeValue);
  920.             }
  921.             if($request->request->get('plan') == 'on'){
  922.                 $ch->setPlanDaction('oui');
  923.             }
  924.             else{
  925.                 $ch->setPlanDaction('non');
  926.             }
  927.             $visite = $visiteRep->findOneByChantier($ch);
  928.             $visitetDate=$request->get('date');
  929.             $visitepDate = new \DateTime($request->get('datepvisite'));
  930.             $visite->setObservation($request->get('observation'));
  931.             $visite->setDatevisite($visitetDate);
  932.             $visite->setDatepvisite($visitepDate);
  933.             $visite->setChantier($ch);
  934.             $visite->setCause($request->get('cause'));
  935.             if ($type !== null) {
  936.                 $visite->setClassement($type->getType());
  937.             }
  938.             $em->persist($visite);
  939.                     
  940.            
  941.             $products = $ch->getChantierProduits();
  942.             if (count($products) > 0) {
  943.                 foreach ($products as $key => $p) {
  944.                     if (isset($request->get('typec')[$key]) && isset($request->get('produit')[$key])) {
  945.                         $typeChantier = $typecRep->find($request->get('typec')[$key]);
  946.                         $pr = $produitRep->find($request->get('produit')[$key]);
  947.             
  948.                         $p->setType($typeChantier->getType());
  949.                         $p->setProduit($pr);
  950.                     }
  951.                 }
  952.             }            
  953.             
  954.             $ch->setZone($zone);
  955.             $prod=$prodRep->findOneById($request->get('produit'));
  956.             $typeProduit = $em->getRepository(TypeProduit::class)->findOneBy([]);
  957.             $existingChantierProducts = $ch->getChantierProducts();
  958.             foreach ($request->get('produit') as $pr) {
  959.                 // Find the product entity
  960.                 $produit = $produitRep->find($pr);
  961.                 // Check if this product is already associated with the chantier
  962.                 $existingChantierProduct = null;
  963.                 foreach ($existingChantierProducts as $existingProduct) {
  964.                     if ($existingProduct->getProduit() === $produit) {
  965.                         $existingChantierProduct = $existingProduct;
  966.                         break;
  967.                     }
  968.                 }
  969.                 if ($existingChantierProduct === null) {
  970.                     // If the product is not associated, create a new ChantierProduct entity
  971.                     $chantierProduct = new ChantierProduct();
  972.                     $chantierProduct->setProduit($produit);
  973.                     $chantierProduct->setChantier($ch);
  974.                     $em->persist($chantierProduct);
  975.                 } else {
  976.                     // If the product is already associated, update the association (optional)
  977.                     // $existingChantierProduct->setProduit($produit); // Optionally update the product if needed
  978.                 }
  979.             }
  980.             // Remove any ChantierProduct entities associated with the chantier but not included in the submitted products (optional)
  981.             foreach ($existingChantierProducts as $existingProduct) {
  982.                 if (!in_array($existingProduct->getProduit()->getId(), $request->get('produit'))) {
  983.                     $em->remove($existingProduct);
  984.                 }
  985.             }
  986.             $em->flush();
  987.             
  988.             // Persist all changes to the database
  989.             $em->flush();
  990.             
  991.             // Redirect or render the appropriate response
  992.                 
  993.             $ch->settype($type);
  994.             $ch->setNature($nat);  
  995.             $ch->setCommercial($com);
  996.             
  997.             $ch->setLatitude($request->get('latitude'));
  998.             $ch->setLongitude($request->get('longitude'));
  999.             
  1000.             $directeurs=$directeurRep->findAll();
  1001.             foreach ($directeurs as $d) {
  1002.                 $ch->addDirecteur($d);
  1003.             }
  1004.             
  1005.             foreach ($intervenants as $intervenant) {
  1006.                 $ch->removeIntervenant($intervenant);
  1007.             }
  1008.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomp')));
  1009.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nome')));
  1010.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomap')));
  1011.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomar')));
  1012.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nompilot')));
  1013.             
  1014.             $existingChantier = $chantierRep->findOneBy([
  1015.                 'nom' => $request->get('nom'),
  1016.                 'zone' => $zone
  1017.             ]);
  1018.             
  1019.             if ($existingChantier != null && $ch != null && $existingChantier->getId() != $ch->getId()) {
  1020.                 $ChantierName = $ch->getNom(); // Store the previous name before modifying
  1021.                 $this->addFlash('error', 'Le nom de chantier "' . $ChantierName . '" existe déjà. Veuillez en choisir un autre !!!');
  1022.                 $ch->setNom(''); // Set the name of $ch to an empty string
  1023.             }
  1024.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >= $now)
  1025.             {
  1026.                $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  1027.             }
  1028.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >$visitepDate)  
  1029.             {
  1030.                $this->addFlash('error','Date de la visite est superieur a la date prochain visite!!!');
  1031.             }
  1032.            else{
  1033.            $this->addFlash('success','Le chantier en cours est modifié avec succès!!!');
  1034.            
  1035.                   
  1036.             $em->persist($ch);
  1037.             $em->flush();
  1038.            return $this->redirectToRoute('app_encours');
  1039.            }
  1040.         }
  1041.         $pis=$intervenetRep->findBytype($typeIntRep->findOneById('1'));
  1042.         $egcs=$intervenetRep->findBytype($typeIntRep->findOneById('2'));
  1043.         $apps=$intervenetRep->findBytype($typeIntRep->findOneById('3'));
  1044.         $archs=$intervenetRep->findBytype($typeIntRep->findOneById('4'));
  1045.         $pilots=$intervenetRep->findBytype($typeIntRep->findOneById('5'));
  1046.         $ipi=null;
  1047.         $iegc=null;
  1048.         $iap=null;
  1049.         $iar=null;
  1050.         $ipilots=null;
  1051.         $ints=$ch->getIntervenant();
  1052.           foreach ($ints as $i) {
  1053.             if($i->getType()==$typeIntRep->findOneById('1'))
  1054.             $ipi=$i;
  1055.             elseif($i->getType()==$typeIntRep->findOneById('2'))
  1056.             $iegc=$i;
  1057.             elseif($i->getType()==$typeIntRep->findOneById('3'))
  1058.             $iap=$i;
  1059.             elseif($i->getType()==$typeIntRep->findOneById('4'))
  1060.             $iar=$i; 
  1061.             else
  1062.             $ipilots=$i; 
  1063.           }
  1064.         
  1065.         $em->persist($ch);
  1066.         $em->flush();
  1067.         
  1068.         
  1069.         $tab=[];
  1070.         $chantierproduit=$ch->getChantierProduits();
  1071.          foreach($chantierproduit as $chs)
  1072.          {
  1073.             array_push($tab,$chs->getType());
  1074.          }
  1075.        
  1076.          $revendeurs = $em->getRepository(Revendeur::class)->findAll();
  1077.          return $this->render('commercial/modifierCours.html.twig', [
  1078.             'chantier'=>$ch,
  1079.             'Tinters'=>$typeIntRep->findAll(),
  1080.             'types' => $typecRep->findAll(),'prod' =>$produitRep->findAll(),
  1081.             'pis'=>$pis,
  1082.             'egcs'=>$egcs ,
  1083.             'apps'=>$apps,
  1084.             'archs'=>$archs,
  1085.             'pilots'=>$pilots,
  1086.             'natures'=>$natureRep->findAll(),
  1087.             'zones'=>$zoneRep->findAll(),
  1088.             'typec'=>$typecRep->findAll(),
  1089.             'typeprod'=>$typeprodRep->findAll(),
  1090.             'ipi'=>$ipi,
  1091.             'iegc'=>$iegc,
  1092.             'iap'=>$iap,
  1093.             'iar'=>$iar,
  1094.             'ipilots'=>$ipilots,
  1095.             'user'=>$com,
  1096.             'typec'=>$typecRep->findAll(),
  1097.             't'=>$t,
  1098.             'iegc'=>$iegc,
  1099.             'tabType'=>$tab,
  1100.             'int'=>$ints,
  1101.             'selectedProductIds' => $selectedProductIds,
  1102.             'revendeurs' => $revendeurs, 
  1103.         ]);
  1104.     
  1105.     }
  1106. //modification viste client en cours
  1107. #[Route('commercial/revendeur/{id}/editEncours', name: 'app_revendeur_editEncours')]
  1108. public function modifierRevendeurEncours(Request $request, VisiteRepository $visiteRep,EntityManagerInterface $em,
  1109.  Chantier $chantier, TypeChantierRepository $typecRep, CommercialRepository $comrep, ZoneRepository $zoneRep, 
  1110.  ProduitRepository $produitRep, RevendeurRepository $revendeurRep): Response
  1111. {
  1112.     if (!$this->isGranted('ROLE_COMMERCIAL')) {
  1113.         $this->addFlash('error', "Vous n'avez pas le droit!!!");
  1114.         return $this->redirectToRoute('app_login');
  1115.     }
  1116.     $user = $this->getUser();
  1117.     $com = $comrep->findOneByUser($user);
  1118.     $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $chantier]);
  1119.          // Tableau pour stocker les identifiants des produits déjà associés au chantier
  1120.          $selectedProductIds = [];
  1121.          foreach ($chantierProducts as $chantierProduct) {
  1122.              $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  1123.          }
  1124.     if ($request->isMethod('POST')) {
  1125.         $zone = $zoneRep->findOneById($request->get('zone'));
  1126.        // $typec = $typecRep->findOneByNom('en prospect');
  1127.         $typec = $typecRep->findOneById($request->get('typec'));
  1128.         $visitetDate = $request->get('date');
  1129.         $visitepDate = new \DateTime($request->get('datepvisite'));
  1130.         $chantier->setNom($request->get('nom'));
  1131.         $chantier->setConcurrent($request->get('concurrent'));
  1132.         $chantier->setDemande($request->get('demande') ? 'Revendeur : ' . $request->get('demande') : null);
  1133.         $chantier->setBudgetrev($request->get('budgetrev'));
  1134.         $chantier->setTyperev($request->get('typerev'));
  1135.         $chantier->setType($typec);
  1136.         $chantier->setZone($zone);
  1137.         $chantier->SetVglobal($request->get('vglobal'));
  1138.         // Mise à jour des produits associés au chantier
  1139.         
  1140.    
  1141.        // $chantier->clearChantierProduits();
  1142.         foreach ($request->get('produit') as $pr) {
  1143.             $prod = $produitRep->findOneById($pr);
  1144.             $chantierProduit = new ChantierProduit();
  1145.             $chantierProduit->setChantier($chantier);
  1146.             $chantierProduit->setProduit($prod);
  1147.             $chantierProduit->setType('en prospect');
  1148.             $chantierProduit->setBudgetrev($request->get('budgetrev'));
  1149.             $chantier->addChantierProduit($chantierProduit);
  1150.             $em->persist($chantierProduit);
  1151.         }
  1152.         //  $visite = new Visite();
  1153.         $visite = $visiteRep->findOneByChantier($chantier);
  1154.      
  1155.         $visite->setObservation($request->get('observation'));
  1156.         $visite->setDatevisite($visitetDate);
  1157.         $visite->setDatepvisite($visitepDate);
  1158.         $visite->setChantier($chantier);
  1159.         $visite->setCause($request->get('cause'));
  1160.         $em->persist($visite);
  1161.         $em->persist($chantier);
  1162.         $em->flush();
  1163.         $this->addFlash('success', 'visite client a été modifié avec succès!!!');
  1164.         return $this->redirectToRoute('app_encours');
  1165.     }
  1166.     return $this->render('commercial/ModifVisiteRevEncours.html.twig', [
  1167.         'chantier' => $chantier,
  1168.         'zones' => $zoneRep->findAll(),
  1169.         'prod' => $produitRep->findAll(),
  1170.         'user' => $com,
  1171.         'revendeurs' => $revendeurRep->findAll(),
  1172.         'selectedProductIds' => $selectedProductIds,
  1173.         'typec'=>$typecRep->findAll(),
  1174.     ]);
  1175. }
  1176.     
  1177.     #[Route('/enPlandaction/modifier/{id<\d+>}', name: 'app_modifier_planaction')]
  1178.     public function editPlandaction(Request $request,TypeChantierRepository $typecRep ,ProduitRepository $produitRep,
  1179.     EntityManagerInterface $em,CommercialRepository $comrep,ProduitRepository $prodRep,IntervenantRepository $intervenetRep,
  1180.     TypeIntervenantRepository $typeIntRep ,NatureChantierRepository $natureRep,ChantierRepository $chantierRep, 
  1181.     DirecteurRepository $directeurRep, ZoneRepository $zoneRep ,VisiteRepository $visiteRep,TypeIntervenantRepository $typeIRep,$id,
  1182.     TypeProduitRepository $typeprodRep,RevendeurRepository $revendeurRep): Response
  1183.     {
  1184.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  1185.             $this->addFlash('error',"Vous n'avez pas le droit!!!"); 
  1186.             return $this->redirectToRoute('app_login');
  1187.         }
  1188.         
  1189.         $ch=$chantierRep->find($id);
  1190.         $intervenants = $ch->getIntervenant();
  1191.         $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $ch]);
  1192.         // Tableau pour stocker les identifiants des produits déjà associés au chantier
  1193.         $selectedProductIds = [];
  1194.         foreach ($chantierProducts as $chantierProduct) {
  1195.             $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  1196.         }
  1197.         
  1198.         $t=$ch->getType();
  1199.         $user =$this->getUser();
  1200.         $com=$comrep->findOneByUser($user);
  1201.         if($request->isMethod('POST')){
  1202.             //dd($request->request->all());
  1203.             //$type=$typecRep->findOneByNom('en prospect');
  1204.             $now = new \DateTime();
  1205.             $zone=$zoneRep->findOneById($request->get('zone'));
  1206.             $nat=$natureRep->findOneById($request->get('naturec'));
  1207.             $type=$typecRep->findOneById($request->get('typec'));
  1208.             $clientId = $request->get('nomclient');
  1209.             $client = $revendeurRep->find($clientId);
  1210.             $ch->setNom($request->get('nom'));
  1211.             $ch->setRaidechausse($request->get('rai'));
  1212.             $ch->setMetrage(intval($request->get('metrage')));
  1213.             $ch->setValeur($request->get('valeur'));
  1214.             $ch->setProducts($request->get('products'));
  1215.             $ch->setConcurrent($request->get('concurrent'));
  1216.             $ch->setMcarre($request->get('mcarre'));
  1217.             $ch->SetVglobal($request->get('vglobal'));
  1218.             $ch->setFinancement($request->get('financement'));
  1219.             //$ch->setOtherclient($request->get('otherclient'));
  1220.             $other=$request->get('otherclient');
  1221.             if (empty($other)) {
  1222.                 $ch->setOtherclient(null);
  1223.             } else {
  1224.                 $ch->setOtherclient($other);
  1225.             }
  1226.             $datedebut =$request->get('datedebut');
  1227.             $ch->setDatedebut($datedebut);
  1228.             $ch->setClient($client);
  1229.             $ch->setDateModification(new \DateTime()); 
  1230.             $demandeValue = $request->get('demande');
  1231.             if (empty($demandeValue)) {
  1232.                 $ch->setDemande(null);
  1233.             } else {
  1234.                 $ch->setDemande($demandeValue);
  1235.             }
  1236.             if($request->request->get('plan') == 'on'){
  1237.                 $ch->setPlanDaction('oui');
  1238.             }
  1239.             else{
  1240.                 $ch->setPlanDaction('non');
  1241.             }
  1242.             
  1243.             $visite = $visiteRep->findOneByChantier($ch);
  1244.             $visitetDate=$request->get('date');
  1245.             $visitepDate = new \DateTime($request->get('datepvisite'));
  1246.             $visite->setObservation($request->get('observation'));
  1247.             $visite->setDatevisite($visitetDate);
  1248.             $visite->setDatepvisite($visitepDate);
  1249.             $visite->setChantier($ch);
  1250.             $visite->setCause($request->get('cause'));
  1251.             if ($type !== null) {
  1252.                 $visite->setClassement($type->getType());
  1253.             }
  1254.             $em->persist($visite);
  1255.                     
  1256.            
  1257.             $products = $ch->getChantierProduits();
  1258.             if (count($products) > 0) {
  1259.                 foreach ($products as $key => $p) {
  1260.                     if (isset($request->get('typec')[$key]) && isset($request->get('produit')[$key])) {
  1261.                         $typeChantier = $typecRep->find($request->get('typec')[$key]);
  1262.                         $pr = $produitRep->find($request->get('produit')[$key]);
  1263.             
  1264.                         $p->setType($typeChantier->getType());
  1265.                         $p->setProduit($pr);
  1266.                     }
  1267.                 }
  1268.             }            
  1269.             
  1270.             $ch->setZone($zone);
  1271.             $prod=$prodRep->findOneById($request->get('produit'));
  1272.             $typeprod = $typeprodRep->findOneById($request->get('typeprod'));
  1273.             $typeProduit = $em->getRepository(TypeProduit::class)->findOneBy([]);
  1274.             $existingChantierProducts = $ch->getChantierProducts();
  1275.             foreach ($request->get('produit') as $pr) {
  1276.                 // Find the product entity
  1277.                 $produit = $produitRep->find($pr);
  1278.                 // Check if this product is already associated with the chantier
  1279.                 $existingChantierProduct = null;
  1280.                 foreach ($existingChantierProducts as $existingProduct) {
  1281.                     if ($existingProduct->getProduit() === $produit) {
  1282.                         $existingChantierProduct = $existingProduct;
  1283.                         break;
  1284.                     }
  1285.                 }
  1286.                 if ($existingChantierProduct === null) {
  1287.                     // If the product is not associated, create a new ChantierProduct entity
  1288.                     $chantierProduct = new ChantierProduct();
  1289.                     $chantierProduct->setProduit($produit);
  1290.                     $chantierProduct->setChantier($ch);
  1291.                     $em->persist($chantierProduct);
  1292.                 } else {
  1293.                     // If the product is already associated, update the association (optional)
  1294.                     // $existingChantierProduct->setProduit($produit); // Optionally update the product if needed
  1295.                 }
  1296.             }
  1297.             // Remove any ChantierProduct entities associated with the chantier but not included in the submitted products (optional)
  1298.             foreach ($existingChantierProducts as $existingProduct) {
  1299.                 if (!in_array($existingProduct->getProduit()->getId(), $request->get('produit'))) {
  1300.                     $em->remove($existingProduct);
  1301.                 }
  1302.             }
  1303.             
  1304.             
  1305.             
  1306.             // Persist all changes to the database
  1307.             $em->flush();
  1308.             
  1309.             // Redirect or render the appropriate response
  1310.                 
  1311.             $ch->settype($type);
  1312.             $ch->setNature($nat);  
  1313.             $ch->setCommercial($com);
  1314.             
  1315.             $ch->setLatitude($request->get('latitude'));
  1316.             $ch->setLongitude($request->get('longitude'));
  1317.             
  1318.             $directeurs=$directeurRep->findAll();
  1319.             foreach ($directeurs as $d) {
  1320.                 $ch->addDirecteur($d);
  1321.             }
  1322.             
  1323.             foreach ($intervenants as $intervenant) {
  1324.                 $ch->removeIntervenant($intervenant);
  1325.             }
  1326.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomp')));
  1327.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nome')));
  1328.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomap')));
  1329.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nomar')));
  1330.             $ch->addIntervenant($intervenetRep->findOneById($request->get('nompilot')));
  1331.             $existingChantier = $chantierRep->findOneBy([
  1332.                 'nom' => $request->get('nom'),
  1333.                 'zone' => $zone
  1334.             ]);
  1335.             
  1336.             if ($existingChantier != null && $ch != null && $existingChantier->getId() != $ch->getId()) {
  1337.                 $ChantierName = $ch->getNom(); // Store the previous name before modifying
  1338.                 $this->addFlash('error', 'Le nom de chantier "' . $ChantierName . '" existe déjà. Veuillez en choisir un autre !!!');
  1339.                 $ch->setNom(''); // Set the name of $ch to an empty string
  1340.             }
  1341.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >= $now)
  1342.             {
  1343.                $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  1344.             }
  1345.             elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >$visitepDate)  
  1346.             {
  1347.                $this->addFlash('error','Date de la visite est superieur a la date prochain visite!!!');
  1348.             }
  1349.            else {
  1350.             $this->addFlash('success', 'Le chantier en plan d\'action a été modifié avec succès!');
  1351.            
  1352.                   
  1353.             $em->persist($ch);
  1354.             $em->flush();
  1355.            return $this->redirectToRoute('app_plan_comm');
  1356.            }
  1357.         }
  1358.         $pis=$intervenetRep->findBytype($typeIntRep->findOneById('1'));
  1359.         $egcs=$intervenetRep->findBytype($typeIntRep->findOneById('2'));
  1360.         $apps=$intervenetRep->findBytype($typeIntRep->findOneById('3'));
  1361.         $archs=$intervenetRep->findBytype($typeIntRep->findOneById('4'));
  1362.         $pilots=$intervenetRep->findBytype($typeIntRep->findOneById('5'));
  1363.         $ipi=null;
  1364.         $iegc=null;
  1365.         $iap=null;
  1366.         $iar=null;
  1367.         $ipilots=null;
  1368.         $ints=$ch->getIntervenant();
  1369.           foreach ($ints as $i) {
  1370.             if($i->getType()==$typeIntRep->findOneById('1'))
  1371.             $ipi=$i;
  1372.             elseif($i->getType()==$typeIntRep->findOneById('2'))
  1373.             $iegc=$i;
  1374.             elseif($i->getType()==$typeIntRep->findOneById('3'))
  1375.             $iap=$i;
  1376.             elseif($i->getType()==$typeIntRep->findOneById('4'))
  1377.             $iar=$i; 
  1378.             else
  1379.             $ipilots=$i; 
  1380.           }
  1381.            
  1382.         
  1383.         $em->persist($ch);
  1384.         $em->flush();
  1385.         
  1386.         
  1387.         $tab=[];
  1388.         $chantierproduit=$ch->getChantierProduits();
  1389.          foreach($chantierproduit as $chs)
  1390.          {
  1391.             array_push($tab,$chs->getType());
  1392.          }
  1393.          $revendeurs = $em->getRepository(Revendeur::class)->findAll();
  1394.          return $this->render('commercial/modifierplan.html.twig', [
  1395.             'chantier'=>$ch,
  1396.             'Tinters'=>$typeIntRep->findAll(),
  1397.             'types' => $typecRep->findAll(),'prod' =>$produitRep->findAll(),
  1398.             'pis'=>$pis,
  1399.             'egcs'=>$egcs ,
  1400.             'apps'=>$apps,
  1401.             'archs'=>$archs,
  1402.             'pilots'=>$pilots,
  1403.             'natures'=>$natureRep->findAll(),
  1404.             'zones'=>$zoneRep->findAll(),
  1405.             'typec'=>$typecRep->findAll(),
  1406.             'ipi'=>$ipi,
  1407.             'iegc'=>$iegc,
  1408.             'iap'=>$iap,
  1409.             'iar'=>$iar,
  1410.             'ipilots'=>$ipilots,
  1411.             'user'=>$com,
  1412.             'typec'=>$typecRep->findAll(),
  1413.             'typeprod'=>$typeprodRep->findAll(),
  1414.             't'=>$t,
  1415.             'iegc'=>$iegc,
  1416.             'tabType'=>$tab,
  1417.             'int'=>$ints,
  1418.             'selectedProductIds' => $selectedProductIds,
  1419.             'revendeurs' => $revendeurs, 
  1420.         ]);
  1421.     
  1422.     }
  1423. /******************************************* modification projet fini ****************************************** */
  1424. #[Route('/fini/modifier/{id<\d+>}', name: 'app_modifier_fini')]
  1425. public function editFini(Request $request,TypeChantierRepository $typecRep ,ProduitRepository $produitRep,EntityManagerInterface $em,CommercialRepository $comrep,ProduitRepository $prodRep,IntervenantRepository $intervenetRep,TypeIntervenantRepository $typeIntRep ,
  1426. NatureChantierRepository $natureRep,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep , VisiteRepository $visiteRep,TypeIntervenantRepository $typeIRep,$id,TypeProduitRepository $typeprodRep,RevendeurRepository $revendeurRep): Response
  1427. {
  1428.     if (!$this->isGranted('ROLE_COMMERCIAL')) {
  1429.         $this->addFlash('error',"Vous n'avez pas le droit!!!"); 
  1430.         return $this->redirectToRoute('app_login');
  1431.     }
  1432.     
  1433.     $ch=$chantierRep->find($id);
  1434.     $intervenants = $ch->getIntervenant();
  1435.     $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $ch]);
  1436.     // Tableau pour stocker les identifiants des produits déjà associés au chantier
  1437.     $selectedProductIds = [];
  1438.     foreach ($chantierProducts as $chantierProduct) {
  1439.         $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  1440.     }
  1441.     $t=$ch->getType();
  1442.     $user =$this->getUser();
  1443.     $com=$comrep->findOneByUser($user);
  1444.     if($request->isMethod('POST')){
  1445.         $now = new \DateTime();
  1446.         //dd($request->request->all());
  1447.         //$type=$typecRep->findOneByNom('en prospect');
  1448.         $zone=$zoneRep->findOneById($request->get('zone'));
  1449.         $nat=$natureRep->findOneById($request->get('naturec'));
  1450.         $type=$typecRep->findOneById($request->get('typec'));
  1451.         $clientId = $request->get('nomclient');
  1452.         $client = $revendeurRep->find($clientId);
  1453.        
  1454.         $ch->setNom($request->get('nom'));
  1455.         $ch->setRaidechausse($request->get('rai'));
  1456.         $ch->setMetrage(intval($request->get('metrage')));
  1457.         $ch->setDateModification(new \DateTime()); 
  1458.         $ch->setValeur($request->get('valeur'));
  1459.         $ch->setProducts($request->get('products'));
  1460.         $ch->setConcurrent($request->get('concurrent'));
  1461.         $ch->setMcarre($request->get('mcarre'));
  1462.         $ch->SetVglobal($request->get('vglobal'));
  1463.         $ch->setFinancement($request->get('financement'));
  1464.         //$ch->setOtherclient($request->get('otherclient'));
  1465.         $other=$request->get('otherclient');
  1466.         if (empty($other)) {
  1467.             $ch->setOtherclient(null);
  1468.         } else {
  1469.             $ch->setOtherclient($other);
  1470.         }
  1471.         $datedebut =$request->get('datedebut');
  1472.         $ch->setDatedebut($datedebut);
  1473.         $ch->setClient($client);
  1474.         $demandeValue = $request->get('demande');
  1475.         if (empty($demandeValue)) {
  1476.             $ch->setDemande(null);
  1477.         } else {
  1478.             $ch->setDemande($demandeValue);
  1479.         }
  1480.         if($request->request->get('plan') == 'on'){
  1481.             $ch->setPlanDaction('oui');
  1482.         }
  1483.         else{
  1484.             $ch->setPlanDaction('non');
  1485.         }
  1486.         
  1487.         $visite = $visiteRep->findOneByChantier($ch);
  1488.         $visitetDate=$request->get('date');
  1489.         $visitepDate = new \DateTime($request->get('datepvisite'));
  1490.         $visite->setObservation($request->get('observation'));
  1491.         $visite->setDatevisite($visitetDate);
  1492.         $visite->setDatepvisite($visitepDate);
  1493.         $visite->setChantier($ch);
  1494.         $visite->setCause($request->get('cause'));
  1495.         if ($type !== null) {
  1496.             $visite->setClassement($type->getType());
  1497.         }
  1498.         $em->persist($visite);
  1499.                 
  1500.        
  1501.         $products = $ch->getChantierProduits();
  1502.         if (count($products) > 0) {
  1503.             foreach ($products as $key => $p) {
  1504.                 if (isset($request->get('typec')[$key]) && isset($request->get('produit')[$key])) {
  1505.                     $typeChantier = $typecRep->find($request->get('typec')[$key]);
  1506.                     $pr = $produitRep->find($request->get('produit')[$key]);
  1507.         
  1508.                     $p->setType($typeChantier->getType());
  1509.                     $p->setProduit($pr);
  1510.                 }
  1511.             }
  1512.         }            
  1513.         
  1514.         $ch->setZone($zone);
  1515.         $prod=$prodRep->findOneById($request->get('produit'));
  1516.         $typeProduit = $em->getRepository(TypeProduit::class)->findOneBy([]);
  1517.         $existingChantierProducts = $ch->getChantierProducts();
  1518.         foreach ($request->get('produit') as $pr) {
  1519.             // Find the product entity
  1520.             $produit = $produitRep->find($pr);
  1521.             // Check if this product is already associated with the chantier
  1522.             $existingChantierProduct = null;
  1523.             foreach ($existingChantierProducts as $existingProduct) {
  1524.                 if ($existingProduct->getProduit() === $produit) {
  1525.                     $existingChantierProduct = $existingProduct;
  1526.                     break;
  1527.                 }
  1528.             }
  1529.             if ($existingChantierProduct === null) {
  1530.                 // If the product is not associated, create a new ChantierProduct entity
  1531.                 $chantierProduct = new ChantierProduct();
  1532.                 $chantierProduct->setProduit($produit);
  1533.                 $chantierProduct->setChantier($ch);
  1534.                 $em->persist($chantierProduct);
  1535.             } else {
  1536.                 // If the product is already associated, update the association (optional)
  1537.                 // $existingChantierProduct->setProduit($produit); // Optionally update the product if needed
  1538.             }
  1539.         }
  1540.         // Remove any ChantierProduct entities associated with the chantier but not included in the submitted products (optional)
  1541.         foreach ($existingChantierProducts as $existingProduct) {
  1542.             if (!in_array($existingProduct->getProduit()->getId(), $request->get('produit'))) {
  1543.                 $em->remove($existingProduct);
  1544.             }
  1545.         }
  1546.         $em->flush();
  1547.         
  1548.         
  1549.         // Persist all changes to the database
  1550.         $em->flush();
  1551.         
  1552.         // Redirect or render the appropriate response
  1553.             
  1554.         $ch->settype($type);
  1555.         $ch->setNature($nat);  
  1556.         $ch->setCommercial($com);
  1557.         
  1558.         $ch->setLatitude($request->get('latitude'));
  1559.         $ch->setLongitude($request->get('longitude'));
  1560.         
  1561.         $directeurs=$directeurRep->findAll();
  1562.         foreach ($directeurs as $d) {
  1563.             $ch->addDirecteur($d);
  1564.         }
  1565.         
  1566.         foreach ($intervenants as $intervenant) {
  1567.             $ch->removeIntervenant($intervenant);
  1568.         }
  1569.         $ch->addIntervenant($intervenetRep->findOneById($request->get('nomp')));
  1570.         $ch->addIntervenant($intervenetRep->findOneById($request->get('nome')));
  1571.         $ch->addIntervenant($intervenetRep->findOneById($request->get('nomap')));
  1572.         $ch->addIntervenant($intervenetRep->findOneById($request->get('nomar')));
  1573.         $ch->addIntervenant($intervenetRep->findOneById($request->get('nompilot')));
  1574.         $existingChantier = $chantierRep->findOneBy([
  1575.             'nom' => $request->get('nom'),
  1576.             'zone' => $zone
  1577.         ]);
  1578.         
  1579.         if ($existingChantier != null && $ch != null && $existingChantier->getId() != $ch->getId()) {
  1580.             $ChantierName = $ch->getNom(); // Store the previous name before modifying
  1581.             $this->addFlash('error', 'Le nom de chantier "' . $ChantierName . '" existe déjà. Veuillez en choisir un autre !!!');
  1582.             $ch->setNom(''); // Set the name of $ch to an empty string
  1583.         }
  1584.         elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >= $now)
  1585.         {
  1586.            $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  1587.         }
  1588.         elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) >$visitepDate)  
  1589.         {
  1590.            $this->addFlash('error','Date de la visite est superieur a la date prochain visite!!!');
  1591.         }
  1592.        else{
  1593.        $this->addFlash('success','Le chantier  est modifié avec succès!!!');
  1594.        
  1595.               
  1596.         $em->persist($ch);
  1597.         $em->flush();
  1598.        return $this->redirectToRoute('app_finis');
  1599.        }
  1600.     }
  1601.     $pis=$intervenetRep->findBytype($typeIntRep->findOneById('1'));
  1602.     $egcs=$intervenetRep->findBytype($typeIntRep->findOneById('2'));
  1603.     $apps=$intervenetRep->findBytype($typeIntRep->findOneById('3'));
  1604.     $archs=$intervenetRep->findBytype($typeIntRep->findOneById('4'));
  1605.     $pilots=$intervenetRep->findBytype($typeIntRep->findOneById('5'));
  1606.     $ipi=null;
  1607.     $iegc=null;
  1608.     $iap=null;
  1609.     $iar=null;
  1610.     $ipilots=null;
  1611.     $ints=$ch->getIntervenant();
  1612.       foreach ($ints as $i) {
  1613.         if($i->getType()==$typeIntRep->findOneById('1'))
  1614.         $ipi=$i;
  1615.         elseif($i->getType()==$typeIntRep->findOneById('2'))
  1616.         $iegc=$i;
  1617.         elseif($i->getType()==$typeIntRep->findOneById('3'))
  1618.         $iap=$i;
  1619.         elseif($i->getType()==$typeIntRep->findOneById('4'))
  1620.         $iar=$i; 
  1621.         else
  1622.         $ipilots=$i; 
  1623.       }
  1624.        
  1625.     
  1626.     $em->persist($ch);
  1627.     $em->flush();
  1628.     
  1629.     
  1630.     $tab=[];
  1631.     $chantierproduit=$ch->getChantierProduits();
  1632.      foreach($chantierproduit as $chs)
  1633.      {
  1634.         array_push($tab,$chs->getType());
  1635.      }
  1636.    
  1637.      $revendeurs = $em->getRepository(Revendeur::class)->findAll();
  1638.      return $this->render('commercial/modifierFini.html.twig', [
  1639.         'chantier'=>$ch,
  1640.         'Tinters'=>$typeIntRep->findAll(),
  1641.         'types' => $typecRep->findAll(),'prod' =>$produitRep->findAll(),
  1642.         'pis'=>$pis,
  1643.         'egcs'=>$egcs ,
  1644.         'apps'=>$apps,
  1645.         'archs'=>$archs,
  1646.         'pilots'=>$pilots,
  1647.         'natures'=>$natureRep->findAll(),
  1648.         'zones'=>$zoneRep->findAll(),
  1649.         'typec'=>$typecRep->findAll(),
  1650.         'ipi'=>$ipi,
  1651.         'iegc'=>$iegc,
  1652.         'iap'=>$iap,
  1653.         'iar'=>$iar,
  1654.         'ipilots'=>$ipilots,
  1655.         'user'=>$com,
  1656.         'typec'=>$typecRep->findAll(),
  1657.         'typeprod'=>$typeprodRep->findAll(),
  1658.         't'=>$t,
  1659.         'iegc'=>$iegc,
  1660.         'tabType'=>$tab,
  1661.         'int'=>$ints,
  1662.         'selectedProductIds' => $selectedProductIds,
  1663.         'revendeurs' => $revendeurs, 
  1664.     ]);
  1665. }
  1666. #[Route('commercial/revendeur/{id}/editfini', name: 'app_revendeur_editfini')]
  1667. public function modifierRevendeurFini(Request $request, VisiteRepository $visiteRep,EntityManagerInterface $em,
  1668.  Chantier $chantier, TypeChantierRepository $typecRep, CommercialRepository $comrep, ZoneRepository $zoneRep, 
  1669.  ProduitRepository $produitRep, RevendeurRepository $revendeurRep): Response
  1670. {
  1671.     if (!$this->isGranted('ROLE_COMMERCIAL')) {
  1672.         $this->addFlash('error', "Vous n'avez pas le droit!!!");
  1673.         return $this->redirectToRoute('app_login');
  1674.     }
  1675.     $user = $this->getUser();
  1676.     $com = $comrep->findOneByUser($user);
  1677.     $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $chantier]);
  1678.          // Tableau pour stocker les identifiants des produits déjà associés au chantier
  1679.          $selectedProductIds = [];
  1680.          foreach ($chantierProducts as $chantierProduct) {
  1681.              $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  1682.          }
  1683.     if ($request->isMethod('POST')) {
  1684.         $zone = $zoneRep->findOneById($request->get('zone'));
  1685.        // $typec = $typecRep->findOneByNom('en prospect');
  1686.         $typec = $typecRep->findOneById($request->get('typec'));
  1687.         $visitetDate = $request->get('date');
  1688.         $visitepDate = new \DateTime($request->get('datepvisite'));
  1689.         $chantier->setNom($request->get('nom'));
  1690.         $chantier->setConcurrent($request->get('concurrent'));
  1691.         $chantier->setDemande($request->get('demande') ? 'Revendeur : ' . $request->get('demande') : null);
  1692.         $chantier->setBudgetrev($request->get('budgetrev'));
  1693.         $chantier->setTyperev($request->get('typerev'));
  1694.         $chantier->setType($typec);
  1695.         $chantier->setZone($zone);
  1696.         $chantier->SetVglobal($request->get('vglobal'));
  1697.         // Mise à jour des produits associés au chantier
  1698.         
  1699.    
  1700.        // $chantier->clearChantierProduits();
  1701.         foreach ($request->get('produit') as $pr) {
  1702.             $prod = $produitRep->findOneById($pr);
  1703.             $chantierProduit = new ChantierProduit();
  1704.             $chantierProduit->setChantier($chantier);
  1705.             $chantierProduit->setProduit($prod);
  1706.             $chantierProduit->setType('en prospect');
  1707.             $chantierProduit->setBudgetrev($request->get('budgetrev'));
  1708.             $chantier->addChantierProduit($chantierProduit);
  1709.             $em->persist($chantierProduit);
  1710.         }
  1711.         //  $visite = new Visite();
  1712.         $visite = $visiteRep->findOneByChantier($chantier);
  1713.      
  1714.         $visite->setObservation($request->get('observation'));
  1715.         $visite->setDatevisite($visitetDate);
  1716.         $visite->setDatepvisite($visitepDate);
  1717.         $visite->setChantier($chantier);
  1718.         $visite->setCause($request->get('cause'));
  1719.         $em->persist($visite);
  1720.         $em->persist($chantier);
  1721.         $em->flush();
  1722.         $this->addFlash('success', 'visite client a été modifié avec succès!!!');
  1723.         return $this->redirectToRoute('app_finis');
  1724.     }
  1725.     return $this->render('commercial/ModifVisiteRevFini.html.twig', [
  1726.         'chantier' => $chantier,
  1727.         'zones' => $zoneRep->findAll(),
  1728.         'prod' => $produitRep->findAll(),
  1729.         'user' => $com,
  1730.         'revendeurs' => $revendeurRep->findAll(),
  1731.         'selectedProductIds' => $selectedProductIds,
  1732.         'typec'=>$typecRep->findAll(),
  1733.     ]);
  1734. }
  1735. ///************************************************************************************************************** */
  1736.     
  1737.     #[Route('commercial/visite/chantier/{id<\d+>}', name: 'app_Ajout_Visite')]
  1738.     public function AjoutVisite(Request $request,EntityManagerInterface $em, Chantier $chantier,TypeChantierRepository $typecRep ,TypeIntervenantRepository $typeIRep ,IntervenantRepository $intervenetRep ,CommercialRepository $comrep,ProduitRepository $produitRep,VisiteRepository $visiteRepository,TypeProduitRepository $typeprodRep): Response
  1739.     {
  1740.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  1741.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  1742.             return $this->redirectToRoute('app_login');
  1743.         }
  1744.           $now = new \DateTime();
  1745.           //$visitetDate = $now->format('Y-m-d');
  1746.           $t=$chantier->getType();
  1747.           $user =$this->getUser();
  1748.           $com=$comrep->findOneByUser($user);   
  1749.           $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $chantier]);
  1750.             // Tableau pour stocker les identifiants des produits déjà associés au chantier
  1751.             $selectedProductIds = [];
  1752.             foreach ($chantierProducts as $chantierProduct) {
  1753.                 $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  1754.             }
  1755.         if($request->isMethod('POST')){
  1756.             // dd($request->request->all());
  1757.             $visitetDate=$request->get('date');
  1758.             $visitettype=$request->get('typev');
  1759.             $type=$typecRep->findOneById($request->get('typec')); 
  1760.             $iPI=$intervenetRep->findOneById($request->get('nomp'));
  1761.             $iE=$intervenetRep->findOneById($request->get('nome'));
  1762.             $iAP=$intervenetRep->findOneById($request->get('nomap'));
  1763.             $iAR=$intervenetRep->findOneById($request->get('nomar'));
  1764.             $iPILOTS=$intervenetRep->findOneById($request->get('nomapilot'));
  1765.             
  1766.             $visite= new Visite();
  1767.             $visite->setObservation($request->get('observation'));
  1768.             $visite->setProducts($request->get('products'));
  1769.             $visite->setDateCreation(new \DateTime()); 
  1770.             $visite->setBudget($request->get('budget'));
  1771.             $visite->setCause($request->get('cause'));
  1772.             
  1773.             $visite->setDatevisite($visitetDate);
  1774.             $visite->settype($visitettype);
  1775.             $visite->setChantier($chantier);
  1776.             if ($type !== null) {
  1777.             $visite->setClassement($type->getType());
  1778.         }
  1779.             
  1780.             if(!$chantier->getIntervenant()->contains($iPI)){
  1781.                 $chantier->addIntervenant($iPI);
  1782.             }
  1783.             if(!$chantier->getIntervenant()->contains($iE)){
  1784.                 $chantier->addIntervenant($iE);
  1785.             }
  1786.             if(!$chantier->getIntervenant()->contains($iAP)){
  1787.                 $chantier->addIntervenant($iAP);
  1788.             }
  1789.             if(!$chantier->getIntervenant()->contains($iAR)){
  1790.                 $chantier->addIntervenant($iAR);
  1791.             }
  1792.             if(!$chantier->getIntervenant()->contains($iPILOTS)){
  1793.                 $chantier->addIntervenant($iPILOTS);
  1794.             }
  1795.            ////// begin photo
  1796.             $uploaddir = 'telechargement/';
  1797.               $file = $request->files->get('image');
  1798.               if($file != null){
  1799.                // Vérifier si un fichier a été téléchargé
  1800.                  if (!$file instanceof UploadedFile) {throw new FileException('pas de fichier a telechargé');}
  1801.                  $fileName = $file->getClientOriginalName();
  1802.                   $uploadfile = $uploaddir . $fileName;
  1803.                   // Déplacer le fichier téléchargé vers le répertoire de destination
  1804.                    try {$file->move($uploaddir, $fileName);} catch (FileException $e) {
  1805.                         $this->addFlash('error','pas de fichier !!!');}
  1806.                          $visite->setPhoto($fileName);
  1807.                 }
  1808.                 else{$visite->setPhoto(null);}
  1809.              ///////end photo 
  1810.              // Verifier la date de la visite
  1811.              $derniereVisite = $chantier->getVisite()->last();  
  1812.              if (
  1813.                 ($type !== null && $type->gettype() == 'en negociation' && $chantier->getType() !== null && $chantier->getType()->getType() == 'en cours') ||
  1814.                 ($type !== null && $type->gettype() == 'en prospect' && $chantier->getType() !== null && $chantier->getType()->getType() == 'en negociation') ||
  1815.                 ($type !== null && $type->gettype() == 'en prospect' && $chantier->getType() !== null && $chantier->getType()->getType() == 'en cours')
  1816.             )             {    $this->addFlash('error', 'Etat incorrect !!! Veuillez sélectionner l\'état du chantier.');
  1817.             }           
  1818.              elseif ($derniereVisite->getDatevisite() > $visitetDate ) {
  1819.                 $this->addFlash('error','Date de la derniere visite est superieur a la date de la nouvelle visite!!!');  
  1820.                     
  1821.              }
  1822.              elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) > $now)
  1823.              {
  1824.                 $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  1825.              }
  1826.              else{ 
  1827.                 if ($chantier->getType() != $type){
  1828.                     $chantier->setType($type);}               
  1829.             $chantier->addVisite($visite);
  1830.             $chantier->setNombreVisite($chantier->getNombreVisite()+1);
  1831.             $products=$chantier->getChantierProduits();
  1832.             $chantier->setProducts($request->get('products'));
  1833.             if(count($products)>0){
  1834.                 foreach($products as $key=>$p)
  1835.                 {
  1836.                     if(isset($request->get('typec')[$key]))
  1837.                     {
  1838.                         $typeChantier=$typecRep->find($request->get('typec')[$key]);
  1839.                         $pr=$produitRep->find($request->get('produit')[$key]);
  1840.                         $p->setType($typeChantier->getType());
  1841.                         $p->setProduit($pr);
  1842.                     }
  1843.                    
  1844.                 }
  1845.             }
  1846.             $prod=$produitRep->findOneById($request->get('produit'));
  1847.             $typeprod = $typeprodRep->findOneById($request->get('typeprod'));
  1848.             $typeProduit = $em->getRepository(TypeProduit::class)->findAll();
  1849.           
  1850.             $typeProduit = $em->getRepository(TypeProduit::class)->findOneBy([]);
  1851. foreach ($request->get('produit') as $pr) {
  1852.     // Find the product by its ID
  1853.     $produit = $produitRep->find($pr);
  1854.     
  1855.     // Check if the product exists
  1856.     if ($produit !== null) {
  1857.         // Check if there is already a ChantierProduct associated with the product
  1858.         $existingChantierProduct = $em->getRepository(ChantierProduct::class)->findOneBy([
  1859.             'produit' => $produit,
  1860.             'chantier' => $chantier,
  1861.         ]);
  1862.         // If there is no existing ChantierProduct for this product and chantier, create one
  1863.         if ($existingChantierProduct === null) {
  1864.             $chantierProduct = new ChantierProduct();
  1865.             $chantierProduct->setProduit($produit);
  1866.             $chantierProduct->setChantier($chantier);
  1867.             $chantierProduct->setVisite($visite); 
  1868.             // Ensure all Visite entities associated with the Chantier are persisted
  1869.             foreach ($chantier->getVisite() as $visite) {
  1870.                 $em->persist($visite);
  1871.             }
  1872.             $em->persist($chantierProduct);
  1873.             $em->flush();
  1874.         }
  1875.     }
  1876. }
  1877.         $uploaddir = 'telechargement/';
  1878.          $tab2 = [];
  1879.          
  1880.          if (isset($_FILES['devis'])) { // Check if 'devis' is set in $_FILES array
  1881.              for ($i = 0; $i < count($_FILES['devis']['name']); $i++) {
  1882.                  $uploadfile = $uploaddir . basename($_FILES['devis']['name'][$i]);
  1883.                  if (move_uploaded_file($_FILES['devis']['tmp_name'][$i], $uploadfile)) {
  1884.                      $tab2[] = $_FILES['devis']['name'][$i];
  1885.                  }
  1886.              }
  1887.          } else {
  1888.              // Handle the case where no files were uploaded
  1889.              echo "No files uploaded.";
  1890.          }
  1891.          
  1892.          // Assuming $visite is defined and has a setDevis method
  1893.          $visite->setDevis(implode(',', $tab2)); // Corrected $tab to $tab2
  1894.             
  1895.             if($request->request->get('plan') == 'on'){
  1896.                 $chantier->setPlanDaction('oui');
  1897.             }
  1898.             else{
  1899.                 $chantier->setPlanDaction('non');
  1900.             }
  1901.             $em->persist($visite);
  1902.             $em->persist($chantier);
  1903.             $em->flush();
  1904.            
  1905.            $this->addFlash('success','La visite est ajoutée avec succès!!!');
  1906.             return $this->redirectToRoute('app_liste_visite',[
  1907.                 'id'=>$chantier->getId(),
  1908.             ]);
  1909.              }
  1910.            
  1911.         }
  1912.         $pis=$intervenetRep->findBytype($typeIRep->findOneById('1'));
  1913.         $egcs=$intervenetRep->findBytype($typeIRep->findOneById('2'));
  1914.         $apps=$intervenetRep->findBytype($typeIRep->findOneById('3'));
  1915.         $archs=$intervenetRep->findBytype($typeIRep->findOneById('4'));
  1916.         $pilots=$intervenetRep->findBytype($typeIRep->findOneById('5'));
  1917.         $ints=$chantier->getIntervenant();
  1918.         
  1919.         $ipi=null;
  1920.         $iegc=null;
  1921.         $iap=null;
  1922.         $iar=null;
  1923.         $ipilots=null;
  1924.         foreach ($ints as $i) {
  1925.             if($i->getType()==$typeIRep->findOneById('1'))
  1926.             $ipi=$i;
  1927.             elseif($i->getType()==$typeIRep->findOneById('2'))
  1928.             $iegc=$i;
  1929.             elseif($i->getType()==$typeIRep->findOneById('3'))
  1930.             $iap=$i;
  1931.             elseif($i->getType()==$typeIRep->findOneById('4'))
  1932.             $iar=$i; 
  1933.             else
  1934.             $ipilots=$i;  
  1935.           }
  1936.           $tab=[];
  1937.          $chantierproduit=$chantier->getChantierProduits();
  1938.          foreach($chantierproduit as $ch)
  1939.          {
  1940.             array_push($tab,$ch->getType());
  1941.          }
  1942.          
  1943.          
  1944.         return $this->render('commercial/visite.html.twig', [
  1945.             'chant' => $chantier,
  1946.             'typec'=>$typecRep->findAll(),
  1947.             't'=>$t,
  1948.             'prod'=>$produitRep->findAll(),
  1949.             'ipi'=>$ipi,
  1950.             'iegc'=>$iegc,
  1951.             'iap'=>$iap,
  1952.             'iar'=>$iar,
  1953.             'ipilots'=>$ipilots,
  1954.             'tabType'=>$tab,
  1955.             'pis'=>$pis,
  1956.             'egcs'=>$egcs ,
  1957.             'apps'=>$apps,
  1958.             'archs'=>$archs,
  1959.             'pilots'=>$pilots,
  1960.             'int'=>$ints,
  1961.             'user'=>$com,
  1962.             'typeprod'=>$typeprodRep->findAll(),
  1963.             'selectedProductIds' => $selectedProductIds,
  1964.         ]);
  1965.     }
  1966.     #[Route('commercial/visite/liste/{id<\d+>}', name: 'app_liste_visite')]
  1967.     public function listeVisite(Chantier $chantier,VisiteRepository $visiteRep ,CommercialRepository $comrep): Response
  1968.     {
  1969.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  1970.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  1971.             return $this->redirectToRoute('app_login');
  1972.         }
  1973.         $user =$this->getUser();
  1974.         $com=$comrep->findOneByUser($user); 
  1975.         
  1976.        
  1977.         $visites = $visiteRep->findByChantier($chantier);
  1978.         // Fetch products for each visit
  1979.         $productsByVisite = [];
  1980.         foreach ($visites as $visite) {
  1981.             $productsByVisite[$visite->getId()] = $visite->getChantierProducts();
  1982.         }
  1983.         
  1984.         return $this->render('commercial/listeVisite.html.twig', [
  1985.             'visites' => $visites,
  1986.             'c'=>$chantier,'user'=>$com,
  1987.             'productsByVisite' => $productsByVisite,
  1988.         ]);
  1989.     }
  1990.     
  1991.     #[Route('directeur/visite/liste/{id<\d+>}', name: 'app_liste_visite_dir')]
  1992.     public function listeVisitesDir(Chantier $chantier,VisiteRepository $visiteRep,DirecteurRepository $dirRep): Response
  1993.     {
  1994.         if (!$this->isGranted('ROLE_DIRECTION') && !$this->isGranted('ROLE_DIRECTEUR')) {
  1995.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  1996.             return $this->redirectToRoute('app_login');
  1997.         }
  1998.         $user =$this->getUser();
  1999.         $dir=$dirRep->findOneByUser($user); 
  2000.         $templates = 'direction/listeVisite.html.twig';
  2001.         $parameters = [
  2002.             'visites' => $visiteRep->findByChantier($chantier),'c'=>$chantier,'user'=>$dir,
  2003.         ];
  2004.         
  2005.         if ($this->isGranted('ROLE_DIRECTEUR')) {
  2006.             // Override template and parameters for ROLE_DIRECTEUR
  2007.             $templates = 'directeur/listeVisite.html.twig';
  2008.             $parameters = [
  2009.                 'visites' => $visiteRep->findByChantier($chantier),'c'=>$chantier,'user'=>$dir,
  2010.             ];
  2011.         }
  2012.     
  2013.         return $this->render($templates, $parameters);
  2014.        
  2015.     }
  2016.     ////////////////////////////revendeuurr
  2017.     #[Route('commercial/revendeur/ajout', name: 'app_revendeur')]
  2018.     public function nouveauRevendeur(Request $request,EntityManagerInterface $em, TypeChantierRepository $typecRep,CommercialRepository $comrep ,VisiteRepository $visiteRep,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep, ProduitRepository $produitRep,RevendeurRepository $revendeurRep): Response
  2019.     {
  2020.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2021.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2022.             return $this->redirectToRoute('app_login');
  2023.         }
  2024.         $user =$this->getUser();
  2025.         $com=$comrep->findOneByUser($user);
  2026.         if($request->isMethod('POST')){
  2027.            
  2028.             $now = new \DateTime();
  2029.             $zone=$zoneRep->findOneById($request->get('zone'));
  2030.             $typec=$typecRep->findOneByNom('en prospect');
  2031.             $visitetDate=$request->get('date');
  2032.             $visitepDate = new \DateTime($request->get('datepvisite'));
  2033.             $ch=new Chantier();
  2034.             $ch->setNom($request->get('nom'));
  2035.             $ch->setDateModification(new \DateTime()); 
  2036.             $ch->setConcurrent($request->get('concurrent'));
  2037.             $ch->setChoix($request->get('choix'));
  2038.             $ch->SetVglobal($request->get('vglobal'));
  2039.             $demandeValue = $request->get('demande');
  2040.             if (empty($demandeValue)) {
  2041.                 $ch->setDemande(null);
  2042.             } else {
  2043.                 $ch->setDemande('client : '.$demandeValue);
  2044.             }
  2045.             $budgetrev = $request->get('budgetrev');
  2046.             $ch->setBudgetrev($budgetrev);
  2047.             $typerev = $request->get('typerev');
  2048.             $ch->setTyperev($typerev);
  2049.             $ch->settype($typec);
  2050.             foreach ($request->get('produit') as $pr) {
  2051.                 $prod = $produitRep->findOneById($pr);
  2052.             
  2053.                 // Retrieve the budgetrev value from your request data, ensuring it's not null.
  2054.                 $budgetrev = $request->get('budgetrev') ?? ''; // If budgetrev is null, set an empty string.
  2055.             
  2056.                 $chantierProduit = new ChantierProduit();
  2057.                 $chantierProduit->setChantier($ch);
  2058.                 $chantierProduit->setProduit($prod);
  2059.                 $chantierProduit->setType('en prospect');
  2060.             
  2061.                 // Set the budgetrev property of the ChantierProduit entity.
  2062.                 $chantierProduit->setBudgetrev($budgetrev);
  2063.             
  2064.                 $ch->addChantierProduit($chantierProduit);
  2065.                 $em->persist($chantierProduit);
  2066.             }
  2067.             
  2068.             
  2069.             
  2070.             $ch->setZone($zone);
  2071.             $ch->setNombreVisite(1);
  2072.             $ch->setCommercial($com);
  2073.             $ch->setRevendeur('oui');
  2074.             $visite= new Visite();
  2075.             $visite->setObservation($request->get('observation'));
  2076.             $visite->setDatevisite($visitetDate);
  2077.             if ($visitepDate !== null) {
  2078.                 $visite->setDatepvisite($visitepDate);
  2079.             } else {
  2080.                 $visite->setDatepvisite(null); // or don't set it at all, depending on your business logic
  2081.             }
  2082.             
  2083.             $uploaddir = 'telechargement/';
  2084.          $tab2 = [];
  2085.          
  2086.          if (isset($_FILES['devis'])) { // Check if 'devis' is set in $_FILES array
  2087.              for ($i = 0; $i < count($_FILES['devis']['name']); $i++) {
  2088.                  $uploadfile = $uploaddir . basename($_FILES['devis']['name'][$i]);
  2089.                  if (move_uploaded_file($_FILES['devis']['tmp_name'][$i], $uploadfile)) {
  2090.                      $tab2[] = $_FILES['devis']['name'][$i];
  2091.                  }
  2092.              }
  2093.          } else {
  2094.              // Handle the case where no files were uploaded
  2095.              echo "No files uploaded.";
  2096.          }
  2097.          
  2098.          // Assuming $visite is defined and has a setDevis method
  2099.          $visite->setDevis(implode(',', $tab2)); // Corrected $tab to $tab2
  2100.             $data = json_decode($request->getContent(), true);
  2101.         
  2102.         
  2103.             // Create Calendar entity
  2104.             $calendar = new Calendar();
  2105.             $calendar->setTitle($data['title'] ?? $ch->getNom()); // Use null coalescing operator to handle undefined keys
  2106.             $calendar->setStart(($visitepDate));
  2107.             $calendar->setEnd(($visitepDate));
  2108.             $calendar->setCommercial($com);
  2109.          
  2110.         
  2111.             $em->persist($calendar);
  2112.            
  2113.             $directeurs=$directeurRep->findAll();
  2114.           
  2115.             foreach ($directeurs as $d) {
  2116.                 $ch->addDirecteur($d);
  2117.               }
  2118. ////////////////////////bug la visite de clients deja existe/////////////////////
  2119.             $user =$this->getUser();
  2120.               $com=$comrep->findOneByUser($user);
  2121.             
  2122.               $chantierRep = $this->chantierRepository->findBy(['commercial' => $com]);
  2123.               $nom = $request->get('nom');
  2124.             $found = false;
  2125.         foreach ($chantierRep as $chantier) {
  2126.             if ($chantier->getNom() === $nom) {
  2127.         $found = true;
  2128.         break;
  2129.     }
  2130. }
  2131.               if($found){
  2132.      //////////////////////////////////////////////////////////////////////////////////////////////////////         
  2133.                 $this->addFlash('error', "La visite de client existe déjà ! Veuillez consulter la liste des visites.");
  2134.                 return $this->redirectToRoute('app_revendeur_list');
  2135.             }
  2136.             else
  2137.             if(\DateTime::createFromFormat('Y-m-d', $visitetDate) > $now)
  2138.              {
  2139.                 $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  2140.                 return $this->redirectToRoute('app_revendeur_list');
  2141.              }
  2142.            
  2143.            else{
  2144.            $this->addFlash('success','Le client est ajouté avec succès!!!');
  2145.            $ch->addVisite($visite);
  2146.            $em->persist($visite);
  2147.            $em->persist($ch);
  2148.            $em->flush();
  2149.            return $this->redirectToRoute('app_revendeur_list');
  2150.            }
  2151.         }
  2152.         $revendeurs = $em->getRepository(Revendeur::class)->findAll();
  2153.         
  2154.         return $this->render('commercial/nouveauRevendeur.html.twig', [
  2155.             'zones'=>$zoneRep->findAll(),
  2156.             'prod'=>$produitRep->findAll(),
  2157.             'user'=>$com,
  2158.             'revendeurs' => $revendeurs,            
  2159.         ]);
  2160.     }
  2161.     #[Route('commercial/liste/revendeur', name: 'app_revendeur_list')]
  2162.     public function listrev(ChantierRepository $toutChRep , CommercialRepository $comrep ,TypeChantierRepository $typeCRep,TypeIntervenantRepository $typeIRep,RevendeurRepository $revendeurRep): Response
  2163.     {
  2164.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2165.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2166.             return $this->redirectToRoute('app_login');
  2167.         }
  2168.         $user =$this->getUser();
  2169.          $com=$comrep->findOneByUser($user); 
  2170.          $t=$typeCRep->findOneByNom('en prospect');
  2171.          $toutch= $toutChRep->findByrevcommercial($com,'oui');
  2172.           
  2173.         return $this->render('commercial/listerevendeur.html.twig', [
  2174.             
  2175.             'ch' =>$toutch,
  2176.             'revendeur' => $revendeurRep->findAll(),
  2177.             'user'=>$com,
  2178.         ]);
  2179.     }
  2180.     #[Route('commercial/visiteRev/liste/{id<\d+>}', name: 'app_liste_visiteRev')]
  2181.     public function listeVisiteRev(Chantier $chantier,VisiteRepository $visiteRep ,CommercialRepository $comrep): Response
  2182.     {
  2183.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2184.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2185.             return $this->redirectToRoute('app_login');
  2186.         }
  2187.         $user =$this->getUser();
  2188.         $com=$comrep->findOneByUser($user); 
  2189.           
  2190.         return $this->render('commercial/listeVisiteRev.html.twig', [
  2191.             'visites' => $visiteRep->findByChantier($chantier, ['id' => 'desc']),
  2192.             'c'=>$chantier,
  2193.             'user'=>$com, 
  2194.             'ch'=>$chantier,
  2195.         ]);
  2196.     }
  2197.     #[Route('commercial/visiteRev/chantier/{id<\d+>}', name: 'app_Ajout_VisiteRev')]
  2198.     public function AjoutVisiteRev(Request $request,EntityManagerInterface $em, Chantier $chantier,TypeChantierRepository $typecRep ,TypeIntervenantRepository $typeIRep ,IntervenantRepository $intervenetRep ,CommercialRepository $comrep, ProduitRepository $produitRep,RevendeurRepository $revendeurRep): Response
  2199.     {
  2200.         if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2201.             $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2202.             return $this->redirectToRoute('app_login');
  2203.         }
  2204.           $now = new \DateTime();
  2205.           //$visitetDate = $now->format('Y-m-d');
  2206.           $t=$chantier->getType();
  2207.           $user =$this->getUser();
  2208.         
  2209.           $com=$comrep->findOneByUser($user);   
  2210.         if($request->isMethod('POST')){
  2211.             // dd($request->request->all());
  2212.             $visitetDate=$request->get('date');
  2213.             $type=$typecRep->findOneById($request->get('typec'));
  2214.             $visite= new Visite();
  2215.             $visite->setObservation($request->get('observation'));
  2216.             $visite->setDateCreation(new \DateTime()); 
  2217.             $visite->setCause($request->get('cause'));
  2218.             $visite->setBudget($request->get('budget'));
  2219.            // $prod=$produitRep->findOneById($request->get('produit'));
  2220.             //$chantier->addChantierProduit($prod);
  2221.             $visitettype=$request->get('typev');
  2222.             $visite->settype($visitettype);
  2223.            // Parcourez les produits envoyés dans la requête
  2224.             foreach ($request->get('produit') as $pr) {
  2225.                 // Récupérez le produit à partir du repository
  2226.                 $prod = $produitRep->findOneById($pr);
  2227.                 // Vérifiez si le produit est déjà associé au chantier
  2228.                 $alreadyAdded = false;
  2229.                 foreach ($chantier->getChantierProduits() as $chantierProduit) {
  2230.                     if ($chantierProduit->getProduit()->getId() == $prod->getId()) {
  2231.                         $alreadyAdded = true;
  2232.                         break;
  2233.                     }
  2234.                 }
  2235.                 // Si le produit n'est pas déjà associé, créez une nouvelle association
  2236.                 if (!$alreadyAdded) {
  2237.                     $chantierProduit = new ChantierProduit();
  2238.                     $chantierProduit->setChantier($chantier);
  2239.                     $chantierProduit->setProduit($prod);
  2240.                     $chantierProduit->setType('en prospect');
  2241.                     $chantier->addChantierProduit($chantierProduit);
  2242.                     $em->persist($chantierProduit);
  2243.                 }
  2244.             }
  2245.             $uploaddir = 'telechargement/';
  2246.             $tab2 = [];
  2247.             
  2248.             if (isset($_FILES['devis'])) { // Check if 'devis' is set in $_FILES array
  2249.                 for ($i = 0; $i < count($_FILES['devis']['name']); $i++) {
  2250.                     $uploadfile = $uploaddir . basename($_FILES['devis']['name'][$i]);
  2251.                     if (move_uploaded_file($_FILES['devis']['tmp_name'][$i], $uploadfile)) {
  2252.                         $tab2[] = $_FILES['devis']['name'][$i];
  2253.                     }
  2254.                 }
  2255.             } else {
  2256.                 // Handle the case where no files were uploaded
  2257.                 echo "No files uploaded.";
  2258.             }
  2259.             
  2260.             // Assuming $visite is defined and has a setDevis method
  2261.             $visite->setDevis(implode(',', $tab2)); // Corrected $tab to $tab2
  2262.             
  2263.             $visite->setDatevisite($visitetDate);
  2264.             $visite->setChantier($chantier);
  2265.             
  2266.             if ($type !== null) {
  2267.                 $visite->setClassement($type->getType());
  2268.             }
  2269.             $chantier->settype($type);
  2270.           
  2271.             $chantier->addVisite($visite);
  2272.             $chantier->setNombreVisite($chantier->getNombreVisite()+1);
  2273.             $em->persist($visite);
  2274.             $em->persist($chantier);
  2275.             $em->flush();
  2276.            
  2277.            $this->addFlash('success','La visite est ajoutée avec succès!!!');
  2278.             return $this->redirectToRoute('app_liste_visiteRev',[
  2279.                 'id'=>$chantier->getId(),
  2280.             ]);
  2281.              }
  2282.            
  2283.         return $this->render('commercial/visiteRev.html.twig', [
  2284.             'chant' => $chantier,
  2285.             'typec'=>$typecRep->findAll(),
  2286.             
  2287.             't'=>$t,
  2288.             'prod'=>$produitRep->findAll(),
  2289.             'revendeur' => $revendeurRep->findAll(),
  2290.            
  2291.             'user'=>$com,
  2292.         ]);
  2293.     }
  2294. ///////////////////////////modif revendeur
  2295. //prospect
  2296. #[Route('commercial/revendeur/{id}/editprospect', name: 'app_revendeur_edit')]
  2297. public function modifierRevendeur(Request $request, VisiteRepository $visiteRep,EntityManagerInterface $em, Chantier $chantier, TypeChantierRepository $typecRep, CommercialRepository $comrep, ZoneRepository $zoneRep, ProduitRepository $produitRep, RevendeurRepository $revendeurRep): Response
  2298. {
  2299.     if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2300.         $this->addFlash('error', "Vous n'avez pas le droit!!!");
  2301.         return $this->redirectToRoute('app_login');
  2302.     }
  2303.     $user = $this->getUser();
  2304.     $com = $comrep->findOneByUser($user);
  2305.     $chantierProducts = $em->getRepository(ChantierProduct::class)->findBy(['chantier' => $chantier]);
  2306.          // Tableau pour stocker les identifiants des produits déjà associés au chantier
  2307.          $selectedProductIds = [];
  2308.          foreach ($chantierProducts as $chantierProduct) {
  2309.              $selectedProductIds[] = $chantierProduct->getProduit()->getId();
  2310.          }
  2311.     if ($request->isMethod('POST')) {
  2312.         $zone = $zoneRep->findOneById($request->get('zone'));
  2313.        // $typec = $typecRep->findOneByNom('en prospect');
  2314.         $typec = $typecRep->findOneById($request->get('typec'));
  2315.         $visitetDate = $request->get('date');
  2316.         $visitepDate = new \DateTime($request->get('datepvisite'));
  2317.         $chantier->setNom($request->get('nom'));
  2318.         $chantier->setConcurrent($request->get('concurrent'));
  2319.         $chantier->setDemande($request->get('demande') ? 'Revendeur : ' . $request->get('demande') : null);
  2320.         $chantier->setBudgetrev($request->get('budgetrev'));
  2321.         $chantier->setTyperev($request->get('typerev'));
  2322.         $chantier->setType($typec);
  2323.         $chantier->setZone($zone);
  2324.         $chantier->SetVglobal($request->get('vglobal'));
  2325.         // Mise à jour des produits associés au chantier
  2326.         
  2327.    
  2328.        // $chantier->clearChantierProduits();
  2329.         foreach ($request->get('produit') as $pr) {
  2330.             $prod = $produitRep->findOneById($pr);
  2331.             $chantierProduit = new ChantierProduit();
  2332.             $chantierProduit->setChantier($chantier);
  2333.             $chantierProduit->setProduit($prod);
  2334.             $chantierProduit->setType('en prospect');
  2335.             $chantierProduit->setBudgetrev($request->get('budgetrev'));
  2336.             $chantier->addChantierProduit($chantierProduit);
  2337.             $em->persist($chantierProduit);
  2338.         }
  2339.         //  $visite = new Visite();
  2340.         $visite = $visiteRep->findOneByChantier($chantier);
  2341.      
  2342.         $visite->setObservation($request->get('observation'));
  2343.         $visite->setDatevisite($visitetDate);
  2344.         $visite->setDatepvisite($visitepDate);
  2345.         $visite->setChantier($chantier);
  2346.         $visite->setCause($request->get('cause'));
  2347.         
  2348.         $em->persist($visite);
  2349.         $em->persist($chantier);
  2350.         $em->flush();
  2351.         $this->addFlash('success', 'visite client a été modifié avec succès!!!');
  2352.         return $this->redirectToRoute('app_prospects');
  2353.     }
  2354.     return $this->render('commercial/ModifVisiteRev.html.twig', [
  2355.         'chantier' => $chantier,
  2356.         'zones' => $zoneRep->findAll(),
  2357.         'prod' => $produitRep->findAll(),
  2358.         'user' => $com,
  2359.         'revendeurs' => $revendeurRep->findAll(),
  2360.         'selectedProductIds' => $selectedProductIds,
  2361.         'typec'=>$typecRep->findAll(),
  2362.     ]);
  2363. }
  2364.  ////////////////////////////architect///////////////////////
  2365.  #[Route('commercial/architect/ajout', name: 'app_architect')]
  2366.  public function nouveauArchitect (Request $request,EntityManagerInterface $em,CommercialRepository $comrep ,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep,ProduitRepository $produitRep,ArchitecteRepository $architecteRep): Response
  2367.  {
  2368.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2369.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2370.          return $this->redirectToRoute('app_login');
  2371.      }
  2372.      $user =$this->getUser();
  2373.      $com=$comrep->findOneByUser($user);
  2374.      if($request->isMethod('POST')){
  2375.         
  2376.          $now = new \DateTime();
  2377.          $zone=$zoneRep->findOneById($request->get('zone'));
  2378.          
  2379.          $visitetDate=$request->get('date');
  2380.          $ch=new Chantier();
  2381.          $ch->setNom($request->get('nom'));
  2382.          $demandeValue = $request->get('demande');
  2383.          if (empty($demandeValue)) {
  2384.             $ch->setDemande(null);
  2385.         } else {
  2386.             $ch->setDemande('Architecte : '.$demandeValue);
  2387.         }
  2388.          foreach ($request->get('produit') as $pr) {
  2389.             $prod = $produitRep->findOneById($pr);
  2390.             $chantierProduit = new ChantierProduit();
  2391.             $chantierProduit->setChantier($ch);
  2392.             $chantierProduit->setProduit($prod);
  2393.             $chantierProduit->setType('en prospect');
  2394.             $ch->addChantierProduit($chantierProduit);
  2395.             $em->persist($chantierProduit);
  2396.             
  2397.         }
  2398.         
  2399.          $ch->setZone($zone);
  2400.          $ch->setNombreVisite(1);
  2401.          $ch->setCommercial($com);
  2402.          $ch->setArchitect('oui');
  2403.          $visite= new Visite();
  2404.          $visite->setObservation($request->get('observation'));
  2405.          $visite->setDatevisite($visitetDate);
  2406.         
  2407.          $directeurs=$directeurRep->findAll();
  2408.          foreach ($directeurs as $d) {
  2409.              $ch->addDirecteur($d);
  2410.            }
  2411.          
  2412.            if($chantierRep->findOneByNom(($request->get('nom')))!=null){
  2413.             $this->addFlash('error', "La visite de l'architecte existe déjà ! Veuillez consulter la liste des visites.");
  2414.         }
  2415.          
  2416.          elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) > $now)
  2417.           {
  2418.              $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  2419.           }
  2420.           
  2421.         else{
  2422.         $this->addFlash('success', 'La visite de l\'architecte est ajoutée avec succès!!!');
  2423.         $ch->addVisite($visite);
  2424.         $em->persist($visite);
  2425.         $em->persist($ch);
  2426.         $em->flush();
  2427.         return $this->redirectToRoute('app_architect_list');
  2428.         }
  2429.      }
  2430.      
  2431.      return $this->render('commercial/nouveauArchitect.html.twig', [
  2432.          'zones'=>$zoneRep->findAll(),
  2433.          'prod'=>$produitRep->findAll(),
  2434.          'architecte' => $architecteRep->findAll(),
  2435.          'user'=>$com,
  2436.      ]);
  2437.  }
  2438.  #[Route('commercial/liste/architect', name: 'app_architect_list')]
  2439.  public function listarchitect(ChantierRepository $toutChRep , CommercialRepository $comrep ,TypeChantierRepository $typeCRep,TypeIntervenantRepository $typeIRep): Response
  2440.  {
  2441.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2442.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2443.          return $this->redirectToRoute('app_login');
  2444.      }
  2445.      $user =$this->getUser();
  2446.       $com=$comrep->findOneByUser($user); 
  2447.       $t=$typeCRep->findOneByNom('en prospect');
  2448.       $toutcha= $toutChRep->findByarchcommercial($com,'oui');
  2449.        
  2450.      return $this->render('commercial/listearchitect.html.twig', [
  2451.          'ch' =>$toutcha,
  2452.          'user'=>$com,
  2453.      ]);
  2454.  }
  2455.  #[Route('commercial/visiteArch/liste/{id<\d+>}', name: 'app_liste_visiteArch')]
  2456.  public function listeVisiteArch(Chantier $chantier,VisiteRepository $visiteRep ,CommercialRepository $comrep): Response
  2457.  {
  2458.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2459.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2460.          return $this->redirectToRoute('app_login');
  2461.      }
  2462.      $user =$this->getUser();
  2463.      $com=$comrep->findOneByUser($user);   
  2464.      return $this->render('commercial/listeVisiteArch.html.twig', [
  2465.          'visites' => $visiteRep->findByChantier($chantier),
  2466.          'c'=>$chantier,
  2467.          'user'=>$com, 
  2468.          'ch'=>$chantier,
  2469.      ]);
  2470.  }
  2471.  #[Route('commercial/visiteArch/chantier/{id<\d+>}', name: 'app_Ajout_VisiteArch')]
  2472.  public function AjoutVisiteArch(Request $request,EntityManagerInterface $em, Chantier $chantier,TypeChantierRepository $typecRep ,TypeIntervenantRepository $typeIRep ,IntervenantRepository $intervenetRep ,CommercialRepository $comrep,ProduitRepository $produitRep): Response
  2473.  {
  2474.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2475.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2476.          return $this->redirectToRoute('app_login');
  2477.      }
  2478.        $now = new \DateTime();
  2479.        //$visitetDate = $now->format('Y-m-d');
  2480.        $t=$chantier->getType();
  2481.        $user =$this->getUser();
  2482.        $com=$comrep->findOneByUser($user);   
  2483.      if($request->isMethod('POST')){
  2484.          // dd($request->request->all());
  2485.          $visitetDate=$request->get('date');
  2486.          //$prod=$produitRep->findOneById($request->get('produit'));
  2487.         //$chantier->addChantierProduit($prod);
  2488.         foreach ($request->get('produit') as $pr) {
  2489.             $prod = $produitRep->findOneById($pr);
  2490.             $chantierProduit = new ChantierProduit();
  2491.             $chantierProduit->setChantier($chantier);
  2492.             $chantierProduit->setProduit($prod);
  2493.             $chantierProduit->setType('en prospect');
  2494.             $chantier->addChantierProduit($chantierProduit);
  2495.             $em->persist($chantierProduit);
  2496.             
  2497.         }
  2498.          $visite= new Visite();
  2499.          $visite->setObservation($request->get('observation'));
  2500.          
  2501.          $visite->setDatevisite($visitetDate);
  2502.          $visite->setChantier($chantier);
  2503.          
  2504.                         
  2505.          $chantier->addVisite($visite);
  2506.          $chantier->setNombreVisite($chantier->getNombreVisite()+1);
  2507.          $em->persist($visite);
  2508.          $em->persist($chantier);
  2509.          $em->flush();
  2510.         
  2511.         $this->addFlash('success','La visite est ajoutée avec succès!!!');
  2512.          return $this->redirectToRoute('app_liste_visiteArch',[
  2513.              'id'=>$chantier->getId(),
  2514.          ]);
  2515.           }
  2516.         
  2517.      
  2518.      
  2519.      return $this->render('commercial/visiteArch.html.twig', [
  2520.          'chant' => $chantier,
  2521.          
  2522.          't'=>$t,
  2523.          'prod'=>$produitRep->findAll(),
  2524.         
  2525.          'user'=>$com,
  2526.      ]);
  2527.  }  
  2528.  ////////////////////////////pi///////////////////////
  2529.  #[Route('commercial/pi/ajout', name: 'app_pi')]
  2530.  public function nouveauPi (Request $request,EntityManagerInterface $em,CommercialRepository $comrep ,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep,ProduitRepository $produitRep,PiRepository $piRep): Response
  2531.  {
  2532.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2533.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2534.          return $this->redirectToRoute('app_login');
  2535.      }
  2536.      $user =$this->getUser();
  2537.      $com=$comrep->findOneByUser($user);
  2538.      if($request->isMethod('POST')){
  2539.         
  2540.          $now = new \DateTime();
  2541.          $zone=$zoneRep->findOneById($request->get('zone'));
  2542.          
  2543.          $visitetDate=$request->get('date');
  2544.          $ch=new Chantier();
  2545.          $ch->setNom($request->get('nom'));
  2546.          $produits = $request->get('produit');
  2547.          if (is_array($produits) && count($produits) > 0) {
  2548.              foreach ($produits as $pr) {
  2549.                  $prod = $produitRep->findOneById($pr);
  2550.          
  2551.                  $chantierProduit = new ChantierProduit();
  2552.                  $chantierProduit->setChantier($ch);
  2553.                  $chantierProduit->setProduit($prod);
  2554.                  $chantierProduit->setType('en prospect');
  2555.          
  2556.                  $ch->addChantierProduit($chantierProduit);
  2557.                  $em->persist($chantierProduit);
  2558.              }
  2559.          }
  2560.         
  2561.          
  2562.          $ch->setZone($zone);
  2563.          
  2564.          $ch->setNombreVisite(1);
  2565.          $ch->setCommercial($com);
  2566.          $ch->setPi('oui');
  2567.          $visite= new Visite();
  2568.          $visite->setObservation($request->get('observation'));
  2569.          $visite->setDatevisite($visitetDate);
  2570.         
  2571.         
  2572.          $directeurs=$directeurRep->findAll();
  2573.          foreach ($directeurs as $d) {
  2574.              $ch->addDirecteur($d);
  2575.            }
  2576.          
  2577.          
  2578.            if($chantierRep->findOneByNom(($request->get('nom')))!=null){
  2579.             $this->addFlash('error', "La visite de PI existe déjà ! Veuillez consulter la liste des visites.");
  2580.         }
  2581.          elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) > $now)
  2582.           {
  2583.              $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  2584.           }
  2585.           
  2586.         else{
  2587.         $this->addFlash('success','Pi est ajouté avec succès!!!');
  2588.         $ch->addVisite($visite);
  2589.         $em->persist($visite);
  2590.         $em->persist($ch);
  2591.         $em->flush();
  2592.         //return $this->redirectToRoute('app_architect_list');
  2593.         }
  2594.      }
  2595.      
  2596.      return $this->render('commercial/nouveauPi.html.twig', [
  2597.          'zones'=>$zoneRep->findAll(),
  2598.          'prod'=>$produitRep->findAll(),
  2599.          'pi' => $piRep->findAll(),
  2600.          'user'=>$com,
  2601.      ]);
  2602.  }
  2603.  #[Route('commercial/liste/pi', name: 'app_pi_list')]
  2604.  public function listpi(ChantierRepository $toutChRep , CommercialRepository $comrep ,TypeChantierRepository $typeCRep,TypeIntervenantRepository $typeIRep): Response
  2605.  {
  2606.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2607.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2608.          return $this->redirectToRoute('app_login');
  2609.      }
  2610.      $user =$this->getUser();
  2611.       $com=$comrep->findOneByUser($user); 
  2612.       $t=$typeCRep->findOneByNom('en prospect');
  2613.       $toutcha= $toutChRep->findBypicommercial($com,'oui');
  2614.        
  2615.      return $this->render('commercial/listepi.html.twig', [
  2616.          'ch' =>$toutcha,
  2617.          'user'=>$com,
  2618.      ]);
  2619.  }
  2620.  #[Route('commercial/visitepi/liste/{id<\d+>}', name: 'app_liste_visitepi')]
  2621.  public function listeVisitePi(Chantier $chantier,VisiteRepository $visiteRep ,CommercialRepository $comrep): Response
  2622.  {
  2623.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2624.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2625.          return $this->redirectToRoute('app_login');
  2626.      }
  2627.      $user =$this->getUser();
  2628.      $com=$comrep->findOneByUser($user);   
  2629.      return $this->render('commercial/listeVisitepi.html.twig', [
  2630.          'visites' => $visiteRep->findByChantier($chantier),
  2631.          'c'=>$chantier,
  2632.          'user'=>$com, 
  2633.          'ch'=>$chantier,
  2634.      ]);
  2635.  }
  2636.  #[Route('commercial/visitepi/chantier/{id<\d+>}', name: 'app_Ajout_Visitepi')]
  2637.  public function AjoutVisitepi(Request $request,EntityManagerInterface $em, Chantier $chantier,TypeChantierRepository $typecRep ,TypeIntervenantRepository $typeIRep ,IntervenantRepository $intervenetRep ,CommercialRepository $comrep,ProduitRepository $produitRep): Response
  2638.  {
  2639.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2640.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2641.          return $this->redirectToRoute('app_login');
  2642.      }
  2643.        $now = new \DateTime();
  2644.        //$visitetDate = $now->format('Y-m-d');
  2645.        $t=$chantier->getType();
  2646.        $user =$this->getUser();
  2647.        $com=$comrep->findOneByUser($user);   
  2648.      if($request->isMethod('POST')){
  2649.          // dd($request->request->all());
  2650.          $visitetDate=$request->get('date');
  2651.          //$prod=$produitRep->findOneById($request->get('produit'));
  2652.         //$chantier->addChantierProduit($prod);
  2653.         $produits = $request->get('produit');
  2654.          if (is_array($produits) && count($produits) > 0) {
  2655.              foreach ($produits as $pr) {
  2656.                  $prod = $produitRep->findOneById($pr);
  2657.          
  2658.                  $chantierProduit = new ChantierProduit();
  2659.                  $chantierProduit->setChantier($chantier);
  2660.                  $chantierProduit->setProduit($prod);
  2661.                  $chantierProduit->setType('en prospect');
  2662.          
  2663.                  $chantier->addChantierProduit($chantierProduit);
  2664.                  $em->persist($chantierProduit);
  2665.              }
  2666.          }
  2667.          $visite= new Visite();
  2668.          $visite->setObservation($request->get('observation'));
  2669.          
  2670.          $visite->setDatevisite($visitetDate);
  2671.          $visite->setChantier($chantier);
  2672.          
  2673.                         
  2674.          $chantier->addVisite($visite);
  2675.          $chantier->setNombreVisite($chantier->getNombreVisite()+1);
  2676.          $em->persist($visite);
  2677.          $em->persist($chantier);
  2678.          $em->flush();
  2679.         
  2680.         $this->addFlash('success','La visite est ajoutée avec succès!!!');
  2681.          return $this->redirectToRoute('app_liste_visitepi',[
  2682.              'id'=>$chantier->getId(),
  2683.          ]);
  2684.           }
  2685.            
  2686.      return $this->render('commercial/visitepi.html.twig', [
  2687.          'chant' => $chantier,
  2688.          't'=>$t,
  2689.          'prod'=>$produitRep->findAll(),   
  2690.          'user'=>$com,
  2691.      ]);
  2692.  }  
  2693. ////////////////////////////egc///////////////////////
  2694. #[Route('commercial/egc/ajout', name: 'app_egc')]
  2695. public function nouveauEGC (Request $request,EntityManagerInterface $em,CommercialRepository $comrep ,ChantierRepository $chantierRep, DirecteurRepository $directeurRep, ZoneRepository $zoneRep,ProduitRepository $produitRep,EgcRepository $egcRep): Response
  2696. {
  2697.     if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2698.         $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2699.         return $this->redirectToRoute('app_login');
  2700.     }
  2701.     $user =$this->getUser();
  2702.     $com=$comrep->findOneByUser($user);
  2703.     if($request->isMethod('POST')){
  2704.        
  2705.         $now = new \DateTime();
  2706.         $zone=$zoneRep->findOneById($request->get('zone'));
  2707.         
  2708.         $visitetDate=$request->get('date');
  2709.         $ch=new Chantier();
  2710.         $ch->setNom($request->get('nom'));
  2711.         $produits = $request->get('produit');
  2712.         if (is_array($produits) && count($produits) > 0) {
  2713.             foreach ($produits as $pr) {
  2714.                 $prod = $produitRep->findOneById($pr);
  2715.         
  2716.                 $chantierProduit = new ChantierProduit();
  2717.                 $chantierProduit->setChantier($ch);
  2718.                 $chantierProduit->setProduit($prod);
  2719.                 $chantierProduit->setType('en prospect');
  2720.         
  2721.                 $ch->addChantierProduit($chantierProduit);
  2722.                 $em->persist($chantierProduit);
  2723.             }
  2724.         }
  2725.        
  2726.         
  2727.         $ch->setZone($zone);
  2728.         
  2729.         $ch->setNombreVisite(1);
  2730.         $ch->setCommercial($com);
  2731.         $ch->setEgc('oui');
  2732.         $visite= new Visite();
  2733.         $visite->setObservation($request->get('observation'));
  2734.         $visite->setDatevisite($visitetDate);
  2735.        
  2736.        
  2737.         $directeurs=$directeurRep->findAll();
  2738.         foreach ($directeurs as $d) {
  2739.             $ch->addDirecteur($d);
  2740.           }
  2741.         
  2742.         
  2743.           if($chantierRep->findOneByNom(($request->get('nom')))!=null){
  2744.            $this->addFlash('error', "La visite de egc existe déjà ! Veuillez consulter la liste des visites.");
  2745.        }
  2746.         elseif(\DateTime::createFromFormat('Y-m-d', $visitetDate) > $now)
  2747.          {
  2748.             $this->addFlash('error','Date de la visite est superieur a la date systeme!!!');
  2749.          }
  2750.          
  2751.        else{
  2752.        $this->addFlash('success','egc est ajouté avec succès!!!');
  2753.        $ch->addVisite($visite);
  2754.        $em->persist($visite);
  2755.        $em->persist($ch);
  2756.        $em->flush();
  2757.        return $this->redirectToRoute('app_egc_list');
  2758.        }
  2759.     }
  2760.     
  2761.     return $this->render('commercial/nouveauegc.html.twig', [
  2762.         'zones'=>$zoneRep->findAll(),
  2763.         'prod'=>$produitRep->findAll(),
  2764.         'egc' => $egcRep->findAll(),
  2765.         'user'=>$com,
  2766.     ]);
  2767. }
  2768. #[Route('commercial/liste/egc', name: 'app_egc_list')]
  2769. public function listegc(ChantierRepository $toutChRep , CommercialRepository $comrep ,TypeChantierRepository $typeCRep,TypeIntervenantRepository $typeIRep): Response
  2770. {
  2771.     if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2772.         $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2773.         return $this->redirectToRoute('app_login');
  2774.     }
  2775.     $user =$this->getUser();
  2776.      $com=$comrep->findOneByUser($user); 
  2777.      $t=$typeCRep->findOneByNom('en prospect');
  2778.      $toutcha= $toutChRep->findByegccommercial($com,'oui');
  2779.       
  2780.     return $this->render('commercial/listeegc.html.twig', [
  2781.         'ch' =>$toutcha,
  2782.         'user'=>$com,
  2783.     ]);
  2784. }
  2785. #[Route('commercial/visiteegc/liste/{id<\d+>}', name: 'app_liste_visiteegc')]
  2786.  public function listeVisiteeGC(Chantier $chantier,VisiteRepository $visiteRep ,CommercialRepository $comrep): Response
  2787.  {
  2788.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2789.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2790.          return $this->redirectToRoute('app_login');
  2791.      }
  2792.      $user =$this->getUser();
  2793.      $com=$comrep->findOneByUser($user);   
  2794.      return $this->render('commercial/listeVisiteegc.html.twig', [
  2795.          'visites' => $visiteRep->findByChantier($chantier),
  2796.          'c'=>$chantier,
  2797.          'user'=>$com, 
  2798.          'ch'=>$chantier,
  2799.      ]);
  2800.  }
  2801.  #[Route('commercial/visiteegc/chantier/{id<\d+>}', name: 'app_Ajout_Visiteegc')]
  2802.  public function AjoutVisiteegc(Request $request,EntityManagerInterface $em, Chantier $chantier,TypeChantierRepository $typecRep ,TypeIntervenantRepository $typeIRep ,IntervenantRepository $intervenetRep ,CommercialRepository $comrep,ProduitRepository $produitRep): Response
  2803.  {
  2804.      if (!$this->isGranted('ROLE_COMMERCIAL')) {
  2805.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2806.          return $this->redirectToRoute('app_login');
  2807.      }
  2808.        $now = new \DateTime();
  2809.        //$visitetDate = $now->format('Y-m-d');
  2810.        $t=$chantier->getType();
  2811.        $user =$this->getUser();
  2812.        $com=$comrep->findOneByUser($user);   
  2813.      if($request->isMethod('POST')){
  2814.          // dd($request->request->all());
  2815.          $visitetDate=$request->get('date');
  2816.          //$prod=$produitRep->findOneById($request->get('produit'));
  2817.         //$chantier->addChantierProduit($prod);
  2818.         $produits = $request->get('produit');
  2819.          if (is_array($produits) && count($produits) > 0) {
  2820.              foreach ($produits as $pr) {
  2821.                  $prod = $produitRep->findOneById($pr);
  2822.          
  2823.                  $chantierProduit = new ChantierProduit();
  2824.                  $chantierProduit->setChantier($chantier);
  2825.                  $chantierProduit->setProduit($prod);
  2826.                  $chantierProduit->setType('en prospect');
  2827.          
  2828.                  $chantier->addChantierProduit($chantierProduit);
  2829.                  $em->persist($chantierProduit);
  2830.              }
  2831.          }
  2832.          $visite= new Visite();
  2833.          $visite->setObservation($request->get('observation'));
  2834.          
  2835.          $visite->setDatevisite($visitetDate);
  2836.          $visite->setChantier($chantier);
  2837.          
  2838.                         
  2839.          $chantier->addVisite($visite);
  2840.          $chantier->setNombreVisite($chantier->getNombreVisite()+1);
  2841.          $em->persist($visite);
  2842.          $em->persist($chantier);
  2843.          $em->flush();
  2844.         
  2845.         $this->addFlash('success','La visite est ajoutée avec succès!!!');
  2846.          return $this->redirectToRoute('app_liste_visiteegc',[
  2847.              'id'=>$chantier->getId(),
  2848.          ]);
  2849.           }
  2850.            
  2851.      return $this->render('commercial/visiteegc.html.twig', [
  2852.          'chant' => $chantier,
  2853.          't'=>$t,
  2854.          'prod'=>$produitRep->findAll(),   
  2855.          'user'=>$com,
  2856.      ]);
  2857.  }  
  2858.  #[Route('dir/visiteRev/liste/{id<\d+>}', name: 'dir_liste_visiteRev')]
  2859.  public function listedirVisiteRev(Chantier $chantier,VisiteRepository $visiteRep ,DirecteurRepository $dirRep): Response
  2860.  {
  2861.      if (!$this->isGranted('ROLE_DIRECTION')) {
  2862.          $this->addFlash('error',"Vous n'avez pas le droit!!!");
  2863.          return $this->redirectToRoute('app_login');
  2864.      }
  2865.      $user =$this->getUser();
  2866.      $dir=$dirRep->findOneByUser($user); 
  2867.        
  2868.      return $this->render('direction/listeVisiteRev.html.twig', [
  2869.          'visites' => $visiteRep->findByChantier($chantier, ['id' => 'desc']),
  2870.          'c'=>$chantier,
  2871.          'user'=>$dir, 
  2872.          'ch'=>$chantier,
  2873.      ]);
  2874.  }
  2875.  
  2876. }