src/Controller/ProjetController.php line 195

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Contrat;
  4. use App\Entity\Document;
  5. use App\Entity\InfoSalarie;
  6. use App\Entity\LdvStatutProjet;
  7. use App\Entity\Projet;
  8. use App\Entity\Societe;
  9. use App\Entity\Tiers;
  10. use App\Model\LCSWS\LiveConsent;
  11. use App\Model\NoteDeFrais\NDF;
  12. use App\Repository\LdvStatutProjetRepository;
  13. use App\Tools\Fnc;
  14. use phpDocumentor\Reflection\Types\Collection;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\RequestStack;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use App\Tools\JsonRes;
  21. use Doctrine\Persistence\ManagerRegistry;
  22. use Doctrine\Persistence\ObjectManager;
  23. class ProjetController extends AbstractController
  24. {
  25.     private ?ObjectManager $em null;
  26.     private ?string $prefixSociete null;
  27.     private ?LdvStatutProjetRepository $_statutProjetRepository null;
  28.     /**
  29.      * Stockage des informations de la société pour affichage sur entête document
  30.      * @var object|mixed|null
  31.      */
  32.     private ?object $dataSociete null;
  33.     public function __construct(RequestStack $requestStackManagerRegistry $doctrine)
  34.     {
  35.         $request $requestStack->getCurrentRequest();
  36.         //TODO: page erreur subdomain
  37.         if(null===$request->getSession()->get('societe')) return $this->render('misc/404.html.twig');
  38.         // on récupère le sous-domaine stocké en session pour pointer vers le bon entity manager
  39.         $subdomain $request->getSession()->get('societe')->getBase();
  40.         $this->em $doctrine->getManager($subdomain);
  41.         $this->prefixSociete $request->getSession()->get('societe')->getPrefix();
  42.         if(null!==$this->prefixSociete$this->prefixSociete strtoupper($this->prefixSociete);
  43.         $jsonString $request->getSession()->get('societe')->getData();
  44.         if(null!==$jsonString) {
  45.             $this->dataSociete json_decode($jsonString);
  46.             $this->dataSociete->lib_societe $request->getSession()->get('societe')->getLibSociete();
  47.         }
  48. //        $this->_statutProjetRepository = $statutProjetRepository;
  49.     }
  50.     /**
  51.      * @Route("/projet/select2/{r}", methods={"GET"}, name="select2-projet")
  52.      */
  53.     public function select2($r)
  54.     {
  55.         //TODO: page erreur entity manager
  56.         if(null===$this->em) return $this->render('misc/404.html.twig');
  57.         $projetRepository $this->em->getRepository(Projet::class);
  58.         $result $projetRepository->select2($r);
  59.         die(json_encode($result));
  60.     }
  61.     private function getStatutProjetSelectOptions($optionTous=true$id=0)
  62.     {
  63.         return $this->_statutProjetRepository->getSelectOptions($optionTous$id);
  64.     }
  65.     /**
  66.      * @Route("/projet/creation", methods={"GET"}, name="creation_projet")
  67.      */
  68.     public function createProjet(): Response
  69.     {
  70.         return $this->render('projet/creation_projet.html.twig', [
  71.             'id_menu' => 'creation_projet',
  72.         ]);
  73.     }
  74.     /**
  75.      * @Route("/projet/insert", methods={"POST"}, name="insert_projet")
  76.      */
  77.     public function insert(Request $request): Response
  78.     {
  79.         //TODO: page erreur entity manager
  80.         if(null===$this->em) return $this->render('misc/404.html.twig');
  81.         // Initialisation du retour Json
  82.         $res = new JsonRes($request->request->all());
  83.         if($res->isSuccess()) {
  84.             $data $res->getData();
  85.             if(!isset($data['statut_projet'])) $res->addErrMsg('champs statut_projet inconnu');
  86.             if(!isset($data['nom_projet'])) $res->addErrMsg('champs nom_projet inconnu');
  87.             if(!isset($data['id_client_projet'])) $res->addErrMsg('champs id_client_projet inconnu');
  88.             if(!isset($data['id_chef_projet'])) $res->addErrMsg('champs id_chef_projet inconnu');
  89.             if(!isset($data['id_tiers_projet'])) $res->addErrMsg('champs id_tiers_projet inconnu');
  90.             if(!isset($data['date_deb'])) $res->addErrMsg('champs date_deb inconnu');
  91.             if(!isset($data['date_fin'])) $res->addErrMsg('champs date_fin inconnu');
  92.             if($res->isSuccess()) {
  93.                 if(''===$data['statut_projet']) $res->addErrMsg('champs statut_projet obligatoire');
  94.                 if(''===$data['nom_projet']) $res->addErrMsg('champs nom_projet obligatoire');
  95.                 if(''===$data['id_client_projet']) $res->addErrMsg('champs id_client_projet obligatoire');
  96.                 if(''===$data['id_chef_projet']) $res->addErrMsg('champs id_chef_projet obligatoire');
  97.                 if(''===$data['date_deb']) $res->addErrMsg('champs date_deb obligatoire');
  98.                 if(''===$data['date_fin']) $res->addErrMsg('champs date_fin obligatoire');
  99.                 if($res->isSuccess()) {
  100.                     /** @var Societe $societe */
  101.                     $societe null;
  102.                     /** @var Tiers $producteur */
  103.                     $producteur null;
  104.                     /** @var Tiers $tiers */
  105.                     $tiers null;
  106.                     $societeRepository $this->em->getRepository(Societe::class);
  107.                     $societe $societeRepository->find($data['id_client_projet']);
  108.                     if (null === $societe) {
  109.                         $res->addErrMsg('Société introuvable');
  110.                     } else {
  111.                         if(0===$societe->getAdresses()->count()) $res->addErrMsg('Enregistrer une adresse pour cette société avant de créer un projet');
  112.                     }
  113.                     $tiersRepository $this->em->getRepository(Tiers::class);
  114.                     $producteur $tiersRepository->find($data['id_chef_projet']);
  115.                     if(null===$societe$res->addErrMsg('Chef de projet introuvable');
  116.                     if(''!==$data['id_tiers_projet']) $tiers $tiersRepository->find($data['id_tiers_projet']);
  117.                     if($res->isSuccess()) {
  118.                         /** @var \App\Entity\User $currentUser */
  119.                         $currentUser $this->getUser()->getId();
  120.                         $projet = new Projet();
  121.                         // Projet en appel d'offre (id=1) ou directement en cours (id=3)
  122.                         $statutProjetRepository $this->em->getRepository(LdvStatutProjet::class);
  123.                         if($data['statut_projet'] ? $idStatut $idStatut 3);
  124.                         $projet->setIsAppelOffre(false);
  125.                         if(1===$idStatut$projet->setIsAppelOffre(true);
  126.                         $statutProjet $statutProjetRepository->find($idStatut);
  127.                         $projet->setStatut($statutProjet);
  128.                         $projet->setLibProjet($data['nom_projet']);
  129.                         // Tiers : société + producteur + autre tiers
  130.                         $projet->setSociete($societe);
  131.                         $projet->setProducteur($producteur);
  132.                         if(null!==$tiers$projet->setTiers($tiers);
  133.                         $dateDeb date_create_from_format('Y-m-d'$data['date_deb']);
  134.                         $projet->setDateDeb($dateDeb);
  135.                         $dateFin date_create_from_format('Y-m-d'$data['date_fin']);
  136.                         $projet->setDateFin($dateFin);
  137.                         $projet->setUserCrea($currentUser);
  138.                         $projet->setDateCrea(new \DateTime());
  139.                         if(1===$idStatut$numProd $societe->createNumAO($this->prefixSociete);
  140.                         if(3===$idStatut$numProd $societe->createNumProd($this->prefixSociete);
  141.                         $projet->setNumProd($numProd);
  142.                         $projet->setIsActive(true);
  143.                         $this->em->persist($projet);
  144.                         $this->em->flush();
  145.                         $data['id_projet'] = $projet->getId();
  146.                         $data['num_prod'] = $numProd;
  147.                         $res->setData($data);
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.         die($res->returnJson());
  153.     }
  154.     /**
  155.      * @Route("/projet/{id}", methods={"GET"}, name="show_projet")
  156.      */
  157.     public function show($id)
  158.     {
  159.         /* Mise à jour des statuts de signature LiveConsent */
  160. //        $contratRepository = $this->em->getRepository(Contrat::class);
  161. //        $LiveConsent = new LiveConsent();
  162. //        $statutList = array(
  163. //            'ACCEPTED',
  164. //            'CANCELED',
  165. //            'REJECTED',
  166. //            'EXPIRED',);
  167. //        foreach ($statutList as $statut){
  168. //            $res = $LiveConsent->getRequestList($statut);
  169. //            if(is_object($res)){
  170. //                if(isset($res->response)){
  171. //                    foreach ($res->response as $demande){
  172. //                        $idStatut = LiveConsent::REQUEST_STATUT['REQUEST_' . $statut];
  173. //                        $contratRepository->udpateStatutSignatureElec($demande->request_id, $idStatut);
  174. //                    }
  175. //                }
  176. //            }
  177. //        }
  178.         $projetRepository $this->em->getRepository(Projet::class);
  179.         /** @var Projet $projet */
  180.         $projet $projetRepository->find($id);
  181.         if(null===$projet) return $this->render('misc/404.html.twig');
  182.         $projet->setWorkflow();
  183.         /**
  184.          * Fiche du projet
  185.          */
  186.         $societeRepository $this->em->getRepository(Societe::class);
  187.         /** @var Societe $client */
  188.         $client $societeRepository->findOneBy([
  189.             'id' => $projet->getSociete()->getId(),
  190.         ]);
  191.         $tiersRepository $this->em->getRepository(Tiers::class);
  192.         /** @var Tiers $producteur */
  193.         $producteur $tiersRepository->findOneBy([
  194.             'id' => $projet->getProducteur()->getId(),
  195.         ]);
  196.         /** @var Tiers $tiers */
  197.         $tiers $projet->getTiers();
  198.         if(!null===$tiers) {
  199.             $tiers $tiersRepository->findOneBy([
  200.                 'id' => $projet->getTiers()->getId(),
  201.             ]);
  202.         }
  203.         /**
  204.          * Documents
  205.          */
  206.         $devisList $projet->getDocuments()->filter(function (Document $document){
  207.             return $document->getTypeDocument() === 'FACTURE PROFORMA';
  208.         });
  209.         $factureList $projet->getDocuments()->filter(function (Document $document){
  210.             return in_array($document->getTypeDocument(), ['FACTURE''AVOIR']);
  211.         });
  212.         $documentVierge = new Document();
  213.         $documentVierge->initDocVierge($projet'FACTURE PROFORMA');
  214.         /**
  215.          * Salariés
  216.          */
  217.         $salarieList = array();
  218.         $salarieProjet $projet->getSalaries();
  219.         foreach ($salarieProjet as $salarie){
  220.             $contratList $salarie->getContratByIdProjet($projet->getId());
  221.             foreach ($contratList as $contrat){
  222.                 $id $salarie->getId();
  223.                 if(!isset($salarieList[$id])){
  224.                     $contrat->total_jour_pointage 0;
  225.                     $contrat->total_salaire 0;
  226.                     $contrat->contrat_list = array();
  227.                     $salarieList[$id] = $contrat;
  228.                 }
  229.                 $tel '+33'substr($salarie->getTelPortableTiers(), 1);
  230.                 $mois = ['janvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre'];
  231.                 $mois $mois[intval($contrat->getMois())-1];
  232.                 $nomDemande 'CONTRAT TRAVAIL '$salarie->getNomTiers() .' '$salarie->getPrenomTiers() .' - '$mois .' '$contrat->getAnnee();
  233.                 $coordonnee = array(
  234.                     'nom_salarie' => $salarie->getNomTiers(),
  235.                     'prenom_salarie' => $salarie->getPrenomTiers(),
  236.                     'email_salarie' => $salarie->getEmailTiers(),
  237.                     'portable_salarie' => $tel,
  238.                     'nom_demande' => mb_strtoupper($nomDemande),
  239.                     'id_projet' => $projet->getId(),
  240.                     'id_salarie' => $salarie->getId(),
  241.                     'id_contrat' => $contrat->getId(),
  242.                 );
  243.                 $coordonnee json_encode($coordonnee);
  244.                 $contrat->coordonnee htmlentities($coordonnee);
  245.                 $salarieList[$id]->total_jour_pointage+= $contrat->getNbJourPointage();
  246.                 $salarieList[$id]->total_salaire+= $contrat->getTarifJour() * $contrat->getNbJourPointage();
  247.                 $salarieList[$id]->contrat_list[] = $contrat;
  248.             }
  249.         }
  250.         $salarieList Fnc::array_orderby($salarieList'getSalarie()->getInfoSalarie()->getFonction()'SORT_ASC);
  251.         $webPath $this->getParameter('kernel.project_dir');
  252.         $contratVierge = new Contrat();
  253.         $salarieVierge = new Tiers();
  254.         $infosSalarieVierge = new InfoSalarie($webPath);
  255.         $infosSalarieVierge->initInfosVierge();
  256.         $salarieVierge->setInfoSalarie($infosSalarieVierge);
  257.         $contratVierge->setIdProjet($projet->getId())
  258.             ->setSalarie($salarieVierge)
  259.         ;
  260.         /**
  261.          * Prestataires
  262.          */
  263.         $commandeList $projet->getDocuments()->filter(function (Document $document){
  264.             return $document->getTypeDocument() === 'COMMANDE PRESTATAIRE';
  265.         });
  266.         $commandeVierge = new Document();
  267.         $commandeVierge->initDocVierge($projet'COMMANDE PRESTATAIRE');
  268.         /**
  269.          * Notes de frais
  270.          */
  271.         $ndfList $projet->getDocuments()->filter(function (Document $document){
  272.             return $document->getTypeDocument() === 'NDF';
  273.         });
  274.         $ndfVierge = new Document();
  275.         $ndfVierge->initDocVierge($projet'NDF');
  276.         $ndfList $ndfVierge->groupNdfBySalarie($ndfList);
  277.         $ndf = new NDF($projet, new Societe(), new Tiers(), 0);
  278.         return $this->render('projet/gestion_projet.html.twig', [
  279.             'id_menu' => 'gestion_projet',
  280.             'societe' => $this->dataSociete,
  281.             'projet' => $projet,
  282.             'client' => $client,
  283.             'producteur' => $producteur,
  284.             'tiers' => $tiers,
  285.             'document_vierge' => $documentVierge,
  286.             'label_btn_cancel' => 'Annuler',
  287.             'devisList' => $devisList->toArray(),
  288.             'factureList' => $factureList->toArray(),
  289.             'contrat_vierge' => $contratVierge,
  290.             'salarieList' => $salarieList,
  291.             'commandeList' => $commandeList->toArray(),
  292.             'commande_vierge' => $commandeVierge,
  293.             'ndfList' => $ndfList,
  294.             'ndf_vierge' => $ndfVierge,
  295.             'type_charge_ndf' => 'NDF',
  296.             'select_option_type_ndf' => $ndf->getSelectOptionTypeNdf(),
  297. //            'select_statut_projet' => $this->getStatutProjetSelectOptions(false, $projet->getStatut()->getId()),
  298.         ]);
  299.     }
  300.     /**
  301.      * @Route("/projet/update", methods={"POST"}, name="update_projet")
  302.      */
  303.     public function update(Request $request): Response
  304.     {
  305.         //TODO: page erreur entity manager
  306.         if(null===$this->em) return $this->render('misc/404.html.twig');
  307.         // Initialisation du retour Json
  308.         $res = new JsonRes($request->request->all());
  309.         if($res->isSuccess()) {
  310.             $data $res->getData();
  311.             if(!isset($data['id_projet'])) $res->addErrMsg('champs id_projet inconnu');
  312.             if(!isset($data['statut_projet'])) $res->addErrMsg('champs statut_projet inconnu');
  313.             if(!isset($data['nom_projet'])) $res->addErrMsg('champs nom_projet inconnu');
  314.             if(!isset($data['id_client_projet'])) $res->addErrMsg('champs id_client_projet inconnu');
  315.             if(!isset($data['id_chef_projet'])) $res->addErrMsg('champs id_chef_projet inconnu');
  316.             if(!isset($data['id_tiers_projet'])) $res->addErrMsg('champs id_tiers_projet inconnu');
  317.             if(!isset($data['date_deb'])) $res->addErrMsg('champs date_deb inconnu');
  318.             if(!isset($data['date_fin'])) $res->addErrMsg('champs date_fin inconnu');
  319.             if(!isset($data['num_administratif_projet'])) $res->addErrMsg('champs num_administratif_projet inconnu');
  320.             if(!isset($data['commentaire_projet'])) $res->addErrMsg('champs commentaire_projet inconnu');
  321.             if($res->isSuccess()) {
  322.                 if(''===$data['id_projet']) $res->addErrMsg('champs id_projet obligatoire');
  323.                 if(''===$data['statut_projet']) $res->addErrMsg('champs statut_projet obligatoire');
  324.                 if(''===$data['nom_projet']) $res->addErrMsg('champs nom_projet obligatoire');
  325.                 if(''===$data['id_client_projet']) $res->addErrMsg('champs id_client_projet obligatoire');
  326.                 if(''===$data['id_chef_projet']) $res->addErrMsg('champs id_chef_projet obligatoire');
  327.                 if(''===$data['date_deb']) $res->addErrMsg('champs date_deb obligatoire');
  328.                 if(''===$data['date_fin']) $res->addErrMsg('champs date_fin obligatoire');
  329.                 if($res->isSuccess()) {
  330.                     $projetRepository $this->em->getRepository(Projet::class);
  331.                     /** @var Projet $projet */
  332.                     $projet $projetRepository->find($data['id_projet']);
  333.                     if(null===$projet$res->addErrMsg('Projet inconnu dans la bdd');
  334.                     if($res->isSuccess()) {
  335.                         /** @var Societe $societe */
  336.                         $societe null;
  337.                         /** @var Tiers $producteur */
  338.                         $producteur null;
  339.                         /** @var Tiers $tiers */
  340.                         $tiers null;
  341.                         $societeRepository $this->em->getRepository(Societe::class);
  342.                         $societe $societeRepository->find($data['id_client_projet']);
  343.                         if(null===$societe$res->addErrMsg('Société introuvable');
  344.                         $tiersRepository $this->em->getRepository(Tiers::class);
  345.                         $producteur $tiersRepository->find($data['id_chef_projet']);
  346.                         if(null===$societe$res->addErrMsg('Chef de projet introuvable');
  347.                         if(''!==$data['id_tiers_projet']) $tiers $tiersRepository->find($data['id_tiers_projet']);
  348.                         if($res->isSuccess()) {
  349.                             /** @var \App\Entity\User $currentUser */
  350.                             $currentUser $this->getUser()->getId();
  351.                             $statutProjetRepository $this->em->getRepository(LdvStatutProjet::class);
  352.                             $statutProjet $statutProjetRepository->find($data['statut_projet']);
  353.                             $numProd $this->replaceNumProdAppelOffre($projet->getNumProd(), $projet->getStatut()->getId(), $data['statut_projet']);
  354.                             $projet->setStatut($statutProjet)
  355.                                 ->setNumProd($numProd)
  356.                             ;
  357.                             $projet->setLibProjet($data['nom_projet']);
  358.                             // Tiers : client + producteur + autre tiers
  359.                             $projet->setSociete($societe);
  360.                             $projet->setProducteur($producteur);
  361.                             if(null!==$tiers$projet->setTiers($tiers);
  362.                             $dateDeb date_create_from_format('Y-m-d'$data['date_deb']);
  363.                             $projet->setDateDeb($dateDeb);
  364.                             $dateFin date_create_from_format('Y-m-d'$data['date_fin']);
  365.                             $projet->setDateFin($dateFin);
  366.                             $projet->setNumAdministratif($data['num_administratif_projet']);
  367.                             $projet->setCommentaire($data['commentaire_projet']);
  368.                             $projet->setUserModif($currentUser);
  369.                             $projet->setDateModif(new \DateTime());
  370.                             $this->em->persist($projet);
  371.                             $this->em->flush();
  372.                             $res->setData($data);
  373.                         }
  374.                     }
  375.                 }
  376.             }
  377.         }
  378.         die($res->returnJson());
  379.     }
  380.     /**
  381.      * @Route("/projet/update-statut", methods={"POST"}, name="update_statut_projet")
  382.      */
  383.     public function updateStatut(Request $request): Response
  384.     {
  385.         //TODO: page erreur entity manager
  386.         if(null===$this->em) return $this->render('misc/404.html.twig');
  387.         // Initialisation du retour Json
  388.         $res = new JsonRes($request->request->all());
  389.         $data $res->getData();
  390.         if(empty($data['id_projet'])) $res->addErrMsg('erreur champs id_projet');
  391.         if(empty($data['id_statut'])) $res->addErrMsg('erreur champs id_statut');
  392.         if(!$res->isSuccess()) die($res->returnJson());
  393.         $projetRepository $this->em->getRepository(Projet::class);
  394.         /** @var Projet $projet */
  395.         $projet $projetRepository->find($data['id_projet']);
  396.         if(null===$projet$res->addErrMsg('Projet inconnu dans la bdd');
  397.         if(!$res->isSuccess()) die($res->returnJson());
  398.         /** @var \App\Entity\User $currentUser */
  399.         $currentUser $this->getUser()->getId();
  400.         $statutProjetRepository $this->em->getRepository(LdvStatutProjet::class);
  401.         $statutProjet $statutProjetRepository->find($data['id_statut']);
  402.         $numProd $this->replaceNumProdAppelOffre($projet->getNumProd(), $projet->getStatut()->getId(), $data['id_statut']);
  403.         $projet->setStatut($statutProjet)
  404.             ->setNumProd($numProd)
  405.             ->setUserModif($currentUser)
  406.             ->setDateModif(new \DateTime())
  407.         ;
  408.         $this->em->persist($projet);
  409.         $this->em->flush();
  410.         $res->setData($data);
  411.         die($res->returnJson());
  412.     }
  413.     /**
  414.      * @Route("/projet/reload-dashboard/{id}", methods={"GET"}, name="reload_dashboard_projet")
  415.      */
  416.     public function reloadDashboard($id): Response
  417.     {
  418.         $projetRepository $this->em->getRepository(Projet::class);
  419.         /** @var Projet $projet */
  420.         $projet $projetRepository->find($id);
  421.         if(null===$projet) return $this->render('misc/404.html.twig');
  422.         $tiersRepository $this->em->getRepository(Tiers::class);
  423.         /** @var Tiers $producteur */
  424.         $producteur $tiersRepository->findOneBy([
  425.             'id' => $projet->getProducteur()->getId(),
  426.         ]);
  427.         return $this->render('projet/tab/card-dashboard-projet.html.twig', [
  428.             'projet' => $projet,
  429.             'producteur' => $producteur,
  430.         ]);
  431.     }
  432.     /**
  433.      * @Route("/projet/reload-workflow/{id}", methods={"GET"}, name="reload_workflow_projet")
  434.      */
  435.     public function reloadWorkflow($id): Response
  436.     {
  437.         $projetRepository $this->em->getRepository(Projet::class);
  438.         /** @var Projet $projet */
  439.         $projet $projetRepository->find($id);
  440.         $projet->setWorkflow();
  441.         return $this->render('projet/workflow-ligne.html.twig', [
  442.             'projet' => $projet,
  443.         ]);
  444.     }
  445.     /**
  446.      * @param string $numProd
  447.      * @param int $currentId
  448.      * @param int $newId
  449.      * @return string
  450.      */
  451.     private function replaceNumProdAppelOffre(string $numProdint $currentIdint $newId): string
  452.     {
  453.         if (>= $currentId && $newId) {
  454.             $numProd preg_replace('/-AO-(?!.*-AO-)/''-'$numProd);
  455.         }
  456.         return $numProd;
  457.     }
  458. }