<?php
/**
* Created by PhpStorm.
* User: grego
* Date: 02/12/2024
* Time: 11:17
*/
namespace App\Controller\CossBundle;
use App\Entity\Campaign;
use App\Entity\Participation;
use App\Entity\Program;
use App\Entity\User;
use App\Form\CampaignType;
use App\Form\ParticipationType;
use App\Form\ReportType;
use App\Manager\CossManager;
use App\Manager\MistralManager;
use App\Manager\ReportManager;
use App\Repository\CampaignRepository;
use App\Repository\ParticipationRepository;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\MediaBundle\Provider\Pool;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ClientAdminController extends AbstractController
{
/**
* @Route("/client/programs", name="client_admin_list_programs")
*/
public function listProgramsAction(Request $request, CossManager $cossManager)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$programs = $cossManager->getClientAdminPrograms($user);
return $this->render('CossBundle/ClientAdmin/list_programs.html.twig', array(
'programs' => $programs,
));
}
/**
* @Route("/client/campaigns/create/{id}", name="client_admin_create_campaign")
*/
public function createCampaignAction(Request $request, EntityManagerInterface $entityManager, CossManager $cossManager, TranslatorInterface $translator, $id)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$programs = $cossManager->getClientAdminPrograms($user);
$program = $entityManager->getRepository(Program::class)->find($id);
$ids = array_map(function ($val) {
return $val->getId();
}, $programs);
if (!in_array($program->getId(), $ids)) {
$msg = $translator->trans(
"Vous n'êtes pas rattaché à ce programme",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('client_admin_list_programs');
} else {
$createCampaignForm = $this->createCampaignForm(null);
$createCampaignForm->handleRequest($request);
if ($createCampaignForm->isSubmitted() && $createCampaignForm->isValid()) {
$newCampaign = new Campaign();
$newCampaign->setProgram($program);
$newCampaign->setQuiz($program->getQuiz());
$newCampaign->setStatus(CampaignRepository::STATUS_ACTIVE);
$newCampaign->setStartDate($createCampaignForm->get('startDate')->getData());
$newCampaign->setEndDate($createCampaignForm->get('endDate')->getData());
$entityManager->persist($newCampaign);
$entityManager->flush();
$url = $this->generateUrl(
'list_recipients',
['token' => $newCampaign->getToken()],
UrlGeneratorInterface::ABSOLUTE_URL
);
$msg = $translator->trans(
"Campagne créée avec succès",
array(), 'coss'
);
$this->addFlash("success", $msg);
$campaigns = $cossManager->getClientAdminCampaigns($user, null);
return $this->render('CossBundle/ClientAdmin/list_campaigns.html.twig', array(
'campaigns' => $campaigns,
'listType' => null,
'show_modal_url' => true,
'modal_program_link' => $url,
'modal_program_name' => $program->getName(),
'modal_program_start' => $newCampaign->getStartDate(),
'modal_program_end' => $newCampaign->getEndDate(),
));
}
return $this->render('CossBundle/ClientAdmin/create_edit_campaign.html.twig', array(
'program' => $program,
'campaignForm' => $createCampaignForm->createView(),
'mode' => "create"
));
}
}
/**
* @Route("/client/campaigns/{listType}", name="client_admin_list_campaigns")
*/
public function listCampaignsAction(Request $request, CossManager $cossManager, $listType = 0)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$campaigns = $cossManager->getClientAdminCampaigns($user, $listType);
return $this->render('CossBundle/ClientAdmin/list_campaigns.html.twig', array(
'campaigns' => $campaigns,
'listType' => $listType,
'show_modal_url' => false,
'modal_program_link' => null,
'modal_program_name' => null,
'modal_program_start' => null,
'modal_program_end' => null,
));
}
/**
* @Route("/client/campaigns/edit/{id}", name="client_admin_edit_campaign")
*/
public function editCampaignAction(Request $request, EntityManagerInterface $entityManager, CossManager $cossManager, TranslatorInterface $translator, $id)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$campaign = $entityManager->getRepository(Campaign::class)->find($id);
if (!$campaign) {
$msg = $translator->trans(
"Cette campagne n'existe pas",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('client_admin_list_campaigns');
} else {
$users = $cossManager->getClientAdminCampaigns($user, null);
$ids = array_map(function ($val) {
return $val->getId();
}, $users);
if (!in_array($campaign->getId(), $ids)) {
$msg = $translator->trans(
"Vous n'êtes pas rattaché à cette campagne",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('client_admin_list_campaigns');
} else {
$editCampaignForm = $this->createCampaignForm($campaign);
$editCampaignForm->handleRequest($request);
if ($editCampaignForm->isSubmitted() && $editCampaignForm->isValid()) {
$campaign->setStartDate($editCampaignForm->get('startDate')->getData());
$campaign->setEndDate($editCampaignForm->get('endDate')->getData());
$entityManager->persist($campaign);
$entityManager->flush();
$msg = $translator->trans(
"Campagne modifiée avec succès",
array(), 'coss'
);
$this->addFlash("success", $msg);
return $this->redirectToRoute('client_admin_list_campaigns');
}
return $this->render('CossBundle/ClientAdmin/create_edit_campaign.html.twig', array(
'program' => $campaign->getProgram(),
'campaignForm' => $editCampaignForm->createView(),
'mode' => 'edit',
));
}
}
}
/**
* @Route("/client/campaigns/download/csv", name="client_admin_download_campaigns")
*/
public function downloadCampaignsAction(Request $request, CossManager $cossManager)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$campaigns = $cossManager->getClientAdminCampaigns($user, null);
$today = new Datetime();
$fileName = "export_campaigns_".$today->format('d_m_Y').".csv";
$response = new StreamedResponse();
$response->setCallback(function() use ($campaigns) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, ['company', 'program', 'quiz', 'startDate', 'endDate', 'status'], ';');
foreach ($campaigns as $campaign) {
fputcsv(
$handle,
[$campaign->getProgram()->getCompany()->getName(), $campaign->getProgram()->getName(), $campaign->getQuiz()->getTitle(), $campaign->getStartDate()->format('d/m/Y'), $campaign->getEndDate()->format('d/m/Y'), $campaign->getStatusFormatted()],
';'
);
}
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;
}
/*___________only for SUPER_ADMIN___________*/
/**
* @Route("/client/participations/{listType}", name="client_admin_list_participations")
*/
public function listParticipationsAction($listType = -1, Request $request, CossManager $cossManager)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$participations = $cossManager->getClientAdminParticipations($listType);
return $this->render('CossBundle/ClientAdmin/list_participations.html.twig', array(
'participations' => $participations,
'listType' => $listType,
));
}
/**
* @Route("/client/participations/edit/{id}", name="client_admin_edit_participation")
*/
public function editParticipationAction(Request $request, EntityManagerInterface $entityManager, CossManager $cossManager, TranslatorInterface $translator, $id)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$participation = $entityManager->getRepository(Participation::class)->find($id);
if (!$participation) {
$msg = $translator->trans(
"Cette participation n'existe pas",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('client_admin_list_participations');
} else {
$editParticipationForm = $this->createParticipationForm($participation);
$editParticipationForm->handleRequest($request);
if ($editParticipationForm->isSubmitted() && $editParticipationForm->isValid()) {
$participation->setStartDate($editParticipationForm->get('startDate')->getData());
$participation->setEndDate($editParticipationForm->get('endDate')->getData());
$participation->setStatus($editParticipationForm->get('status')->getData());
$entityManager->persist($participation);
$entityManager->flush();
$msg = $translator->trans(
"Participation modifiée avec succès",
array(), 'coss'
);
$this->addFlash("success", $msg);
return $this->redirectToRoute('client_admin_list_participations');
}
return $this->render('CossBundle/ClientAdmin/edit_participation.html.twig', array(
'participation' => $participation,
'participationForm' => $editParticipationForm->createView(),
'mode' => 'edit',
));
}
}
/**
* @Route("/client/participations/report/edit/{id}", name="client_admin_edit_participation_report")
*/
public function editParticipationReportAction(Request $request, EntityManagerInterface $entityManager, ReportManager $reportManager, TranslatorInterface $translator, $id)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$participation = $entityManager->getRepository(Participation::class)->find($id);
if (!$participation) {
$msg = $translator->trans(
"Cette participation n'existe pas",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('client_admin_list_participations');
} else {
$reportForm = $this->createReportForm($participation);
$reportForm->handleRequest($request);
if ($reportForm->isSubmitted() && $reportForm->isValid()) {
$participation->setReportDate($reportForm->get('reportDate')->getData());
$participation->setReportAnswersCount($reportForm->get('answersCount')->getData());
$data = $request->request->get('reportData');
$strengthsImage = $request->request->get('strengths_image');
$weaknessesImage = $request->request->get('weaknesses_image');
$strengthsPath = $this->saveBase64Image($strengthsImage);
$weaknessesPath = $this->saveBase64Image($weaknessesImage);
$participation->setReportData($data);
$html = $reportManager->generate($participation, $strengthsPath, $weaknessesPath);
$participation->setStatus(ParticipationRepository::STATUS_CLOSED);
$entityManager->persist($participation);
$entityManager->flush();
if($html){
$this->addFlash('success', 'Rapport généré avec succès.');
return $this->redirectToRoute('client_admin_participation_report_success', [
'id' => $participation->getId()
]);
} else {
$this->addFlash('error', 'Une erreur est survenue lors de la génération du rapport.');
return $this->redirectToRoute('client_admin_list_participations');
}
}
return $this->render('CossBundle/ClientAdmin/edit_report.html.twig', [
'participation' => $participation,
'reportData' => $participation->getReportData(),
'reportForm' => $reportForm->createView(),
]);
}
}
/**
* @Route("/client/participations/report/success/{id}", name="client_admin_participation_report_success")
*/
public function participationReportSuccessAction(Request $request, EntityManagerInterface $entityManager, TranslatorInterface $translator, $id)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$participation = $entityManager->getRepository(Participation::class)->find($id);
if (!$participation) {
$msg = $translator->trans(
"Cette participation n'existe pas",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('client_admin_list_participations');
} else {
if(!$participation->getReport()){
$msg = $translator->trans(
"Cette participation n'a pas encore de rapport généré",
array(), 'coss'
);
$this->addFlash("error", $msg);
return $this->redirectToRoute('client_admin_list_participations');
} else {
return $this->render('CossBundle/ClientAdmin/download_report.html.twig', [
'participation' => $participation
]);
}
}
}
/**
* @Route("/client/participations/download/csv", name="client_admin_download_participations")
*/
public function downloadParticipationsAction(Request $request, CossManager $cossManager)
{
$user = $this->getUser();
$request->setLocale($user->getLocale());
$participations = $cossManager->getClientAdminParticipations(-1);
$today = new Datetime();
$fileName = "export_participations_".$today->format('d_m_Y').".csv";
$response = new StreamedResponse();
$response->setCallback(function() use ($participations) {
$handle = fopen('php://output', 'w+');
fputcsv($handle, ['participant', 'company', 'program', 'quiz', 'startDate', 'endDate', 'status'], ';');
foreach ($participations as $participation) {
fputcsv(
$handle,
[
$participation->getParticipant()->getFullname(),
$participation->getCampaign()->getProgram()->getCompany()->getName(),
$participation->getCampaign()->getProgram()->getName(),
$participation->getCampaign()->getQuiz()->getTitle(),
$participation->getStartDate()->format('d/m/Y'),
$participation->getEndDate()->format('d/m/Y'),
$participation->getStatusFormatted()
],
';'
);
}
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;
}
private function createCampaignForm($campaign)
{
$form = $this->createForm(CampaignType::class, new CampaignType(), array(
'campaign' => $campaign,
));
return $form;
}
private function createParticipationForm($participation)
{
$form = $this->createForm(ParticipationType::class, new ParticipationType(), array(
'participation' => $participation,
));
return $form;
}
private function createReportForm($participation)
{
$form = $this->createForm(ReportType::class, new ReportType(), array(
'participation' => $participation,
));
return $form;
}
private function saveBase64Image(?string $base64): string
{
$base64 = str_replace('data:image/png;base64,', '', $base64);
$base64 = str_replace(' ', '+', $base64);
$imageData = base64_decode($base64);
$filename = "cloud_" . uniqid() . '.png';
$path = $this->getParameter('kernel.project_dir') . '/public/tmp/' . $filename;
file_put_contents($path, $imageData);
return $filename; // juste le nom, le chemin public sera /tmp/filename.png
}
}