src/Controller/Buzz/RedirectNewsController.php line 171

Open in your IDE?
  1. <?php
  2. /**
  3.  * @author Mehrez Labidi
  4.  */
  5. declare(strict_types=1);
  6. namespace App\Controller\Buzz;
  7. use App\Services\{
  8.     RobotProvider,
  9.     Mailer
  10. };
  11. use App\Services\Buzz\BuzzNewsletter;
  12. use App\Services\Annonces\ConsultationsAnnonce;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use App\Entity\{
  15.     Utilisateur,
  16.     BuzzLiensNewsletter,
  17.     BuzzActualites,
  18.     ServicesPrestataire,
  19.     UtilisateursNewsletter,
  20.     StatistiquesNewsletterClics,
  21.     StatistiquesNewsletterClicsDuJour,
  22.     StatistiquesNewsletterOuvertures,
  23.     StatistiquesClicsOuvragesEfl,
  24.     BuzzNewslettersQuotidiennes,
  25.     StatistiquesNbConsultationsActualitesBuzz,
  26.     InteractionUtilisateur
  27. };
  28. use App\Controller\EntityUsingController;
  29. use App\Helper\Utils;
  30. use Symfony\Component\HttpFoundation\{
  31.     Cookie,
  32.     Request,
  33.     Response,
  34.     RedirectResponse
  35. };
  36.     
  37. class RedirectNewsController extends EntityUsingController {
  38.     /**
  39.      * Constructeur de la classe
  40.      * Initialise le gestionnaire d'entités
  41.      * @param EntityManagerInterface $em
  42.      */
  43.     public function __construct(EntityManagerInterface $emMailer $mailerConsultationsAnnonce $consultations_annonce) {
  44.         $this->em $em;
  45.         $this->mailer $mailer;
  46.         $this->consultations_annonce $consultations_annonce;
  47.     }
  48.     /**
  49.      * Redirige vers un article Buzz
  50.      * Traite le code encodé, met à jour les statistiques
  51.      * Gère les interactions utilisateur et les cookies
  52.      * @return mixed
  53.      */
  54.     public function redirectArticleNewsBuzz($code) {
  55.         $trio base64_decode($code);
  56.         $t explode(','$trio);
  57.         if (count($t) < 3) {
  58.             throw new \InvalidArgumentException('Paramètres insuffisants');
  59.         }
  60.         $idLien = (int) $t [0];
  61.         $idUtilisateur = (int) $t [1];
  62.         $dateNewsletter $t [2];
  63.         $objetLien $this->getLienParIdLien($idLien);
  64.         $id_pays NULL;
  65.         if (isset($t[3])) {
  66.             if (strpos($t[3], '32') !== false) {
  67.                 $id_pays '32';
  68.             }
  69.             if (strpos($t[3], '1') !== false) {
  70.                 $id_pays '01';
  71.             }
  72.             if (strpos($t[3], '01') !== false) {
  73.                 $id_pays '01';
  74.             }
  75.             if (strpos($t[3], '33') !== false) {
  76.                 $id_pays '33';
  77.             }
  78.             if (strpos($t[3], '41') !== false) {
  79.                 $id_pays '41';
  80.             }
  81.         }
  82.         $lien = ($objetLien) ? $objetLien->_get('lien'):NULL;
  83.         $email $this->getEmailUtilisateurParIdUtilisateur($idUtilisateur);
  84.         $utilisateur $this->em->getRepository(Utilisateur::class)->findOneBy(['email_utilisateur' => $email]);
  85.         if (!empty($utilisateur)) {
  86.             $idUtilisateur $utilisateur->_get("id_utilisateur");
  87.             $interactionUtilisateur $this->em->getRepository(InteractionUtilisateur::class)->findOneBy(array('id_utilisateur' => $idUtilisateur));
  88.             if (!$interactionUtilisateur) {
  89.                 $interactionUtilisateur = new InteractionUtilisateur();
  90.                 $interactionUtilisateur->_set("id_utilisateur"$idUtilisateur);
  91.             }
  92.             $interactionUtilisateur->_set("date_time_interaction"date("YmdHis"));
  93.             $interactionUtilisateur->_set("type_interaction""newsletters");
  94.             $interactionUtilisateur->_set("plateform_interaction""FUSACQ");
  95.             $this->em->persist($interactionUtilisateur);
  96.             $this->em->flush();
  97.         }
  98.         //  setcookie("id_utilisateur_ip_detecte", $idUtilisateur, time() + 60 * 60 * 24 * 365, '/');
  99.         // Créer le cookie
  100.         $cookie Cookie::create('id_utilisateur_ip_detecte')
  101.                 ->withValue((string) $idUtilisateur)
  102.                 ->withExpires(new \DateTime('+1 year'))
  103.                 ->withPath('/')
  104.                 ->withSecure(false)  // true si HTTPS
  105.                 ->withHttpOnly(true// Protection XSS
  106.                 ->withSameSite(Cookie::SAMESITE_LAX); // Protection CSRF
  107.         if (!empty($objetLien)) {
  108.             if ($lien != "&&&" && $lien != "") {
  109.                 $this->modifyStatistiqueClic($email$dateNewsletter$lien1,$idLien$id_pays);
  110.             }
  111.             if (strpos($lien'newsletter-le-buzz-') !== false) {
  112.                 $lien $lien '?email=' $email;
  113.             }
  114.             $response $this->redirect($lien);
  115.             $response->headers->setCookie($cookie);
  116.             return $response;
  117.         } else {
  118.             //
  119.         }
  120.     }
  121.     /**
  122.      * Gère l'ouverture d'une newsletter Buzz
  123.      * Décode les paramètres, vérifie les statistiques
  124.      * Crée une nouvelle entrée si nécessaire
  125.      * @return void
  126.      */
  127.     public function ouvertureNewsBuzz($code) {
  128.         $codeDecode base64_decode($code);
  129.         if ($codeDecode === false) {
  130.             return new Response(''Response::HTTP_BAD_REQUEST);
  131.         }
  132.         $codeEnChaine $this->chaineFormatUriToArray($codeDecode);
  133.         $email $codeEnChaine ["email"];
  134.         $typeNewsletter BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI_NOM_COMPLET;
  135.         $dateNewsletter $codeEnChaine ["date"];
  136.         $id_pays NULL;
  137.         if (isset($codeEnChaine ["id_pays"])) {
  138.             $id_pays $codeEnChaine ["id_pays"];
  139.         }
  140.         if (empty($email) || empty($dateNewsletter)) {
  141.             return new Response(''Response::HTTP_BAD_REQUEST);
  142.         }
  143.         $statistique $this->getStatistiqueParEmailDate($email$dateNewsletter);
  144.         if (count($statistique) >= 1) {
  145.             //
  146.         } else {
  147.             $this->createStatistiqueParEmailDate($email$dateNewsletter$id_pays);
  148.         }
  149.         // Retourner une réponse vide ou une redirection
  150.         return new Response(''Response::HTTP_NO_CONTENT);
  151.     }
  152.     /**
  153.      * Gère les clics sur les actualités
  154.      * Vérifie si c'est un robot, incrémente les statistiques
  155.      * Envoie des notifications à certains seuils
  156.      * @return void
  157.      */
  158.     public function cliquerLienActualite($idActualite) {
  159.         // fonction appeleé en render_esi dans twig 
  160.         if (!empty($idActualite)) {
  161.             $actualite $this->em->getRepository(BuzzActualites::class)->find($idActualite);
  162.             if (!$actualite) {
  163.                 return new Response(''Response::HTTP_NOT_FOUND);
  164.             }
  165.             $isBot false;
  166.             $isFusacqBot false;
  167.             $isBot $this->isRobotConnu();
  168.             $isFusacqBot $this->testSiConnexionFromLocauxFusacq();
  169.             //  echo "isbot : " . $isBot . '|| isFusacq : ' . $isFusacqBot;
  170.             if ($isBot == false && $isFusacqBot == false && $actualite != NULL) {
  171.                 //      echo "non robot";
  172.                 $result $this->em->getRepository(StatistiquesNbConsultationsActualitesBuzz::class)->findOneBy(array("id_actualite" => $idActualite));
  173.                 if (!empty($result)) {
  174.                     $statistiqueConsultationActu $result;
  175.                     $nbConsultations $statistiqueConsultationActu->_get("nb_affichages");
  176.                     $this->updateStatistiqueNbConsultationActualiteBuzz($idActualite1);
  177.                     $nbConsultations = (int) $nbConsultations 1;
  178.                     if ($actualite->_get("provenance_flux_actualite") == "blog") {
  179.                         if ($nbConsultations == 100 || $nbConsultations == 500 || ($nbConsultations 1000 == && $nbConsultations <= 10000)) {
  180.                             $nbProchainConsultations $nbConsultations 1;
  181.                             if ($nbConsultations == 100) {
  182.                                 $nbProchainConsultations 500;
  183.                             }
  184.                             if ($nbConsultations == 500) {
  185.                                 $nbProchainConsultations 1000;
  186.                             }
  187.                             if ($nbConsultations 1000 == 0) {
  188.                                 $nbProchainConsultations = (int) $nbConsultations 1000;
  189.                             }
  190.                             $titre $actualite->_get('titre_actualite');
  191.                             $lien '/buzz/' Utils::slugify($titre) . "-a" $actualite->_get('id_actualite') . "";
  192.                             $idSocietePrestataire $actualite->_get("id_societe_prestataire");
  193.                             $deposant $this->em->getRepository(Utilisateur::class)->findOneBy(array("id_societe_prestataire" => $idSocietePrestataire));
  194.                             if (!empty($deposant)) {
  195.                                 $emailDestinataire $deposant->getEmail();
  196.                                 $arrayMail = array(
  197.                                     'nbConsultations' => $nbConsultations,
  198.                                     'lien' => $lien,
  199.                                     'titre' => $titre,
  200.                                     'nbProchainConsultations' => $nbProchainConsultations,
  201.                                     'emailDestinataire' => $emailDestinataire,
  202.                                 );
  203. //                                $this->mailer->sendmail(
  204. //                                        Mailer::$senderAdress['contact'], // $from
  205. //                                        $emailDestinataire, // $to
  206. //                                        NULL, // $ccTo
  207. //                                        Mailer::$receiverAdress['mail_damien'], // $cciTo
  208. //                                        $nbConsultations . ' consultations pour votre blog "' . $titre . '"', // $subject
  209. //                                        NULL, // $replyTo
  210. //                                        NULL, // $contenu
  211. //                                        'mails/templates/notifications_consultation_blog.html.twig', // $template
  212. //                                        $arrayMail, // $varTemplate
  213. //                                        NULL // $attachement
  214. //                                );
  215.                             }
  216.                         }
  217.                     }
  218.                 } else {
  219.                     $this->insertStatistiqueNbConsultationActualiteBuzz($idActualite);
  220.                 }
  221.             } else {
  222.                 // echo "robot";
  223.             }
  224.         }
  225.         // Retourner une réponse vide ou une redirection
  226.         return new Response(''Response::HTTP_NO_CONTENT);
  227.     }
  228.     /**
  229.      * Redirige vers les ouvrages sélectionnés
  230.      * Gère les clics publicitaires EFL
  231.      * Met à jour les statistiques par provenance
  232.      * @return mixed
  233.      */
  234.     public function redirectionOuvragesSelectionnes(Request $request) { //  /enregistrement.html
  235.         $action $request->query->get('action') ?? NULL;
  236.         $from $request->query->get('from') ?? NULL;
  237.         $idServicePrestataire $request->query->get('id_service_prestataire') ?? NULL;
  238.         if ($action == 'clic_pub_efl' && $from == 'from_menu_droit_buzz' && !empty($idServicePrestataire)) {
  239.             $siteRedirect $this->getSiteParIdServicePrestataire($idServicePrestataire);
  240.             $isBot false;
  241.             $isFusacqBot false;
  242.             $isBot $this->isRobotConnu();
  243.             $isFusacqBot $this->testSiConnexionFromLocauxFusacq();
  244.             if ($isBot == false && $isFusacqBot == false) {
  245.                 if (!empty($this->getStatistiqueEFL($idServicePrestataire))) {
  246.                     $this->updateStatistiqueEFL($idServicePrestataire,  1'from_menu_droit_buzz');
  247.                 } else {
  248.                     $this->insererStatistiqueEFL($idServicePrestataire,  1'from_menu_droit_buzz');
  249.                 }
  250.             } else {
  251.                 //
  252.             }
  253.             $siteRedirect "https://" $siteRedirect;
  254.             return $this->redirect($siteRedirect);
  255.         } else if ($action == 'clic_pub_efl' && $from == 'from_ouvrages' && !empty($idServicePrestataire)) {
  256.             $siteRedirect $this->getSiteParIdServicePrestataire($idServicePrestataire);
  257.             $isBot false;
  258.             $isFusacqBot false;
  259.             $isBot $this->isRobotConnu();
  260.             $isFusacqBot $this->testSiConnexionFromLocauxFusacq();
  261.             if ($isBot == false && $isFusacqBot == false) {
  262.                 if (!empty($this->getStatistiqueEFL($idServicePrestataire))) {
  263.                     $this->updateStatistiqueEFL($idServicePrestataire,  1"from_ouvrages");
  264.                 } else {
  265.                     $this->insererStatistiqueEFL($idServicePrestataire,  1"from_ouvrages");
  266.                 }
  267.             } else {
  268.                 //  
  269.             }
  270.             $siteRedirect "https://" $siteRedirect;
  271.             return $this->redirect($siteRedirect);
  272.         }
  273.     }
  274.     /**
  275.      * Affiche la newsletter quotidienne
  276.      * Récupère le contenu HTML, personnalise l'email
  277.      * Gère les images et liens de désinscription
  278.      * @return mixed
  279.      */
  280.     public function redirectionNewsletterQuotidienne(Request $request, ?int $idNewsletter null) {
  281.         $em $this->em;
  282.         $email $request->query->get('email''');
  283.         if (!empty($idNewsletter)) {
  284.             $newsletter $this->getNewsletterQuotidienneParId($idNewsletter);
  285.         } else {
  286.             $idNewsletter $this->getIdDerniereNewsletterQuotidienne();
  287.         }
  288.         $textHtml $newsletter[0]->_get('contenu_html');
  289.         if ($idNewsletter <= 1728) {
  290.             $textHtml str_replace("https://www.fusacq.com/buzz/images/logo_bleu.png""https://content.fusacq.com/static/dev-fusacq/buzz/images/logo_bleu.png"$textHtml);
  291.         }
  292.         if (!empty($email)) {
  293.             $textHtml str_replace('<!--###email_desinscription###-->'$email$textHtml);
  294.         }
  295.         echo $textHtml;
  296.         return $this->response;
  297.     }
  298.     /**
  299.      * Récupère une newsletter quotidienne
  300.      * Recherche par identifiant unique
  301.      * Retourne l'objet newsletter correspondant
  302.      * @param int $idNewsletter
  303.      * @return mixed
  304.      */
  305.     private function getNewsletterQuotidienneParId($idNewsletter) {
  306.         return $this->em->getRepository(BuzzNewslettersQuotidiennes::class)->findOneBy(['idNewsletter' => $idNewsletter]);
  307.     }
  308.     /**
  309.      * Obtient l'ID dernière newsletter
  310.      * Recherche la plus récente envoyée
  311.      * Retourne l'identifiant unique
  312.      * @param EntityManagerInterface $em
  313.      * @return int
  314.      */
  315.     private function getIdDerniereNewsletterQuotidienne() {
  316.         $queryBuilder $this->em->createQueryBuilder();
  317.         $query $queryBuilder
  318.                 ->select(array("buzzNewslettersQuotidiennes.id_newsletter"))
  319.                 ->from(BuzzNewslettersQuotidiennes::class, 'buzzNewslettersQuotidiennes')
  320.                 ->where('buzzNewslettersQuotidiennes.mode = :modeEnvoyee')
  321.                 ->setParameter('modeEnvoyee''envoyee')
  322.                 ->orderBy('buzzNewslettersQuotidiennes.date_envoi''desc');
  323.         $resultat $query
  324.                 ->setMaxResults(1)
  325.                 ->getQuery()
  326.                 ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  327.         return $resultat[0]['id_newsletter'];
  328.     }
  329.     /**
  330.      * Récupère statistiques EFL
  331.      * Pour un prestataire et mois donnés
  332.      * Retourne les données existantes
  333.      * @param int $idServicePrestataire
  334.      * @return mixed
  335.      */
  336.     private function getStatistiqueEFL($idServicePrestataire) {
  337.         $stats $this->em->getRepository(StatistiquesClicsOuvragesEfl::class)->findOneBy(['id_service_prestataire' => $idServicePrestataire'date_mois' => date('Ym')]);
  338.         return $stats;
  339.     }
  340.   
  341.     private function insererStatistiqueEFL($idServicePrestataire,  $nb$colFrom ) {
  342.         $stat = new StatistiquesClicsOuvragesEfl();
  343.         $stat->_set("id_service_prestataire"intval($idServicePrestataire));
  344.         $stat->_set("date_mois"date("Ym"));
  345.         if ($colFrom == 'from_ouvrages') {
  346.             $stat->_set("from_ouvrages"$nb);
  347.         } else {
  348.             $stat->_set("from_ouvrages"0);
  349.         }
  350.         if ($colFrom == 'from_annuaire_experts') {
  351.             $stat->_set("from_annuaire_experts"$nb);
  352.         } else {
  353.             $stat->_set("from_annuaire_experts"0);
  354.         }
  355.         if ($colFrom == 'from_autres') {
  356.             $stat->_set("from_autres"$nb);
  357.         } else {
  358.             $stat->_set("from_autres"0);
  359.         }
  360.         if ($colFrom == 'from_menu_droit_buzz') {
  361.             $stat->_set("from_menu_droit_buzz"$nb);
  362.         } else {
  363.             $stat->_set("from_menu_droit_buzz"0);
  364.         }
  365.         $this->em->persist($stat);
  366.         $this->em->flush();
  367.     }
  368.    
  369.     private function updateStatistiqueEFL($idServicePrestataire$nb$colFrom) { //  ($idServicePrestataire,   1, "from_ouvrages")
  370.         $stat $this->em->getRepository(StatistiquesClicsOuvragesEfl::class)->findOneBy(['id_service_prestataire' => $idServicePrestataire'date_mois' => date('Ym')]);
  371.         if (!$stat) {
  372.             throw new \RuntimeException(
  373.                             sprintf('Aucune statistique trouvée pour le prestataire ID: %d au mois %s'$idServicePrestatairedate('Ym'))
  374.                     );
  375.         }
  376.         if ($colFrom == 'from_ouvrages') {
  377.             $n = (int) $stat->_get('from_ouvrages');
  378.             $n $n $nb;
  379.             $stat->_set("from_ouvrages"$n);
  380.         } else if ($colFrom == 'from_annuaire_experts') {
  381.             $n = (int) $stat->_get('from_annuaire_experts');
  382.             $n $n $nb;
  383.             $stat->_set("from_annuaire_experts"$n);
  384.         } else if ($colFrom == 'from_autres') {
  385.             $n = (int) $stat->_get('from_autres');
  386.             $n $n $nb;
  387.             $stat->_set("from_autres"$n);
  388.         } else if ($colFrom == 'from_menu_droit_buzz') {
  389.             $n = (int) $stat->_get('from_menu_droit_buzz');
  390.             $n $n $nb;
  391.             $stat->_set("from_menu_droit_buzz"$n);
  392.         }
  393.         $this->em->persist($stat);
  394.         $this->em->flush();
  395.     }
  396.     /**
  397.      * Récupère site web prestataire
  398.      * Recherche par ID service
  399.      * Retourne l'URL du site
  400.      * @param int $idServicePrestataire
  401.      * @return string
  402.      */
  403.     private function getSiteParIdServicePrestataire($idServicePrestataire) {
  404.         $queryBuilder $this->em->createQueryBuilder();
  405.         $query $queryBuilder
  406.                 ->select(array("servicesPrestataire.url_site_web"))
  407.                 ->from(ServicesPrestataire::class, 'servicesPrestataire')
  408.                 ->where('servicesPrestataire.id_service_prestataire = :idService')
  409.                 ->setParameter('idService'$idServicePrestataire);
  410.         $resultat $query
  411.                 ->setMaxResults(1000)
  412.                 ->getQuery()
  413.                 ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  414.         return $resultat[0]['url_site_web'];
  415.     }
  416.     /**
  417.      * Vérifie connexion locaux FUSACQ
  418.      * Examine les headers HTTP
  419.      * Compare avec IP configurée
  420.      * @return bool
  421.      */
  422.     private function testSiConnexionFromLocauxFusacq() {
  423.         $headers apache_request_headers();
  424.         if (array_key_exists('X-Forwarded-For'$headers)) {
  425.             $hostname $headers ['X-Forwarded-For'];
  426.         } else {
  427.             $hostname $_SERVER ["REMOTE_ADDR"];
  428.         }
  429. //        $config = $this->getServiceLocator()->get('Config');
  430. //        if ($hostname == $config["adresse_IP_locaux_fusacq"]) {
  431. //            return true;
  432. //        } else {
  433. //            echo "###";
  434.         return false;
  435. //        }
  436.     }
  437.     /**
  438.      * Obtient IP du visiteur
  439.      * Vérifie les proxies X-Forwarded-For
  440.      * Retourne l'adresse IP réelle
  441.      * @return string
  442.      */
  443.     private function getIPVisiteur() {
  444.         $headers apache_request_headers();
  445.         if (array_key_exists('X-Forwarded-For'$headers)) {
  446.             $hostname $headers['X-Forwarded-For'];
  447.         } else {
  448.             $hostname $_SERVER["REMOTE_ADDR"];
  449.         }
  450.         return $hostname;
  451.     }
  452.     /**
  453.      * Détecte si robot connu
  454.      * Utilise le fournisseur RobotProvider
  455.      * Vérifie l'IP contre une liste
  456.      * @return bool
  457.      */
  458.     private function isRobotConnu(): bool {
  459.         $ip $this->getIPVisiteur();
  460.         $robotProvider = new RobotProvider();
  461.         return $robotProvider->donneNomRobot($ip) !== NULL;
  462.     }
  463.     /**
  464.      * Récupère statistiques consultation
  465.      * Pour une actualité spécifique
  466.      * Retourne l'objet statistique
  467.      * @param int $idActualite
  468.      * @return mixed
  469.      */
  470.     private function getStatistiqueNbConsultationActualiteBuzz(int $idActualite) {
  471.         return $this->em->getRepository(StatistiquesNbConsultationsActualitesBuzz::class)->findOneBy(['id_actualite' => $idActualite]);
  472.     }
  473.     /**
  474.      * Insère statistique consultation
  475.      * Pour une nouvelle actualité
  476.      * Initialise le compteur à 1
  477.      * @param int $idActualite
  478.      * @return void
  479.      */
  480.     private function insertStatistiqueNbConsultationActualiteBuzz($idActualite) {
  481.         $stat = new StatistiquesNbConsultationsActualitesBuzz();
  482.         $stat->_set("id_actualite", (int) $idActualite);
  483.         $stat->_set("nb_affichages"1);
  484.         $this->em->persist($stat);
  485.         $this->em->flush();
  486.     }
  487.     /**
  488.      * Met à jour statistique consultation
  489.      * Incrémente le nombre d'affichages
  490.      * Persiste les modifications
  491.      * @param int $idActualite
  492.      * @param int $nb
  493.      * @return void
  494.      */
  495.     private function updateStatistiqueNbConsultationActualiteBuzz($idActualite$nb): void {
  496.         /*$stat = $this->em->getRepository(StatistiquesNbConsultationsActualitesBuzz::class)->findOneBy(['id_actualite' => $idActualite]);
  497.         if ($stat) {
  498.             $stat->_set("nb_affichages", $stat->_get('nb_affichages') + $nb);
  499.             $this->em->persist($stat);
  500.             $this->em->flush();
  501.         }*/
  502.         
  503.         // On incrémente de 1 le nb de consultation
  504.         $this->consultations_annonce->incrementeConsultation('actualite'$idActualite);
  505.     }
  506.     /**
  507.      * Crée statistique de clic
  508.      * Gère anciennes/nouvelles tables
  509.      * Associe pays et newsletter
  510.      * @param string $email
  511.      * @param string $dateNewsletter
  512.      * @param string $lien
  513.      * @param string|NULL $idPays
  514.      * @return void
  515.      */
  516.     private function createStatistiqueClic($email$dateNewsletter$lien$idPays NULL): void {
  517.         if ($dateNewsletter <= BuzzNewsletter::DATE_COMMENCE_NOUVELLE_TABLE_BUZZ_STATS) {
  518.             $stat = new StatistiquesNewsletterClics();
  519.             $stat->_set('date_newsletter'$dateNewsletter);
  520.             $stat->_set('email'$email);
  521.             $stat->_set('type_newsletter'BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
  522.             $stat->_set('lien'$lien);
  523.             $stat->_set('nb_clics'1);
  524.             $stat->_set('id_pays'$idPays);
  525.             $this->em->persist($stat);
  526.             $this->em->flush();
  527.         } else {
  528.             $buzzLien $this->em->getRepository(BuzzLiensNewsletter::class)->findOneBy(['lien' => $lien'date_newsletter' => $dateNewsletter'type_lien' => NULL]);
  529.             if (!$buzzLien) {
  530.                 throw new \RuntimeException(
  531.                                 sprintf('Aucun lien trouvé pour: %s à la date %s'$lien$dateNewsletter->format('Y-m-d'))
  532.                         );
  533.             }
  534.             $stat = new StatistiquesNewsletterClicsDuJour();
  535.             $stat->_set('date_newsletter'$dateNewsletter);
  536.             $stat->_set('email'$email);
  537.             $stat->_set('type_newsletter'BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
  538.             $stat->_set('lien'$lien);
  539.             $stat->_set('nb_clics'1);
  540.             $stat->_set('id_pays'$idPays);
  541.             $this->em->persist($stat);
  542.             $this->em->flush();
  543.         }
  544.     }
  545.     /**
  546.      * Modifie statistique de clic
  547.      * Incrémente ou crée nouvelle
  548.      * Gère transition entre tables
  549.      * @param string $email
  550.      * @param string $dateNewsletter
  551.      * @param string $lien
  552.      * @param int $n
  553.      * @param string|NULL $idPays
  554.      * @return void
  555.      */
  556.     private function modifyStatistiqueClic($email$dateNewsletter$lien$n$id_lien,$idPays NULL): void {
  557.         //ancien abondonne depuis 2017
  558.         if ($dateNewsletter <= BuzzNewsletter::DATE_COMMENCE_NOUVELLE_TABLE_BUZZ_STATS) {
  559.             $stat $this->em->getRepository(StatistiquesNewsletterClics::class)->findOneBy(['date_newsletter' => $dateNewsletter'email' => $email'lien' => $lien'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI]);
  560.             if ($stat) {
  561.                 $stat->_set('nb_clics'$stat->_get('nb_clics') + $n);
  562.                 $stat->_set('id_pays'$idPays);
  563.             } else {
  564.                 $stat = new StatistiquesNewsletterClics();
  565.                 $stat->_set('date_newsletter'$dateNewsletter);
  566.                 $stat->_set('email'$email);
  567.                 $stat->_set('type_newsletter'BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
  568.                 $stat->_set('lien'$lien);
  569.                 $stat->_set('nb_clics'1);
  570.                 $stat->_set('id_pays'$idPays);
  571.                 $this->em->persist($stat);
  572.             }
  573.         } else {
  574.             //On a une tache planifiee pour mettre à jour depuis StatistiquesNewsletterClicsDuJour ver StatistiquesNewsletterClicsNew
  575.             $buzzLien $this->em->getRepository(BuzzLiensNewsletter::class)->findOneBy(['lien' => $lien'date_newsletter' => $dateNewsletter'type_lien' => NULL]);
  576.             if (!$buzzLien) {
  577.                 throw new \RuntimeException(
  578.                                 sprintf('Aucun lien trouvé pour: %s à la date %s'$lien$dateNewsletter->format('Y-m-d'))
  579.                         );
  580.             }
  581.             $stat $this->em->getRepository(StatistiquesNewsletterClicsDuJour::class)
  582.                     ->findOneBy([
  583.                         'date_newsletter' => $dateNewsletter,
  584.                         'email' => $email,
  585.                         'id_lien' => $buzzLien->getIdLien(),
  586.                         'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI
  587.             ]);
  588.             if ($stat) {
  589.                 $stat->_set('nb_clics'$stat->_get('nb_clics') + $n);
  590.                 $stat->_set('id_pays'$idPays);
  591.             } else {
  592.                 $stat = new StatistiquesNewsletterClicsDuJour();
  593.                 $stat->_set('date_newsletter'$dateNewsletter);
  594.                 $stat->_set('email'$email);
  595.                 $stat->_set('type_newsletter'BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
  596.                 $stat->_set('id_lien'$id_lien);
  597.                 $stat->_set('nb_clics'1);
  598.                 $stat->_set('id_pays'$idPays);
  599.                 ;
  600.                 $this->em->persist($stat);
  601.             }
  602.         }
  603.         $this->em->flush();
  604.     }
  605.     /**
  606.      * Vérifie existence statistique
  607.      * Recherche dans tables appropriées
  608.      * Retourne vrai si existante
  609.      * @param string $email
  610.      * @param string $dateNewsletter
  611.      * @param string $lien
  612.      * @return bool
  613.      */
  614.     private function testSiStatistiqueClicCreee($email$dateNewsletter$lien): bool {
  615.         if ($dateNewsletter <= BuzzNewsletter::DATE_COMMENCE_NOUVELLE_TABLE_BUZZ_STATS) {
  616.             $result $this->em->getRepository(StatistiquesNewsletterClics::class)
  617.                     ->findBy(['date_newsletter' => $dateNewsletter'email' => $email'lien' => $lien'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI]);
  618.         } else {
  619.             // Récupération de l'ID du lien
  620.             $buzzLien $this->em->getRepository(BuzzLiensNewsletter::class)
  621.                     ->findOneBy([
  622.                         'lien' => $lien,
  623.                         'date_newsletter' => $dateNewsletter,
  624.                         'type_lien' => NULL
  625.             ]);
  626.             if (!$buzzLien) {
  627.                 return false;
  628.             }
  629.             $idLien $buzzLien->getIdLien();
  630.             $result $this->em->getRepository(StatistiquesNewsletterClicsDuJour::class)
  631.                     ->findBy(['date_newsletter' => $dateNewsletter'email' => $email'id_lien' => $idLien'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI]);
  632.         }
  633.         return count($result) >= 1;
  634.     }
  635.     /**
  636.      * Récupère lien par ID
  637.      * Recherche dans la base
  638.      * Retourne l'objet lien
  639.      * @param int $idLien
  640.      * @return mixed
  641.      */
  642.     private function getLienParIdLien(int $idLien) {
  643.         return $this->em->getRepository(BuzzLiensNewsletter::class)->findOneBy(['id_lien' => $idLien]);
  644.     }
  645.     /**
  646.      * Obtient email utilisateur
  647.      * Par ID utilisateur
  648.      * Retourne l'adresse email
  649.      * @param int $idUtilisateur
  650.      * @return string|NULL
  651.      */
  652.     private function getEmailUtilisateurParIdUtilisateur($idUtilisateur) {
  653.         $utilisateur $this->em->getRepository(UtilisateursNewsletter::class)->findOneBy(['id_utilisateur' => $idUtilisateur]);
  654.         return $utilisateur $utilisateur->getEmail() : NULL;
  655.     }
  656.     /**
  657.      * Convertit chaîne URI
  658.      * En tableau associatif
  659.      * Gère les paramètres URL
  660.      * @param string $chaine
  661.      * @return array
  662.      */
  663.     function chaineFormatUriToArray(string $chaine): array {
  664.         if ($chaine === "") {
  665.             return [];
  666.         }
  667.         $infos = [];
  668.         $tab_donnees explode("&"$chaine);
  669.         foreach ($tab_donnees as $donnee) {
  670.             $temp explode("="$donnee2);
  671.             $infos[$temp[0]] = $temp[1] ?? NULL;
  672.         }
  673.         return $infos;
  674.     }
  675.     /**
  676.      * Récupère statistique ouverture
  677.      * Par email et date newsletter
  678.      * Retourne les résultats
  679.      * @param string $email
  680.      * @param string $dateNewsletter
  681.      * @return array
  682.      */
  683.     private function getStatistiqueParEmailDate($email$dateNewsletter) {
  684.         return $this->em->getRepository(StatistiquesNewsletterOuvertures::class)
  685.                         ->createQueryBuilder('s')
  686.                         ->where('s.date_newsletter = :dateNewsletter')
  687.                         ->andWhere('s.email = :email')
  688.                         ->andWhere('s.type_newsletter = :typeNewsletter')
  689.                         ->setParameter('dateNewsletter'$dateNewsletter)
  690.                         ->setParameter('email'$email)
  691.                         ->setParameter('typeNewsletter'BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI)
  692.                         ->getQuery()
  693.                         ->getResult();
  694.     }
  695.     /**
  696.      * Crée statistique ouverture
  697.      * Initialise le compteur
  698.      * Associe pays optionnel
  699.      * @param string $email
  700.      * @param string $dateNewsletter
  701.      * @param string|NULL $id_pays
  702.      * @return void
  703.      */
  704.     private function createStatistiqueParEmailDate($email$dateNewsletter$id_pays NULL) {
  705.         $stat = new StatistiquesNewsletterOuvertures();
  706.         if ($stat) {
  707.             $stat->_set("date_newsletter"$dateNewsletter);
  708.             $stat->_set("email"$email);
  709.             $stat->_set("type_newsletter"BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
  710.             $stat->_set("nb_ouvertures"1);
  711.             $stat->_set("id_pays"$id_pays);
  712.             $this->em->persist($stat);
  713.             $this->em->flush();
  714.         }
  715.     }
  716. }