<?php
namespace App\Controller;
use App\Entity\GroupContact;
use App\Entity\Meeting;
use App\Entity\Period;
use App\Entity\PersonalNotes;
use App\Entity\Point;
use App\Entity\PointFile;
use App\Entity\ProcessedPoint;
use App\Entity\Service;
use App\Form\PointFileType;
use App\Form\PointLiveType;
use App\Form\PointSearchFilterType;
use App\Form\PointType;
use App\Ldap\LdapCommunication;
use App\Manager\PeriodManager;
use App\Repository\DomainRepository;
use App\Repository\GroupContactRepository;
use App\Repository\MeetingRepository;
use App\Repository\PeriodRepository;
use App\Repository\PersonalNotesRepository;
use App\Repository\PointFileRepository;
use App\Repository\PointRepository;
use App\Repository\PointStatusRepository;
use App\Repository\ProcessedPointRepository;
use App\Repository\ServiceRepository;
use App\Service\DataProvider;
use Carbon\Carbon;
use Doctrine\Common\Collections\Collection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Doctrine\Common\Collections\ArrayCollection;
use Knp\Component\Pager\PaginatorInterface;
use stdClass;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\HttpFoundation\Cookie;
/**
* @Route("/point")
*/
class PointController extends AbstractController
{
/**
* @Route("/", name="point_index", methods={"GET"})
*/
public function index(DataProvider $dataProvider, PaginatorInterface $paginator, PointRepository $pointRepository, Request $request): Response
{
$pointPagination = $paginator->paginate(
$dataProvider->getUserPoints($this->getUser()),
$request->query->getInt('page', 1),
18,
[
'pageParameterName' => 'page',
'align' => 'center',
]
);
return $this->render('point/index.html.twig', [
'points' => $pointPagination,
]);
}
/**
* @Route("/searchPoint", name="point_search_point", methods={"GET","POST"})
*/
public function searchPoint(Request $request, PointRepository $pointRepository, DataProvider $dataProvider): Response
{
$points = $pointRepository->findSearch();
$inDataProvider = $dataProvider->getUserPointsSearch($this->getUser());
$pointCanAdd = [];
foreach ($points as $value) {
if (in_array($value, $inDataProvider)) {
$pointCanAdd[] = $value;
}
}
$form = $this->createForm(PointSearchFilterType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$points = $pointRepository->findSearch($form->getData());
$pointCanAdd = [];
foreach ($points as $value) {
if (in_array($value, $inDataProvider)) {
$pointCanAdd[] = $value;
}
}
}
return $this->render('point/search.html.twig', [
// 'points' => $points,
'form' => $form->createView(),
'jsonFile' => $this->Json($pointCanAdd, 200, [], ['groups' => 'searchPoints'])
]);
}
/**
* @Route("/searchPoint/{id}/show", name="point_show", methods={"GET"})
*/
public function show(Point $point, ProcessedPointRepository $processedPointRepository, PersonalNotesRepository $personalNotesRepository, PointFileRepository $pointFileRepository): Response
{
$allNotes = $personalNotesRepository->findPersonalNotes($this->getUser(), $point);
// $allCommDiscu = $processedPointRepository->findByNotInMeeting($meeting, $point);
$processedPoint = $processedPointRepository->findByProcessedPointPoint($point, array('processedPointMeeting' => 'ASC'));
return $this->render('point/show.html.twig', [
'point' => $point,
'processedPoint' => $processedPoint,
'allNotes' => $allNotes,
'files' => $pointFileRepository->findByFilePoint(array($point)),
// 'allCommDiscu' => $allCommDiscu,
]);
}
/**
* @Route("/new", name="point_new", methods={"GET","POST"})
*/
public function new(Request $request, DataProvider $dataProvider, MeetingRepository $meetingRepository, GroupContactRepository $groupContactRepository, GroupContactRepository $pointContactRepository, PointStatusRepository $pointStatusRepository, DomainRepository $domainRepository, ServiceRepository $serviceRepository, SerializerInterface $serializer): Response
{
$point = new Point();
$processedPoint = new ProcessedPoint();
$user = $this->getUser();
$meetings = $meetingRepository->findAll();
if ($user->getUserDomain()->count() == 1) {
$point->setPointDomain($user->getUserDomain(){
0
});
}
$form = $this->createForm(PointType::class, $point, array('meetings' => $meetings));
$form->remove('pointDomain');
$form->remove('pointService');
$form->remove('priorNotice');
$form->remove('priorNoticeReason');
if (!$this->isGranted('ROLE_CHANCELLOR')) {
$form->remove('pointStatus');
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
foreach ($point->getPointContact() as $key => $value) {
$contact = $pointContactRepository->findOneBy(array('email' => $value->getEmail()));
if ($contact) {
$point->removePointContact($value);
$point->addPointContact($contact);
}
}
$point->setPointStatus($pointStatusRepository->findOneByName('Ouvert'));
$point->setPointUser($user);
$point->setTagAdvisor(false);
$point->setTagResponsible(false);
$entityManager->persist($point);
$response = new Response();
$response->headers->setCookie(Cookie::create('lastService', $point->getPointService()->getId(), 0, '/', null, false, false));
$response->headers->setCookie(Cookie::create('lastDomain', $point->getPointDomain()->getId(), 0, '/', null, false, false));
$response->sendHeaders();
$entityManager->flush();
return $this->redirectToRoute('point_index');
}
$contacts = $groupContactRepository->findAll();
$array = $dataProvider->getUserDomainsAndServices($user);
$result = [];
$result['domains'] = json_decode($serializer->serialize($array['domains'], 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'shortName']]));
$result['services'] = json_decode($serializer->serialize($array['services'], 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'serviceDomain' => ['id']]]));
return $this->render('point/new.html.twig', [
'point' => $point,
'props' => $result,
'props_notice' => json_decode($serializer->serialize(new stdClass(), 'json', [])),
'contacts' => $contacts,
'form' => $form->createView(),
]);
}
/**
* @Route("/newPointMeeting/{meeting}", name="point_new_meeting", methods={"GET","POST"})
*/
public function newPointMeeting(Request $request, Meeting $meeting, GroupContactRepository $groupContactRepository, GroupContactRepository $pointContactRepository, PointStatusRepository $pointStatusRepository, PointRepository $pointRepository, DataProvider $dataProvider, SerializerInterface $serializer): Response
{
$point = new Point();
$processedPoint = new ProcessedPoint();
$user = $this->getUser();
$form = $this->createForm(PointType::class, $point);
$form->remove('meeting');
$form->remove('pointDomain');
$form->remove('pointService');
$form->remove('priorNotice');
$form->remove('priorNoticeReason');
$form->remove('communication');
$form->remove('discussions');
if (!$this->isGranted('ROLE_CHANCELLOR')) {
$form->remove('pointStatus');
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$lastIndexPriority = $pointRepository->findByPriorityIndex($meeting->getId())[1];
$lastIndexPriority++;
foreach ($point->getPointContact() as $key => $value) {
$contact = $pointContactRepository->findOneBy(array('email' => $value->getEmail()));
if ($contact) {
$point->removePointContact($value);
$point->addPointContact($contact);
}
}
$point->setPointStatus($pointStatusRepository->findOneByName('Ouvert'));
$point->setPointUser($user);
$point->setTagAdvisor(false);
$point->setTagResponsible(false);
$entityManager->persist($point);
$processedPoint->setProcessedPointPoint($point);
$processedPoint->setProcessedPointMeeting($meeting);
$processedPoint->setProcessedPointStatus($point->getPointStatus());
$processedPoint->setIndexPriority($lastIndexPriority);
$entityManager->persist($processedPoint);
$response = new Response();
$response->headers->setCookie(Cookie::create('lastService', $point->getPointService()->getId(), 0, '/', null, false, false));
$response->headers->setCookie(Cookie::create('lastDomain', $point->getPointDomain()->getId(), 0, '/', null, false, false));
$response->sendHeaders();
$entityManager->flush();
return $this->redirectToRoute('meeting_index');
}
$contacts = $groupContactRepository->findAll();
$array = $dataProvider->getUserDomainsAndServices($user);
$result = [];
$result['domains'] = json_decode($serializer->serialize($array['domains'], 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'shortName']]));
$result['services'] = json_decode($serializer->serialize($array['services'], 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'serviceDomain' => ['id']]]));
return $this->render('point/new.html.twig', [
'point' => $point,
'props' => $result,
'props_notice' => json_decode($serializer->serialize(new stdClass(), 'json', [])),
'contacts' => $contacts,
'form' => $form->createView(),
]);
// }
}
/**
* @Route("/{id}/edit", name="point_edit", methods={"GET","POST"})
*/
public function edit(Request $request, DataProvider $dataProvider, Point $point, GroupContactRepository $groupContactRepository, MeetingRepository $meetingRepository, GroupContactRepository $pointContactRepository, PointFileRepository $pointFileRepository, PersonalNotesRepository $personalNotesRepository, SerializerInterface $serializer, ProcessedPointRepository $processedPointRepository): Response
{
$oldPoint = clone $point;
$meetings = $meetingRepository->findAll();
$pointFile = new PointFile();
$files = $pointFileRepository->findByFilePoint(array($point));
if (!empty($point->getProcessedPoints()->getValues())) {
$selectedMeeting = $meetingRepository->findOneById(array($point->getProcessedPoints()->toArray()[0]->getProcessedPointMeeting()->getId()));
$form = $this->createForm(PointType::class, $point, array('meetings' => $meetings, 'selectedMeeting' => $selectedMeeting, 'edit' => true));
} else {
$validationGroup = $request->get('validation') != null ? false : true;
$form = $this->createForm(PointType::class, $point, array('meetings' => $meetings, 'edit' => true, 'validation_groups' => $validationGroup));
}
$formFile = $this->createForm(PointFileType::class, $pointFile);
$form->remove('pointDomain');
$form->remove('pointService');
$form->remove('priorNotice');
$form->remove('priorNoticeReason');
if ($point->getPointStatus()->getName() != "Ouvert" && $point->getPointStatus()->getName() != 'Incomplet' || !$this->isGranted('ROLE_CHANCELLOR')) {
$form->remove('pointStatus');
}
$formFile->handleRequest($request);
if (!$formFile->isSubmitted()) {
if (!$formFile->isSubmitted()) {
$form->handleRequest($request);
}
}
if ($formFile->isSubmitted() && $formFile->isValid()) {
if (!$this->isGranted('ROLE_CHANCELLOR') && $this->getUser()->getId() != $point->getPointUser()->getId()) {
if ($point->getPointStatus() != "Ouvert" || $point->getPointStatus() != 'Incomplet') {
$this->addFlash('error', 'error.point_status_not_autorized');
return $this->redirectToRoute('meeting_index');
}
}
$entityManager = $this->getDoctrine()->getManager();
$pointFile->setFilePoint($point);
$pointFile->setName($pointFile->getFiles()->getClientOriginalName());
$entityManager->persist($pointFile);
$entityManager->flush();
return $this->redirectToRoute('point_edit', array('id' => $point->getId()));
}
if ($form->isSubmitted() && $form->isValid()) {
if (!$this->isGranted('ROLE_CHANCELLOR') && $this->getUser()->getId() != $point->getPointUser()->getId()) {
if ($point->getPointStatus() != "Ouvert" || $point->getPointStatus() != 'Incomplet') {
$this->addFlash('error', 'error.point_status_not_autorized');
return $this->redirectToRoute('meeting_index');
}
}
$entityManager = $this->getDoctrine()->getManager();
foreach ($point->getPointContact() as $key => $value) {
$contact = $pointContactRepository->findOneBy(array('email' => $value->getEmail()));
if ($contact) {
$point->removePointContact($value);
$point->addPointContact($contact);
}
}
if ($point->getPointDomain() == null) {
$point->setPointDomain($oldPoint->getPointDomain());
}
if ($point->getPointService() == null) {
$point->setPointService($oldPoint->getPointService());
}
$entityManager->flush();
return $this->redirectToRoute('point_index');
}
$contactList = [];
if ($point->getPointGroup()) {
if (!empty($point->getPointGroup()->getGroupContact()->toArray())) {
foreach ($point->getPointGroup()->getGroupContact() as $contact) {
$contactList['group'][$contact->getId()] = $contact->getEmail();
}
}
}
if (!empty($point->getPointContact()->toArray())) {
foreach ($point->getPointContact() as $contact) {
$contactList['pointList'][$contact->getId()] = $contact->getEmail();
}
}
$contacts = $groupContactRepository->findAll();
$array = $dataProvider->getUserDomainsAndServices($this->getUser());
$domains = new ArrayCollection($array['domains']);
$services = new ArrayCollection($array['services']);
if (!($domains->contains($point->getPointDomain()))) {
$domains->add($point->getPointDomain());
}
if (!($services->contains($point->getPointService()))) {
$services->add($point->getPointService());
}
$result = [];
$result['domains'] = json_decode($serializer->serialize($domains, 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'shortName']]));
$result['services'] = json_decode($serializer->serialize($services, 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'serviceDomain' => ['id']]]));
$result['domain'] = json_decode($serializer->serialize($point->getPointDomain(), 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'shortName']]));
$result['service'] = json_decode($serializer->serialize($point->getPointService(), 'json', [AbstractNormalizer::ATTRIBUTES => ['id', 'name', 'serviceDomain' => ['id']]]));
$meetingList = $meetingRepository->findLastMeetingByPP($point->getProcessedPoints());
$meeting = null;
if (!empty($meetingList)) {
$meeting = $meetingList[0];
}
$meetingNumber = [];
foreach ($meetingList as $key => $value) {
$date = Carbon::createFromDate($value->getDate()->format('Y-m-d'));
$meetingNumber[$value->getId()] =array_search($value,$meetingRepository->findByNumber($date->startOfYear()->format('Y-m-d'), $date->endOfYear()->format('Y-m-d')))+1;
}
return $this->render('point/edit.html.twig', [
'point' => $point,
'props' => $result,
'props_notice' => json_decode($serializer->serialize($point, 'json', [AbstractNormalizer::ATTRIBUTES => ['priorNotice', 'priorNoticeReason']]), true),
'contacts' => $contacts,
'contactList' => $contactList,
'files' => $files,
'form' => $form->createView(),
'formFile' => $formFile->createView(),
'processedPoint' => $processedPointRepository->findByProcessedPointPoint($point, array('processedPointMeeting' => 'ASC')),
'allNotes' => $personalNotesRepository->findPersonalNotes($this->getUser(), $point),
'meeting' => $meeting,
'meetingList' => $meetingList,
'number' => $meetingNumber,
]);
}
/**
* @Route("/{id}/getNote/{meeting}", name="point_get_note", methods={"GET", "POST"})
*/
public function getNote(Point $point, Meeting $meeting, PersonalNotesRepository $personalNotesRepository): Response
{
$note = $personalNotesRepository->findOneBy(['notePoint' => $point, 'noteMeeting' => $meeting, 'noteUser' => $this->getUser()]);
if ($note == null) {
$note = '';
}else{
$note = $note->getNote();
}
return $this->json($note);
}
/**
* @Route("/{id}/editNote/{meeting}", name="point_edit_note", methods={"GET", "POST"})
*/
public function editNote(Point $point, Meeting $meeting, Request $request, PersonalNotesRepository $personalNotesRepository): Response
{
$user = $this->getUser();
$entityManager = $this->getDoctrine()->getManager();
$noteExist = $personalNotesRepository->findOneBy(['notePoint' => $point, 'noteMeeting' => $meeting, 'noteUser' => $user]);
$note = json_decode($request->getContent(), true)['note'];
if ($noteExist == null) {
$newNote = new PersonalNotes();
$newNote->setNote($note);
$newNote->setNoteMeeting($meeting);
$newNote->setNotePoint($point);
$newNote->setNoteUser($user);
$entityManager->persist($newNote);
}else{
$noteExist->setNote($note);
}
$entityManager->flush();
return new Response();
}
/**
* @Route("/{id}/remove/{pointFile}", name="point_remove_file", methods={"DELETE"})
*/
public function removeFile(Request $request, Point $point, PointFile $pointFile): Response
{
if ($this->isCsrfTokenValid('delete' . $point->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($pointFile);
$entityManager->flush();
}
return $this->redirectToRoute('point_edit', array('id' => $point->getId()));
}
/**
* @Route("/{id}", name="point_delete", methods={"DELETE"})
*/
public function delete(Request $request, Point $point): Response
{
if ($this->isCsrfTokenValid('delete' . $point->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($point);
$entityManager->flush();
}
return $this->redirectToRoute('point_index');
}
/**
* @Route("/{id}/editLivePoint/{meeting}", name="point_edit_live_point", methods={"GET", "POST"})
*/
public function editLivePoint(Request $request, Point $point, Meeting $meeting, PointFileRepository $pointFileRepository, ProcessedPointRepository $processedPointRepository, PersonalNotesRepository $personalNotesRepository, PeriodRepository $periodRepository, PeriodManager $periodManager, GroupContactRepository $groupContactRepository): Response
{
$files = $pointFileRepository->findByFilePoint(array($point));
$form = $this->createForm(PointLiveType::class, $point);
if (!$this->isGranted('ROLE_CHANCELLOR')) {
$form->remove('pointStatus');
}
$contactList = [];
if ($point->getPointGroup()) {
if (!empty($point->getPointGroup()->getGroupContact()->toArray())) {
foreach ($point->getPointGroup()->getGroupContact() as $contact) {
$contactList['group'][$contact->getId()] = $contact->getEmail();
}
}
}
if (!empty($point->getPointContact()->toArray())) {
foreach ($point->getPointContact() as $contact) {
$contactList['pointList'][$contact->getId()] = $contact->getEmail();
}
}
$contacts = $groupContactRepository->findAll();
$personalNote = $personalNotesRepository->findOneBy(array('noteUser' => $this->getUser(), 'noteMeeting' => $meeting, 'notePoint' => $point));
$processedPoint = $processedPointRepository->findOneBy(array('processedPointMeeting' => $meeting, 'processedPointPoint' => $point));
$allNotes = $personalNotesRepository->findByNotInMeeting($this->getUser(), $meeting, $point);
$allCommDiscu = $processedPointRepository->findByNotInMeeting($meeting, $point);
$note = null;
if ($personalNote) {
$note = $personalNote->getNote();
}
$communication = $processedPoint->getCommunication();
$discussions = $processedPoint->getDiscussions();
$validationGroup = $request->get('validation') != null ? false : true;
$form = $this->createForm(PointLiveType::class, $point, ['personalNote' => $note, 'communication' => $communication, 'discussions' => $discussions, 'validation_groups' => $validationGroup]);
if (!$this->isGranted('ROLE_CHANCELLOR') || $meeting->getStatus() != 'IN_PROGRESS') {
$form->remove('pointStatus');
$form->remove('tagAdvisor');
$form->remove('tagResponsible');
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
if ($form->get('communication')->getData()) {
$processedPoint->setCommunication($form->get('communication')->getData());
}
if ($form->get('discussions')->getData()) {
$processedPoint->setDiscussions($form->get('discussions')->getData());
}
if (!$personalNote) {
$note = new PersonalNotes();
$note->setNotePoint($point);
$note->setNoteMeeting($meeting);
$note->setNoteUser($this->getUser());
if ($form->get('personalNotes')->getData()) {
$note->setNote($form->get('personalNotes')->getData());
}else{
$note->setNote("");
}
$entityManager->persist($note);
} else {
if ($form->get('personalNotes')->getData()) {
$personalNote->setNote($form->get('personalNotes')->getData());
}
}
$processedPoint->setProcessedPointStatus($point->getPointStatus());
$entityManager->flush();
return $this->redirectToRoute('meeting_live', ['id' => $meeting->getId(), 'selectedPoint' => $point->getId()]);
}
$currrentPeriod = $processedPoint->getProcessedPointPeriod()->last();
$previousPeriods = [];
$previousPoint = null;
if ($request->cookies->get('previousPoint') && $request->cookies->get('previousPoint') != $point->getId()) {
$previousPoint = $request->cookies->get('previousPoint');
$previousPeriods = $periodRepository->findByStartAndEnd($previousPoint, $meeting);
}
if ($this->isGranted('ROLE_CHANCELLOR') && $meeting->getStatus() == 'IN_PROGRESS' && $request->cookies->get('previousPoint') != $point->getId()) {
// Update current time cache for the current selected live point
if (!empty($previousPeriods)) {
$previousProcessedPoint = $processedPointRepository->findOneBy(array('processedPointMeeting' => $meeting, 'processedPointPoint' => $previousPoint));
foreach ($previousPeriods as $period) {
$period->setEndTime(Carbon::now());
$periodManager->updateTimeCache($previousProcessedPoint, Carbon::now()->DiffInSeconds($period->getStartTime()));
}
$previousProcessedPoint->setIsActive(false);
$response = new Response();
$response->headers->clearCookie('previousPoint');
$response->sendHeaders();
}else{
if ($currrentPeriod) {
$periodManager->updateTimeCache($processedPoint, Carbon::now()->DiffInSeconds($currrentPeriod->getStartTime()));
}
}
// Close every other period
foreach ($periodRepository->findByEndTime(null) as $period) {
$period->setEndTime(Carbon::now());
$periodManager->updateTimeCache($period->getProcessedPoints(), Carbon::now()->DiffInSeconds($period->getStartTime()));
}
// Start a new period and persist all changes into database
if (!$currrentPeriod || $currrentPeriod->getEndTime()) {
$response = new Response();
$response->headers->setCookie(Cookie::create('previousPoint', $point->getId()));
$response->sendHeaders();
$entityManager = $this->getDoctrine()->getManager();
$period = new Period();
$period->setStartTime(Carbon::now());
$processedPoint->setIsActive(true);
$period->setProcessedPoints($processedPoint);
$entityManager->persist($period);
$entityManager->flush();
}
}
return $this->render('point/edit_live.html.twig', [
'form' => $form->createView(),
'point' => $point,
'files' => $files,
'allNotes' => $allNotes,
'allCommDiscu' => $allCommDiscu,
'meeting' => $meeting,
'contacts' => $contacts,
'contactList' => $contactList,
]);
}
/**
* @Route("/{id}/addContactPoint/{contact}", name="point_add_contact_point", methods={"GET", "POST"})
*/
public function addContactPoint(Point $point, string $contact, GroupContactRepository $groupContactRepository): Response
{
$entityManager = $this->getDoctrine()->getManager();
$contactExist = $groupContactRepository->findOneBy(array('email' => $contact));
if ($contactExist == null) {
$newContact = new GroupContact();
$newContact->setEmail($contact);
// $newContact->addPoint($point);
$entityManager->persist($newContact);
$point->addPointContact($newContact);
}else{
$point->addPointContact($groupContactRepository->findOneBy(array('email' => $contact)));
}
foreach ($point->getPointContact() as $key => $value) {
$contact = $groupContactRepository->findOneBy(array('email' => $value->getEmail()));
if ($contact) {
$point->removePointContact($value);
$point->addPointContact($contact);
}
}
$entityManager->flush();
$contacts = [];
if (!empty($point->getPointContact()->toArray())) {
foreach ($point->getPointContact() as $contact) {
$contacts['pointList'][$contact->getId()] = $contact->getEmail();
}
}
return $this->render('point/_contact_list_point.html.twig', [
'contactList'=> $contacts,
'contact' => $contact,
'point' => $point,
'meetingList' => false,
]);
}
/**
* @Route("/{id}/addContact/{contact}/{meeting}", name="point_add_contact", methods={"GET", "POST"})
*/
public function addContact(Point $point, string $contact, Meeting $meeting, GroupContactRepository $groupContactRepository): Response
{
$entityManager = $this->getDoctrine()->getManager();
$contactExist = $groupContactRepository->findOneBy(array('email' => $contact));
if ($contactExist == null) {
$newContact = new GroupContact();
$newContact->setEmail($contact);
$entityManager->persist($newContact);
$point->addPointContact($newContact);
}else{
$point->addPointContact($groupContactRepository->findOneBy(array('email' => $contact)));
}
foreach ($point->getPointContact() as $key => $value) {
$contact = $groupContactRepository->findOneBy(array('email' => $value->getEmail()));
if ($contact) {
$point->removePointContact($value);
$point->addPointContact($contact);
}
}
$entityManager->flush();
$contacts = [];
if (!empty($point->getPointContact()->toArray())) {
foreach ($point->getPointContact() as $contact) {
$contacts['pointList'][$contact->getId()] = $contact->getEmail();
}
}
return $this->render('point/_contact_list.html.twig', [
'contactList'=> $contacts,
'contact' => $contact,
'meeting' => $meeting,
'point' => $point,
]);
}
/**
* @Route("/{id}/removeContact/{contact}", name="point_remove_contact", methods={"GET", "POST"})
*/
public function removeContact(Point $point, GroupContact $contact): Response
{
$entityManager = $this->getDoctrine()->getManager();
$point->removePointContact($contact);
$entityManager->flush();
$contacts = [];
if (!empty($point->getPointContact()->toArray())) {
foreach ($point->getPointContact() as $contact) {
$contacts['pointList'][$contact->getId()] = $contact->getEmail();
}
}
return new JsonResponse('OK');
}
/**
* @Route("/search/autocomplete", name="point_search_autocomplete", methods={"GET", "POST"})
*/
public function autocomplete(Request $request, PointRepository $pointRepository, DataProvider $dataProvider): Response
{
$search = $request->query->get('search');
$pointsNotInMeeting = null;
if ($search === null) {
$pointsNotInMeeting = $pointRepository->findPointNotInOpenMeeting();
}else{
$pointsNotInMeeting = $pointRepository->findPointNotInOpenMeeting($search);
}
$user = $this->getUser();
$isChancellorOrAdvisor = $this->isGranted('ROLE_CHANCELLOR') || $this->isGranted('ROLE_ADVISOR');
$userServices = $user->getUserService();
$userServiceArray = $userServices ? $userServices->toArray() : [];
$userReferentDomains = $user->getUserReferentDomain();
$userReferentDomainArray = $userReferentDomains ? $userReferentDomains->toArray() : [];
$userPoints = $dataProvider->getUserPoints($user);
$pointCanAdd = [];
foreach ($pointsNotInMeeting as $value) {
if ($isChancellorOrAdvisor || $userServices == null || in_array($value->getPointService(), $userServiceArray) || $userReferentDomains == null || in_array($value->getPointDomain(), $userReferentDomainArray)) {
if (in_array($value, $userPoints)) {
$pointCanAdd[] = $value;
}
}
}
return $this->Json($pointCanAdd, 200, [], ['groups' => 'searchPoints']);
}
}