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

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\Campagneprospectsignalement;
  10. use App\Entity\Cleaningdb;
  11. use App\Entity\Cleaningdbcollaborateur;
  12. use App\Entity\Commentaire;
  13. use App\Entity\Contact;
  14. use App\Entity\Fichier;
  15. use App\Entity\Prospect;
  16. use App\Entity\Prospectdetail;
  17. use App\Entity\Rdv;
  18. use App\Entity\Utilisateur;
  19. use App\Helpers\Mailing;
  20. use Doctrine\ORM\Query;
  21. use Doctrine\ORM\Query\ResultSetMapping;
  22. use phpDocumentor\Reflection\Types\Boolean;
  23. use Symfony\Component\Filesystem\Filesystem;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. /**
  28.  * @Route("/espaceagent")
  29.  */
  30. class ApiEspaceagentController extends ApiController
  31. {
  32.     public function saveTrace(string $trace) {
  33.         //file_put_contents("text.json","azizo");
  34.         // save trace
  35.         $utilisateur $this->getUtilisateurConnecte()->getId();
  36.         $today date("Ymd");
  37.         $repertoire "logs/".$utilisateur;
  38.         if (!is_dir($repertoire)) {
  39.             $filesystem = new Filesystem();
  40.             $filesystem->mkdir($repertoire0700);
  41.         }
  42.         $text PHP_EOL."---------------------".date("Y-m-d H:i:s")."------------------------------".PHP_EOL.$trace;
  43.         file_put_contents($repertoire.'/log_'.$today.'.txt'$text FILE_APPEND LOCK_EX);
  44.     }
  45.     private function buildTransitionMessage($snapshotOuvertureAppelstatut $nouveauStatut, array $dataUtilisateur $utilisateur): string
  46.     {
  47.         $snapshot $snapshotOuverture ?? [];
  48.         $ancienStatut $snapshot['statutActuel']['libelle'] ?? null;
  49.         $ancienDateRappel $snapshot['dateRappel'] ?? null;
  50.         $ancienUtilisateur $snapshot['utilisateur'] ?? null;
  51.         $nouveauDateRappel $nouveauStatut->getRappel() ? ($data['daterappel'] ?? null) : null;
  52.         $typeRappel null;
  53.         if ($nouveauStatut->getRappel()) {
  54.             $partageRappel = isset($data['estpartagerappel']) ? (bool)$data['estpartagerappel'] : false;
  55.             $typeRappel $partageRappel 'rappel partagé' 'rappel ++';
  56.         }
  57.         $ancienStatutLabel $ancienStatut ?: 'non renseigné';
  58.         $nouveauStatutLabel $nouveauStatut->getLibelle() ?: 'non renseigné';
  59.         $ouverturePar $ancienUtilisateur trim($ancienUtilisateur['prenom'] . ' ' $ancienUtilisateur['nom']) : null;
  60.         $affecteA trim($utilisateur->getPrenom() . ' ' $utilisateur->getNom());
  61.         $dateRappelTexte '';
  62.         if ($nouveauDateRappel) {
  63.             try {
  64.                 $dateRappelObjet = new \DateTimeImmutable($nouveauDateRappel);
  65.                 $dateRappelObjet $dateRappelObjet->setTimezone(new \DateTimeZone('Europe/Paris'));
  66.                 $dateRappelTexte $dateRappelObjet->format('d/m/Y à H:i') . ' (Europe/Paris)';
  67.             } catch (\Exception $e) {
  68.                 $dateRappelTexte $nouveauDateRappel;
  69.             }
  70.         } elseif ($ancienDateRappel) {
  71.             try {
  72.                 $dateRappelObjet = new \DateTimeImmutable($ancienDateRappel);
  73.                 $dateRappelObjet $dateRappelObjet->setTimezone(new \DateTimeZone('Europe/Paris'));
  74.                 $dateRappelTexte $dateRappelObjet->format('d/m/Y à H:i') . ' (Europe/Paris)';
  75.             } catch (\Exception $e) {
  76.                 $dateRappelTexte $ancienDateRappel;
  77.             }
  78.         }
  79.         $phrases = [];
  80.         $phrases[] = 'Le statut est passé de <strong>« ' $ancienStatutLabel ' »</strong> à <strong>« ' $nouveauStatutLabel ' »</strong>.';
  81.         if ($dateRappelTexte !== '') {
  82.             $phrases[] = 'Un rappel est prévu le <strong>' $dateRappelTexte '</strong>.';
  83.         }
  84.         if ($typeRappel) {
  85.             $phrases[] = 'Il s’agit d’un <strong>' $typeRappel '</strong>.';
  86.         }
  87.         if ($ouverturePar) {
  88.             $phrases[] = 'La fiche a été ouverte par <strong>' $ouverturePar '</strong>.';
  89.         }
  90.         $phrases[] = 'L’agent en charge est <strong>' $affecteA '</strong>.';
  91.         return '<div class="transition-comment"><p><strong>Transition de la fiche :</strong> ' implode(' '$phrases) . '</p></div>';
  92.     }
  93.     private function buildHistoriqueStatutSnapshot(?array $statut): ?array
  94.     {
  95.         if (!$statut) {
  96.             return null;
  97.         }
  98.         return [
  99.             'id' => $statut['id'] ?? null,
  100.             'libelle' => $statut['libelle'] ?? null,
  101.         ];
  102.     }
  103.     /**
  104.      * @Route("/nextprospect", name="api_espaceagent_nextprospect", methods={"POST"})
  105.      * @param Request $request
  106.      * @return JsonResponse
  107.      */
  108.     public function nextprospect(Request $request)
  109.     {
  110.         $data json_decode($request->getContent(), true);
  111.         $id $data['idCampagne'];
  112.         $getToutRappelPrive $data['getRappelPrive'];
  113.         $getToutRappelPartage $data['getRappelPartage'];
  114.         $trace "Input : ".json_encode($data).PHP_EOL;
  115.         // Chercher les campagnesprospect utilisateur
  116.         /** @var Campagne $campagne */
  117.         $campagne $this->em->getRepository(Campagne::class)->find($id);
  118.         if (!$campagne) {
  119.             return $this->apiKo("Campagne non trouvée !!");
  120.         }
  121.         /** @var Campagneprospect $campagneprospect */
  122.         $campagneprospect $this->getCampagneprospect($campagne,$getToutRappelPrive,$getToutRappelPartage);
  123.         if (!$campagneprospect) {
  124.             $trace .= "OutPut : KO";
  125.             return $this->apiKo("Pas de prospect trouvé. Tous les prospects de la campagne ont été traités !");
  126.         }
  127.         $data = [
  128.             "id" => $campagneprospect->getId(),
  129.             "idCampagne" => $campagneprospect->getCampagne() ? $campagneprospect->getCampagne()->getId() : "",
  130.             "idAppelStatut" => $campagneprospect->getAppelstatut() ? $campagneprospect->getAppelstatut()->getId() : "",
  131.             "rappelprive" => $campagneprospect->getRappelprive(),
  132.             "daterappel" => $campagneprospect->getDaterappel(),
  133.             "idUtilisateur" => $campagneprospect->getUtilisateur() ? $campagneprospect->getUtilisateur()->getId():""
  134.         ];
  135.         $trace .= "OutPut : ".json_encode($data).PHP_EOL;
  136.         $this->saveTrace($trace);
  137.         return $this->apioK($campagneprospect);
  138.     }
  139.     /**
  140.      * @Route("/enregistrerappel", name="api_espaceagent_enregistrerappel", methods={"POST"})
  141.      * @param Request $request
  142.      * @return JsonResponse
  143.      */
  144.     public function enregistrerappel(Request $request)
  145.     {
  146.         $data json_decode($request->getContent(), true);
  147.         try {
  148.             if (!isset($data['prospect'])) {
  149.                 return $this->apiKo("Prospect non trouvé !!");
  150.             }
  151.             if (!isset($data['appelsatut'])) {
  152.                 return $this->apiKo("Statut appel non trouvé !!");
  153.             }
  154.             if (!isset($data['campagneprospect'])) {
  155.                 return $this->apiKo("Campagne prospect non trouvé !!");
  156.             }
  157.             // 1. Update info prospect
  158.             $prospect $this->chercherProspect($data['prospect']);
  159.             $prospect $this->saveProspect($prospect$data['prospect']);
  160.             if (!$prospect instanceof Prospect) {
  161.                 return $this->apiKo($prospect);
  162.             }
  163.             /*
  164.              campagneprospect: {id: this.campagneprospect.id},
  165.             prospect: this.prospect,
  166.             commentaire: this.commentaire,
  167.             appelsatut: {id: this.appelstatutSelected.id},
  168.             daterappel: this.dateRappel,
  169.             estpartagerappel: this.estPartageRappel,
  170.             affectera: {id: affecterA}, // affecter le rappel à
  171.             dureeappel: this.timerSecond,
  172.             contact: this.contactSelected,
  173.             numerotelephone: this.numerotelephone,
  174.             daterdv: this.dateRdv
  175.              */
  176.             /** @var Utilisateur $utilisateur */
  177.             $utilisateur $this->getUtilisateurConnecte();
  178.             /** @var Appelstatut $appelstatut */
  179.             $appelstatut $this->getObject(Appelstatut::class, $data['appelsatut']['id']);
  180.             $numerotelephone "";
  181.             if (isset($data['numerotelephone'])) {
  182.                 $numerotelephone $data['numerotelephone'];
  183.             }
  184.             $sourceOuverture trim((string)($data['sourceouverture'] ?? $data['sourceOuverture'] ?? ''));
  185.             if ($sourceOuverture == '') {
  186.                 $sourceOuverture Appel::SOURCE_INCONNUE;
  187.             }
  188.             // 2. Commentaires
  189.             /** @var Commentaire $commentaire */
  190.             $commentaire = new Commentaire();
  191.             $commentaire->setProspect($prospect);
  192.             $commentaire->setUtilisateur($utilisateur);
  193.             $commentaire->setDate(new \DateTime());
  194.             $messageCommentaire trim((string)($data['commentaire'] ?? ''));
  195.             $transitionMessage $this->buildTransitionMessage($data['snapshotouverture'] ?? null$appelstatut$data$utilisateur);
  196.             if ($messageCommentaire !== '') {
  197.                 $commentaire->setMessage($messageCommentaire '<br><br>' $transitionMessage);
  198.             } else {
  199.                 $commentaire->setMessage($transitionMessage);
  200.             }
  201.             $this->em->persist($commentaire);
  202.             $this->em->flush();
  203.             $commentairereponsable = new Commentaire();
  204.             $commentairereponsable->setDate(new \DateTime());
  205.             $commentairereponsable->setMessage("");
  206.             $this->em->persist($commentairereponsable);
  207.             $this->em->flush();
  208.             // 3. Update campagne prospect
  209.             /** @var Campagneprospect $campagneprospect */
  210.             $campagneprospect $this->getObject(Campagneprospect::class, $data['campagneprospect']['id']);
  211.             // contact !
  212.             if (isset($data['contact'])) {
  213.                 $historique $campagneprospect->getHistorique();
  214.                 if (is_null($historique) || $historique == "null") {
  215.                     $historique = array([]);
  216.                 }
  217.                 $historique[] = [
  218.                     "contact" => $data['contact']['id'],
  219.                     "appelstatut" => $appelstatut->getLibelle()
  220.                 ];
  221.                 $campagneprospect->setHistorique($historique);
  222.             }
  223.             $campagneprospect->setCommentaire($data['commentaire']);
  224.             $campagneprospect->setAppelstatut($appelstatut);
  225.             $campagneprospect->setRappelprive(2);
  226.             $campagneprospect->setTraitementdate(new \DateTime());
  227.             $campagneprospect->setTraitementencore(0);
  228.             $campagneprospect->setTraitementpar($utilisateur);
  229.             $campagneprospect->setUtilisateur($utilisateur); // Par defaut : affecté à utilisateur connecté
  230.             $campagneprospect->setDaterappel(null);
  231.             // TRAITER LE CAS RAPPELL
  232.             if ($appelstatut->getRappel() && isset($data['estpartagerappel']) && isset($data['daterappel'])) {
  233.                 $campagneprospect->setRappelprive(!$data['estpartagerappel']);
  234.                 $campagneprospect->setDaterappel(new \DateTime($data['daterappel']));
  235.                 // cas rappel privé avec affectation à un autre collaborateur
  236.                 if(!$data['estpartagerappel'] == true) {
  237.                     $affecterA 0;
  238.                     if (isset($data['affectera']) && isset($data['affectera']['id'])) {
  239.                         $affecterA $data['affectera']['id'];
  240.                     }
  241.                     if ($affecterA && $affecterA != $utilisateur->getId()) {
  242.                         $collaborateur $this->getObject(Utilisateur::class,$affecterA);
  243.                         if($collaborateur){
  244.                             $campagneprospect->setUtilisateur($collaborateur);
  245.                         }
  246.                     }
  247.                 }
  248.             }
  249.             $this->em->persist($campagneprospect);
  250.             // 3. Historique des appels
  251.             $historique $campagneprospect->getHistorique();
  252.             if (is_null($historique) || $historique === 'null') {
  253.                 $historique = [];
  254.             }
  255.             $historique[] = [
  256.                 'type' => 'statut_fiche',
  257.                 'date' => (new \DateTime())->format('c'),
  258.                 'sourceOuverture' => $sourceOuverture,
  259.                 'ancienStatut' => $this->buildHistoriqueStatutSnapshot($data['snapshotouverture']['statutActuel'] ?? null),
  260.                 'nouveauStatut' => $this->buildHistoriqueStatutSnapshot([
  261.                     'id' => $appelstatut->getId(),
  262.                     'libelle' => $appelstatut->getLibelle()
  263.                 ]),
  264.                 'dateRappel' => $appelstatut->getRappel() && isset($data['daterappel']) ? $data['daterappel'] : null,
  265.                 'rappelPrive' => $appelstatut->getRappel() ? (!$data['estpartagerappel'] ? 0) : null,
  266.                 'utilisateur' => [
  267.                     'id' => $utilisateur->getId(),
  268.                     'nom' => $utilisateur->getNom(),
  269.                     'prenom' => $utilisateur->getPrenom()
  270.                 ],
  271.                 'message' => $transitionMessage
  272.             ];
  273.             $campagneprospect->setHistorique($historique);
  274.             /** @var Appel $appel */
  275.             $appel = new Appel();
  276.             $appel->setUtilisateur($utilisateur);
  277.             $appel->setCampagneprospect($campagneprospect);
  278.             $appel->setDateappel(new \DateTime());
  279.             $appel->setAppelstatut($appelstatut);
  280.             $appel->setDureeappel($data['dureeappel']);
  281.             $appel->setNumerotelephone($numerotelephone);
  282.             $appel->setSourceouverture($sourceOuverture);
  283.             $appel->setCommentaire($commentaire);
  284.             $this->em->persist($appel);
  285.             // TRAITER LE CAS RDV
  286.             if ($appelstatut->getRdv() && isset($data['daterdv'])) {
  287.                 $rdv = new Rdv();
  288.                 $rdv->setUtilisateur($utilisateur);
  289.                 $rdv->setProspect($prospect);
  290.                 $rdv->setCampagne($campagneprospect->getCampagne());
  291.                 $rdv->setDaterdv(new \DateTime($data['daterdv']));
  292.                 $rdv->setDatecreation(new \DateTime());
  293.                 $rdv->setDatemodification(new \DateTime());
  294.                 $rdv->setCommentaire($commentaire);
  295.                 $rdv->setCommentaireresponsable($commentairereponsable);
  296.                 // contact !
  297.                 if (isset($data['contact']) && isset($data['contact']['id'])) {
  298.                     /** @var Contact $contact */
  299.                     $contact $this->getObject(Contact::class, $data['contact']['id']);
  300.                     if ($contact) {
  301.                         $rdv->setContact($contact);
  302.                     }
  303.                 }
  304.                 $this->em->persist($rdv);
  305.                 // Notification
  306.                 (new Mailing($this->mailer$this->templating))->notificationstatutrdv($rdv);
  307.             }
  308.             //TRAITER LE CAS FICHEQUALIFIE
  309.             if ($appelstatut->getFichequalifie() || $appelstatut->getFichearequalifie()) {
  310.                 // Transférer fiche vers campagne cible
  311.                 $campagnecibleId $campagneprospect->getCampagne()->getCampagnecible();
  312.                 if($campagnecibleId>0){
  313.                     $campagnecible $this->getObject(Campagne::class,$campagnecibleId);
  314.                     if($campagnecible){
  315.                         // verifier l'existance prospect dans la campagne
  316.                         /** @var Campagneprospect $campagneprospectCible */
  317.                         $campagneprospectCible $this->em->getRepository(Campagneprospect::class)->findOneBy(
  318.                             ["prospect" => $prospect,"campagne" => $campagnecible]
  319.                         );
  320.                         if(!$campagneprospectCible){
  321.                             $campagneprospectCible = new Campagneprospect();
  322.                             $campagneprospectCible->setProspect($prospect);
  323.                             $campagneprospectCible->setCampagne($campagnecible);
  324.                         }else{
  325.                             $campagneprospectCible->setAppelstatut(null);
  326.                             $campagneprospectCible->setUtilisateur(null);
  327.                             $campagneprospectCible->setRappelprive(-1);
  328.                             $campagneprospectCible->setDaterappel(null);
  329.                         }
  330.                         $campagneprospectCible->setCommentaire($campagneprospect->getCommentaire());
  331.                         $this->em->persist($campagneprospectCible);
  332.                     }
  333.                 }
  334.             }
  335.             // Flush modification dans la bdd
  336.             $this->em->flush();
  337.             return $this->apioK("1");
  338.         } catch (\Exception $e) {
  339.             //throw $e;
  340.             return $this->apiKo($e->getMessage());
  341.         }
  342.     }
  343.     /////////////////////////////////////// ACTION CLEANING DB ///////////////////////////
  344.     /**
  345.      * @Route("/activecleaningdb", name="api_espaceagent_activecleaningdb", methods={"GET"})
  346.      * @return JsonResponse
  347.      */
  348.     public function activecleaningdb()
  349.     {
  350.         /** @var Cleaningdbcollaborateur $cleaningCollaborateur */
  351.         $cleaningCollaborateur $this->em->getRepository(Cleaningdbcollaborateur::class)->findOneBy(
  352.           [
  353.               "collaborateur" => $this->getUtilisateurConnecte()->getId()
  354.           ]
  355.         );
  356.         if($cleaningCollaborateur == null){
  357.             return $this->apioK(false);
  358.         }
  359.         return $this->apioK(true);
  360.     }
  361.     /**
  362.      * @Route("/verifierdoublon/{id}", name="api_espaceagent_verifierdoublon", methods={"GET"})
  363.      * @param int $id
  364.      * @return JsonResponse
  365.      */
  366.     public function verifierdoublon(int $id)
  367.     {
  368.         if($id == null && $id<=0){
  369.             return $this->apiOk([]);
  370.         }
  371.         $sql "SELECT
  372.                 p.id as id,
  373.                 p.doublonSiret as siret,
  374.                 p.doublonStandard as standard
  375.                 FROM prospectdoublon AS p
  376.                 WHERE p.id NOT IN (SELECT c.uid FROM cleaningdb as c WHERE c.action <>0) 
  377.                 AND (p.id like '%-".$id."' OR p.id like '".$id."-%') LIMIT 1";
  378.         $rsm = new ResultSetMapping();
  379.         $rsm->addScalarResult('id','id');
  380.         $rsm->addScalarResult('siret','siret');
  381.         $rsm->addScalarResult('standard','standard');
  382.         $items $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
  383.         $reponse = [];
  384.         foreach ($items as $item){
  385.             $reponse = [
  386.                 "estdoublon" => true,
  387.                 "standard" => (int) $item["standard"],
  388.                 "siret" => (int) $item["siret"],
  389.                 "uid" => $item["id"]
  390.             ];
  391.         }
  392.         return $this->apiOk($reponse);
  393.     }
  394.     /**
  395.      * @Route("/ouvrirdoublon/{uid}", name="api_espaceagent_ouvrirdoublon", methods={"GET"})
  396.      * @param string $uid
  397.      * @return JsonResponse
  398.      */
  399.     public function ouvrirdoublon(string $uid)
  400.     {
  401.         if(!isset($uid)){
  402.             return $this->apiOk([]);
  403.         }
  404.         /** @var Utilisateur $utilisateur */
  405.         $utilisateur $this->getUtilisateurConnecte();
  406.         /** @var Cleaningdb $cleaningdb */
  407.         $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy(
  408.             [
  409.                 "uid" =>$uid
  410.             ]
  411.         );
  412.         if($cleaningdb != null){
  413.             $cleaningdb->setUtilisateur($utilisateur);
  414.             $this->em->persist($cleaningdb);
  415.             $this->em->flush();
  416.         }else{
  417.             $sql "SELECT
  418.                 p.id as id,
  419.                 p.societe as societe,
  420.                 p.siret as siret,
  421.                 p.standard as standard
  422.                 FROM prospectdoublon AS p
  423.                 WHERE p.id = '".$uid."'
  424.                 LIMIT 1";
  425.             $rsm = new ResultSetMapping();
  426.             $rsm->addScalarResult('id','id');
  427.             $rsm->addScalarResult('societe','societe');
  428.             $rsm->addScalarResult('siret','siret');
  429.             $rsm->addScalarResult('standard','standard');
  430.             $items $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
  431.             foreach ($items as $item){
  432.                 $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy([
  433.                     "uid" => $item["id"]
  434.                 ]);
  435.                 if($cleaningdb == null){
  436.                     $cleaningdb = new Cleaningdb();
  437.                     $cleaningdb->setAction(0);
  438.                     $cleaningdb->setUtilisateur($utilisateur);
  439.                     $cleaningdb->setUid($item["id"] );
  440.                     $cleaningdb->setSociete($item["societe"] );
  441.                     $cleaningdb->setSiret($item["siret"] );
  442.                     $cleaningdb->setStandard($item["standard"] );
  443.                     $this->em->persist($cleaningdb);
  444.                     $this->em->flush();
  445.                 }
  446.             }
  447.         }
  448.         if($cleaningdb != null && $cleaningdb->getId()>0){
  449.             // retourn les prospect doublon
  450.             $ids explode("-",$cleaningdb->getUid());
  451.             /** @var Prospect[] $prospects */
  452.             $prospects $this->em->getRepository(Prospect::class)->findBy([
  453.                 "id" => $ids
  454.             ]);
  455.             $data = [
  456.                 "id" => $cleaningdb->getId(),
  457.                 "prospects" => $prospects,
  458.                 "erreurMessage" => "",
  459.                 "erreur" => false,
  460.             ];
  461.         }else{
  462.             $data = [
  463.                 "id" => "",
  464.                 "prospects" => [],
  465.                 "erreurMessage" => "Pas de prospect doublons trouvé !",
  466.                 "erreur" => true,
  467.             ];
  468.         }
  469.         return $this->apiOk($data);
  470.     }
  471.     /**
  472.      * @Route("/nextprospectdoublon", name="api_espaceagent_nextprospectdoublon", methods={"POST"})
  473.      * @param Request $request
  474.      * @return JsonResponse
  475.      */
  476.     public function nextprospectdoublon(Request $request)
  477.     {
  478.         /** @var Utilisateur $utilisateur */
  479.         $utilisateur $this->getUtilisateurConnecte();
  480.         // Recuperer Next Element à traiter
  481.         /** @var Cleaningdb $cleaningdb */
  482.         $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy(
  483.             [
  484.                 "utilisateur" => $utilisateur->getId(),
  485.                 "action" => 0
  486.             ]
  487.         );
  488.         if($cleaningdb == null){
  489.             $sql "SELECT
  490.                 p.id as id,
  491.                 p.societe as societe,
  492.                 p.siret as siret,
  493.                 p.standard as standard
  494.                 FROM prospectdoublon AS p
  495.                 WHERE p.id NOT IN (SELECT c.uid FROM cleaningdb AS c ) 
  496.                 LIMIT 2";
  497.             $rsm = new ResultSetMapping();
  498.             $rsm->addScalarResult('id','id');
  499.             $rsm->addScalarResult('societe','societe');
  500.             $rsm->addScalarResult('siret','siret');
  501.             $rsm->addScalarResult('standard','standard');
  502.             $items $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
  503.             foreach ($items as $item){
  504.                 $cleaningdb $this->em->getRepository(Cleaningdb::class)->findOneBy([
  505.                     "uid" => $item["id"]
  506.                 ]);
  507.                 if($cleaningdb == null){
  508.                     $cleaningdb = new Cleaningdb();
  509.                     $cleaningdb->setAction(0);
  510.                     $cleaningdb->setUtilisateur($utilisateur);
  511.                     $cleaningdb->setUid($item["id"] );
  512.                     $cleaningdb->setSociete($item["societe"] );
  513.                     $cleaningdb->setSiret($item["siret"] );
  514.                     $cleaningdb->setStandard($item["standard"] );
  515.                     $this->em->persist($cleaningdb);
  516.                     $this->em->flush();
  517.                 }
  518.             }
  519.         }
  520.         if($cleaningdb != null && $cleaningdb->getId()>0){
  521.             // retourn les prospect doublon
  522.             $ids explode("-",$cleaningdb->getUid());
  523.             /** @var Prospect[] $prospects */
  524.             $prospects $this->em->getRepository(Prospect::class)->findBy([
  525.                 "id" => $ids
  526.             ]);
  527.             $data = [
  528.                 "id" => $cleaningdb->getId(),
  529.                 "prospects" => $prospects,
  530.                 "erreurMessage" => "",
  531.                 "erreur" => false,
  532.             ];
  533.         }else{
  534.             $data = [
  535.                 "id" => $cleaningdb->getId(),
  536.                 "prospects" => [],
  537.                 "erreurMessage" => "Pas de prospect doublons trouvé !",
  538.                 "erreur" => true,
  539.             ];
  540.         }
  541.         return $this->apiOk($data);
  542.     }
  543.     /**
  544.      * @Route("/enregistrerdoublon", name="api_espaceagent_enregistrerdoublon", methods={"POST"})
  545.      * @param Request $request
  546.      * @return JsonResponse
  547.      */
  548.     public function enregistrerdoublon(Request $request)
  549.     {
  550.         $data json_decode($request->getContent(), true);
  551.         if(!isset($data["id"])
  552.         || !isset($data["deletedProspects"])
  553.         || !isset($data["savedProspects"])
  554.         || !isset($data["prospectdetail"])
  555.         || !isset($data["prospect"])
  556.         || !isset($data["appreils"])
  557.         || !isset($data["contacts"])
  558.         ){
  559.             return $this->apiKo("Object des données n'est pas valide !");
  560.         }
  561.         $id $data["id"];
  562.         /** @var Cleaningdb $cleaningdb */
  563.         $cleaningdb $this->getObject(Cleaningdb::class,$id);
  564.         if($cleaningdb == null){
  565.             return $this->apiKo("Object des données n'est pas valide !");
  566.         }
  567.        //return $this->apiOk("OK");// a supprimer
  568.         $this->em->getConnection()->beginTransaction();
  569.         try {
  570.            //1. update prospect gardé
  571.             $prospect $this->getObject(Prospect::class,$data["prospect"]["id"]);
  572.             $result $this->saveProspect($prospect,$data["prospect"]);
  573.             if(!($result instanceof Prospect)){
  574.                 throw new \Exception($result);
  575.             }
  576.             $prospectdetail $this->saveProspectdetail($prospect$data["prospectdetail"]);
  577.             if(!($prospectdetail instanceof Prospectdetail)){
  578.                 throw new \Exception($prospectdetail);
  579.             }
  580.             //2. archivé les doublons
  581.             $ids $data["deletedProspects"];
  582.             $historique = [];
  583.             foreach ($ids as $id){
  584.                 /** @var Prospect $prospectArchive */
  585.                 $prospectArchive $this->getObject(Prospect::class,$id);
  586.                 if($prospectArchive != null){
  587.                     $historique =  $this->ArchiverProspect($prospect,$prospectArchive);
  588.                 }
  589.             }
  590.             if($historique instanceof \Exception){
  591.                 throw $historique;
  592.             }
  593.             $cleaningdb->setHistorique($historique);
  594.             $this->em->getConnection()->commit();
  595.             $cleaningdb->setDeletedObjects($data["deletedProspects"]);
  596.             $cleaningdb->setSavedObjects($data["savedProspects"]);
  597.             $cleaningdb->setAction(1);
  598.             return $this->apioK("1");
  599.         } catch (\Exception $e) {
  600.             $this->em->getConnection()->rollBack();
  601.             $cleaningdb->setAction(-1);
  602.             $cleaningdb->setCommentaire($e->getMessage());
  603.             return $this->apiKo($e->getMessage());
  604.         } finally {
  605.             $this->em->persist($cleaningdb);
  606.             $this->em->flush();
  607.         }
  608.     }
  609.     /**
  610.      * @param int $id
  611.      */
  612.         public function ArchiverProspect(Prospect $prospect,Prospect $prospectArchive){
  613.             $historique = [];
  614.             $histo = [];
  615.         try{
  616.             //1. Transfert Contacts
  617.             /** @var Contact[] $contacts */
  618.             $contacts $this->em->getRepository(Contact::class)->findBy(
  619.                 ["prospect" => $prospectArchive->getId()]
  620.             );
  621.             /** @var Contact $contact */
  622.             foreach ($contacts as $contact){
  623.                 $contact->setProspect($prospect);
  624.                 $this->em->persist($contact);
  625.                 $histo[] = ["id" => $contact->getId()];
  626.             }
  627.             $historique[] = ["contacts" => $histo];
  628.             $histo = [];
  629.             //2. Appareils
  630.             /** @var Appareil[] $appareils */
  631.             $appareils $this->em->getRepository(Appareil::class)->findBy(
  632.                 ["prospect" => $prospectArchive->getId()]
  633.             );
  634.             /** @var Appareil $appareil */
  635.             foreach ($appareils as $appareil){
  636.                 $appareil->setProspect($prospect);
  637.                 $this->em->persist($appareil);
  638.                 $histo[] = ["id" => $appareil->getId()];
  639.             }
  640.             $historique[] = ["appareils" => $histo];
  641.             $histo = [];
  642.             //3. CampagneProspect
  643.             /** @var Campagneprospect[] $campagneprospects */
  644.             $campagneprospects $this->em->getRepository(Campagneprospect::class)->findBy(
  645.                 ["prospect" => $prospectArchive->getId()]
  646.             );
  647.             /** @var Campagneprospect $campagneprospect */
  648.             foreach ($campagneprospects as $campagneprospect){
  649.                 $campagneprospect->setProspect($prospect);
  650.                 $this->em->persist($campagneprospect);
  651.                 $histo[] = ["id" => $campagneprospect->getId()];
  652.             }
  653.             $historique[] = ["campagneprospects" => $histo];
  654.             $histo = [];
  655.             //4.Commentaires
  656.             /** @var Commentaire[] $commentaires */
  657.             $commentaires $this->em->getRepository(Commentaire::class)->findBy(
  658.                 ["prospect" => $prospectArchive->getId()]
  659.             );
  660.             /** @var Commentaire $commentaire */
  661.             foreach ($commentaires as $commentaire){
  662.                 $commentaire->setProspect($prospect);
  663.                 $this->em->persist($commentaire);
  664.                 $histo[] = ["id" => $commentaire->getId()];
  665.             }
  666.             $historique[] = ["commentaires" => $histo];
  667.             $histo = [];
  668.             //5. Fichiers
  669.             /** @var Fichier[] $fichiers */
  670.             $fichiers $this->em->getRepository(Fichier::class)->findBy(
  671.                 ["prospect" => $prospectArchive->getId()]
  672.             );
  673.             /** @var Fichier $fichier */
  674.             foreach ($fichiers as $fichier){
  675.                 $fichier->setProspect($prospect);
  676.                 $this->em->persist($fichier);
  677.                 $histo[] = ["id" => $fichier->getId()];
  678.             }
  679.             $historique[] = ["fichiers" => $histo];
  680.             $histo = [];
  681.             //6.Rdv
  682.             /** @var Rdv[] $rdvs */
  683.             $rdvs $this->em->getRepository(Rdv::class)->findBy(
  684.                 ["prospect" => $prospectArchive->getId()]
  685.             );
  686.             /** @var Rdv $rdv */
  687.             foreach ($rdvs as $rdv){
  688.                 $rdv->setProspect($prospect);
  689.                 $this->em->persist($rdv);
  690.                 $histo[] = ["id" => $rdv->getId()];
  691.             }
  692.             $historique[] = ["rdvs" => $histo];
  693.             // Marquer prospect comme supprimé logiquement
  694.             $prospectArchive->setActive(2);
  695.             $this->em->persist($prospectArchive);
  696.             return [
  697.                 "prospect" => $prospect->getId(),
  698.                 "prospectArchive" => $prospectArchive->getId(),
  699.                 "historique" => $historique,
  700.             ];
  701.         }catch (\Exception $e){
  702.             return $e;
  703.         }
  704.         }
  705.     /*
  706.      * #############################STATS##############################
  707.      */
  708.     /**
  709.      * @Route("/mesobjectifs/{id}", name="api_espaceagent_mesobjectifs", methods={"GET"})
  710.      * @param int $id
  711.      * @return JsonResponse
  712.      */
  713.     public function mesobjectifs(int $id)
  714.     {
  715.         // Chercher les campagnesprospect utilisateur
  716.         /** @var Campagne $campagne */
  717.         $campagne $this->em->getRepository(Campagne::class)->find($id);
  718.         if (!$campagne) {
  719.             return $this->apiKo("Campagne non trouvée !!");
  720.         }
  721.         /*
  722.          * SELECT
  723. cam.id AS id,
  724. cam.objectifagent AS objectif,
  725. COUNT(rdv.id) AS realise
  726. FROM
  727. rdv AS rdv
  728. left join campagne AS cam ON cam.id = rdv.campagne_id
  729. LEFT JOIN  campagnecollaborateur AS camcol ON camcol.campagne_id = cam.id
  730. WHERE camcol.collaborateur_id=1
  731. GROUP BY cam.id
  732.          */
  733.         $realise 0;
  734.         $objectif 10;
  735.         $data = [
  736.             "aujourdhui" => [
  737.                 "realise" => $realise,
  738.                 "objectif" => $objectif
  739.             ],
  740.             "cemois" => [
  741.                 "realise" => 15,
  742.                 "objectif" => 30
  743.             ],
  744.         ];
  745.         return $this->apioK($data);
  746.     }
  747.     /**
  748.      * @Route("/mesappels", name="api_espaceagent_mesappels", methods={"GET"})
  749.      * @return JsonResponse
  750.      */
  751.     public function mesappels()
  752.     {
  753.         $data = [];
  754.         return $this->apioK($data);
  755.     }
  756.     /**
  757.      * @Route("/signalementficheauto", name="api_espaceagent_signalementficheauto", methods={"POST"})
  758.      * @param Request $request
  759.      * @return JsonResponse
  760.      */
  761.     public function signalementficheauto(Request $request)
  762.     {
  763.         $data json_decode($request->getContent(), true);
  764.         if (!is_array($data)) {
  765.             return $this->apiKo("Requete invalide !");
  766.         }
  767.         if (!isset($data['campagneprospect']['id'])) {
  768.             return $this->apiKo("Campagne prospect non trouvee !");
  769.         }
  770.         $sourceOuverture trim((string)($data['sourceouverture'] ?? $data['sourceOuverture'] ?? ''));
  771.         if ($sourceOuverture !== Appel::SOURCE_AUTO_MISSION) {
  772.             return $this->apiKo("Le signalement est reserve au mode auto !");
  773.         }
  774.         $typeProbleme trim((string)($data['typeprobleme'] ?? $data['typeProbleme'] ?? ''));
  775.         if (!in_array($typeProblemeCampagneprospectsignalement::getTypesProbleme(), true)) {
  776.             return $this->apiKo("Type de probleme invalide !");
  777.         }
  778.         $motifDetaille trim((string)($data['motifdetaille'] ?? $data['motifDetaille'] ?? ''));
  779.         if (mb_strlen($motifDetaille) < 10) {
  780.             return $this->apiKo("Le motif detaille doit contenir au moins 10 caracteres !");
  781.         }
  782.         /** @var Utilisateur $utilisateur */
  783.         $utilisateur $this->getUtilisateurConnecte();
  784.         /** @var Campagneprospect|null $campagneprospect */
  785.         $campagneprospect $this->em->getRepository(Campagneprospect::class)->find($data['campagneprospect']['id']);
  786.         if (!$campagneprospect) {
  787.             return $this->apiKo("Campagne prospect non trouvee !");
  788.         }
  789.         if ($campagneprospect->getUtilisateur() && $campagneprospect->getUtilisateur()->getId() !== $utilisateur->getId()) {
  790.             return $this->apiKo("Cette fiche n'est pas affectee a l'utilisateur connecte !");
  791.         }
  792.         if (!$campagneprospect->getCampagne() || !$campagneprospect->getProspect()) {
  793.             return $this->apiKo("La fiche n'est pas exploitable pour un signalement !");
  794.         }
  795.         $signalementExistant $this->em
  796.             ->getRepository(Campagneprospectsignalement::class)
  797.             ->findByCampagneprospectAndUtilisateur($campagneprospect$utilisateur);
  798.         if ($signalementExistant) {
  799.             return $this->apiKo("Un signalement existe deja pour cette fiche et cet utilisateur !");
  800.         }
  801.         $dateOuvertureValue trim((string)($data['dateouverturefiche'] ?? $data['dateOuvertureFiche'] ?? ''));
  802.         try {
  803.             $dateOuvertureFiche $dateOuvertureValue !== '' ? new \DateTime($dateOuvertureValue) : new \DateTime();
  804.         } catch (\Exception $e) {
  805.             return $this->apiKo("Date d'ouverture de fiche invalide !");
  806.         }
  807.         $datesignalement = new \DateTime();
  808.         $signalement = new Campagneprospectsignalement();
  809.         $signalement->setCampagneprospect($campagneprospect);
  810.         $signalement->setCampagne($campagneprospect->getCampagne());
  811.         $signalement->setProspect($campagneprospect->getProspect());
  812.         $signalement->setUtilisateur($utilisateur);
  813.         $signalement->setTypeprobleme($typeProbleme);
  814.         $signalement->setMotifdetaille($motifDetaille);
  815.         $signalement->setSourceouverture($sourceOuverture);
  816.         $signalement->setDateouverturefiche($dateOuvertureFiche);
  817.         $signalement->setDatesignalement($datesignalement);
  818.         $signalement->setStatuttraitement(Campagneprospectsignalement::STATUT_OUVERT);
  819.         $signalement->setMailenvoye(false);
  820.         $signalement->setActifpourblocageauto(true);
  821.         $signalement->setDateblocageauto($datesignalement);
  822.         $signalement->setSnapshot($this->buildSignalementSnapshot($campagneprospect$utilisateur$typeProbleme$motifDetaille$dateOuvertureFiche$datesignalement));
  823.         $this->em->persist($signalement);
  824.         $this->em->flush();
  825.         $mailing = new Mailing($this->mailer$this->templating);
  826.         $mailResult $mailing->notificationSignalementFicheAuto($signalement);
  827.         if ($mailResult instanceof \Exception || $mailResult === false || $mailResult === 0) {
  828.             $signalement->setMailenvoye(false);
  829.             $signalement->setErreurmail($mailResult instanceof \Exception $mailResult->getMessage() : "Echec d'envoi du mail de signalement.");
  830.         } else {
  831.             $signalement->setMailenvoye(true);
  832.             $signalement->setDateenvoimail(new \DateTime());
  833.             $signalement->setErreurmail(null);
  834.         }
  835.         $this->em->persist($signalement);
  836.         $this->em->flush();
  837.         return $this->apiOk([
  838.             'success' => true,
  839.             'idSignalement' => $signalement->getId(),
  840.             'mailenvoye' => $signalement->getMailenvoye(),
  841.         ], false);
  842.     }
  843.     /*
  844.         * #############################AUTRES##############################
  845.         */
  846.     private function hasActiveSignalementBlocage(Campagneprospect $campagneprospect): bool
  847.     {
  848.         return $this->em
  849.             ->getRepository(Campagneprospectsignalement::class)
  850.             ->hasActiveAutoBlock($campagneprospect);
  851.     }
  852.     private function determineModeSelectionAuto(Campagneprospect $campagneprospect): string
  853.     {
  854.         if ($campagneprospect->getRappelprive() === 1) {
  855.             return 'RAPPEL_PRIVE';
  856.         }
  857.         if ($campagneprospect->getRappelprive() === 0) {
  858.             return 'RAPPEL_PARTAGE';
  859.         }
  860.         return 'NOUVELLE_FICHE';
  861.     }
  862.     private function buildSignalementSnapshot(
  863.         Campagneprospect $campagneprospect,
  864.         Utilisateur $utilisateur,
  865.         string $typeProbleme,
  866.         string $motifDetaille,
  867.         \DateTimeInterface $dateOuvertureFiche,
  868.         \DateTimeInterface $dateSignalement
  869.     ): array {
  870.         $campagne $campagneprospect->getCampagne();
  871.         $prospect $campagneprospect->getProspect();
  872.         $appelstatut $campagneprospect->getAppelstatut();
  873.         $utilisateurAffecte $campagneprospect->getUtilisateur();
  874.         $traitementpar $campagneprospect->getTraitementpar();
  875.         return [
  876.             'typeprobleme' => $typeProbleme,
  877.             'motifdetaille' => $motifDetaille,
  878.             'sourceouverture' => Appel::SOURCE_AUTO_MISSION,
  879.             'modeSelectionAuto' => $this->determineModeSelectionAuto($campagneprospect),
  880.             'dateouverturefiche' => $dateOuvertureFiche->format(DATE_ATOM),
  881.             'datesignalement' => $dateSignalement->format(DATE_ATOM),
  882.             'campagneprospect' => [
  883.                 'id' => $campagneprospect->getId(),
  884.                 'rappelprive' => $campagneprospect->getRappelprive(),
  885.                 'daterappel' => $campagneprospect->getDaterappel() ? $campagneprospect->getDaterappel()->format(DATE_ATOM) : null,
  886.                 'commentaire' => $campagneprospect->getCommentaire(),
  887.                 'historique' => $campagneprospect->getHistorique(),
  888.                 'traitementdate' => $campagneprospect->getTraitementdate() ? $campagneprospect->getTraitementdate()->format(DATE_ATOM) : null,
  889.                 'traitementencore' => $campagneprospect->getTraitementencore(),
  890.             ],
  891.             'campagne' => [
  892.                 'id' => $campagne $campagne->getId() : null,
  893.                 'libelle' => $campagne $campagne->getLibelle() : null,
  894.             ],
  895.             'prospect' => [
  896.                 'id' => $prospect $prospect->getId() : null,
  897.                 'societe' => $prospect $prospect->getSociete() : null,
  898.                 'siret' => $prospect $prospect->getSiret() : null,
  899.                 'standard' => $prospect $prospect->getStandard() : null,
  900.                 'email' => $prospect $prospect->getEmail() : null,
  901.             ],
  902.             'appelstatut' => [
  903.                 'id' => $appelstatut $appelstatut->getId() : null,
  904.                 'libelle' => $appelstatut $appelstatut->getLibelle() : null,
  905.                 'horscible' => $appelstatut $appelstatut->getHorscible() : null,
  906.                 'rappel' => $appelstatut $appelstatut->getRappel() : null,
  907.                 'rdv' => $appelstatut $appelstatut->getRdv() : null,
  908.             ],
  909.             'utilisateurouverture' => [
  910.                 'id' => $utilisateur->getId(),
  911.                 'nom' => $utilisateur->getNom(),
  912.                 'prenom' => $utilisateur->getPrenom(),
  913.                 'email' => $utilisateur->getEmail(),
  914.                 'username' => $utilisateur->getUsername(),
  915.             ],
  916.             'utilisateuraffecte' => [
  917.                 'id' => $utilisateurAffecte $utilisateurAffecte->getId() : null,
  918.                 'nom' => $utilisateurAffecte $utilisateurAffecte->getNom() : null,
  919.                 'prenom' => $utilisateurAffecte $utilisateurAffecte->getPrenom() : null,
  920.                 'email' => $utilisateurAffecte $utilisateurAffecte->getEmail() : null,
  921.             ],
  922.             'traitementpar' => [
  923.                 'id' => $traitementpar $traitementpar->getId() : null,
  924.                 'nom' => $traitementpar $traitementpar->getNom() : null,
  925.                 'prenom' => $traitementpar $traitementpar->getPrenom() : null,
  926.                 'email' => $traitementpar $traitementpar->getEmail() : null,
  927.             ],
  928.         ];
  929.     }
  930.     /**
  931.      * @param Campagne $campagne
  932.      * @return object|null
  933.      */
  934.     public function getCampagneprospect(Campagne $campagnebool $getToutRappelPrive false,bool $getToutRappelPartage=false): ?object
  935.     {
  936.         // Débloquer les fichiers réservé pour un collaborateur +24heure
  937.         $yesterday strtotime('-1 day');
  938.         $sqlBloque "
  939.         UPDATE campagneprospect
  940.         SET traitementencore = 0
  941.         WHERE date_format(traitementdate,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s",$yesterday)."' 
  942.         and traitementencore > 0
  943.         ";
  944.         //file_put_contents("temp.json",$sqlBloque);
  945.         try {
  946.             $con $this->em->getConnection();
  947.             $con->executeQuery($sqlBloque);
  948.         } catch (\Exception $e) {
  949.             return $this->apiKo($e->getMessage());
  950.         }
  951.         /** @var Utilisateur $utilisateur */
  952.         $utilisateur $this->getUtilisateurConnecte();
  953.         $idsCampagneRappelPrive "(".$campagne->getId(); // Rappel Privés
  954.         $idsCampagneRappelPartage "(".$campagne->getId(); // Rappel Partagé
  955.         // Si $getToutRappelPrive ou $getToutRappelPartage ===> alors :
  956.         if($getToutRappelPrive == true || $getToutRappelPartage == true) {
  957.             $campagnecollaborateurs $this->em->getRepository(Campagnecollaborateur::class)->findBy(
  958.                   [
  959.                       "collaborateur" => $utilisateur,
  960.                   ]
  961.                 );
  962.             /** @var Campagnecollaborateur $campagnecollaborateur */
  963.             foreach($campagnecollaborateurs as $campagnecollaborateur){
  964.                 if($campagnecollaborateur->getCampagne()->getActive() == 1){
  965.                     if($getToutRappelPrive == true) {
  966.                         $idsCampagneRappelPrive .=",".$campagnecollaborateur->getCampagne()->getId();
  967.                     }
  968.                     if($getToutRappelPartage == true) {
  969.                         $idsCampagneRappelPartage .=",".$campagnecollaborateur->getCampagne()->getId();
  970.                     }
  971.                 }
  972.             }
  973.         }
  974.         $idsCampagneRappelPrive .=")";
  975.         $idsCampagneRappelPartage .=")";
  976.         //1. Chercher Rappel Privé
  977.         $sql "
  978.         SELECT 
  979.                campagneprospect
  980.         FROM " Campagneprospect::class . " as campagneprospect
  981.         LEFT JOIN " Appelstatut::class . " as appelstatut WITH campagneprospect.appelstatut = appelstatut.id
  982.         WHERE date_format(campagneprospect.daterappel,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s")."' 
  983.         AND appelstatut.rappel=true
  984.         AND campagneprospect.rappelprive = 1 AND campagneprospect.utilisateur = ".$utilisateur->getId()."
  985.         AND campagneprospect.campagne in ".$idsCampagneRappelPrive."
  986.         ORDER BY campagneprospect.rappelprive desc,campagneprospect.daterappel asc
  987.         ";
  988.         //file_put_contents("RappelPriv.txt",$sql);
  989.         /** @var Query $query */
  990.         $query $this->em->createQuery($sql);
  991.         $query->setFirstResult(0);
  992.         $query->setMaxResults(20);
  993.         $campagneprsopects $query->getResult();
  994.         /** @var Campagneprospect $campagneprsopect */
  995.         foreach ($campagneprsopects as $campagneprsopect) {
  996.             if (!$this->hasActiveSignalementBlocage($campagneprsopect)) {
  997.                 return $campagneprsopect;
  998.             }
  999.         }
  1000.         //2. Chercher Rappel Partagé
  1001.         $sql "
  1002.         SELECT 
  1003.         campagneprospect
  1004.         FROM " Campagneprospect::class . " as campagneprospect
  1005.         LEFT JOIN " Appelstatut::class . " as appelstatut WITH campagneprospect.appelstatut = appelstatut.id
  1006.         WHERE date_format(campagneprospect.daterappel,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s")."' 
  1007.         AND appelstatut.rappel=true
  1008.         AND campagneprospect.campagne in ".$idsCampagneRappelPartage."
  1009.         AND campagneprospect.rappelprive = 0
  1010.         AND campagneprospect.traitementencore IN (0,".$utilisateur->getId().")
  1011.         ORDER BY campagneprospect.rappelprive desc,campagneprospect.daterappel asc
  1012.         ";
  1013.         //file_put_contents("RappelPartag.txt",$sql);
  1014.         /** @var Query $query */
  1015.         $query $this->em->createQuery($sql);
  1016.         $query->setFirstResult(0);
  1017.         $query->setMaxResults(20);
  1018.         /** @var Campagneprospect[] $campagneprsopectsRappelPartage */
  1019.         $campagneprsopectsRappelPartage $query->getResult();
  1020.         /** @var Campagneprospect $campagneprsopect */
  1021.         foreach ($campagneprsopectsRappelPartage as $campagneprsopect) {
  1022.             if ($this->hasActiveSignalementBlocage($campagneprsopect)) {
  1023.                 continue;
  1024.             }
  1025.             $campagneprsopect->setUtilisateur($utilisateur);
  1026.             $campagneprsopect->setTraitementdate(new \DateTime());
  1027.             $campagneprsopect->setTraitementencore($utilisateur->getId());
  1028.             $this->em->persist($campagneprsopect);
  1029.             $this->em->flush();
  1030.             return $campagneprsopect;
  1031.         }
  1032.         //3. Chercher next prospect
  1033.         $campagneprsopects $this->em->getRepository(Campagneprospect::class)->findBy(
  1034.             [
  1035.                 "campagne" => $campagne,
  1036.                 "utilisateur" => $utilisateur,
  1037.                 "rappelprive" => -1
  1038.             ],
  1039.             [
  1040.                 "id" => "ASC"
  1041.             ]
  1042.         );
  1043.         if (!$campagneprsopects || sizeof($campagneprsopects) == 0) {
  1044.             // affecter campagneprospect au utilisateur
  1045.             return $this->autoAffectCampagneprospect($campagne$utilisateur);
  1046.         }
  1047.         // Si reste un seul campagneprospect, alors ajouter +5 !
  1048.         if (sizeof($campagneprsopects) == 1) {
  1049.             $this->autoAffectCampagneprospect($campagne$utilisateur);
  1050.         }
  1051.         foreach ($campagneprsopects as $campagneprsopect) {
  1052.             if (!$this->hasActiveSignalementBlocage($campagneprsopect)) {
  1053.                 return $campagneprsopect;
  1054.             }
  1055.         }
  1056.         return $this->autoAffectCampagneprospect($campagne$utilisateur);
  1057.     }
  1058.     /**
  1059.      * @param Campagne $campagne
  1060.      * @param Utilisateur $utilisateur
  1061.      * @return Campagneprospect|null
  1062.      */
  1063.     public function autoAffectCampagneprospect(Campagne $campagneUtilisateur $utilisateur): ?Campagneprospect
  1064.     {
  1065.         $campagneprsopectFirst null;
  1066.         $campagneprsopects $this->em->getRepository(Campagneprospect::class)->findBy(
  1067.             [
  1068.                 "campagne" => $campagne,
  1069.                 "utilisateur" => null,
  1070.                 "rappelprive" => -1
  1071.             ],
  1072.             [
  1073.                 "id" => "ASC"
  1074.             ],
  1075.             5
  1076.         );
  1077.         // si pas campagneprospect trouvé alors return null
  1078.         if (sizeof($campagneprsopects) == 0) {
  1079.             return null;
  1080.         }
  1081.         /** @var Campagneprospect $campagneprsopect */
  1082.         foreach ($campagneprsopects as $campagneprsopect) {
  1083.             if ($this->hasActiveSignalementBlocage($campagneprsopect)) {
  1084.                 continue;
  1085.             }
  1086.             $campagneprsopect->setUtilisateur($utilisateur);
  1087.             $this->em->persist($campagneprsopect);
  1088.             if ($campagneprsopectFirst == null) {
  1089.                 $campagneprsopectFirst $campagneprsopect;
  1090.             }
  1091.         }
  1092.         $this->em->flush();
  1093.         return $campagneprsopectFirst;
  1094.     }
  1095. }