<?php
namespace App\Controller;
use App\Entity\Expert;
use App\Form\ExpertType;
use App\Service\Securizer;
use App\Repository\UserRepository;
use App\Filter\Entity\ExpertSearch;
use App\Form\ExpertGeneralSkillType;
use App\Repository\ExpertRepository;
use App\Repository\SpecieRepository;
use App\Filter\Form\ExpertFilterType;
use App\Repository\SpecieAreaRepository;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use App\Repository\GeneralSkillRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use App\Repository\ExpertAreaSpecieRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* @Route("/expert")
*/
class ExpertController extends AbstractController
{
/**
* @Route("/all.{_format}", name="expert_index",
* requirements={"_format"="html|csv"},
* defaults={"_format"="html"}))
* @Method({"GET","POST"})
*/
public function index(UserRepository $userRepository, Securizer $securizer,ExpertRepository $expertRepository,Request $request,$_format): Response
{
if (null !== $this->container->get('security.token_storage')->getToken())
{
$users = $userRepository->findAll();
$tabUsers=array();
foreach ($users as $user) array_push($tabUsers,$user->getEmail());
$search = new ExpertSearch();
$form=$this->createForm(ExpertFilterType::class,$search);
$form->handleRequest($request);
$entities = $expertRepository->findAllVisibleQuery($tabUsers,$search);
$data=[
'registered' => '1',
'entities' => $entities,
'form'=>$form->createView(),
'titre' =>'Experts list'
];
$rep=$this->render("expert/index.$_format.twig", $data);
// if ($_format == 'csv'){
// $fic = 'expert-'. \date("d-m-Y") . '.csv';
// $rep->headers->set('Content-Disposition','attachment; filename="'.$fic.'"');
// }
return $rep;
}
// else return $this->render('app/restricted_area.html.twig');
}
/**
* @Route("/notRegistered.{_format}", name="expert_not_registered",
* requirements={"_format"="html|csv"},
* defaults={"_format"="html"}))
* @Method({"GET","POST"})
*/
public function notRegistered(UserRepository $userRepository, Securizer $securizer,ExpertRepository $expertRepository,Request $request,$_format): Response
{
if (null !== $this->container->get('security.token_storage')->getToken())
{
$users = $userRepository->findAll();
$tabUsers=array();
foreach ($users as $user) array_push($tabUsers,$user->getEmail());
$search = new ExpertSearch();
$form=$this->createForm(ExpertFilterType::class,$search);
$form->handleRequest($request);
$entities = $expertRepository->findUnregisteredQuery($tabUsers,$search);
$data=[
'registered' => '0',
'entities' => $entities,
'form'=>$form->createView(),
'titre' =>'Unregistered experts'
];
$rep=$this->render("expert/index.$_format.twig", $data);
// if ($_format == 'csv'){
// $fic = 'expert-'. \date("d-m-Y") . '.csv';
// $rep->headers->set('Content-Disposition','attachment; filename="'.$fic.'"');
// }
return $rep;
}
// else return $this->render('app/restricted_area.html.twig');
}
/**
* @Route("/export/{registered}", name="expert_export", methods={"GET"})
*/
public function export($registered, ExpertAreaSpecieRepository $expertAreaSpecieRepository, UserRepository $userRepository, Securizer $securizer,ExpertRepository $expertRepository): Response
{
if (null !== $this->container->get('security.token_storage')->getToken())
{
$users = $userRepository->findAll();
$tabUsers=array();
foreach ($users as $user) array_push($tabUsers,$user->getEmail());
$search = new ExpertSearch();
if ($registered == 1) $entities = $expertRepository->findAllVisibleQuery($tabUsers,$search);
else $entities = $expertRepository->findUnregisteredQuery($tabUsers,$search);
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->getColumnDimension('A')->setWidth(100, 'pt');
$sheet->getColumnDimension('B')->setWidth(100, 'pt');
$sheet->getColumnDimension('C')->setWidth(100, 'pt');
$sheet->getColumnDimension('D')->setWidth(100, 'pt');
$sheet->getColumnDimension('E')->setWidth(100, 'pt');
$sheet->getColumnDimension('F')->setWidth(300, 'pt');
$sheet->getColumnDimension('G')->setWidth(200, 'pt');
$sheet->getColumnDimension('H')->setWidth(100, 'pt');
$sheet->getColumnDimension('I')->setWidth(100, 'pt');
$sheet->getStyle('A1')->getFont()->setBold(true);
$sheet->getStyle('B1')->getFont()->setBold(true);
$sheet->getStyle('C1')->getFont()->setBold(true);
$sheet->getStyle('D1')->getFont()->setBold(true);
$sheet->getStyle('E1')->getFont()->setBold(true);
$sheet->getStyle('F1')->getFont()->setBold(true);
$sheet->getStyle('G1')->getFont()->setBold(true);
$sheet->getStyle('H1')->getFont()->setBold(true);
$sheet->getStyle('I1')->getFont()->setBold(true);
$sheet->setCellValue('A1', "Name");
$sheet->setCellValue('B1', "First name");
$sheet->setCellValue('C1', "Email");
$sheet->setCellValue('D1', "Expertise Type");
$sheet->setCellValue('E1', "Country");
$sheet->setCellValue('F1', "Species skills");
$sheet->setCellValue('G1', "General skills");
$sheet->setCellValue('H1', "Organization");
$sheet->setCellValue('I1', "ORCID");
$i=2;
foreach($entities as $entity)
{
$sheet->setCellValue('A'.$i, $entity->getName());
$sheet->setCellValue('B'.$i, $entity->getFirstname());
$sheet->setCellValue('C'.$i, $entity->getEmail());
$sheet->setCellValue('D'.$i, $entity->getExpertiseType());
$sheet->setCellValue('E'.$i, $entity->getCountry());
$entitiesEAS = $expertAreaSpecieRepository->findByExpert($entity);
$speciesSkills = "";
if (count($entitiesEAS) > 0)
{
foreach ($entitiesEAS as $specieSkill) $speciesSkills.=$specieSkill->getSpecie().'-'.$specieSkill->getSpecieArea()."\n";
}
$sheet->setCellValue('F'.$i, $speciesSkills);
$spreadsheet->getActiveSheet()->getStyle('F'.$i)->getAlignment()->setWrapText(true);
$generalSkills = "";
if (count($entity->getGeneralSkill()) > 0)
{
foreach ($entity->getGeneralSkill() as $generalSkill) $generalSkills.="$generalSkill\n";
}
$sheet->setCellValue('G'.$i, $generalSkills);
$spreadsheet->getActiveSheet()->getStyle('G'.$i)->getAlignment()->setWrapText(true);
$organisms = "";
foreach ($entity->getOrganism() as $organism) $organisms.="$organism,";
$organisms = substr($organisms,0,strlen($organisms)-1);
$sheet->setCellValue('H'.$i, $organisms);
$sheet->setCellValue('I'.$i, $entity->getOrcid());
$i++;
}
$writer = new Xlsx($spreadsheet);
$response = new StreamedResponse(
function () use ($writer) {
$writer->save('php://output');
}
);
$response->headers->set('Content-Type', 'application/vnd.ms-excel');
$response->headers->set('Content-Disposition', 'attachment;filename="EURCAW-Experts.xlsx"');
$response->headers->set('Cache-Control','max-age=0');
return $response;
}
// else return $this->render('app/restricted_area.html.twig');
}
/**
* @Route("/{id}", name="expert_show", methods={"GET"})
*/
public function show(ExpertAreaSpecieRepository $expertAreaSpecieRepository, SpecieRepository $specieRepository, SpecieAreaRepository $specieAreaRepository, GeneralSkillRepository $generalSkillRepository, Expert $entity): Response
{
if (null !== $this->container->get('security.token_storage')->getToken())
{
$listGeneralSkills = $generalSkillRepository->findAll();
$listSpecies = $specieRepository->findAll();
$listSpecieArea = $specieAreaRepository->findAll();
$listESA = $expertAreaSpecieRepository->findByExpert($entity);
return $this->render('expert/show.html.twig', [
'entity' => $entity,
'listESA' => $listESA,
'listSpecies' => $listSpecies,
'listSpecieArea' => $listSpecieArea,
'listGeneralSkills' => $listGeneralSkills,
]);
}
else return $this->render('app/restricted_area.html.twig');
}
/**
* @Route("/generalSkill/{id}", name="expert_generalskillnew", methods={"GET","POST"})
*/
public function addGeneralSkill(Securizer $securizer, Security $security, Expert $entity, ExpertRepository $expertRepository, GeneralSkillRepository $generalSkillRepository, Request $request): Response
{
if (null !== $this->container->get('security.token_storage')->getToken())
{
$user = $security->getUser();
$allowed = false;
if($securizer->isGranted($user, 'ROLE_ADMIN')) $allowed = true;
elseif ($user)
{
$expert = $expertRepository->findOneByEmail($user->getEmail());
if ($expert->isIsAdmin() == true) $allowed=true;
}
$listGeneralSkills = $generalSkillRepository->findAll();
$listExpertGeneralSkills = $entity->getGeneralSkill();
$form = $this->createForm(ExpertGeneralSkillType::class, $entity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
foreach ($listExpertGeneralSkills as $entityEGS) $entity->removeGeneralSkill($entityEGS);
$entityManager->flush();
foreach ($listGeneralSkills as $entityEGS)
{
$info="gr-".$entityEGS->getId();
if (isset($_POST[$info])) $entity->addGeneralSkill($entityEGS);
}
$entityManager->flush();
return $this->redirectToRoute('expert_index');
}
return $this->render('expert/newGeneralSkills.html.twig', [
'allowed' => $allowed,
'entity' => $entity,
'listExpertGeneralSkills' => $listExpertGeneralSkills,
'listGeneralSkills' => $listGeneralSkills,
'form' => $form->createView(),
]);
}
else return $this->render('app/restricted_area.html.twig');
}
/**
* @Route("/{userId}/edit", name="expert_edit", methods={"GET","POST"})
*/
public function edit(ExpertRepository $expertRepository, Request $request, $userId, UserRepository $userRepository): Response
{
if (null !== $this->container->get('security.token_storage')->getToken())
{
$user = $userRepository->find($userId);
$entity = $expertRepository->findOneByEmail($user->getEmail());
$form = $this->createForm(ExpertType::class, $entity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('accueil', [
'id' => $entity->getId(),
]);
}
return $this->render('expert/edit.html.twig', [
'entity' => $entity,
'form' => $form->createView(),
]);
}
else return $this->render('app/restricted_area.html.twig');
}
}