<?php
/**
* @author Mehrez Labidi
*/
declare(strict_types=1);
namespace App\Controller\Buzz;
use App\Services\{
RobotProvider,
Mailer
};
use App\Services\Buzz\BuzzNewsletter;
use App\Services\Annonces\ConsultationsAnnonce;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\{
Utilisateur,
BuzzLiensNewsletter,
BuzzActualites,
ServicesPrestataire,
UtilisateursNewsletter,
StatistiquesNewsletterClics,
StatistiquesNewsletterClicsDuJour,
StatistiquesNewsletterOuvertures,
StatistiquesClicsOuvragesEfl,
BuzzNewslettersQuotidiennes,
StatistiquesNbConsultationsActualitesBuzz,
InteractionUtilisateur
};
use App\Controller\EntityUsingController;
use App\Helper\Utils;
use Symfony\Component\HttpFoundation\{
Cookie,
Request,
Response,
RedirectResponse
};
class RedirectNewsController extends EntityUsingController {
/**
* Constructeur de la classe
* Initialise le gestionnaire d'entités
* @param EntityManagerInterface $em
*/
public function __construct(EntityManagerInterface $em, Mailer $mailer, ConsultationsAnnonce $consultations_annonce) {
$this->em = $em;
$this->mailer = $mailer;
$this->consultations_annonce = $consultations_annonce;
}
/**
* Redirige vers un article Buzz
* Traite le code encodé, met à jour les statistiques
* Gère les interactions utilisateur et les cookies
* @return mixed
*/
public function redirectArticleNewsBuzz($code) {
$trio = base64_decode($code);
$t = explode(',', $trio);
if (count($t) < 3) {
throw new \InvalidArgumentException('Paramètres insuffisants');
}
$idLien = (int) $t [0];
$idUtilisateur = (int) $t [1];
$dateNewsletter = $t [2];
$objetLien = $this->getLienParIdLien($idLien);
$id_pays = NULL;
if (isset($t[3])) {
if (strpos($t[3], '32') !== false) {
$id_pays = '32';
}
if (strpos($t[3], '1') !== false) {
$id_pays = '01';
}
if (strpos($t[3], '01') !== false) {
$id_pays = '01';
}
if (strpos($t[3], '33') !== false) {
$id_pays = '33';
}
if (strpos($t[3], '41') !== false) {
$id_pays = '41';
}
}
$lien = ($objetLien) ? $objetLien->_get('lien'):NULL;
$email = $this->getEmailUtilisateurParIdUtilisateur($idUtilisateur);
$utilisateur = $this->em->getRepository(Utilisateur::class)->findOneBy(['email_utilisateur' => $email]);
if (!empty($utilisateur)) {
$idUtilisateur = $utilisateur->_get("id_utilisateur");
$interactionUtilisateur = $this->em->getRepository(InteractionUtilisateur::class)->findOneBy(array('id_utilisateur' => $idUtilisateur));
if (!$interactionUtilisateur) {
$interactionUtilisateur = new InteractionUtilisateur();
$interactionUtilisateur->_set("id_utilisateur", $idUtilisateur);
}
$interactionUtilisateur->_set("date_time_interaction", date("YmdHis"));
$interactionUtilisateur->_set("type_interaction", "newsletters");
$interactionUtilisateur->_set("plateform_interaction", "FUSACQ");
$this->em->persist($interactionUtilisateur);
$this->em->flush();
}
// setcookie("id_utilisateur_ip_detecte", $idUtilisateur, time() + 60 * 60 * 24 * 365, '/');
// Créer le cookie
$cookie = Cookie::create('id_utilisateur_ip_detecte')
->withValue((string) $idUtilisateur)
->withExpires(new \DateTime('+1 year'))
->withPath('/')
->withSecure(false) // true si HTTPS
->withHttpOnly(true) // Protection XSS
->withSameSite(Cookie::SAMESITE_LAX); // Protection CSRF
if (!empty($objetLien)) {
if ($lien != "&&&" && $lien != "") {
$this->modifyStatistiqueClic($email, $dateNewsletter, $lien, 1,$idLien, $id_pays);
}
if (strpos($lien, 'newsletter-le-buzz-') !== false) {
$lien = $lien . '?email=' . $email;
}
$response = $this->redirect($lien);
$response->headers->setCookie($cookie);
return $response;
} else {
//
}
}
/**
* Gère l'ouverture d'une newsletter Buzz
* Décode les paramètres, vérifie les statistiques
* Crée une nouvelle entrée si nécessaire
* @return void
*/
public function ouvertureNewsBuzz($code) {
$codeDecode = base64_decode($code);
if ($codeDecode === false) {
return new Response('', Response::HTTP_BAD_REQUEST);
}
$codeEnChaine = $this->chaineFormatUriToArray($codeDecode);
$email = $codeEnChaine ["email"];
$typeNewsletter = BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI_NOM_COMPLET;
$dateNewsletter = $codeEnChaine ["date"];
$id_pays = NULL;
if (isset($codeEnChaine ["id_pays"])) {
$id_pays = $codeEnChaine ["id_pays"];
}
if (empty($email) || empty($dateNewsletter)) {
return new Response('', Response::HTTP_BAD_REQUEST);
}
$statistique = $this->getStatistiqueParEmailDate($email, $dateNewsletter);
if (count($statistique) >= 1) {
//
} else {
$this->createStatistiqueParEmailDate($email, $dateNewsletter, $id_pays);
}
// Retourner une réponse vide ou une redirection
return new Response('', Response::HTTP_NO_CONTENT);
}
/**
* Gère les clics sur les actualités
* Vérifie si c'est un robot, incrémente les statistiques
* Envoie des notifications à certains seuils
* @return void
*/
public function cliquerLienActualite($idActualite) {
// fonction appeleé en render_esi dans twig
if (!empty($idActualite)) {
$actualite = $this->em->getRepository(BuzzActualites::class)->find($idActualite);
if (!$actualite) {
return new Response('', Response::HTTP_NOT_FOUND);
}
$isBot = false;
$isFusacqBot = false;
$isBot = $this->isRobotConnu();
$isFusacqBot = $this->testSiConnexionFromLocauxFusacq();
// echo "isbot : " . $isBot . '|| isFusacq : ' . $isFusacqBot;
if ($isBot == false && $isFusacqBot == false && $actualite != NULL) {
// echo "non robot";
$result = $this->em->getRepository(StatistiquesNbConsultationsActualitesBuzz::class)->findOneBy(array("id_actualite" => $idActualite));
if (!empty($result)) {
$statistiqueConsultationActu = $result;
$nbConsultations = $statistiqueConsultationActu->_get("nb_affichages");
$this->updateStatistiqueNbConsultationActualiteBuzz($idActualite, 1);
$nbConsultations = (int) $nbConsultations + 1;
if ($actualite->_get("provenance_flux_actualite") == "blog") {
if ($nbConsultations == 100 || $nbConsultations == 500 || ($nbConsultations % 1000 == 0 && $nbConsultations <= 10000)) {
$nbProchainConsultations = $nbConsultations + 1;
if ($nbConsultations == 100) {
$nbProchainConsultations = 500;
}
if ($nbConsultations == 500) {
$nbProchainConsultations = 1000;
}
if ($nbConsultations % 1000 == 0) {
$nbProchainConsultations = (int) $nbConsultations + 1000;
}
$titre = $actualite->_get('titre_actualite');
$lien = '/buzz/' . Utils::slugify($titre) . "-a" . $actualite->_get('id_actualite') . "";
$idSocietePrestataire = $actualite->_get("id_societe_prestataire");
$deposant = $this->em->getRepository(Utilisateur::class)->findOneBy(array("id_societe_prestataire" => $idSocietePrestataire));
if (!empty($deposant)) {
$emailDestinataire = $deposant->getEmail();
$arrayMail = array(
'nbConsultations' => $nbConsultations,
'lien' => $lien,
'titre' => $titre,
'nbProchainConsultations' => $nbProchainConsultations,
'emailDestinataire' => $emailDestinataire,
);
// $this->mailer->sendmail(
// Mailer::$senderAdress['contact'], // $from
// $emailDestinataire, // $to
// NULL, // $ccTo
// Mailer::$receiverAdress['mail_damien'], // $cciTo
// $nbConsultations . ' consultations pour votre blog "' . $titre . '"', // $subject
// NULL, // $replyTo
// NULL, // $contenu
// 'mails/templates/notifications_consultation_blog.html.twig', // $template
// $arrayMail, // $varTemplate
// NULL // $attachement
// );
}
}
}
} else {
$this->insertStatistiqueNbConsultationActualiteBuzz($idActualite);
}
} else {
// echo "robot";
}
}
// Retourner une réponse vide ou une redirection
return new Response('', Response::HTTP_NO_CONTENT);
}
/**
* Redirige vers les ouvrages sélectionnés
* Gère les clics publicitaires EFL
* Met à jour les statistiques par provenance
* @return mixed
*/
public function redirectionOuvragesSelectionnes(Request $request) { // /enregistrement.html
$action = $request->query->get('action') ?? NULL;
$from = $request->query->get('from') ?? NULL;
$idServicePrestataire = $request->query->get('id_service_prestataire') ?? NULL;
if ($action == 'clic_pub_efl' && $from == 'from_menu_droit_buzz' && !empty($idServicePrestataire)) {
$siteRedirect = $this->getSiteParIdServicePrestataire($idServicePrestataire);
$isBot = false;
$isFusacqBot = false;
$isBot = $this->isRobotConnu();
$isFusacqBot = $this->testSiConnexionFromLocauxFusacq();
if ($isBot == false && $isFusacqBot == false) {
if (!empty($this->getStatistiqueEFL($idServicePrestataire))) {
$this->updateStatistiqueEFL($idServicePrestataire, 1, 'from_menu_droit_buzz');
} else {
$this->insererStatistiqueEFL($idServicePrestataire, 1, 'from_menu_droit_buzz');
}
} else {
//
}
$siteRedirect = "https://" . $siteRedirect;
return $this->redirect($siteRedirect);
} else if ($action == 'clic_pub_efl' && $from == 'from_ouvrages' && !empty($idServicePrestataire)) {
$siteRedirect = $this->getSiteParIdServicePrestataire($idServicePrestataire);
$isBot = false;
$isFusacqBot = false;
$isBot = $this->isRobotConnu();
$isFusacqBot = $this->testSiConnexionFromLocauxFusacq();
if ($isBot == false && $isFusacqBot == false) {
if (!empty($this->getStatistiqueEFL($idServicePrestataire))) {
$this->updateStatistiqueEFL($idServicePrestataire, 1, "from_ouvrages");
} else {
$this->insererStatistiqueEFL($idServicePrestataire, 1, "from_ouvrages");
}
} else {
//
}
$siteRedirect = "https://" . $siteRedirect;
return $this->redirect($siteRedirect);
}
}
/**
* Affiche la newsletter quotidienne
* Récupère le contenu HTML, personnalise l'email
* Gère les images et liens de désinscription
* @return mixed
*/
public function redirectionNewsletterQuotidienne(Request $request, ?int $idNewsletter = null) {
$em = $this->em;
$email = $request->query->get('email', '');
if (!empty($idNewsletter)) {
$newsletter = $this->getNewsletterQuotidienneParId($idNewsletter);
} else {
$idNewsletter = $this->getIdDerniereNewsletterQuotidienne();
}
$textHtml = $newsletter[0]->_get('contenu_html');
if ($idNewsletter <= 1728) {
$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);
}
if (!empty($email)) {
$textHtml = str_replace('<!--###email_desinscription###-->', $email, $textHtml);
}
echo $textHtml;
return $this->response;
}
/**
* Récupère une newsletter quotidienne
* Recherche par identifiant unique
* Retourne l'objet newsletter correspondant
* @param int $idNewsletter
* @return mixed
*/
private function getNewsletterQuotidienneParId($idNewsletter) {
return $this->em->getRepository(BuzzNewslettersQuotidiennes::class)->findOneBy(['idNewsletter' => $idNewsletter]);
}
/**
* Obtient l'ID dernière newsletter
* Recherche la plus récente envoyée
* Retourne l'identifiant unique
* @param EntityManagerInterface $em
* @return int
*/
private function getIdDerniereNewsletterQuotidienne() {
$queryBuilder = $this->em->createQueryBuilder();
$query = $queryBuilder
->select(array("buzzNewslettersQuotidiennes.id_newsletter"))
->from(BuzzNewslettersQuotidiennes::class, 'buzzNewslettersQuotidiennes')
->where('buzzNewslettersQuotidiennes.mode = :modeEnvoyee')
->setParameter('modeEnvoyee', 'envoyee')
->orderBy('buzzNewslettersQuotidiennes.date_envoi', 'desc');
$resultat = $query
->setMaxResults(1)
->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
return $resultat[0]['id_newsletter'];
}
/**
* Récupère statistiques EFL
* Pour un prestataire et mois donnés
* Retourne les données existantes
* @param int $idServicePrestataire
* @return mixed
*/
private function getStatistiqueEFL($idServicePrestataire) {
$stats = $this->em->getRepository(StatistiquesClicsOuvragesEfl::class)->findOneBy(['id_service_prestataire' => $idServicePrestataire, 'date_mois' => date('Ym')]);
return $stats;
}
private function insererStatistiqueEFL($idServicePrestataire, $nb, $colFrom ) {
$stat = new StatistiquesClicsOuvragesEfl();
$stat->_set("id_service_prestataire", intval($idServicePrestataire));
$stat->_set("date_mois", date("Ym"));
if ($colFrom == 'from_ouvrages') {
$stat->_set("from_ouvrages", $nb);
} else {
$stat->_set("from_ouvrages", 0);
}
if ($colFrom == 'from_annuaire_experts') {
$stat->_set("from_annuaire_experts", $nb);
} else {
$stat->_set("from_annuaire_experts", 0);
}
if ($colFrom == 'from_autres') {
$stat->_set("from_autres", $nb);
} else {
$stat->_set("from_autres", 0);
}
if ($colFrom == 'from_menu_droit_buzz') {
$stat->_set("from_menu_droit_buzz", $nb);
} else {
$stat->_set("from_menu_droit_buzz", 0);
}
$this->em->persist($stat);
$this->em->flush();
}
private function updateStatistiqueEFL($idServicePrestataire, $nb, $colFrom) { // ($idServicePrestataire, 1, "from_ouvrages")
$stat = $this->em->getRepository(StatistiquesClicsOuvragesEfl::class)->findOneBy(['id_service_prestataire' => $idServicePrestataire, 'date_mois' => date('Ym')]);
if (!$stat) {
throw new \RuntimeException(
sprintf('Aucune statistique trouvée pour le prestataire ID: %d au mois %s', $idServicePrestataire, date('Ym'))
);
}
if ($colFrom == 'from_ouvrages') {
$n = (int) $stat->_get('from_ouvrages');
$n = $n + $nb;
$stat->_set("from_ouvrages", $n);
} else if ($colFrom == 'from_annuaire_experts') {
$n = (int) $stat->_get('from_annuaire_experts');
$n = $n + $nb;
$stat->_set("from_annuaire_experts", $n);
} else if ($colFrom == 'from_autres') {
$n = (int) $stat->_get('from_autres');
$n = $n + $nb;
$stat->_set("from_autres", $n);
} else if ($colFrom == 'from_menu_droit_buzz') {
$n = (int) $stat->_get('from_menu_droit_buzz');
$n = $n + $nb;
$stat->_set("from_menu_droit_buzz", $n);
}
$this->em->persist($stat);
$this->em->flush();
}
/**
* Récupère site web prestataire
* Recherche par ID service
* Retourne l'URL du site
* @param int $idServicePrestataire
* @return string
*/
private function getSiteParIdServicePrestataire($idServicePrestataire) {
$queryBuilder = $this->em->createQueryBuilder();
$query = $queryBuilder
->select(array("servicesPrestataire.url_site_web"))
->from(ServicesPrestataire::class, 'servicesPrestataire')
->where('servicesPrestataire.id_service_prestataire = :idService')
->setParameter('idService', $idServicePrestataire);
$resultat = $query
->setMaxResults(1000)
->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
return $resultat[0]['url_site_web'];
}
/**
* Vérifie connexion locaux FUSACQ
* Examine les headers HTTP
* Compare avec IP configurée
* @return bool
*/
private function testSiConnexionFromLocauxFusacq() {
$headers = apache_request_headers();
if (array_key_exists('X-Forwarded-For', $headers)) {
$hostname = $headers ['X-Forwarded-For'];
} else {
$hostname = $_SERVER ["REMOTE_ADDR"];
}
// $config = $this->getServiceLocator()->get('Config');
// if ($hostname == $config["adresse_IP_locaux_fusacq"]) {
// return true;
// } else {
// echo "###";
return false;
// }
}
/**
* Obtient IP du visiteur
* Vérifie les proxies X-Forwarded-For
* Retourne l'adresse IP réelle
* @return string
*/
private function getIPVisiteur() {
$headers = apache_request_headers();
if (array_key_exists('X-Forwarded-For', $headers)) {
$hostname = $headers['X-Forwarded-For'];
} else {
$hostname = $_SERVER["REMOTE_ADDR"];
}
return $hostname;
}
/**
* Détecte si robot connu
* Utilise le fournisseur RobotProvider
* Vérifie l'IP contre une liste
* @return bool
*/
private function isRobotConnu(): bool {
$ip = $this->getIPVisiteur();
$robotProvider = new RobotProvider();
return $robotProvider->donneNomRobot($ip) !== NULL;
}
/**
* Récupère statistiques consultation
* Pour une actualité spécifique
* Retourne l'objet statistique
* @param int $idActualite
* @return mixed
*/
private function getStatistiqueNbConsultationActualiteBuzz(int $idActualite) {
return $this->em->getRepository(StatistiquesNbConsultationsActualitesBuzz::class)->findOneBy(['id_actualite' => $idActualite]);
}
/**
* Insère statistique consultation
* Pour une nouvelle actualité
* Initialise le compteur à 1
* @param int $idActualite
* @return void
*/
private function insertStatistiqueNbConsultationActualiteBuzz($idActualite) {
$stat = new StatistiquesNbConsultationsActualitesBuzz();
$stat->_set("id_actualite", (int) $idActualite);
$stat->_set("nb_affichages", 1);
$this->em->persist($stat);
$this->em->flush();
}
/**
* Met à jour statistique consultation
* Incrémente le nombre d'affichages
* Persiste les modifications
* @param int $idActualite
* @param int $nb
* @return void
*/
private function updateStatistiqueNbConsultationActualiteBuzz($idActualite, $nb): void {
/*$stat = $this->em->getRepository(StatistiquesNbConsultationsActualitesBuzz::class)->findOneBy(['id_actualite' => $idActualite]);
if ($stat) {
$stat->_set("nb_affichages", $stat->_get('nb_affichages') + $nb);
$this->em->persist($stat);
$this->em->flush();
}*/
// On incrémente de 1 le nb de consultation
$this->consultations_annonce->incrementeConsultation('actualite', $idActualite);
}
/**
* Crée statistique de clic
* Gère anciennes/nouvelles tables
* Associe pays et newsletter
* @param string $email
* @param string $dateNewsletter
* @param string $lien
* @param string|NULL $idPays
* @return void
*/
private function createStatistiqueClic($email, $dateNewsletter, $lien, $idPays = NULL): void {
if ($dateNewsletter <= BuzzNewsletter::DATE_COMMENCE_NOUVELLE_TABLE_BUZZ_STATS) {
$stat = new StatistiquesNewsletterClics();
$stat->_set('date_newsletter', $dateNewsletter);
$stat->_set('email', $email);
$stat->_set('type_newsletter', BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
$stat->_set('lien', $lien);
$stat->_set('nb_clics', 1);
$stat->_set('id_pays', $idPays);
$this->em->persist($stat);
$this->em->flush();
} else {
$buzzLien = $this->em->getRepository(BuzzLiensNewsletter::class)->findOneBy(['lien' => $lien, 'date_newsletter' => $dateNewsletter, 'type_lien' => NULL]);
if (!$buzzLien) {
throw new \RuntimeException(
sprintf('Aucun lien trouvé pour: %s à la date %s', $lien, $dateNewsletter->format('Y-m-d'))
);
}
$stat = new StatistiquesNewsletterClicsDuJour();
$stat->_set('date_newsletter', $dateNewsletter);
$stat->_set('email', $email);
$stat->_set('type_newsletter', BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
$stat->_set('lien', $lien);
$stat->_set('nb_clics', 1);
$stat->_set('id_pays', $idPays);
$this->em->persist($stat);
$this->em->flush();
}
}
/**
* Modifie statistique de clic
* Incrémente ou crée nouvelle
* Gère transition entre tables
* @param string $email
* @param string $dateNewsletter
* @param string $lien
* @param int $n
* @param string|NULL $idPays
* @return void
*/
private function modifyStatistiqueClic($email, $dateNewsletter, $lien, $n, $id_lien,$idPays = NULL): void {
//ancien abondonne depuis 2017
if ($dateNewsletter <= BuzzNewsletter::DATE_COMMENCE_NOUVELLE_TABLE_BUZZ_STATS) {
$stat = $this->em->getRepository(StatistiquesNewsletterClics::class)->findOneBy(['date_newsletter' => $dateNewsletter, 'email' => $email, 'lien' => $lien, 'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI]);
if ($stat) {
$stat->_set('nb_clics', $stat->_get('nb_clics') + $n);
$stat->_set('id_pays', $idPays);
} else {
$stat = new StatistiquesNewsletterClics();
$stat->_set('date_newsletter', $dateNewsletter);
$stat->_set('email', $email);
$stat->_set('type_newsletter', BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
$stat->_set('lien', $lien);
$stat->_set('nb_clics', 1);
$stat->_set('id_pays', $idPays);
$this->em->persist($stat);
}
} else {
//On a une tache planifiee pour mettre à jour depuis StatistiquesNewsletterClicsDuJour ver StatistiquesNewsletterClicsNew
$buzzLien = $this->em->getRepository(BuzzLiensNewsletter::class)->findOneBy(['lien' => $lien, 'date_newsletter' => $dateNewsletter, 'type_lien' => NULL]);
if (!$buzzLien) {
throw new \RuntimeException(
sprintf('Aucun lien trouvé pour: %s à la date %s', $lien, $dateNewsletter->format('Y-m-d'))
);
}
$stat = $this->em->getRepository(StatistiquesNewsletterClicsDuJour::class)
->findOneBy([
'date_newsletter' => $dateNewsletter,
'email' => $email,
'id_lien' => $buzzLien->getIdLien(),
'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI
]);
if ($stat) {
$stat->_set('nb_clics', $stat->_get('nb_clics') + $n);
$stat->_set('id_pays', $idPays);
} else {
$stat = new StatistiquesNewsletterClicsDuJour();
$stat->_set('date_newsletter', $dateNewsletter);
$stat->_set('email', $email);
$stat->_set('type_newsletter', BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
$stat->_set('id_lien', $id_lien);
$stat->_set('nb_clics', 1);
$stat->_set('id_pays', $idPays);
;
$this->em->persist($stat);
}
}
$this->em->flush();
}
/**
* Vérifie existence statistique
* Recherche dans tables appropriées
* Retourne vrai si existante
* @param string $email
* @param string $dateNewsletter
* @param string $lien
* @return bool
*/
private function testSiStatistiqueClicCreee($email, $dateNewsletter, $lien): bool {
if ($dateNewsletter <= BuzzNewsletter::DATE_COMMENCE_NOUVELLE_TABLE_BUZZ_STATS) {
$result = $this->em->getRepository(StatistiquesNewsletterClics::class)
->findBy(['date_newsletter' => $dateNewsletter, 'email' => $email, 'lien' => $lien, 'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI]);
} else {
// Récupération de l'ID du lien
$buzzLien = $this->em->getRepository(BuzzLiensNewsletter::class)
->findOneBy([
'lien' => $lien,
'date_newsletter' => $dateNewsletter,
'type_lien' => NULL
]);
if (!$buzzLien) {
return false;
}
$idLien = $buzzLien->getIdLien();
$result = $this->em->getRepository(StatistiquesNewsletterClicsDuJour::class)
->findBy(['date_newsletter' => $dateNewsletter, 'email' => $email, 'id_lien' => $idLien, 'type_newsletter' => BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI]);
}
return count($result) >= 1;
}
/**
* Récupère lien par ID
* Recherche dans la base
* Retourne l'objet lien
* @param int $idLien
* @return mixed
*/
private function getLienParIdLien(int $idLien) {
return $this->em->getRepository(BuzzLiensNewsletter::class)->findOneBy(['id_lien' => $idLien]);
}
/**
* Obtient email utilisateur
* Par ID utilisateur
* Retourne l'adresse email
* @param int $idUtilisateur
* @return string|NULL
*/
private function getEmailUtilisateurParIdUtilisateur($idUtilisateur) {
$utilisateur = $this->em->getRepository(UtilisateursNewsletter::class)->findOneBy(['id_utilisateur' => $idUtilisateur]);
return $utilisateur ? $utilisateur->getEmail() : NULL;
}
/**
* Convertit chaîne URI
* En tableau associatif
* Gère les paramètres URL
* @param string $chaine
* @return array
*/
function chaineFormatUriToArray(string $chaine): array {
if ($chaine === "") {
return [];
}
$infos = [];
$tab_donnees = explode("&", $chaine);
foreach ($tab_donnees as $donnee) {
$temp = explode("=", $donnee, 2);
$infos[$temp[0]] = $temp[1] ?? NULL;
}
return $infos;
}
/**
* Récupère statistique ouverture
* Par email et date newsletter
* Retourne les résultats
* @param string $email
* @param string $dateNewsletter
* @return array
*/
private function getStatistiqueParEmailDate($email, $dateNewsletter) {
return $this->em->getRepository(StatistiquesNewsletterOuvertures::class)
->createQueryBuilder('s')
->where('s.date_newsletter = :dateNewsletter')
->andWhere('s.email = :email')
->andWhere('s.type_newsletter = :typeNewsletter')
->setParameter('dateNewsletter', $dateNewsletter)
->setParameter('email', $email)
->setParameter('typeNewsletter', BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI)
->getQuery()
->getResult();
}
/**
* Crée statistique ouverture
* Initialise le compteur
* Associe pays optionnel
* @param string $email
* @param string $dateNewsletter
* @param string|NULL $id_pays
* @return void
*/
private function createStatistiqueParEmailDate($email, $dateNewsletter, $id_pays = NULL) {
$stat = new StatistiquesNewsletterOuvertures();
if ($stat) {
$stat->_set("date_newsletter", $dateNewsletter);
$stat->_set("email", $email);
$stat->_set("type_newsletter", BuzzNewsletter::TYPE_NEWS_BUZZ_QUOTI);
$stat->_set("nb_ouvertures", 1);
$stat->_set("id_pays", $id_pays);
$this->em->persist($stat);
$this->em->flush();
}
}
}