<?php
namespace App\Controller\Inscription;
use App\Entity\Adresse;
use App\Entity\Individu;
use App\Entity\Optin;
use App\Entity\Prospect;
use App\Entity\Reabonnement;
use App\Entity\RefSource;
use App\Entity\User;
use App\Entity\RefOptin;
use App\Entity\RefTypeOptin;
use App\Form\InscriptionType;
use App\Form\ResetPasswordType;
use App\Service\MailerService;
use DateInterval;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\HttpFoundation\Request;
use App\Service\PasswordTempGenerator;
use App\Service\salesForce;
use App\Entity\LogSalesforce;
use App\Entity\RefTypeEnvoiSalesforce;
class InscriptionController extends AbstractController
{
private $passwordEncoder;
private $serviceSalesforce;
private $entityManager;
private $typeFormatMag;
public function __construct(EntityManagerInterface $entityManager,
UserPasswordEncoderInterface $passwordEncoder,
salesForce $serviceSalesforce)
{
$this->entityManager = $entityManager;
$this->passwordEncoder = $passwordEncoder;
$this->serviceSalesforce = $serviceSalesforce;
}
public function inscription()
{
return $this->redirectToRoute('inscriptionForm',[
'format' => 'digital',
'prospect' => 0,
]);
}
public function inscriptionForm(Request $request,$format,$prospect,PasswordTempGenerator $passwordGenerator, MailerService $mailerService){
$individu = new Individu();
$user = new User();
$adresse = new Adresse();
$adresse->setIdIndiv($individu);
$subscriptions = [];
$prospect = $this->entityManager->getRepository(Prospect::class)->findOneByEmail($prospect);
$form = $this->createForm(InscriptionType::class,[
'individu'=>$individu,
'adresse'=>$adresse,
'subscriptions'=>$subscriptions
]);
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
$individu->setDateInscription(new \DateTime());
$dateCrea = new \DateTime();
$individu->setDateInactivite($dateCrea->add(new DateInterval("P3Y")));
$source = $this->entityManager->getRepository(RefSource::class)->findOneBy(['libelle' => 'SITE_D4']);
$individu->setIdRefSource($source);
$this->entityManager->persist($individu);
$user->setIndividu($individu);
$user->setEmail($individu->getEmail());
// GESTION PASSWORD
$passwordTemp = $passwordGenerator->generateRandomStrongPassword(8);
$newPassword = $this->passwordEncoder->encodePassword($user,$passwordTemp);
$user->setPassword($newPassword);
$user->setChangePassword(false);
$user->setRoles(['ROLE_ABONNE']);
$this->entityManager->persist($user);
$adresse->setIdIndiv($individu);
$this->entityManager->persist($adresse);
if($prospect){
$dateFinProspect = new \DateTime();
$prospect->setIdIndiv($individu);
$prospect->setPlusProspect(true);
$prospect->setDateFinProspect($dateFinProspect);
$this->entityManager->persist($prospect);
}
$formData = $form->getViewData();
$magazine = '';
$newsletters = '';
$additionals = '';
foreach ($formData['subscriptions'] as $key => $subscription) {
$optin = new Optin();
$optin->setIdIndiv($individu);
$optin->setEnable($subscription);
switch ($key) {
case "magPrint":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(1));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(1));
if($format === 'print'){
$optin->setEnable(TRUE);
$magazine = 'Print (Free - 6 times a year for 3 years)';
}
break;
case "magDigital":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(2));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(1));
if($format === 'digital'){
$optin->setEnable(TRUE);
$magazine = 'Digital (Free - 6 times a year for 3 years)';
}
break;
case "magDigitPrint":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(3));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(1));
if($format === 'print + digital'){
$optin->setEnable(TRUE);
$magazine = 'Digital + Print (Free - 6 times a year for 3 years)';
}
break;
case "nlEn":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(4));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(2));
if($optin->getEnable()){
$newsletters .= '<b>JEC Composites Market News (English, 52 issues/year)</b><br />';
}
break;
case "nlFr":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(5));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(2));
if($optin->getEnable()) {
$newsletters .= '<b>JEC Composites Informations (French, 26 issues/year)</b><br />';
}
break;
case "jecCompo":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(6));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(3));
if($optin->getEnable()) {
$additionals .= '<b>You wish to receive information from JEC Composites Magazine</b><br />';
}
break;
case "jecGroup":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(7));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(3));
if($optin->getEnable()) {
$additionals .= '<b>You wish to receive information and specials offers from JEC Group</b><br />';
}
break;
case "jecPartners":
$optin->setIdRefOptin($this->entityManager->getRepository(RefOptin::class)->find(8));
$optin->setIdRefTypeOptin($this->entityManager->getRepository(RefTypeOptin::class)->find(3));
if($optin->getEnable()) {
$additionals .= '<b>You wish to receive special offers and promotional communication from JEC Partners</b><br />';
}
break;
}
$this->entityManager->persist($optin);
}
$email = $user->getEmail();
$this->entityManager->flush();
$contentJson = $this->constructJson('indiv', $individu, $adresse,null);
$this->serviceSalesforce->create();
$response = $this->serviceSalesforce->envoiData('indiv', $contentJson);
$logSalesforce = new LogSalesforce();
$logSalesforce->setIdIndividu($individu);
$logSalesforce->setContenuEnvoi($contentJson);
$logSalesforce->setIdRefTypeEnvoiSalesforce($this->entityManager->getRepository(RefTypeEnvoiSalesforce::class)->findOneBy(['libelle' => 'indiv']));
$logSalesforce->setStatuHttp($response === false ? "400" : $response->getStatusCode());
$this->entityManager->persist($logSalesforce);
if($response->getStatusCode() == 200 and json_decode($response->getContent(),true)['success'] == true){
$individu->setIdSalesforce(json_decode($response->getContent(),true)['id']);
$this->entityManager->persist($individu);
}
$this->entityManager->flush();
// envoi email confirmation inscription
$mailerService->sendEmail(MailerService::ID_CAMP_CONFIRM_CREA_COMPTE, [
['name' => 'adresse_email', 'value' => $email],
['name' => 'jec_magazine', 'value' => $magazine ?? " "],
['name' => 'jec_nl', 'value' => $newsletters ?? " "],
['name' => 'jec_additional', 'value' => $additionals ?? " "],
['name' => 'sujet_email_jec', 'value' => 'JEC Composites - Confirmation activation account']
]);
// envoi email mot de passe temp
$mailerService->sendEmail(MailerService::ID_CAMP_REINIT_PASSWORD, [
['name' => 'adresse_email', 'value' => $email],
['name' => 'jec_password', 'value' => $passwordTemp],
['name' => 'sujet_email_jec', 'value' => 'JEC Composites - Your temporary password'],
]);
return $this->redirectToRoute('inscriptionEnd');
}else{
return $this->render('Inscription/inscriptionForm.html.twig', [
'format' => $format,
'form' => $form->createView(),
'prospect'=>$prospect
]);
}
}
public function inscriptionEnd()
{
return $this->render('Inscription/inscriptionEnd.html.twig');
}
public function reset(Request $request, PasswordTempGenerator $passwordGenerator, MailerService $mailerService)
{
$form = $this->CreateForm(ResetPasswordType::class);
$form->handleRequest($request);
$email = $request->request->get('reset_password');
if($form->isSubmitted() && $form->isValid()){
//à mettre en place lors de la pseudonymisation
$querySql = "SELECT id FROM jec_prod.user u WHERE (email).hashed = jec_prod.encode_search('".$email['email']."' ,'c6c71a47913df5a980a73ccb500ee68f194088b515e4538a3c15bc6a2fb1e30d065aadb03409ebadd1def081a5c0eed2c73e9656a024eb86c627b01462609e45')";
$conn = $this->entityManager
->getConnection();
$stmt = $conn->prepare($querySql);
$resultSql =$stmt->execute([])->fetch();
$user = (false === $resultSql) ? NULL : $this->entityManager->getRepository(User::class)->findOneBy(['id' => $resultSql['id']]);
if(!$user){
$this->addFlash('danger', 'No account matching this email address was found.');
return $this->render('Inscription/lostPassword.html.twig', [
'form' => $form->createView(),
'path_lien_redirect' => 'inscription',
'texte_lien_redirect' => 'Subscribe for free >'
]);
}else {
$passwordTemp = $passwordGenerator->generateRandomStrongPassword(8);
$newPassword = $this->passwordEncoder->encodePassword($user, $passwordTemp);
$user->setPassword($newPassword);
$user->setChangePassword(false);
if(!$user->hasRole('ROLE_BO')) {
$user->setRoles(['ROLE_USER']);
}
$this->entityManager->persist($user);
$this->entityManager->flush();
//envoi mail
$mailerService->sendEmail(MailerService::ID_CAMP_REINIT_PASSWORD, [
['name' => 'adresse_email', 'value' => $email['email']],
['name' => 'jec_password', 'value' => $passwordTemp],
['name' => 'sujet_email_jec', 'value' => 'JEC Composites - Reset my password'],
]);
$this->addFlash('success', 'Your temporary password has been sent. Please check your inbox.');
return $this->render('Inscription/loginPage.html.twig', [
'form' => $form->createView(),
'last_username' => $email['email'],
'error' => null,
]);
}
}
else{
return $this->render('Inscription/lostPassword.html.twig', [
'form' => $form->createView(),
]);
}
}
public function landingPageParrainage(Request $request, string $email)
{
$prospect = $this->entityManager->getRepository(Prospect::class)->findOneByEmail($email);
if($prospect->getPlusProspect() || $prospect->getActif()){
return $this->render('accueil.html.twig', [
]);
}
else{
if($request->get('abonne')){
return $this->render('Inscription/choose_mag.html.twig', [
'prospect' => $email,
]);
} elseif($request->get('desabo')){
$prospect->setPlusProspect(true);
$prospect->setDateFinProspect(new \DateTime());
$this->entityManager->persist($prospect);
$this->entityManager->flush();
$this->addFlash('success', 'Your changes have been saved successfully.');
}
return $this->render('landingPageParrainage.html.twig', [
'email' => $email,
'prospect' => $prospect
]);
}
}
public function constructJson(string $typeJson, Individu $individu, ?Adresse $adresse, ?Reabonnement $reabonnement)
{
$currentDate = new \DateTime();
$nlEn = $this->entityManager->getRepository(Optin::class)->findOneBy( ['idIndiv' => $individu->getId(), 'idRefOptin' => 4])->getEnable();
$nlFr = $this->entityManager->getRepository(Optin::class)->findOneBy( ['idIndiv' => $individu->getId(), 'idRefOptin' => 5])->getEnable();
$FormatMag = $this->entityManager->getRepository(Optin::class)->TypeOptinMagazine($individu->getId());
$this->typeFormatMag = $FormatMag ? $FormatMag->getIdRefOptin()->getLibelle() : null;
$inactif = $individu->getDateDesabo() || $individu->getDateInactivite() < $currentDate ? true : false;
if($this->typeFormatMag == 'DIGITAL+PRINT'){
$this->typeFormatMag = 'Digital & Print';
}
switch ($typeJson){
case 'indiv':
$contentJson = [
"Name" => '',
"Salutation__c" => ($individu->getIdRefCiv() ? $individu->getIdRefCiv()->getAbregee() : ''),
"FirstName__c" => $individu->getFirstName(),
"LastName__c" => $individu->getLastName(),
"Email__c" => $individu->getEmail(),
"Company__c" => $adresse->getCompanyName(),
"JobTitle__c" => $individu->getJobTitle(),
"Department__c" => ($individu->getIdRefDepartmentSector() ? $individu->getIdRefDepartmentSector()->getLibelle() : ''),
"Function__c" => ($individu->getIdRefFonction() ? $individu->getIdRefFonction()->getLibelle() : ''),
"BusinessPhone__c" => $individu->getBusinessPhone(),
"MobilePhone__c" => $individu->getMobilePhone(),
"SubscriptionDate__c" => $individu->getDateInscription()->format('Y-m-d'),
"UnsubscriptionDate__c" => ($individu->getDateDesabo() ? $individu->getDateDesabo()->format('Y-m-d') : null),
"ID_D4__c" => $individu->getId(),
"NewsletterEN__c" => $nlEn,
"NewsletterFR__c" => $nlFr,
"Inactive__c" => $inactif,
"inactivedate__c" => $individu->getDateInactivite()->format('Y-m-d'),
"city__c" => $adresse->getTownCity(),
"countrycode__c" => ($adresse->getIdRefPays() ? $adresse->getIdRefPays()->getCodePays() : ''),
"postalcode__c" => $adresse->getPostCodeZip(),
"street1__c" => $adresse->getAdr1(),
"street2__c" => $adresse->getAdr2(),
"street3__c" => $adresse->getAdr3(),
"street4__c" => $adresse->getAdr4(),
"subscriptionformat__c" => strtoupper($this->typeFormatMag),
"source__c" => ($individu->getidRefSource() ? $individu->getidRefSource()->getIdRefTypeSource()->getLibelle().' - '.$individu->getidRefSource()->getLibelle() : '')
];
break;
case 'reabo':
$contentJson = [
"ID_D4__c" => $reabonnement->getId(),
"ResubDate__c" => $reabonnement->getDateReabo()->format('Y-m-d'),
"Format__c" => strtoupper($this->typeFormatMag),
"JCM_Subscription__r" => [
"ID_D4__c" => $individu->getId()
],
"Source__c" => $reabonnement->getidRefSource()->getIdRefTypeSource()->getLibelle().' - '.$reabonnement->getidRefSource()->getLibelle()
];
break;
default:
$contentJson = [];
}
return $contentJson;
}
}