src/Controller/CommandeController.php line 78

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Depot\Chantiers;
  4. use App\Entity\Transport\CdeMatEnt;
  5. use App\Entity\User;
  6. use App\Form\CommandeType;
  7. use App\Repository\Affaire\TransportRepository;
  8. use App\Repository\Depot\AgenceRepository;
  9. use App\Repository\Depot\ArticleRepository;
  10. use App\Repository\Depot\ChantiersRepository;
  11. use App\Repository\Depot\DepotRepository;
  12. use App\Repository\Depot\TransporteurRepository;
  13. use App\Repository\Transport\CdeMatDetRepository;
  14. use App\Repository\Transport\CdeMatEntRepository;
  15. use App\Repository\UserRepository;
  16. use App\Service\CommandeService;
  17. use App\Service\CustomSerializer;
  18. use App\Service\OutlookService;
  19. use App\Service\PdfService;
  20. use DateTime;
  21. use Exception;
  22. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Component\HttpFoundation\RedirectResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\Serializer\SerializerInterface;
  30. use Twig\Environment;
  31. /**
  32.  * 
  33.  * show true lagny 
  34.  * false layher
  35.  */
  36. class CommandeController extends AbstractController
  37. {
  38.     private $agenceRepository;
  39.     public function __construct(
  40.         AgenceRepository $agenceRepository,
  41.         private CommandeService $commandeService,
  42.         private CdeMatEntRepository $cdeMatEntRepository,
  43.         private CdeMatDetRepository $cdeMatDetRepository,
  44.         private DepotRepository $depotRepository,
  45.         private ArticleRepository $articleRepository,
  46.         private PdfService $pdfService,
  47.         private Environment $environment,
  48.         private OutlookService $outlookService,
  49.         private TransporteurRepository $transporteurRepository,
  50.         private CustomSerializer $customSerializer,
  51.         private ChantiersRepository $chantiersRepository,
  52.         private UserRepository $userRepository,
  53.         private TransportRepository $transportRepository
  54.     ) {
  55.         $this->agenceRepository $agenceRepository;
  56.     }
  57.  
  58.     // récuperer les commandes 
  59.     #[Route('/commande'name'app_commande')]
  60.     public function index(): Response
  61.     {
  62.         $agences $this->agenceRepository->findAll();
  63.         return $this->render('commande/index.html.twig', [
  64.             'controller_name' => 'CommandeController',
  65.             'title' => 'Commandes',
  66.             'agences' => $agences,
  67.             'nav' => []
  68.         ]);
  69.     }
  70.     // j'ai crée juste pour tester la prémier page affiche 
  71.     #[Route('/'name'app_commande_home')]
  72.     public function home(): Response
  73.     {
  74.         $agences $this->agenceRepository->findAll();
  75.         return $this->render('commande/index.html.twig', [
  76.             'controller_name' => 'CommandeController',
  77.             'title' => 'Commandes',
  78.             'agences' => $agences,
  79.             'nav' => []
  80.         ]);
  81.     }
  82.     /** méthod pour afficher importer la commande et stocker les donées   */
  83.     #[Route('/search-commande'name'app_commande_search')]
  84.     public function search_commande_save_update(Request $request)
  85.     {
  86.         try {
  87.             $numCloud $request->query->get('numCloud');
  88.             $reponse $this->commandeService->importationCommandeWindecParIdCommande($numCloud);
  89.             if ($reponse == 200) {
  90.                 $data = [
  91.                     'message' => 'La commande a bien été chargée',
  92.                     'code' => 200
  93.                 ];
  94.                 return new JsonResponse($data);
  95.             } else if ($reponse == 500) {
  96.                 $data = [
  97.                     'message' => "error sur serveur",
  98.                     'code' => 500
  99.                 ];
  100.                 return new JsonResponse($data);
  101.             } else {
  102.                 $data = [
  103.                     'message' => "La commande est introuvable",
  104.                     'code' => 500
  105.                 ];
  106.                 return new JsonResponse($data);
  107.             }
  108.         } catch (Exception $e) {
  109.             return $this->json([]);
  110.         }
  111.     }
  112.     /** méthod pour récuperer les commandes  
  113.      *  retourner Tableau Commande par dépot
  114.      */
  115.     #[Route('/get-commande'name'app_command_depot')]
  116.     public function getCommandeByIdDepot(Request $requestSerializerInterface $serializer)
  117.     {
  118.         try {
  119.             // selectedDepot c'est depot soit layher et lagny ou autre
  120.             $id_depot $request->query->get('selectedDepot');
  121.             
  122.             // recuper les commandes par repository
  123.             $data $this->cdeMatEntRepository->listCommandebyIdepot($id_depot);
  124.              
  125.             // sérialeer les commandes
  126.             $serializedData $this->customSerializer->serializeCommandes($data);
  127.             return new JsonResponse($serializedData);
  128.         } catch (Exception $e) {
  129.             return $this->json([]);
  130.         }
  131.     }
  132.     /** méthod pour modifier la commande et affecter le transport 
  133.      *  on peut modifier les articles lagny
  134.      * 
  135.      */
  136.     #[Route('/edit-commande/{id}'name'edit_commande')]
  137.     public function affiche_commande(CdeMatEnt $cdeMatEntRequest $request)
  138.     {
  139.         $depots null;
  140.         $show false;
  141.         try {
  142.             // chantiers par agence
  143.             $chantiers_by_agence $this->chantiersRepository->getAllChantiers();
  144.             // serialized Chantiers 
  145.             $serializedChantiers json_encode($chantiers_by_agence);
  146.             // récuperer Transport
  147.             $transport $this->transporteurRepository->findAll();
  148.             // recupere les articles par commandes
  149.             $articles $this->cdeMatDetRepository->articles_by_cde($cdeMatEnt->getId());
  150.             // on peut ajouter des articles sur les commande Lagny donc on récuperer toutes articles
  151.             $articlesbyDepot $this->articleRepository->findAll_article_désignation_byIdDepot($cdeMatEnt->getIddepot(), 1);
  152.   
  153.             // récuperer le dépot le commande 
  154.             $depots $this->depotRepository->findOneByIdDepot($cdeMatEnt->getIddepot());
  155.             if($depots->getCodedepot() == 1){
  156.                 $show true;
  157.             }
  158.              // create Form et on passe Show pour afficher des champs pour chaque depot voir CommandeTypes
  159.             $form $this->createForm(CommandeType::class, $cdeMatEnt,[
  160.                 'show' => $show// Pass the Doctrine service to the form
  161.             ]);
  162.             $form->handleRequest($request);
  163.             if ($form->isSubmitted() && $form->isValid()) {
  164.                 // combiner le date et heure
  165.                 $combinedDateTime = new DateTime($cdeMatEnt->getDateEnlevDem()->format('Y-m-d') . ' ' $cdeMatEnt->getHeureEnlevDem()->format('H:i:s'));
  166.                 // cette partie trés important  pour affréter la commande voir les conditions sur erp 
  167.                 if ((($cdeMatEnt->getNumErpLocation() != null  || $cdeMatEnt->getNumErpVente() != null)) && $cdeMatEnt->getIdCalendar() != null  ) {
  168.               
  169.                     // changer IBM Valid c'est a dire affrete
  170.                     $res =  $this->outlookService->changeEvent_To_IBMValid($cdeMatEnt->getIdCalendar(),$combinedDateTime);
  171.                     // change etat
  172.                     $cdeMatEnt->setEtat(2);
  173.                     
  174.                 } 
  175.                 // Modifier Transport
  176.                 if( $cdeMatEnt->getTransports()->isEmpty() != true){
  177.                     $transports $cdeMatEnt->getTransports()[0];
  178.                     $transports->setDateTransport($cdeMatEnt->getDateEnlevDem());
  179.                     $transports->setHeuredepart($cdeMatEnt->getHeureEnlevDem()->format('H:i'));
  180.                     $transports->setDateLivraison($cdeMatEnt->getDateEnlevDem());
  181.                     $transports->setHeuredep2($cdeMatEnt->getHeureEnlevDem()->format('H:i'));
  182.                     $transports->setPoidsbon($cdeMatEnt->getPoidsTotMat());
  183.                     $this->transportRepository->add($transports);
  184.                 }
  185.                  // sauvegarder Commande
  186.                 $resulat $this->cdeMatEntRepository->save($cdeMatEnt);
  187.                 if ($resulat) {
  188.                     $this->addFlash("success""l'article a été correctement modifiée");
  189.                     return new RedirectResponse($this->generateUrl('app_commande'));
  190.                 } else {
  191.                 }
  192.             }
  193.             $cdeEnteHeure null;
  194.             if ($cdeMatEnt->getTransports()[0] == null) {
  195.                 $cdeEnteHeure $cdeMatEnt->getHeureEnlevDem()->format('H:i');
  196.             } else {
  197.                 $cdeEnteHeure $cdeMatEnt->getTransports()[0]->getHeuredepart();
  198.             }
  199.             // passer les donnes articles , depot, transporteurs, articles , commande
  200.             return $this->render('commande/edit.html.twig', [
  201.                 'form' => $form->createView(),
  202.                 'title' => 'Modification Commande',
  203.                 'nav' => [['app_commande''Commande']],
  204.                 'articles' => $articles,
  205.                 'depots' => $depots,
  206.                 'transporteurs' => $transport,
  207.                 'articlesbyDepot' => $articlesbyDepot,
  208.                 'idCdeEnte' => $cdeMatEnt->getId(),
  209.                 'cdeEnteHeure' => $cdeEnteHeure,
  210.                 'transport' => $cdeMatEnt->getTransports()[0],
  211.                 'commande' =>$cdeMatEnt,
  212.                 'serializedChantiers' => $serializedChantiers,
  213.                 'show' => $show
  214.             ]);
  215.         } catch (Exception $e) {
  216.             dd($e->getMessage());
  217.             return $e->getMessage();
  218.         }
  219.     }
  220.     /** méthod modifier les qtes articles   */
  221.     #[Route('/update-qte-article'name'app_qte_article')]
  222.     public function update_qte_article(Request $request)
  223.     {
  224.         try {
  225.             $qtes json_decode($request->getContent(), true);
  226.             $reponse $this->commandeService->update_qte_sortie($qtes);
  227.             if ($reponse == 200) {
  228.                 $data = [
  229.                     'message' => 'La quantité a bien été modifier',
  230.                     'code' => 200
  231.                 ];
  232.                 return new JsonResponse($data);
  233.             } else if ($reponse == 500) {
  234.                 $data = [
  235.                     'message' => "error sur serveur",
  236.                     'code' => 500
  237.                 ];
  238.                 return new JsonResponse($data);
  239.             } else {
  240.                 $data = [
  241.                     'message' => "La quantité est introuvable",
  242.                     'code' => 500
  243.                 ];
  244.                 return new JsonResponse($data);
  245.             }
  246.         } catch (Exception $e) {
  247.             return $this->json([]);
  248.         }
  249.     }
  250.     /** méthod pour récuperer les articles vente ou location   */
  251.     #[Route('/get-article-type'name'app_command_article_type')]
  252.     public function getArticlebyType(Request $request)
  253.     {
  254.         try {
  255.             $type $request->query->get('type');
  256.             $depot $this->depotRepository->findOneByCodedepot(20143);
  257.             $articles $this->articleRepository->findAll_article_désignation_byIdDepot($depot$type);
  258.             return $this->json($articles);
  259.         } catch (Exception $e) {
  260.             return $this->json([]);
  261.         }
  262.     }
  263.     #[Route('/commandes/transporteurs'name'api_transporteurs')]
  264.     public function list_transorteur(): JsonResponse
  265.     {
  266.         $transporteurs $this->transporteurRepository->findAll();
  267.         return $this->json($transporteurs);
  268.     }
  269.     /** méthod pour ajouter  commande sur lagny  */
  270.     #[Route('/add-commande'name'app_new_commande')]
  271.     public function add_commande(Request $request)
  272.     {
  273.         try {
  274.             $depot $request->query->get('depot');
  275.             $articlesbyDepot $this->articleRepository->findAll_article_désignation_byIdDepot($depot1);
  276.             $cdeMatEnt = new CdeMatEnt();
  277.             $depots $this->depotRepository->findOneByIdDepot($depot);
  278.             $form $this->createForm(CommandeType::class, $cdeMatEnt,[
  279.                 'show' => false// Pass the Doctrine service to the form
  280.             ]);
  281.             $form->handleRequest($request);
  282.             if ($form->isSubmitted() && $form->isValid()) {
  283.             }
  284.             return $this->render('commande/new.html.twig', [
  285.                 'ticket' => null,
  286.                 'form' => $form->createView(),
  287.                 'title' => 'Création Commande',
  288.                 'nav' => [['app_commande''Commande']],
  289.                 'articles' => null,
  290.                 'depots' => $depots,
  291.                 'articlesbyDepot' => $articlesbyDepot,
  292.                 'idCdeEnte' => 0,
  293.                 'show' => 0
  294.             ]);
  295.         } catch (Exception $e) {
  296.             return $e->getMessage();
  297.         }
  298.     }
  299.     /** méthod pour récuperer les articles vente ou location   */
  300.     #[Route('/save-cde-ent'name'app_command_article_type_save')]
  301.     public function save_cde_ent(Request $request)
  302.     {
  303.         try {
  304.             $requestData json_decode($request->getContent(), true);
  305.             // Access articleQte if present
  306.             $urlEncodedString $requestData['formData'] ?? [];
  307.             $depot $requestData['depot'] ?? [];
  308.             parse_str($urlEncodedString$formData);
  309.             $articleQteArray $requestData["articleQte"];
  310.             $resultat $this->commandeService->save($formData$articleQteArray$depot);
  311.             return $this->json($resultat);
  312.         } catch (Exception $e) {
  313.             dd($e->getMessage());
  314.             return $this->json([]);
  315.         }
  316.     }
  317.     /** méthod pour afficher décompte material sous format pdf   */
  318.     #[Route('/pdf-commande/{id}'name'app_pdf_generer')]
  319.     public function generer_pdf(CdeMatEnt $cdeMatEntRequest $request)
  320.     {
  321.         try {
  322.             // récuperer les articles par commande
  323.             $articles $this->cdeMatDetRepository->articles_by_cde($cdeMatEnt->getId());
  324.              
  325.             // odf
  326.             $header $this->environment->render('commande/headerpdf.html.twig', ['cdeMat' => $cdeMatEnt'articles' => $articles]);
  327.             $this->pdfService->generateTemplate($header);
  328.             $pdf $this->pdfService->generatePdf("ss");
  329.             $response = new Response($pdf);
  330.             $disposition $response->headers->makeDisposition(
  331.                 ResponseHeaderBag::DISPOSITION_INLINE,
  332.                 'ss.pdf'
  333.             );
  334.             $response->headers->set('Content-Disposition'$disposition);
  335.             return $response;
  336.         } catch (Exception $e) {
  337.             dd($e->getMessage());
  338.             return $this->json([]);
  339.         }
  340.     }
  341.     /** méthod pour annuler la commande et persist motif  */
  342.     #[Route('/annuler-commande'name'annuler_commande')]
  343.     public function annuler_commande(Request $request)
  344.     {
  345.         try {
  346.             $motif $request->query->get('motif');
  347.             $idCommande $request->query->get('idCommande');
  348.             $res $this->cdeMatEntRepository->annuler_commande($motif$idCommande);
  349.             $commande $this->cdeMatEntRepository->findCdeById($idCommande);
  350.             if($res == 200 && $commande != null){
  351.                 // metez ajourner le calendrier
  352.                 $this->outlookService->archive_calendar_ajourner($commande->getIdCalendar());
  353.             }
  354.             return new Response($res); // Assuming $res is a string or something that can be directly returned as a response
  355.         } catch (Exception $e) {
  356.             return $this->json([]);
  357.         }
  358.     }
  359.     // affichage les commande Annuler 
  360.     #[Route('/commande_annuler'name'commande_annuler_affichage')]
  361.     public function affichage_commande_annuler(): Response
  362.     {
  363.         $agences $this->agenceRepository->findAll();
  364.         return $this->render('commande/annuler_affichage.html.twig', [
  365.             'controller_name' => 'CommandeController',
  366.             'title' => 'Commandes Annulées',
  367.             'agences' => $agences,
  368.             'nav' => [['app_commande''Commandes']],
  369.         ]);
  370.     }
  371.     // getCommande  Annuler
  372.     #[Route('/get-commande-annuler'name'app_command_annuler_affichage')]
  373.     public function getCommandeAnnuler(Request $request)
  374.     {
  375.         try {
  376.             $id_depot $request->query->get('selectedDepot');
  377.             $commandes $this->cdeMatEntRepository->listCommandebyIdDepotAnnuler($id_depot);
  378.             $serializedData $this->customSerializer->serializeCommandes($commandes);
  379.             return new JsonResponse($serializedData);
  380.         } catch (Exception $e) {
  381.             return $this->json([]);
  382.         }
  383.     }
  384.     // fin  traitement Commande 
  385.     // get Commande par conducteur traveaux
  386.     #[Route('/commande_conducteur/{id}'name'commande_conducteur_traveaux')]
  387.     public function commande_conducteur_travaux(User $user null): Response // Assuming parameter conversion
  388.     {
  389.         // Check if the User exists
  390.         if (!$user) {
  391.             throw $this->createNotFoundException('No user found for id ');
  392.         }
  393.         $commandes $user->getCommandes();
  394.         $commandesArray $commandes->toArray();
  395.         
  396.         $conducs_chantiers =   $user->getConducteurChantiers();
  397.         usort($commandesArray, function($a$b) {
  398.             $dateA $a->getDateCde();
  399.             $dateB $b->getDateCde();
  400.         
  401.             if ($dateA == $dateB) {
  402.                 return 0;
  403.             }
  404.             return ($dateA $dateB) ? -1;
  405.         });
  406.     
  407.         // Handle User with No Commandes
  408.        
  409.         // Valid case: User exists and has commandes
  410.         return $this->render('chantiers/show_conducteur.html.twig', [
  411.             'title' => 'Commandes par Conducteur de Travaux',
  412.             'nav' => [],
  413.             'commandes' => $commandes// Pass commandes to the view
  414.             'user' => $user// Optionally pass the user to the view if needed
  415.             'chantiers_conducs' => $conducs_chantiers
  416.         ]);
  417.     }
  418.       // get Commande par Chantiers
  419.       #[Route('/commande_chantiers/{id}'name'commande_chantiers')]
  420.       public function commande_chantiers(Chantiers $chantiers null): Response // Assuming parameter conversion
  421.       {
  422.           // Check if the User exists
  423.           if (!$chantiers) {
  424.               throw $this->createNotFoundException('No user found for id ');
  425.           }
  426.           $commandes $chantiers->getCommandes();
  427.           $transport $chantiers->getNumChantierArrive();
  428.           $commandesArray $commandes->toArray();
  429.   
  430.           usort($commandesArray, function($a$b) {
  431.               $dateA $a->getDateCde();
  432.               $dateB $b->getDateCde();
  433.           
  434.               if ($dateA == $dateB) {
  435.                   return 0;
  436.               }
  437.               return ($dateA $dateB) ? -1;
  438.           });
  439.           // Handle User with No Commandes
  440.          
  441.           // Valid case: User exists and has commandes
  442.           return $this->render('chantiers/show_commandes_chantiers.html.twig', [
  443.               'title' => 'Commandes par Chantiers',
  444.               'nav' => [],
  445.               'commandes' => $commandesArray// Pass commandes to the view
  446.               'chantiers' => $chantiers// Optionally pass the user to the view if needed
  447.               'transports' => $transport
  448.           ]);
  449.       }
  450.       // desarchive les commande 
  451.       #[Route('/desarchive-commande'name'desarchive_commande')]
  452.       public function desarchive_commande(Request $request)
  453.       {
  454.           try {
  455.               $idCommande $request->query->get('idCommande');
  456.               $res $this->cdeMatEntRepository->desarchive_commande($idCommande);
  457.               $commande $this->cdeMatEntRepository->findCdeById($idCommande);
  458.               if($res == 200 && $commande != null){
  459.                   // desarchiver la commande
  460.                   $this->outlookService->des_archive_calendar_ajourner($commande->getIdCalendar());
  461.               }
  462.   
  463.               return new Response($res); // Assuming $res is a string or something that can be directly returned as a response
  464.           } catch (Exception $e) {
  465.   
  466.               return $this->json([]);
  467.           }
  468.       }
  469.        
  470.       // annulation Affretations et changer la calendar et etat 5
  471.       #[Route('/annuler-commande-transport/{id}'name'annuler_commande_transport')]
  472.       public function annuler_commande_transport(CdeMatEnt $cdeMatEnt)
  473.       {
  474.           try {
  475.               $transport $cdeMatEnt->getTransports()[0];
  476.              
  477.               $removeTransport true;
  478.               
  479.               if($transport != null){
  480.                 $removeTransport $this->transportRepository->remove($transport);
  481.               }
  482.               $changeCalendar true;
  483.               if($removeTransport){
  484.                  $changeCalendar $this->outlookService->change_affrete_annulation_transport($cdeMatEnt);
  485.               }
  486.               if($changeCalendar){
  487.                 $cdeMatEnt->setEtat(5);
  488.                 $this->cdeMatEntRepository->save($cdeMatEnt);
  489.               }
  490.              
  491.           } catch (Exception $e) {
  492.   
  493.               return $this->json(false);
  494.           }
  495.           return $this->json(true);
  496.       }
  497.       // filter Commande par etat Commande et date
  498.       #[Route('/filter-commande'name'filter_commande')]
  499.       public function filter_commande(Request $request): JsonResponse
  500.       {
  501.   
  502.   
  503.           $etat_commande $request->query->get('etat_commande');
  504.           $date_commande $request->query->get('date_commande');
  505.           $toutes_commandes $request->query->getBoolean('toutes_commandes'); 
  506.           $depot $request->query->get('depot'); 
  507.           // filter Commande
  508.           $commandes $this->cdeMatEntRepository->filter_commande($etat_commande,$date_commande,$toutes_commandes,$depot);
  509.   
  510.           
  511.           $serializedData $this->customSerializer->serializeCommandes($commandes);
  512.   
  513.           
  514.   
  515.           // Do something with the parameters, for example, return a JSON response
  516.           return new JsonResponse($serializedData);
  517.       }
  518. }