src/Controller/Api/Prive/ApiEspaceagentController.php line 343

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\Prive;
  3. use App\Entity\Appareil;
  4. use App\Entity\Appel;
  5. use App\Entity\Appelstatut;
  6. use App\Entity\Campagne;
  7. use App\Entity\Campagnecollaborateur;
  8. use App\Entity\Campagneprospect;
  9. use App\Entity\Cleaningdb;
  10. use App\Entity\Cleaningdbcollaborateur;
  11. use App\Entity\Commentaire;
  12. use App\Entity\Contact;
  13. use App\Entity\Fichier;
  14. use App\Entity\Prospect;
  15. use App\Entity\Prospectdetail;
  16. use App\Entity\Rdv;
  17. use App\Entity\Utilisateur;
  18. use App\Helpers\Mailing;
  19. use Doctrine\ORM\Query;
  20. use Doctrine\ORM\Query\ResultSetMapping;
  21. use phpDocumentor\Reflection\Types\Boolean;
  22. use Symfony\Component\Filesystem\Filesystem;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. /**
  27.  * @Route("/espaceagent")
  28.  */
  29. class ApiEspaceagentController extends ApiController
  30. {
  31.     public function saveTrace(string $trace) {
  32.         //file_put_contents("text.json","azizo");
  33.         // save trace
  34.         $utilisateur $this->getUtilisateurConnecte()->getId();
  35.         $today date("Ymd");
  36.         $repertoire "logs/".$utilisateur;
  37.         if (!is_dir($repertoire)) {
  38.             $filesystem = new Filesystem();
  39.             $filesystem->mkdir($repertoire0700);
  40.         }
  41.         $text PHP_EOL."---------------------".date("Y-m-d H:i:s")."------------------------------".PHP_EOL.$trace;
  42.         file_put_contents($repertoire.'/log_'.$today.'.txt'$text FILE_APPEND LOCK_EX);
  43.     }
  44.     /**
  45.      * @Route("/nextprospect", name="api_espaceagent_nextprospect", methods={"POST"})
  46.      * @param Request $request
  47.      * @return JsonResponse
  48.      */
  49.     public function nextprospect(Request $request)
  50.     {
  51.         $data json_decode($request->getContent(), true);
  52.         $id $data['idCampagne'];
  53.         $getToutRappelPrive $data['getRappelPrive'];
  54.         $getToutRappelPartage $data['getRappelPartage'];
  55.         $trace "Input : ".json_encode($data).PHP_EOL;
  56.         // Chercher les campagnesprospect utilisateur
  57.         /** @var Campagne $campagne */
  58.         $campagne $this->em->getRepository(Campagne::class)->find($id);
  59.         if (!$campagne) {
  60.             return $this->apiKo("Campagne non trouvée !!");
  61.         }
  62.         /** @var Campagneprospect $campagneprospect */
  63.         $campagneprospect $this->getCampagneprospect($campagne,$getToutRappelPrive,$getToutRappelPartage);
  64.         if (!$campagneprospect) {
  65.             $trace .= "OutPut : KO";
  66.             return $this->apiKo("Pas de prospect trouvé. Tous les prospects de la campagne ont été traités !");
  67.         }
  68.         $data = [
  69.             "id" => $campagneprospect->getId(),
  70.             "idCampagne" => $campagneprospect->getCampagne() ? $campagneprospect->getCampagne()->getId() : "",
  71.             "idAppelStatut" => $campagneprospect->getAppelstatut() ? $campagneprospect->getAppelstatut()->getId() : "",
  72.             "rappelprive" => $campagneprospect->getRappelprive(),
  73.             "daterappel" => $campagneprospect->getDaterappel(),
  74.             "idUtilisateur" => $campagneprospect->getUtilisateur() ? $campagneprospect->getUtilisateur()->getId():""
  75.         ];
  76.         $trace .= "OutPut : ".json_encode($data).PHP_EOL;
  77.         $this->saveTrace($trace);
  78.         return $this->apioK($campagneprospect);
  79.     }
  80.     /**
  81.      * @Route("/enregistrerappel", name="api_espaceagent_enregistrerappel", methods={"POST"})
  82.      * @param Request $request
  83.      * @return JsonResponse
  84.      */
  85.     public function enregistrerappel(Request $request)
  86.     {
  87.         $data json_decode($request->getContent(), true);
  88.         try {
  89.             if (!isset($data['prospect'])) {
  90.                 return $this->apiKo("Prospect non trouvé !!");
  91.             }
  92.             if (!isset($data['appelsatut'])) {
  93.                 return $this->apiKo("Statut appel non trouvé !!");
  94.             }
  95.             if (!isset($data['campagneprospect'])) {
  96.                 return $this->apiKo("Campagne prospect non trouvé !!");
  97.             }
  98.             // 1. Update info prospect
  99.             $prospect $this->chercherProspect($data['prospect']);
  100.             $prospect $this->saveProspect($prospect$data['prospect']);
  101.             if (!$prospect instanceof Prospect) {
  102.                 return $this->apiKo($prospect);
  103.             }
  104.             /*
  105.              campagneprospect: {id: this.campagneprospect.id},
  106.             prospect: this.prospect,
  107.             commentaire: this.commentaire,
  108.             appelsatut: {id: this.appelstatutSelected.id},
  109.             daterappel: this.dateRappel,
  110.             estpartagerappel: this.estPartageRappel,
  111.             affectera: {id: affecterA}, // affecter le rappel à
  112.             dureeappel: this.timerSecond,
  113.             contact: this.contactSelected,
  114.             numerotelephone: this.numerotelephone,
  115.             daterdv: this.dateRdv
  116.              */
  117.             /** @var Utilisateur $utilisateur */
  118.             $utilisateur $this->getUtilisateurConnecte();
  119.             /** @var Appelstatut $appelstatut */
  120.             $appelstatut $this->getObject(Appelstatut::class, $data['appelsatut']['id']);
  121.             $numerotelephone "";
  122.             if (isset($data['numerotelephone'])) {
  123.                 $numerotelephone $data['numerotelephone'];
  124.             }
  125.             // 2. Commentaires
  126.             /** @var Commentaire $commentaire */
  127.             $commentaire = new Commentaire();
  128.             $commentaire->setProspect($prospect);
  129.             $commentaire->setUtilisateur($utilisateur);
  130.             $commentaire->setDate(new \DateTime());
  131.             $commentaire->setMessage($data['commentaire']);
  132.             $this->em->persist($commentaire);
  133.             $this->em->flush();
  134.             $commentairereponsable = new Commentaire();
  135.             $commentairereponsable->setDate(new \DateTime());
  136.             $commentairereponsable->setMessage("");
  137.             $this->em->persist($commentairereponsable);
  138.             $this->em->flush();
  139.             // 3. Update campagne prospect
  140.             /** @var Campagneprospect $campagneprospect */
  141.             $campagneprospect $this->getObject(Campagneprospect::class, $data['campagneprospect']['id']);
  142.             // contact !
  143.             if (isset($data['contact'])) {
  144.                 $historique $campagneprospect->getHistorique();
  145.                 if (is_null($historique) || $historique == "null") {
  146.                     $historique = array([]);
  147.                 }
  148.                 $historique[] = [
  149.                     "contact" => $data['contact']['id'],
  150.                     "appelstatut" => $appelstatut->getLibelle()
  151.                 ];
  152.                 $campagneprospect->setHistorique($historique);
  153.             }
  154.             $campagneprospect->setCommentaire($data['commentaire']);
  155.             $campagneprospect->setAppelstatut($appelstatut);
  156.             $campagneprospect->setRappelprive(2);
  157.             $campagneprospect->setTraitementdate(new \DateTime());
  158.             $campagneprospect->setTraitementencore(0);
  159.             $campagneprospect->setTraitementpar($utilisateur);
  160.             $campagneprospect->setUtilisateur($utilisateur); // Par defaut : affecté à utilisateur connecté
  161.             $campagneprospect->setDaterappel(null);
  162.             // TRAITER LE CAS RAPPELL
  163.             if ($appelstatut->getRappel() && isset($data['estpartagerappel']) && isset($data['daterappel'])) {
  164.                 $campagneprospect->setRappelprive(!$data['estpartagerappel']);
  165.                 $campagneprospect->setDaterappel(new \DateTime($data['daterappel']));
  166.                 // cas rappel privé avec affectation à un autre collaborateur
  167.                 if(!$data['estpartagerappel'] == true) {
  168.                     $affecterA 0;
  169.                     if (isset($data['affectera']) && isset($data['affectera']['id'])) {
  170.                         $affecterA $data['affectera']['id'];
  171.                     }
  172.                     if ($affecterA && $affecterA != $utilisateur->getId()) {
  173.                         $collaborateur $this->getObject(Utilisateur::class,$affecterA);
  174.                         if($collaborateur){
  175.                             $campagneprospect->setUtilisateur($collaborateur);
  176.                         }
  177.                     }
  178.                 }
  179.             }
  180.             $this->em->persist($campagneprospect);
  181.             // 3. Historique des appels
  182.             /** @var Appel $appel */
  183.             $appel = new Appel();
  184.             $appel->setUtilisateur($utilisateur);
  185.             $appel->setCampagneprospect($campagneprospect);
  186.             $appel->setDateappel(new \DateTime());
  187.             $appel->setAppelstatut($appelstatut);
  188.             $appel->setDureeappel($data['dureeappel']);
  189.             $appel->setNumerotelephone($numerotelephone);
  190.             if ($commentaire->getId() > 0) {
  191.                 $appel->setCommentaire($commentaire);
  192.             }
  193.             $this->em->persist($appel);
  194.             // TRAITER LE CAS RDV
  195.             if ($appelstatut->getRdv() && isset($data['daterdv'])) {
  196.                 $rdv = new Rdv();
  197.                 $rdv->setUtilisateur($utilisateur);
  198.                 $rdv->setProspect($prospect);
  199.                 $rdv->setCampagne($campagneprospect->getCampagne());
  200.                 $rdv->setDaterdv(new \DateTime($data['daterdv']));
  201.                 $rdv->setDatecreation(new \DateTime());
  202.                 $rdv->setDatemodification(new \DateTime());
  203.                 $rdv->setCommentaire($commentaire);
  204.                 $rdv->setCommentaireresponsable($commentairereponsable);
  205.                 // contact !
  206.                 if (isset($data['contact']) && isset($data['contact']['id'])) {
  207.                     /** @var Contact $contact */
  208.                     $contact $this->getObject(Contact::class, $data['contact']['id']);
  209.                     if ($contact) {
  210.                         $rdv->setContact($contact);
  211.                     }
  212.                 }
  213.                 $this->em->persist($rdv);
  214.                 // Notification
  215.                 (new Mailing($this->mailer$this->templating))->notificationstatutrdv($rdv);
  216.             }
  217.             //TRAITER LE CAS FICHEQUALIFIE
  218.             if ($appelstatut->getFichequalifie() || $appelstatut->getFichearequalifie()) {
  219.                 // Transférer fiche vers campagne cible
  220.                 $campagnecibleId $campagneprospect->getCampagne()->getCampagnecible();
  221.                 if($campagnecibleId>0){
  222.                     $campagnecible $this->getObject(Campagne::class,$campagnecibleId);
  223.                     if($campagnecible){
  224.                         // verifier l'existance prospect dans la campagne
  225.                         /** @var Campagneprospect $campagneprospectCible */
  226.                         $campagneprospectCible $this->em->getRepository(Campagneprospect::class)->findOneBy(
  227.                             ["prospect" => $prospect,"campagne" => $campagnecible]
  228.                         );
  229.                         if(!$campagneprospectCible){
  230.                             $campagneprospectCible = new Campagneprospect();
  231.                             $campagneprospectCible->setProspect($prospect);
  232.                             $campagneprospectCible->setCampagne($campagnecible);
  233.                         }else{
  234.                             $campagneprospectCible->setAppelstatut(null);
  235.                             $campagneprospectCible->setUtilisateur(null);
  236.                             $campagneprospectCible->setRappelprive(-1);
  237.                             $campagneprospectCible->setDaterappel(null);
  238.                         }
  239.                         $campagneprospectCible->setCommentaire($campagneprospect->getCommentaire());
  240.                         $this->em->persist($campagneprospectCible);
  241.                     }
  242.                 }
  243.             }
  244.             // Flush modification dans la bdd
  245.             $this->em->flush();
  246.             return $this->apioK("1");
  247.         } catch (\Exception $e) {
  248.             //throw $e;
  249.             return $this->apiKo($e->getMessage());
  250.         }
  251.     }
  252.     /////////////////////////////////////// ACTION CLEANING DB ///////////////////////////
  253.     /**
  254.      * @Route("/activecleaningdb", name="api_espaceagent_activecleaningdb", methods={"GET"})
  255.      * @return JsonResponse
  256.      */
  257.     public function activecleaningdb()
  258.     {
  259.         /** @var Cleaningdbcollaborateur $cleaningCollaborateur */
  260.         $cleaningCollaborateur $this->em->getRepository(Cleaningdbcollaborateur::class)->findOneBy(
  261.           [
  262.               "collaborateur" => $this->getUtilisateurConnecte()->getId()
  263.           ]
  264.         );
  265.         if($cleaningCollaborateur == null){
  266.             return $this->apioK(false);
  267.         }
  268.         return $this->apioK(true);
  269.     }
  270.     /**
  271.      * @Route("/verifierdoublon/{id}", name="api_espaceagent_verifierdoublon", methods={"GET"})
  272.      * @param int $id
  273.      * @return JsonResponse
  274.      */
  275.     public function verifierdoublon(int $id)
  276.     {
  277.         if($id == null && $id<=0){
  278.             return $this->apiOk([]);
  279.         }
  280.         $sql "SELECT
  281.                 p.id as id,
  282.                 p.doublonSiret as siret,
  283.                 p.doublonStandard as standard
  284.                 FROM prospectdoublon AS p
  285.                 WHERE p.id NOT IN (SELECT c.uid FROM cleaningdb as c WHERE c.action <>0) 
  286.                 AND (p.id like '%-".$id."' OR p.id like '".$id."-%') LIMIT 1";
  287.         $rsm = new ResultSetMapping();
  288.         $rsm->addScalarResult('id','id');
  289.         $rsm->addScalarResult('siret','siret');
  290.         $rsm->addScalarResult('standard','standard');
  291.         $items $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
  292.         $reponse = [];
  293.         foreach ($items as $item){
  294.             $reponse = [
  295.                 "estdoublon" => true,
  296.                 "standard" => (int) $item["standard"],
  297.                 "siret" => (int) $item["siret"],
  298.                 "uid" => $item["id"]
  299.             ];
  300.         }
  301.         return $this->apiOk($reponse);
  302.     }
  303.     /**
  304.      * @Route("/ouvrirdoublon/{uid}", name="api_espaceagent_ouvrirdoublon", methods={"GET"})
  305.      * @param string $uid
  306.      * @return JsonResponse
  307.      */
  308.     public function ouvrirdoublon(string $uid)
  309.     {
  310.         if(!isset($uid)){
  311.             return $this->apiOk([]);
  312.         }
  313.         /** @var Utilisateur $utilisateur */
  314.         $utilisateur $this->getUtilisateurConnecte();
  315.         /** @var Cleaningdb $cleaningdb */
  316.         $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy(
  317.             [
  318.                 "uid" =>$uid
  319.             ]
  320.         );
  321.         if($cleaningdb != null){
  322.             $cleaningdb->setUtilisateur($utilisateur);
  323.             $this->em->persist($cleaningdb);
  324.             $this->em->flush();
  325.         }else{
  326.             $sql "SELECT
  327.                 p.id as id,
  328.                 p.societe as societe,
  329.                 p.siret as siret,
  330.                 p.standard as standard
  331.                 FROM prospectdoublon AS p
  332.                 WHERE p.id = '".$uid."'
  333.                 LIMIT 1";
  334.             $rsm = new ResultSetMapping();
  335.             $rsm->addScalarResult('id','id');
  336.             $rsm->addScalarResult('societe','societe');
  337.             $rsm->addScalarResult('siret','siret');
  338.             $rsm->addScalarResult('standard','standard');
  339.             $items $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
  340.             foreach ($items as $item){
  341.                 $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy([
  342.                     "uid" => $item["id"]
  343.                 ]);
  344.                 if($cleaningdb == null){
  345.                     $cleaningdb = new Cleaningdb();
  346.                     $cleaningdb->setAction(0);
  347.                     $cleaningdb->setUtilisateur($utilisateur);
  348.                     $cleaningdb->setUid($item["id"] );
  349.                     $cleaningdb->setSociete($item["societe"] );
  350.                     $cleaningdb->setSiret($item["siret"] );
  351.                     $cleaningdb->setStandard($item["standard"] );
  352.                     $this->em->persist($cleaningdb);
  353.                     $this->em->flush();
  354.                 }
  355.             }
  356.         }
  357.         if($cleaningdb != null && $cleaningdb->getId()>0){
  358.             // retourn les prospect doublon
  359.             $ids explode("-",$cleaningdb->getUid());
  360.             /** @var Prospect[] $prospects */
  361.             $prospects $this->em->getRepository(Prospect::class)->findBy([
  362.                 "id" => $ids
  363.             ]);
  364.             $data = [
  365.                 "id" => $cleaningdb->getId(),
  366.                 "prospects" => $prospects,
  367.                 "erreurMessage" => "",
  368.                 "erreur" => false,
  369.             ];
  370.         }else{
  371.             $data = [
  372.                 "id" => "",
  373.                 "prospects" => [],
  374.                 "erreurMessage" => "Pas de prospect doublons trouvé !",
  375.                 "erreur" => true,
  376.             ];
  377.         }
  378.         return $this->apiOk($data);
  379.     }
  380.     /**
  381.      * @Route("/nextprospectdoublon", name="api_espaceagent_nextprospectdoublon", methods={"POST"})
  382.      * @param Request $request
  383.      * @return JsonResponse
  384.      */
  385.     public function nextprospectdoublon(Request $request)
  386.     {
  387.         /** @var Utilisateur $utilisateur */
  388.         $utilisateur $this->getUtilisateurConnecte();
  389.         // Recuperer Next Element à traiter
  390.         /** @var Cleaningdb $cleaningdb */
  391.         $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy(
  392.             [
  393.                 "utilisateur" => $utilisateur->getId(),
  394.                 "action" => 0
  395.             ]
  396.         );
  397.         if($cleaningdb == null){
  398.             $sql "SELECT
  399.                 p.id as id,
  400.                 p.societe as societe,
  401.                 p.siret as siret,
  402.                 p.standard as standard
  403.                 FROM prospectdoublon AS p
  404.                 WHERE p.id NOT IN (SELECT c.uid FROM cleaningdb AS c ) 
  405.                 LIMIT 2";
  406.             $rsm = new ResultSetMapping();
  407.             $rsm->addScalarResult('id','id');
  408.             $rsm->addScalarResult('societe','societe');
  409.             $rsm->addScalarResult('siret','siret');
  410.             $rsm->addScalarResult('standard','standard');
  411.             $items $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
  412.             foreach ($items as $item){
  413.                 $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy([
  414.                     "uid" => $item["id"]
  415.                 ]);
  416.                 if($cleaningdb == null){
  417.                     $cleaningdb = new Cleaningdb();
  418.                     $cleaningdb->setAction(0);
  419.                     $cleaningdb->setUtilisateur($utilisateur);
  420.                     $cleaningdb->setUid($item["id"] );
  421.                     $cleaningdb->setSociete($item["societe"] );
  422.                     $cleaningdb->setSiret($item["siret"] );
  423.                     $cleaningdb->setStandard($item["standard"] );
  424.                     $this->em->persist($cleaningdb);
  425.                     $this->em->flush();
  426.                 }
  427.             }
  428.         }
  429.         if($cleaningdb != null && $cleaningdb->getId()>0){
  430.             // retourn les prospect doublon
  431.             $ids explode("-",$cleaningdb->getUid());
  432.             /** @var Prospect[] $prospects */
  433.             $prospects $this->em->getRepository(Prospect::class)->findBy([
  434.                 "id" => $ids
  435.             ]);
  436.             $data = [
  437.                 "id" => $cleaningdb->getId(),
  438.                 "prospects" => $prospects,
  439.                 "erreurMessage" => "",
  440.                 "erreur" => false,
  441.             ];
  442.         }else{
  443.             $data = [
  444.                 "id" => $cleaningdb->getId(),
  445.                 "prospects" => [],
  446.                 "erreurMessage" => "Pas de prospect doublons trouvé !",
  447.                 "erreur" => true,
  448.             ];
  449.         }
  450.         return $this->apiOk($data);
  451.     }
  452.     /**
  453.      * @Route("/enregistrerdoublon", name="api_espaceagent_enregistrerdoublon", methods={"POST"})
  454.      * @param Request $request
  455.      * @return JsonResponse
  456.      */
  457.     public function enregistrerdoublon(Request $request)
  458.     {
  459.         $data json_decode($request->getContent(), true);
  460.         if(!isset($data["id"])
  461.         || !isset($data["deletedProspects"])
  462.         || !isset($data["savedProspects"])
  463.         || !isset($data["prospectdetail"])
  464.         || !isset($data["prospect"])
  465.         || !isset($data["appreils"])
  466.         || !isset($data["contacts"])
  467.         ){
  468.             return $this->apiKo("Object des données n'est pas valide !");
  469.         }
  470.         $id $data["id"];
  471.         /** @var Cleaningdb $cleaningdb */
  472.         $cleaningdb $this->getObject(Cleaningdb::class,$id);
  473.         if($cleaningdb == null){
  474.             return $this->apiKo("Object des données n'est pas valide !");
  475.         }
  476.        //return $this->apiOk("OK");// a supprimer
  477.         $this->em->getConnection()->beginTransaction();
  478.         try {
  479.            //1. update prospect gardé
  480.             $prospect $this->getObject(Prospect::class,$data["prospect"]["id"]);
  481.             $result $this->saveProspect($prospect,$data["prospect"]);
  482.             if(!($result instanceof Prospect)){
  483.                 throw new \Exception($result);
  484.             }
  485.             $prospectdetail $this->saveProspectdetail($prospect$data["prospectdetail"]);
  486.             if(!($prospectdetail instanceof Prospectdetail)){
  487.                 throw new \Exception($prospectdetail);
  488.             }
  489.             //2. archivé les doublons
  490.             $ids $data["deletedProspects"];
  491.             $historique = [];
  492.             foreach ($ids as $id){
  493.                 /** @var Prospect $prospectArchive */
  494.                 $prospectArchive $this->getObject(Prospect::class,$id);
  495.                 if($prospectArchive != null){
  496.                     $historique =  $this->ArchiverProspect($prospect,$prospectArchive);
  497.                 }
  498.             }
  499.             if($historique instanceof \Exception){
  500.                 throw $historique;
  501.             }
  502.             $cleaningdb->setHistorique($historique);
  503.             $this->em->getConnection()->commit();
  504.             $cleaningdb->setDeletedObjects($data["deletedProspects"]);
  505.             $cleaningdb->setSavedObjects($data["savedProspects"]);
  506.             $cleaningdb->setAction(1);
  507.             return $this->apioK("1");
  508.         } catch (\Exception $e) {
  509.             $this->em->getConnection()->rollBack();
  510.             $cleaningdb->setAction(-1);
  511.             $cleaningdb->setCommentaire($e->getMessage());
  512.             return $this->apiKo($e->getMessage());
  513.         } finally {
  514.             $this->em->persist($cleaningdb);
  515.             $this->em->flush();
  516.         }
  517.     }
  518.     /**
  519.      * @param int $id
  520.      */
  521.         public function ArchiverProspect(Prospect $prospect,Prospect $prospectArchive){
  522.             $historique = [];
  523.             $histo = [];
  524.         try{
  525.             //1. Transfert Contacts
  526.             /** @var Contact[] $contacts */
  527.             $contacts $this->em->getRepository(Contact::class)->findBy(
  528.                 ["prospect" => $prospectArchive->getId()]
  529.             );
  530.             /** @var Contact $contact */
  531.             foreach ($contacts as $contact){
  532.                 $contact->setProspect($prospect);
  533.                 $this->em->persist($contact);
  534.                 $histo[] = ["id" => $contact->getId()];
  535.             }
  536.             $historique[] = ["contacts" => $histo];
  537.             $histo = [];
  538.             //2. Appareils
  539.             /** @var Appareil[] $appareils */
  540.             $appareils $this->em->getRepository(Appareil::class)->findBy(
  541.                 ["prospect" => $prospectArchive->getId()]
  542.             );
  543.             /** @var Appareil $appareil */
  544.             foreach ($appareils as $appareil){
  545.                 $appareil->setProspect($prospect);
  546.                 $this->em->persist($appareil);
  547.                 $histo[] = ["id" => $appareil->getId()];
  548.             }
  549.             $historique[] = ["appareils" => $histo];
  550.             $histo = [];
  551.             //3. CampagneProspect
  552.             /** @var Campagneprospect[] $campagneprospects */
  553.             $campagneprospects $this->em->getRepository(Campagneprospect::class)->findBy(
  554.                 ["prospect" => $prospectArchive->getId()]
  555.             );
  556.             /** @var Campagneprospect $campagneprospect */
  557.             foreach ($campagneprospects as $campagneprospect){
  558.                 $campagneprospect->setProspect($prospect);
  559.                 $this->em->persist($campagneprospect);
  560.                 $histo[] = ["id" => $campagneprospect->getId()];
  561.             }
  562.             $historique[] = ["campagneprospects" => $histo];
  563.             $histo = [];
  564.             //4.Commentaires
  565.             /** @var Commentaire[] $commentaires */
  566.             $commentaires $this->em->getRepository(Commentaire::class)->findBy(
  567.                 ["prospect" => $prospectArchive->getId()]
  568.             );
  569.             /** @var Commentaire $commentaire */
  570.             foreach ($commentaires as $commentaire){
  571.                 $commentaire->setProspect($prospect);
  572.                 $this->em->persist($commentaire);
  573.                 $histo[] = ["id" => $commentaire->getId()];
  574.             }
  575.             $historique[] = ["commentaires" => $histo];
  576.             $histo = [];
  577.             //5. Fichiers
  578.             /** @var Fichier[] $fichiers */
  579.             $fichiers $this->em->getRepository(Fichier::class)->findBy(
  580.                 ["prospect" => $prospectArchive->getId()]
  581.             );
  582.             /** @var Fichier $fichier */
  583.             foreach ($fichiers as $fichier){
  584.                 $fichier->setProspect($prospect);
  585.                 $this->em->persist($fichier);
  586.                 $histo[] = ["id" => $fichier->getId()];
  587.             }
  588.             $historique[] = ["fichiers" => $histo];
  589.             $histo = [];
  590.             //6.Rdv
  591.             /** @var Rdv[] $rdvs */
  592.             $rdvs $this->em->getRepository(Rdv::class)->findBy(
  593.                 ["prospect" => $prospectArchive->getId()]
  594.             );
  595.             /** @var Rdv $rdv */
  596.             foreach ($rdvs as $rdv){
  597.                 $rdv->setProspect($prospect);
  598.                 $this->em->persist($rdv);
  599.                 $histo[] = ["id" => $rdv->getId()];
  600.             }
  601.             $historique[] = ["rdvs" => $histo];
  602.             // Marquer prospect comme supprimé logiquement
  603.             $prospectArchive->setActive(2);
  604.             $this->em->persist($prospectArchive);
  605.             return [
  606.                 "prospect" => $prospect->getId(),
  607.                 "prospectArchive" => $prospectArchive->getId(),
  608.                 "historique" => $historique,
  609.             ];
  610.         }catch (\Exception $e){
  611.             return $e;
  612.         }
  613.         }
  614.     /*
  615.      * #############################STATS##############################
  616.      */
  617.     /**
  618.      * @Route("/mesobjectifs/{id}", name="api_espaceagent_mesobjectifs", methods={"GET"})
  619.      * @param int $id
  620.      * @return JsonResponse
  621.      */
  622.     public function mesobjectifs(int $id)
  623.     {
  624.         // Chercher les campagnesprospect utilisateur
  625.         /** @var Campagne $campagne */
  626.         $campagne $this->em->getRepository(Campagne::class)->find($id);
  627.         if (!$campagne) {
  628.             return $this->apiKo("Campagne non trouvée !!");
  629.         }
  630.         /*
  631.          * SELECT
  632. cam.id AS id,
  633. cam.objectifagent AS objectif,
  634. COUNT(rdv.id) AS realise
  635. FROM
  636. rdv AS rdv
  637. left join campagne AS cam ON cam.id = rdv.campagne_id
  638. LEFT JOIN  campagnecollaborateur AS camcol ON camcol.campagne_id = cam.id
  639. WHERE camcol.collaborateur_id=1
  640. GROUP BY cam.id
  641.          */
  642.         $realise 0;
  643.         $objectif 10;
  644.         $data = [
  645.             "aujourdhui" => [
  646.                 "realise" => $realise,
  647.                 "objectif" => $objectif
  648.             ],
  649.             "cemois" => [
  650.                 "realise" => 15,
  651.                 "objectif" => 30
  652.             ],
  653.         ];
  654.         return $this->apioK($data);
  655.     }
  656.     /**
  657.      * @Route("/mesappels", name="api_espaceagent_mesappels", methods={"GET"})
  658.      * @return JsonResponse
  659.      */
  660.     public function mesappels()
  661.     {
  662.         $data = [];
  663.         return $this->apioK($data);
  664.     }
  665.     /*
  666.         * #############################AUTRES##############################
  667.         */
  668.     /**
  669.      * @param Campagne $campagne
  670.      * @return object|null
  671.      */
  672.     public function getCampagneprospect(Campagne $campagnebool $getToutRappelPrive false,bool $getToutRappelPartage=false): ?object
  673.     {
  674.         // Débloquer les fichiers réservé pour un collaborateur +24heure
  675.         $yesterday strtotime('-1 day');
  676.         $sqlBloque "
  677.         UPDATE campagneprospect
  678.         SET traitementencore = 0
  679.         WHERE date_format(traitementdate,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s",$yesterday)."' 
  680.         and traitementencore > 0
  681.         ";
  682.         //file_put_contents("temp.json",$sqlBloque);
  683.         try {
  684.             $con $this->em->getConnection();
  685.             $con->executeQuery($sqlBloque);
  686.         } catch (\Exception $e) {
  687.             return $this->apiKo($e->getMessage());
  688.         }
  689.         /** @var Utilisateur $utilisateur */
  690.         $utilisateur $this->getUtilisateurConnecte();
  691.         $idsCampagneRappelPrive "(".$campagne->getId(); // Rappel Privés
  692.         $idsCampagneRappelPartage "(".$campagne->getId(); // Rappel Partagé
  693.         // Si $getToutRappelPrive ou $getToutRappelPartage ===> alors :
  694.         if($getToutRappelPrive == true || $getToutRappelPartage == true) {
  695.             $campagnecollaborateurs $this->em->getRepository(Campagnecollaborateur::class)->findBy(
  696.                   [
  697.                       "collaborateur" => $utilisateur,
  698.                   ]
  699.                 );
  700.             /** @var Campagnecollaborateur $campagnecollaborateur */
  701.             foreach($campagnecollaborateurs as $campagnecollaborateur){
  702.                 if($campagnecollaborateur->getCampagne()->getActive() == 1){
  703.                     if($getToutRappelPrive == true) {
  704.                         $idsCampagneRappelPrive .=",".$campagnecollaborateur->getCampagne()->getId();
  705.                     }
  706.                     if($getToutRappelPartage == true) {
  707.                         $idsCampagneRappelPartage .=",".$campagnecollaborateur->getCampagne()->getId();
  708.                     }
  709.                 }
  710.             }
  711.         }
  712.         $idsCampagneRappelPrive .=")";
  713.         $idsCampagneRappelPartage .=")";
  714.         //1. Chercher Rappel Privé
  715.         $sql "
  716.         SELECT 
  717.                campagneprospect
  718.         FROM " Campagneprospect::class . " as campagneprospect
  719.         LEFT JOIN " Appelstatut::class . " as appelstatut WITH campagneprospect.appelstatut = appelstatut.id
  720.         WHERE date_format(campagneprospect.daterappel,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s")."' 
  721.         AND appelstatut.rappel=true
  722.         AND campagneprospect.rappelprive = 1 AND campagneprospect.utilisateur = ".$utilisateur->getId()."
  723.         AND campagneprospect.campagne in ".$idsCampagneRappelPrive."
  724.         ORDER BY campagneprospect.rappelprive desc,campagneprospect.daterappel asc
  725.         ";
  726.         //file_put_contents("RappelPriv.txt",$sql);
  727.         /** @var Query $query */
  728.         $query $this->em->createQuery($sql);
  729.         $query->setFirstResult(0);
  730.         $query->setMaxResults(1);
  731.         $campagneprsopect $query->getOneOrNullResult();
  732.         if ($campagneprsopect) {
  733.             return $campagneprsopect;
  734.         }
  735.         //2. Chercher Rappel Partagé
  736.         $sql "
  737.         SELECT 
  738.         campagneprospect
  739.         FROM " Campagneprospect::class . " as campagneprospect
  740.         LEFT JOIN " Appelstatut::class . " as appelstatut WITH campagneprospect.appelstatut = appelstatut.id
  741.         WHERE date_format(campagneprospect.daterappel,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s")."' 
  742.         AND appelstatut.rappel=true
  743.         AND campagneprospect.campagne in ".$idsCampagneRappelPartage."
  744.         AND campagneprospect.rappelprive = 0
  745.         AND campagneprospect.traitementencore IN (0,".$utilisateur->getId().")
  746.         ORDER BY campagneprospect.rappelprive desc,campagneprospect.daterappel asc
  747.         ";
  748.         //file_put_contents("RappelPartag.txt",$sql);
  749.         /** @var Query $query */
  750.         $query $this->em->createQuery($sql);
  751.         $query->setFirstResult(0);
  752.         $query->setMaxResults(1);
  753.         /** @var Campagneprospect $campagneprsopect */
  754.         $campagneprsopect $query->getOneOrNullResult();
  755.         if ($campagneprsopect) {
  756.             $campagneprsopect->setUtilisateur($utilisateur);
  757.             $campagneprsopect->setTraitementdate(new \DateTime());
  758.             $campagneprsopect->setTraitementencore($utilisateur->getId());
  759.             $this->em->persist($campagneprsopect);
  760.             $this->em->flush();
  761.             return $campagneprsopect;
  762.         }
  763.         //3. Chercher next prospect
  764.         $campagneprsopects $this->em->getRepository(Campagneprospect::class)->findBy(
  765.             [
  766.                 "campagne" => $campagne,
  767.                 "utilisateur" => $utilisateur,
  768.                 "rappelprive" => -1
  769.             ],
  770.             [
  771.                 "id" => "ASC"
  772.             ]
  773.         );
  774.         if (!$campagneprsopects || sizeof($campagneprsopects) == 0) {
  775.             // affecter campagneprospect au utilisateur
  776.             return $this->autoAffectCampagneprospect($campagne$utilisateur);
  777.         }
  778.         // Si reste un seul campagneprospect, alors ajouter +5 !
  779.         if (sizeof($campagneprsopects) == 1) {
  780.             $this->autoAffectCampagneprospect($campagne$utilisateur);
  781.         }
  782.         // returner le premier dans la liste
  783.         return $campagneprsopects[0];
  784.     }
  785.     /**
  786.      * @param Campagne $campagne
  787.      * @param Utilisateur $utilisateur
  788.      * @return Campagneprospect|null
  789.      */
  790.     public function autoAffectCampagneprospect(Campagne $campagneUtilisateur $utilisateur): ?Campagneprospect
  791.     {
  792.         $campagneprsopectFirst null;
  793.         $campagneprsopects $this->em->getRepository(Campagneprospect::class)->findBy(
  794.             [
  795.                 "campagne" => $campagne,
  796.                 "utilisateur" => null,
  797.                 "rappelprive" => -1
  798.             ],
  799.             [
  800.                 "id" => "ASC"
  801.             ],
  802.             5
  803.         );
  804.         // si pas campagneprospect trouvé alors return null
  805.         if (sizeof($campagneprsopects) == 0) {
  806.             return null;
  807.         }
  808.         /** @var Campagneprospect $campagneprsopect */
  809.         foreach ($campagneprsopects as $campagneprsopect) {
  810.             $campagneprsopect->setUtilisateur($utilisateur);
  811.             $this->em->persist($campagneprsopect);
  812.             if ($campagneprsopectFirst == null) {
  813.                 $campagneprsopectFirst $campagneprsopect;
  814.             }
  815.         }
  816.         $this->em->flush();
  817.         return $campagneprsopectFirst;
  818.     }
  819. }