<?php
/**
* Created by PhpStorm.
* User: grego
* Date: 30/09/2024
* Time: 12:34
*/
namespace App\Controller\CossBundle;
use App\Entity\Badge;
use App\Entity\Proof;
use App\Entity\ProofMessage;
use App\Entity\Recipient;
use App\Entity\User;
use App\Form\AddRecipientType;
use App\Form\RecipientsProofFormType;
use App\Manager\CossManager;
use App\Manager\ImportExportManager;
use App\Manager\MailerManager;
use App\Repository\RecipientRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Routing\Annotation\Route;
class RecipientController extends AbstractController
{
/**
* @Route("/recipients", name="recipients_list")
*/
public function listAction(Request $request, EntityManagerInterface $em){
$user = $this->getUser();
$request->setLocale($user->getLocale());
$recipients = $em->getRepository(Recipient::class)->getAllValidatedRecipients($user);
$users = $em->getRepository(Recipient::class)->getAllValidatorUsers($user, "all");
return $this->render('CossBundle/Recipient/list.html.twig', array(
'recipients' => $recipients,
'users' => $users
));
}
/**
* @Route("/recipients/link/{appUser}/{id}", name="recipients_link_user")
*/
public function linkRecipientAction(Request $request, EntityManagerInterface $em, TranslatorInterface $translator, CossManager $cossManager, $appUser, $id){
$user = $this->getUser();
$request->setLocale($user->getLocale());
$recipient = $em->getRepository(Recipient::class)->find($id);
$appUser = $em->getRepository(User::class)->find($appUser);
$access = false;
if (in_array( 'ROLE_SUPER_ADMIN', $user->getRoles() )){
$access = true;
} elseif ($appUser->getValidator() == $user){
$access = true;
}
if(!$access){
$msg = $translator->trans(
"Vous n'avez pas accès cet utilisateur",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('recipients_list');
}
$existingRecipient = $em->getRepository(Recipient::class)->findOneBy(array('user' => $recipient->getUser(), 'appUser' => $appUser ));
if($existingRecipient){
$msg = $translator->trans(
"Ce répondant est déjà rattaché à l'utilisateur sélectionné",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('recipients_list');
} else {
$newRecipient = new Recipient();
$newRecipient->setUser($recipient->getUser());
$newRecipient->setAppUser($appUser);
$newRecipient->setType($recipient->getType());
$newRecipient->setTitle($recipient->getTitle());
$newRecipient->setCompany($recipient->getCompany());
$newRecipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$newRecipient->setValidatedAt(new DateTime());
$newRecipient->setSources(array('admin'));
$em->persist($newRecipient);
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
$msg = $translator->trans(
"Le répondant %recipient% a été rattaché à %user%",
array('%user%' => $appUser->getEmail(), '%recipient%' => $recipient->getUser()->getEmail()), 'coss'
);
$this->addFlash("success", $msg);
}
return $this->redirectToRoute('recipients_list');
}
/**
* @Route("/recipients/list/{listType}", name="recipients_list_all_users")
*/
public function listAllUsersAction(Request $request, EntityManagerInterface $em, $listType = "to_validate"){
$user = $this->getUser();
$request->setLocale($user->getLocale());
$users = $em->getRepository(Recipient::class)->getAllValidatorUsers($user, $listType);
return $this->render('CossBundle/Recipient/list_all_users.html.twig', array(
'users' => $users,
'listType' => $listType
));
}
/**
* @Route("/recipients/{appUser}", name="list_user_recipients")
*/
public function listRecipientsAction(Request $request, $appUser, EntityManagerInterface $em, TranslatorInterface $translator, MailerManager $mailerManager, CossManager $cossManager)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$appUser = $em->getRepository(User::class)->find($appUser);
$access = false;
if (in_array( 'ROLE_SUPER_ADMIN', $user->getRoles() )){
$access = true;
} elseif ($appUser->getValidator() == $user){
$access = true;
}
if(!$access){
$msg = $translator->trans(
"Vous n'avez pas accès à cette liste de répondants",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('recipients_list_all_users');
}
$recipients = $em->getRepository(Recipient::class)->getUserRecipients($appUser);
$recipientsAnalysis = array();
foreach ($recipients as $recipient){
$analysisData = $recipient->getAnalysisData();
if($analysisData){
$score = 50;
foreach ($analysisData['criterias'] as $criteria) {
$impact = $criteria['impact'];
// Supprimer le "%" potentiel et convertir en entier
$value = (int) str_replace('%', '', $impact);
$score += $value;
}
// Score entre 0 et 100
$score = max(0, min(100, $score));
$recipientsAnalysis[] = array(
"firstname" => $recipient->getUser()->getFirstname(),
"lastname" => $recipient->getUser()->getLastname(),
"email" => $recipient->getUser()->getEmail(),
"title" => $recipient->getTitle(),
"company" => $recipient->getCompany(),
"type" => $recipient->getTypeClear(),
"relation_level" => $analysisData['relation_level'],
"admin_analysis" => $analysisData['admin_analysis'],
"score" => $score,
"criterias" => $analysisData['criterias'],
);
}
}
if(count($recipients) < 5){
if($request->getSession()->get('hideModal') == true){
$showModal = false;
} else {
$showModal = true;
}
} else {
$showModal = false;
}
$recipientsForm = $this->createFormBuilder()
->add('validatedRecipientsIds', TextType::class, array('label' => false, 'mapped' => false))
->add('deletedRecipientsIds', TextType::class, array('label' => false, 'mapped' => false))
->add('infoRecipientsIds', TextType::class, array('label' => false, 'mapped' => false))
->add('save', SubmitType::class, array('label' => false))
->getForm();
$recipientsForm->handleRequest($request);
if ($recipientsForm->isSubmitted() && $recipientsForm->isValid()) {
$recipientsValidated = false;
$recipientsDeleted = false;
$recipientsInfo = false;
$recipientsValidatedData = array();
$recipientsDeletedData = array();
$recipientsInfoData = array();
$validatedRecipientsIds = $recipientsForm->get('validatedRecipientsIds')->getData();
$validatedRecipients = explode(";", $validatedRecipientsIds);
foreach ($validatedRecipients as $id){
if($id){
$recipient = $em->getRepository(Recipient::class)->find($id);
if($recipient) {
$recipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$recipient->setValidatedAt(new Datetime());
$em->persist($recipient);
$recipientsValidated = true;
$recipientsValidatedData[] = $recipient;
}
}
}
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
$deletedRecipientsIds = $recipientsForm->get('deletedRecipientsIds')->getData();
$deletedRecipients = explode(";", $deletedRecipientsIds);
foreach ($deletedRecipients as $id){
if($id){
$recipient = $em->getRepository(Recipient::class)->find($id);
if($recipient) {
$em->remove($recipient);
$recipientsDeleted = true;
$recipientsDeletedData[] = $recipient;
}
}
}
$infoRecipientsIds = $recipientsForm->get('infoRecipientsIds')->getData();
$infoRecipients = explode(";", $infoRecipientsIds);
foreach ($infoRecipients as $id){
if($id){
$recipient = $em->getRepository(Recipient::class)->find($id);
if($recipient) {
$recipient->setStatus(RecipientRepository::STATUS_INFO);
$recipientsInfo = true;
$recipientsInfoData[] = $recipient;
}
}
}
$em->flush();
$recipientsData = array(
"validated" => $recipientsValidatedData,
"deleted" => $recipientsDeletedData,
"info" => $recipientsInfoData
);
if($recipientsValidated || $recipientsDeleted || $recipientsInfo){
if($recipientsValidated && !$recipientsDeleted && !$recipientsInfo){
// Send email only validated
$mailerManager->setRecipientsOnlyValidatedEmail($appUser, $recipientsData);
}elseif($recipientsDeleted && !$recipientsValidated && !$recipientsInfo){
// Send email only deleted
$mailerManager->setRecipientsOnlyDeletedEmail($appUser, $recipientsData);
}elseif($recipientsInfo && !$recipientsValidated && !$recipientsDeleted){
// Send email only info
$mailerManager->setRecipientsOnlyInfoEmail($appUser, $recipientsData);
} else {
// Send email with correct cases
$mailerManager->setRecipientsMultiCaseEmail($appUser, $recipientsData);
}
}
return $this->redirectToRoute('list_user_recipients', array('appUser' => $appUser->getId()));
}
$proofMessages = $em->getRepository(ProofMessage::class)->findAll();
return $this->render('CossBundle/Recipient/list_user.html.twig', array(
'recipients' => $recipients,
'recipientsAnalysis' => $recipientsAnalysis,
'appUser' => $appUser,
'showModal' => $showModal,
'proofMessages' => $proofMessages,
'form' => $recipientsForm->createView(),
));
}
/**
* @Route("/recipients/comment/add/{recipientId}", name="recipient_comment_add")
*/
public function addRecipientCommentAction(Request $request, EntityManagerInterface $em, $recipientId)
{
if ($request->isXmlHttpRequest()) {
$user = $this->getUser();
$request->setLocale($user->getLocale());
$comment = $request->request->get('comment');
$recipient = $em->getRepository(Recipient::class)->find($recipientId);
if($recipient){
$recipient->setComment($comment);
$em->persist($recipient);
$em->flush();
return new JsonResponse(
array(
'status' => 'ok',
'comment' => $comment,
'recipientId' => $recipient->getId()
), 200);
} else {
return new JsonResponse(
array(
'status' => 'error',
), 200);
}
} else {
return New Response("", 401);
}
}
/**
* @Route("/recipient/{appUser}/{mode}/{id}", name="edit_recipient")
*/
public function addRecipientAction(Request $request, $appUser, $mode, EntityManagerInterface $em, TranslatorInterface $translator, CossManager $cossManager, MailerManager $mailerManager, UserPasswordHasherInterface $passwordHasher, $id = null)
{
$nextAction = 'save';
$user = $this->getUser();
$request->setLocale($user->getLocale());
$appUser = $em->getRepository(User::class)->find($appUser);
$access = false;
if (in_array( 'ROLE_SUPER_ADMIN', $user->getRoles() )){
$access = true;
} elseif ($appUser->getValidator() == $user){
$access = true;
}
if(!$access){
$msg = $translator->trans(
"Vous n'avez pas accès à cette liste de répondants",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('recipients_list_all_users');
}
$isValidatorValidEmail = $cossManager->getValidatorIsValidEmail($user);
if(!$isValidatorValidEmail){
$msg = $translator->trans(
"Vous devez avoir un email professionnel pour ajouter des répondants",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('list_user_recipients', array('appUser' => $appUser->getId()));
}
if($id) {
$recipients = $em->getRepository(Recipient::class)->getUserRecipients($appUser);
$recipient = $em->getRepository(Recipient::class)->find($id);
$ids = array_map(function ($val) {
return $val->getId();
}, $recipients);
if (!in_array($recipient->getId(), $ids)) {
$msg = $translator->trans(
"Vous n'avez pas accès à cet utilisateur",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('list_user_recipients', array('appUser' => $appUser->getId()));
}
} else {
$recipient = null;
}
$addRecipientForm = $this->createAddRecipientForm($recipient);
$addRecipientForm->handleRequest($request);
if ($addRecipientForm->isSubmitted() && $addRecipientForm->isValid()) {
$nextAction = $addRecipientForm->get('saveAndAdd')->isClicked()
? 'save_add'
: 'save';
if($addRecipientForm['email']->getData()){
$isValidEmail = $cossManager->getRecipientValidEmail($addRecipientForm['email']->getData());
if($isValidEmail){
$existingUser = $em->getRepository(User::class)->findOneBy(array('email' => $addRecipientForm['email']->getData()));
if($existingUser){
$existingUser->setFirstname($addRecipientForm['firstname']->getData());
$existingUser->setLastname($addRecipientForm['lastname']->getData());
$existingUser->setEmail($addRecipientForm['email']->getData());
$existingUser->setUsername($addRecipientForm['email']->getData());
$em->persist($existingUser);
$em->flush();
$msg = $translator->trans(
"L'utilisateur %user% a été mis à jour",
array('%user%' => $addRecipientForm['email']->getData()), 'coss'
);
$this->addFlash("success", $msg);
$existingRecipient = $em->getRepository(Recipient::class)->findOneBy(array('user' => $existingUser, 'appUser' => $appUser ));
if(!$existingRecipient){
$newRecipient = new Recipient();
$newRecipient->setUser($existingUser);
$newRecipient->setAppUser($appUser);
$newRecipient->setType($addRecipientForm['type']->getData());
$newRecipient->setTitle($addRecipientForm['title']->getData());
$newRecipient->setCompany($addRecipientForm['company']->getData());
$newRecipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$newRecipient->setSources(array('admin'));
$newRecipient->setValidatedAt(new DateTime());
$em->persist($newRecipient);
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
$msg = $translator->trans(
"L'utilisateur %user% a été ajouté aux répondants de %sender%",
array('%user%' => $addRecipientForm['email']->getData(), '%sender%' => $appUser->getEmail()), 'coss'
);
$this->addFlash("success", $msg);
} else {
$existingRecipient->setUser($existingUser);
$existingRecipient->setAppUser($appUser);
$existingRecipient->setType($addRecipientForm['type']->getData());
$existingRecipient->setTitle($addRecipientForm['title']->getData());
$existingRecipient->setCompany($addRecipientForm['company']->getData());
$em->persist($existingRecipient);
$em->flush();
}
} else {
$newUser = new User();
$newUser->setFirstname($addRecipientForm['firstname']->getData());
$newUser->setLastname($addRecipientForm['lastname']->getData());
$newUser->setEmail($addRecipientForm['email']->getData());
$newUser->setUsername($addRecipientForm['email']->getData());
$newUser->setEnabled(false);
$newUser->setLocale($user->getLocale());
$plainpassword = substr( str_shuffle( 'abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789' ), 0, 10 );
$password = $passwordHasher->hashPassword(
$newUser,
$plainpassword
);
$newUser->setPassword($password);
$em->persist($newUser);
$em->flush();
$newRecipient = new Recipient();
$newRecipient->setUser($newUser);
$newRecipient->setAppUser($appUser);
$newRecipient->setType($addRecipientForm['type']->getData());
$newRecipient->setTitle($addRecipientForm['title']->getData());
$newRecipient->setCompany($addRecipientForm['company']->getData());
$newRecipient->setSources(array('admin'));
$newRecipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$newRecipient->setValidatedAt(new DateTime());
$em->persist($newRecipient);
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
$msg = $translator->trans(
"L'utilisateur %user% a été ajouté aux répondants de %sender%",
array('%user%' => $addRecipientForm['email']->getData(), '%sender%' => $appUser->getEmail()), 'coss'
);
$this->addFlash("success", $msg);
}
$request->getSession()->set('hideModal', true);
} else{
$error = $translator->trans(
"Vous devez saisir des emails professionnels de collaborateurs.",
array(), 'coss'
);
$this->addFlash("error", $error);
}
}
}
if($nextAction == "save_add"){
return $this->redirectToRoute('edit_recipient', array('appUser' => $appUser->getId(), 'mode' => 'add'));
}
return $this->render('CossBundle/Recipient/add.html.twig', array(
'addRecipientForm' => $addRecipientForm->createView(),
'mode' => $mode,
'appUser' => $appUser
));
}
/**
* @Route("/recipients/download/{appUser}", name="download_recipients")
*/
public function downloadRecipientsAction(Request $request, EntityManagerInterface $em, $appUser, CossManager $cossManager, TranslatorInterface $translator){
$user = $this->getUser();
$request->setLocale($user->getLocale());
$appUser = $em->getRepository(User::class)->find($appUser);
$access = false;
if (in_array( 'ROLE_SUPER_ADMIN', $user->getRoles() )){
$access = true;
} elseif ($appUser->getValidator() == $user){
$access = true;
}
if(!$access){
$msg = $translator->trans(
"Vous n'avez pas accès à cette liste de répondants",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('recipients_list_all_users');
}
$recipients = $em->getRepository(Recipient::class)->getUserRecipients($appUser);
$today = new Datetime();
$fileName = "export_recipients_".$today->format('d_m_Y').".csv";
$response = new StreamedResponse();
$response->setCallback(function() use ($recipients) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, ['firstname', 'lastname', 'email', 'type', 'title', 'company', 'status'], ';');
foreach ($recipients as $recipient) {
fputcsv(
$handle,
[$recipient->getUser()->getFirstname(), $recipient->getUser()->getLastname(), $recipient->getUser()->getEmail(), $recipient->getTypeClear(), $recipient->getTitle(), $recipient->getCompany(), $recipient->getStatus()],
';'
);
}
fclose($handle);
});
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
$response->headers->set('Content-Disposition','attachment; filename='.$fileName.'');
return $response;
}
/**
* @Route("/recipients/import/{appUser}", name="import_recipients")
*/
public function importRecipientsAction(Request $request, $appUser, EntityManagerInterface $em, TranslatorInterface $translator, CossManager $cossManager, ImportExportManager $importExportManager, UserPasswordHasherInterface $passwordHasher, MailerManager $mailerManager)
{
$user = $this->getUser();
$appUser = $em->getRepository(User::class)->find($appUser);
$access = false;
if (in_array( 'ROLE_SUPER_ADMIN', $user->getRoles() )){
$access = true;
} elseif ($appUser->getValidator() == $user){
$access = true;
}
if(!$access){
$msg = $translator->trans(
"Vous n'avez pas accès à cette liste de répondants",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('recipients_list_all_users');
}
$form = $this->createFormBuilder()
->add('importFile', FileType::class, array('label' => false, 'required' => false))
->getForm();
if ($request->getMethod('post') == 'POST') {
// Bind request to the form
$form->handleRequest($request);
// If form is valid
if ($form->isValid()) {
$fileImport = $form['importFile']->getData();
// CHECK ENCODING && EXTENSION
$extension = $fileImport->guessExtension();
if ($extension != "txt" && $extension != "csv" && $extension != "xls" && $extension != "xlsx") {
$error = $translator->trans(
"Merci de sélectionner un fichier au format CSV ou Excel",
array(), 'import_export'
);
$this->addFlash("error", $error);
} else {
$ok = true;
if ($extension == "txt" || $extension == "csv") {
if (!mb_detect_encoding($fileImport, 'UTF-8', true)) {
$error = $translator->trans(
"Merci de sélectionner un fichier encodé en UTF-8",
array(), 'import_export'
);
$this->addFlash("error", $error);
$ok = false;
} else {
$users = $importExportManager->openCSVFile($fileImport);
}
} else if ($extension == "xls" || $extension == "xlsx") {
$users = $importExportManager->openExcelFile($fileImport, false);
}
if ($ok) {
foreach ($users['users'] as $i => $utilisateur) {
if (count($users['fields']) != count($utilisateur)) {
if (count($utilisateur) == 1) {
$error = $translator->trans("La ligne %value% est peut-être vide, si ce n'est pas le cas, merci de corriger cette ligne.", array('%value%' => ($i + 1)), 'import_export');
$this->addFlash("error", $error);
break;
} else {
$error = $translator->trans("Le nombre de champs ne correspond pas à l'entête pour l'utilisateur en ligne : %value%", array('%value%' => ($i + 1)), 'import_export');
$this->addFlash("error", $error);
break;
}
} else {
// Traite l'utilisateur courant
$utilisateur["email"] = trim(preg_replace('/\s+/', ' ', $utilisateur["email"]));
$isValidEmail = $cossManager->getRecipientValidEmail($utilisateur['email']);
if ($isValidEmail) {
$existingUser = $em->getRepository(User::class)->findOneBy(array('email' => $utilisateur['email']));
if ($existingUser) {
$existingUser->setFirstname($utilisateur['firstname']);
$existingUser->setLastname($utilisateur['lastname']);
$existingUser->setEmail($utilisateur['email']);
$existingUser->setUsername($utilisateur['email']);
$em->persist($existingUser);
$em->flush();
$msg = $translator->trans(
"L'utilisateur %user% a été mis à jour",
array('%user%' => $utilisateur['email']), 'coss'
);
$this->addFlash("success", $msg);
$existingRecipient = $em->getRepository(Recipient::class)->findOneBy(array('appUser' => $appUser, 'user' => $existingUser));
if (!$existingRecipient) {
$newRecipient = new Recipient();
$newRecipient->setUser($existingUser);
$newRecipient->setAppUser($appUser);
$newRecipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$newRecipient->setValidatedAt(new DateTime());
$newRecipient->setType($utilisateur['type']);
$newRecipient->setTitle($utilisateur['title']);
$newRecipient->setCompany($utilisateur['company']);
$newRecipient->setSources(array('admin'));
$em->persist($newRecipient);
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
$msg = $translator->trans(
"L'utilisateur %user% a été ajouté aux répondants de vos utilisateurs",
array('%user%' => $utilisateur['email']), 'coss'
);
$this->addFlash("success", $msg);
}
} else {
$newUser = new User();
$newUser->setFirstname($utilisateur['firstname']);
$newUser->setLastname($utilisateur['lastname']);
$newUser->setEmail($utilisateur['email']);
$newUser->setUsername($utilisateur['email']);
$newUser->setEnabled(false);
$newUser->setLocale($user->getLocale());
$plainpassword = substr(str_shuffle('abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789'), 0, 10);
$password = $passwordHasher->hashPassword(
$newUser,
$plainpassword
);
$newUser->setPassword($password);
$em->persist($newUser);
$em->flush();
$msg = $translator->trans(
"L'utilisateur %user% a été ajouté",
array('%user%' => $utilisateur['email']), 'coss'
);
$this->addFlash("success", $msg);
$newRecipient = new Recipient();
$newRecipient->setUser($newUser);
$newRecipient->setAppUser($appUser);
$newRecipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$newRecipient->setValidatedAt(new DateTime());
$newRecipient->setType($utilisateur['type']);
$newRecipient->setTitle($utilisateur['title']);
$newRecipient->setCompany($utilisateur['company']);
$newRecipient->setSources(array('admin'));
$em->persist($newRecipient);
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
$msg = $translator->trans(
"L'utilisateur %user% a été ajouté aux répondants de vos utilisateurs",
array('%user%' => $utilisateur['email']), 'coss'
);
$this->addFlash("success", $msg);
}
} else {
$error = $translator->trans(
"Vous devez saisir des emails professionnels de collaborateurs.",
array(), 'coss'
);
$this->addFlash("error", $error);
break;
}
}
}
} else {
$error = $translator->trans("Une erreur est survenue lors de l'ouverture du fichier", array(), 'import_export');
$this->addFlash("error", $error);
}
}
}
}
return $this->render('CossBundle/Import/import_recipients.html.twig', array(
"form" => $form->createView()
));
}
/**
* @Route("/recipients/import/template/csv", name="import_recipients_template_csv")
*/
public function generateImportRecipientsTemplateCSV(Request $request)
{
$response = new StreamedResponse();
$response->setCallback(function(){
$handle = fopen('php://output', 'w+');
fwrite($handle, implode(';', ['"firstname"','"lastname"','"email"', '"type"', '"title"', '"company"']) . PHP_EOL);
fwrite($handle, implode(';', ['"Paul"','"Dupont"','"paul@dupont.com"', '"SUPERIOR"', '"Directeur Marketing"', '"EDF"']) . PHP_EOL);
fwrite($handle, implode(';', ['"Pierre"','"Dulac"','"pierre@dulac.com"', '"SUPERIOR"', '"Manager"', '"McDonalds"']) . PHP_EOL);
fwrite($handle, implode(';', ['"Marie"','"Lannau"','"marie@lannau.com"', '"PAIR"', '"Développeur"', '5Feedback']) . PHP_EOL);
fwrite($handle, implode(';', ['"Jacques"','"Mattel"','"jacques@mattel.com"', '"GUEST"', '"Client"', 'Microsoft']) . PHP_EOL);
fclose($handle);
});
$filename = "tutor_import_template.csv";
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
$response->headers->set('Content-Disposition','attachment; filename='.$filename.'');
return $response;
}
/**
* @Route("/recipients/import/template/excel", name="import_recipients_template_excel")
*/
public function generateImportRecipientsTemplateExcel(Request $request)
{
$response = new StreamedResponse();
$response->setCallback(function(){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'firstname');
$sheet->setCellValue('B1', 'lastname');
$sheet->setCellValue('C1', 'email');
$sheet->setCellValue('D1', 'type');
$sheet->setCellValue('E1', 'title');
$sheet->setCellValue('F1', 'company');
$sheet->setCellValue('A2', 'Paul');
$sheet->setCellValue('B2', 'Dupont');
$sheet->setCellValue('C2', 'paul@dupont.com');
$sheet->setCellValue('D2', 'SUPERIOR');
$sheet->setCellValue('E2', 'Directeur Marketing');
$sheet->setCellValue('F2', 'EDF');
$sheet->setCellValue('A3', 'Pierre');
$sheet->setCellValue('B3', 'Dulac');
$sheet->setCellValue('C3', 'pierre@dulac.com');
$sheet->setCellValue('D3', 'SUPERIOR');
$sheet->setCellValue('E3', 'Manager');
$sheet->setCellValue('F3', 'McDonalds');
$sheet->setCellValue('A4', 'Marie');
$sheet->setCellValue('B4', 'Lannau');
$sheet->setCellValue('C4', 'marie@lannau.com');
$sheet->setCellValue('D4', 'PAIR');
$sheet->setCellValue('E4', 'Développeur');
$sheet->setCellValue('F4', '5Feedback');
$sheet->setCellValue('A5', 'Jacques');
$sheet->setCellValue('B5', 'Mattel');
$sheet->setCellValue('C5', 'jacques@mattel.com');
$sheet->setCellValue('D5', 'GUEST');
$sheet->setCellValue('E5', 'Client');
$sheet->setCellValue('F5', 'Microsoft');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
});
$filename = "recipients_import_template.xlsx";
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition','attachment; filename='.$filename.'');
return $response;
}
/**
* @Route("/guest/recipients/proof/{id}/{token}", name="user_recipients_proof")
*/
public function guestUserRecipientsProofAction(Request $request, EntityManagerInterface $em, MailerManager $mailerManager, TranslatorInterface$translator, $id, $token)
{
$appUser = $em->getRepository(User::class)->find($id);
if ($appUser->getRecipientProofGuestToken() == $token) {
$recipients = $em->getRepository(Recipient::class)->getUserProofRecipients($appUser);
$recipientsForm = $this->createRecipientsProofForm($recipients);
$recipientsForm->handleRequest($request);
if ($recipientsForm->isSubmitted() && $recipientsForm->isValid()) {
$proofs = array();
$persist = true;
foreach ($recipients as $i => $recipient) {
$email = $recipientsForm->get('email_' . $i)->getData();
$comment = $recipientsForm->get('comment_' . $i)->getData();
$file = $recipientsForm->get('file_' . $i)->getData();
$delete = $recipientsForm->get('delete_' . $i)->getData();
if ($delete) {
$em->remove($recipient);
} else {
$proof = new Proof();
if ($email) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
// Get the domain part of the email
$domain = substr($email, strpos($email, '@') + 1);
// Check if the domain matches
if ($domain != "5feedback.com" && $domain != "globalcoss.com") {
$proof->setEmail($email);
} else {
$this->addFlash('error', $translator->trans("Vous avez saisi un email non autorisé.", [], 'coss'));
$persist = false;
}
} else {
$this->addFlash('error', $translator->trans("Merci de saisir un email valide.", [], 'coss'));
$persist = false;
}
}
$proof->setRecipient($recipient);
if($comment){
$proof->setComment($comment);
}
if($file){
$proof->setFile($file);
}
$em->persist($proof);
$proofs[] = $proof;
}
}
if($persist){
$em->flush();
$mailerManager->sendCOSSNewProofEmail($appUser, $recipients, $proofs);
return $this->render('CossBundle/Recipient/proof_success.html.twig', array());
}
}
return $this->render('CossBundle/Recipient/proofs_form.html.twig', array(
"recipients" => $recipients,
"recipientsCount" => count($recipients),
'form' => $recipientsForm->createView(),
));
} else {
return $this->render('CossBundle/Recipient/error.html.twig', array());
}
}
/**
* @Route("/guest/recipients/proof/{id}", name="recipient_proofs")
*/
public function guestRecipientProofsAction(Request $request, EntityManagerInterface $em, $id)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$recipient = $em->getRepository(Recipient::class)->find($id);
if($recipient){
return $this->render('CossBundle/Recipient/proofs_modal.html.twig', array(
'proofs' => $recipient->getProofs()
));
} else {
return $this->render('CossBundle/Recipient/error_modal.html.twig', array());
}
}
/**
* @Route("/recipients/validate/proof/{id}", name="validate_recipient_proof")
*/
public function validateRecipientProofAction(Request $request, EntityManagerInterface $em, $id)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$proof = $em->getRepository(Proof::class)->find($id);
if($proof){
$recipient = $proof->getRecipient();
$email = $proof->getEmail();
if($email){
$existingUser = $em->getRepository(User::class)->findOneBy(array('email' => $email));
if($existingUser){
$recipient->setUser($existingUser);
$em->persist($recipient);
} else {
$recipientUser = $recipient->getUser();
$recipientUser->setEmail($email);
$recipientUser->setUsername($email);
$em->persist($recipientUser);
}
}
$recipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$recipient->setValidatedAt(new Datetime());
$em->persist($recipient);
$em->flush();
return $this->redirectToRoute('list_user_recipients', array('appUser' => $proof->getRecipient()->getAppUser()));
} else {
return $this->redirectToRoute('list_user_recipients', array('appUser' => $proof->getRecipient()->getAppUser()));
}
}
/**
* @Route("recipients/list/validation/{token}/{id}", name="recipients_list_validation")
*/
public function recipientsListValidationAction(Request $request, $token, $id, EntityManagerInterface $em, CossManager $cossManager, MailerManager $mailerManager)
{
$appUser = $em->getRepository(User::class)->find($id);
if($appUser){
$validator = $appUser->getValidator();
if($mailerManager->getRecipientGuestToken($validator, $appUser) == $token) {
$recipients = $em->getRepository(Recipient::class)->getUserRecipients($appUser);
$recipientsListForm = $this->createFormBuilder()
->add('validatedIds', TextType::class, array('label' => false, 'mapped' => false))
->add('canceledIds', TextType::class, array('label' => false, 'mapped' => false))
->add('save', SubmitType::class, array('label' => false))
->getForm();
$recipientsListForm->handleRequest($request);
if ($recipientsListForm->isSubmitted() && $recipientsListForm->isValid()) {
$validatedIds = $recipientsListForm->get('validatedIds')->getData();
$validated = explode(";", $validatedIds);
foreach ($validated as $id){
if($id){
$recipient = $em->getRepository(Recipient::class)->find($id);
if($recipient) {
$recipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$recipient->setValidatedAt(new Datetime());
$em->persist($recipient);
}
}
}
$canceledIds = $recipientsListForm->get('canceledIds')->getData();
$canceled = explode(";", $canceledIds);
foreach ($canceled as $id){
if($id){
$recipient = $em->getRepository(Recipient::class)->find($id);
if($recipient) {
$em->remove($recipient);
}
}
}
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
return $this->render('CossBundle/Recipient/success.html.twig');
}
$recipientsArray = array();
foreach($recipients as $r){
$recipientsArray[] = $r->getUser()->getEmail();
}
return $this->render('CossBundle/Recipient/index.html.twig',
array(
'recipients' => $recipients,
'recipientsArray' => $recipientsArray,
'form' => $recipientsListForm->createView(),
'token' => $token,
'appUser' => $appUser,
'appUser_id' => $appUser->getId()
)
);
} else {
return $this->render('CossBundle/Recipient/error.html.twig');
}
} else {
return $this->render('CossBundle/Recipient/error.html.twig');
}
}
/**
* @Route("recipients/list/add-user/{token}/{id}", name="recipients_list_add_user_validation")
*/
public function recipientsListAddUserAction(Request $request, $token, $id, EntityManagerInterface $em, CossManager $cossManager, MailerManager $mailerManager)
{
if ($request->isXmlHttpRequest()) {
$appUser = $em->getRepository(User::class)->find($id);
if($appUser){
$validator = $appUser->getValidator();
if($mailerManager->getRecipientGuestToken($validator, $appUser) == $token) {
$lastname = $request->get('lastname');
$firstname = $request->get('firstname');
$email = $request->get('email');
$title = $request->get('title');
$type = $request->get('type');
$company = $request->get('company');
if($type == "SUPERIOR" || $type == "superior"){
$formattedType = RecipientRepository::SUPERIOR_RECIPIENT;
} elseif ($type == "PAIR" || $type == "pair"){
$formattedType = RecipientRepository::PAIR_RECIPIENT;
}elseif ($type == "GUEST" || $type == "guest"){
$formattedType = RecipientRepository::GUEST_RECIPIENT;
} else {
$formattedType = RecipientRepository::GUEST_RECIPIENT;
}
$u = $em->getRepository(User::class)->findOneBy(array('email' => $email));
if (!$u) {
$u = new User();
$u->setFirstname($firstname);
$u->setLastname($lastname);
$u->setEmail($email);
$u->setUsername($email);
$u->setLocale($request->getLocale());
$u->setPlainPassword(substr(str_shuffle(str_repeat($x='0123456789abcdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ', ceil(12/strlen($x)) )),1,12));
$em->persist($u);
$em->flush();
$newRecipient = new Recipient();
$newRecipient->setUser($u);
$newRecipient->setAppUser($appUser);
$newRecipient->setType($formattedType);
$newRecipient->setTitle($title);
$newRecipient->setCompany($company);
$newRecipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$newRecipient->setSources(array('admin'));
$newRecipient->setValidatedAt(new Datetime());
$em->persist( $newRecipient);
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
return new JsonResponse(array('status' => 'ok', 'user' => array('id' => $newRecipient->getId(), 'firstname' => $firstname, 'lastname' => $lastname, 'email' => $email, 'title' => $title, 'type' => $newRecipient->getTypeClear())));
} else {
$recipient = $em->getRepository(Recipient::class)->findOneBy(array('appUser' => $appUser, 'user' => $u));
if(!$recipient){
$recipient = new Recipient();
$recipient->setUser($u);
$recipient->setAppUser($appUser);
$recipient->setType($formattedType);
$recipient->setTitle($title);
$recipient->setCompany($company);
$recipient->setStatus(RecipientRepository::STATUS_VALIDATED);
$recipient->setSources(array('admin'));
$recipient->setValidatedAt(new DateTime());
$em->persist( $recipient);
$em->flush();
// Check new badges after new validated recipient
$cossManager->sendMissingBadges($appUser);
}
return new JsonResponse(array('status' => 'ok', 'user' => array('id' => $recipient->getId(), 'firstname' => $firstname, 'lastname' => $lastname, 'email' => $email, 'title' => $title, 'type' => $recipient->getTypeClear())));
}
} else {
return new JsonResponse(array('status' => 'error'));
}
} else {
return new JsonResponse(array('status' => 'error'));
}
} else {
return New Response("", 401);
}
}
private function createAddRecipientForm($recipient){
$form = $this->createForm(AddRecipientType::class, new AddRecipientType(), array('recipient' => $recipient));
return $form;
}
private function createRecipientsProofForm($recipients)
{
$form = $this->createForm(RecipientsProofFormType::class, new RecipientsProofFormType(), array(
'recipients' => $recipients,
));
return $form;
}
}