<?php
namespace App\Controller\Api;
use App\Entity\Absence;
use App\Entity\Notifications;
use App\Entity\StudentYear;
use App\Repository\AbsenceRepository;
use App\Repository\NotificationsRepository;
use App\Repository\SchoolYearRepository;
use App\Repository\StudentRepository;
use App\Repository\StudentYearRepository;
use App\Repository\UserRepository;
use App\Repository\UserYearRepository;
use Doctrine\ORM\EntityManagerInterface;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerInterface;
use Knp\Component\Pager\PaginatorInterface;
use OpenApi\Annotations as OA;
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 Twig\Environment;
use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update;
use App\Repository\SubjectRepository;
use App\Repository\ExamsRepository;
use App\Service\PushNotificationService;
use App\Entity\UserNotifications;
use App\Repository\TheClassRepository;
class AbsenceController extends AbstractController
{
/**
* Absence parents index
* @OA\Tag(name="Absence")
*/
#[Route("/api/parent/students/absences/",name: 'api_parent_absence_student_list', methods: ['GET'])]
public function parentsGetAbsenceIndex(
SchoolYearRepository $schoolYearRepository,
StudentYearRepository $studentYearRepository,
AbsenceRepository $absenceRepository,
SerializerInterface $serializer,
Request $request,
PaginatorInterface $paginator
):JsonResponse
{
$user = $this->getUser();
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
$parentStudent = $studentYearRepository->findParentStudents($user, $this->getUser()->getSchool());
$studentsIds = [];
$userLateDetails = [];
foreach ($parentStudent as $value){
$studentsIds[] = $value->getStudent();
$studentAbsence = $absenceRepository->findBy(['student'=>$value,'year'=>$year], ['id' => 'DESC']);
$totalHrs = 0;
$totalJust = 0;
$totalInjust = 0;
foreach ($studentAbsence as $val){
$totalHrs += $val->getDuration();
$totalInjust += $val->getDuration() - $val->getJustified();
$totalJust += $val->getJustified();
}
$absenceTotale = [
'student' => [
'id'=>$value->getStudent()->getId(),
'firstName'=>$value->getStudent()->getFirstName(),
'lastName'=>$value->getStudent()->getLastName()
],
'totalHrs' =>$totalHrs,
'totalInjust' => $totalInjust,
'totalJust' => $totalJust
];
$userLateDetails[] = $absenceTotale;
}
//dd($userLateDetails);
$parentAbsenceStudents = $absenceRepository->findAbsenceStudentsParent($studentsIds);
$data = $paginator->paginate($parentAbsenceStudents,
$request->query->getInt('page', 1),40);
$getData = [
'current_page_number'=>$data->getCurrentPageNumber(),
'number_per_page'=>$data->getItemNumberPerPage(),
'total_count'=>$data->getTotalItemCount(),
'total_absence_hrs'=>$userLateDetails,
'data'=>$data->getItems(),
];
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonPost = $serializer->serialize($getData,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* Absence parents index
* @OA\Tag(name="Absence")
*/
#[Route("/api/parent/students/absences/classe/{classe}/",name: 'api_parent_absence_student_list_classe', methods: ['GET'])]
public function parentsGetAbsenceIndexClasse(
SchoolYearRepository $schoolYearRepository,
StudentYearRepository $studentYearRepository,
AbsenceRepository $absenceRepository,
SerializerInterface $serializer,
Request $request,
PaginatorInterface $paginator,
$classe,
TheClassRepository $theClassRepository
):JsonResponse
{
$user = $this->getUser();
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
$classRepo = $theClassRepository->find($classe);
$parentStudent = $studentYearRepository->findBy(["classe"=>$classRepo, 'year'=>$year, 'school'=>$user->getSchool()]);
$studentsIds = [];
$userLateDetails = [];
foreach ($parentStudent as $value){
$studentsIds[] = $value->getStudent();
$studentAbsence = $absenceRepository->findBy(['student'=>$value,'year'=>$year], ['id' => 'DESC']);
$totalHrs = 0;
$totalJust = 0;
$totalInjust = 0;
foreach ($studentAbsence as $val){
$totalHrs += $val->getDuration();
$totalInjust += $val->getDuration() - $val->getJustified();
$totalJust += $val->getJustified();
}
$absenceTotale = [
'student' => [
'id'=>$value->getStudent()->getId(),
'firstName'=>$value->getStudent()->getFirstName(),
'lastName'=>$value->getStudent()->getLastName()
],
'totalHrs' =>$totalHrs,
'totalInjust' => $totalInjust,
'totalJust' => $totalJust
];
$userLateDetails[] = $absenceTotale;
}
//dd($userLateDetails);
$parentAbsenceStudents = $absenceRepository->findBy(["classe"=>$classRepo, 'year'=>$year, 'school'=>$user->getSchool()], ['id' => 'DESC']);
$data = $paginator->paginate($parentAbsenceStudents,
$request->query->getInt('page', 1),40);
// dd($data->getItems());
$resData = [];
foreach ($data as $item){
$absence = [];
$absence['id'] = $item->getId();
$studentAbsence = $absenceRepository->find($item->getId());
$absence['student'] = $studentAbsence ? [
'id'=>$studentAbsence->getStudent()->getId(),
'first_name'=>$studentAbsence->getStudent()->getFirstName(),
'last_name'=>$studentAbsence->getStudent()->getLastName()
] : null;
$absence['subject'] = [
'id'=>$item->getSubject()->getId(),
'name'=>$item->getSubject()->getName()
];
$absence['start_time'] = $item->getStartTime();
$absence['end_time'] = $item->getEndTime();
$absence['absence_date'] = $item->getAbsenceDate();
$absence['duration'] = $item->getDuration();
$absence['created_at'] = $item->getCreatedAt();
$resData[] = $absence;
}
$getData = [
'current_page_number'=>$data->getCurrentPageNumber(),
'number_per_page'=>$data->getItemNumberPerPage(),
'total_count'=>$data->getTotalItemCount(),
'total_absence_hrs'=>$userLateDetails,
'data'=>$resData,
];
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonPost = $serializer->serialize($getData,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* Absence parents index
* @OA\Tag(name="Absence")
*/
#[Route("/api/user/homework/students/classe/{classe}/",name: 'api_parent_absence_student_list_classe_student_exam', methods: ['GET'])]
public function studentClass(
SchoolYearRepository $schoolYearRepository,
StudentYearRepository $studentYearRepository,
ExamsRepository $examsRepository,
$classe,
TheClassRepository $theClassRepository,
SubjectRepository $subjectRepository,
):JsonResponse
{
$user = $this->getUser();
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
$classRepo = $theClassRepository->find($classe);
$students = $studentYearRepository->findBy(["classe"=>$classRepo, 'year'=>$year, 'school'=>$user->getSchool()]);
$examsRepo = $examsRepository->findBy(['year'=>$year, 'school'=>$user->getSchool(), 'classe'=>$classRepo], ['id'=>'DESC']);
$examList = [];
foreach ($examsRepo as $exam){
$examList[] = [
'id'=>$exam->getId(),
'name'=>$exam->getName(),
];
}
$studentList = [];
foreach ($students as $student) {
$studentList[] = [
'id' => $student->getStudent()->getId(),
'firstName' => $student->getStudent()->getFirstName(),
'lastName' => $student->getStudent()->getLastName(),
];
}
// Trier la liste des élèves par ordre alphabétique (lastName puis firstName)
usort($studentList, function($a, $b) {
$cmp = strcmp($a['lastName'], $b['lastName']);
if ($cmp === 0) {
return strcmp($a['firstName'], $b['firstName']);
}
return $cmp;
});
$subjectRepo = $subjectRepository->findBy(['classe' => $classRepo, 'year' => $year, 'school' => $user->getSchool()], ['id' => 'DESC']);
$subjectList = [];
foreach ($subjectRepo as $subject) {
$subjectList[] = [
'id' => $subject->getId(),
'name' => $subject->getName(),
];
}
//dd($subjectList);
$jsonPost = [
'classe' => [
'id' => $classRepo->getId(),
'name' => $classRepo->getName(),
],
'examList' => $examList,
'studentList' => $studentList,
'subjectList' => $subjectList
];
//dd($studentList);
return $this->json($jsonPost);
}
/**
* Absence index
* @OA\Tag(name="Absence")
*/
#[Route(path: '/api/absence/{id}/show', name: "api_absence_show",methods: ['GET'])]
public function show(Absence $absence,SerializerInterface $serializer):JsonResponse
{
if (!$this->getUser()){
return new JsonResponse(
$serializer->serialize(['message'=>'you must be logged'],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonPost = $serializer->serialize($absence,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* Add new Absence via API
* @OA\Tag(name="Absence")
*/
#[Route('/api/prof/absence/new/user/{id}/', name: 'api_absence_add_user_', methods: ['POST'])]
public function apiAddAbsence(
$id,
SubjectRepository $subjectRepository,
StudentRepository $studentRepository,
Request $request,
EntityManagerInterface $entityManager,
SchoolYearRepository $schoolYearRepository,
ExamsRepository $examRepo,
PushNotificationService $notification,
SerializerInterface $serializer,
TheClassRepository $theClassRepository,
StudentYearRepository $studentYearRepository
): JsonResponse
{
$data = $request->request->all();
$absence = new Absence();
$school = $this->getUser()->getSchool();
$year = $schoolYearRepository->findOneBy(["active"=>true],[]);
// $_student = $studentRepository->find($data["studentId"]);
$subject = $subjectRepository->findOneBy(['id' => $data["subject"], 'school' => $school]);
$studentYear = $studentYearRepository->findOneBy(['student' => $id, 'year' => $year]);
$classe = $studentYear->getClasse();
//$theClassRepo = $theClassRepository->find($data["classe"]);
$exam = $examRepo->findOneBy(['id' => $data['exam'], 'school' => $school]);
$absence->setYear($year);
$absence->setStudent($studentYear->getStudent());
$absence->setDuration((float)$data["duration"]);
$absence->setSubject($subject);
$absence->setClasse($classe);
$absence->setSchool($school);
$absence->setAbsenceDate($data["lateDate"]);
$absence->setStartTime($data['normalTms']);
$absence->setEndTime($data['arriveTms']);
$absence->setExam($exam);
$absence->setAuthor($this->getUser());
//$this->getUser()->addAbsence($absence);
$entityManager->persist($absence);
$entityManager->persist($this->getUser());
$entityManager->flush();
$parent = $studentYear->getStudent()->getParent();
$_student = $studentYear->getStudent();
if (!empty($parent)) {
$lang = $parent->getLocalPhoneLang();
$token = $parent->getUserToken();
$userId = $parent->getId();
$route = '/drawer/Absence';
$title = $lang == null ? 'Absence signalée' : 'Absence Signaled';
if ($lang == null ) {
$message = ($parent->getSexe() == 'M' ? 'Cher ' : 'Chère ')
. $parent->getFullName()
. ' votre enfant '
. $_student->getFullName()
. ' a été absent au cours de : '
. $subject->getName()
. ' du '
. $absence->getAbsenceDate()
. ' entre '
. $absence->getStartTime()
. ' et '
. $absence->getEndTime();
} else {
$message = ($parent->getSexe() == 'M' ? 'Dear ' : 'Dear ')
. $parent->getFullName()
. ' your child '
. $_student->getFullName()
. ' was absent in the course: '
. $subject->getName()
. ' on '
. $absence->getAbsenceDate()
. ' between '
. $absence->getStartTime()
. ' and '
. $absence->getEndTime();
}
if ($token){
$notificationUser = new UserNotifications;
$notificationUser->setTitle($title);
$notificationUser->setContent($message);
$notificationUser->setUser($parent);
$notificationUser->setExpoPushToken($token);
$notificationUser->setType("absence");
$entityManager->persist($notificationUser);
$entityManager->flush();
$notification->sendNotification($token, $title, $message, $route, $userId);
}
}
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonPost = $serializer->serialize($absence,'json',$context);
return new JsonResponse($jsonPost, Response::HTTP_OK, ['accept'=>'application/json'], true);
}
/**
* Absence notifications
* @OA\Tag(name="Absence")
*/
#[Route(path: '/api/absence/notification', name: "api_absence_notifications",methods: ['GET'])]
public function absenceNotification(
Request $request,
PaginatorInterface $paginator,
StudentYearRepository $studentYearRepository,
SerializerInterface $serializer,
SchoolYearRepository $schoolYearRepository,
StudentRepository $studentRepository,
AbsenceRepository $absenceRepository,
NotificationsRepository $notificationsRepository,
EntityManagerInterface $entityManager):JsonResponse
{
$user = $this->getUser();
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
$parentStudent = $studentYearRepository->findParentStudents($user, $this->getUser()->getSchool());
$studentsIds = [];
$userLateDetails = [];
foreach ($parentStudent as $value){
$studentsIds[] = $value->getStudent();
$studentAbsence = $absenceRepository->findBy(['student'=>$value,'year'=>$year]);
$totalHrs = 0;
$totalJust = 0;
$totalInjust = 0;
foreach ($studentAbsence as $val){
$totalHrs += $val->getDuration();
$totalInjust += $val->getDuration() - $val->getJustified();
$totalJust += $val->getJustified();
}
$absenceTotale = [
'student' => [
'id'=>$value->getStudent()->getId(),
'firstName'=>$value->getStudent()->getFirstName(),
'lastName'=>$value->getStudent()->getLastName()
],
'totalHrs' =>$totalHrs,
'totalInjust' => $totalInjust,
'totalJust' => $totalJust
];
$userLateDetails[] = $absenceTotale;
}
//dd($userLateDetails);
$parentAbsenceStudents = $absenceRepository->findAbsenceStudentsParent($studentsIds);
$data = $paginator->paginate($parentAbsenceStudents,
$request->query->getInt('page', 1),40);
$notificationUserRow = $notificationsRepository->findOneBy(['user'=>$user],[]);
if ($notificationUserRow == null){
$notif = new Notifications();
$notif->setUser($this->getUser());
$entityManager->persist($notif);
$entityManager->flush();
}
$absenceLastConnectionCount = $notificationsRepository->findOneBy(['user'=>$user],[]);
$absenceLastConnectionCountValue = $absenceLastConnectionCount->getAbsenceLastConnectionCount();
//if ($absenceLastConnectionCountValue !== null){
$absenceAdded = $data->getTotalItemCount() - $absenceLastConnectionCountValue;
if ($absenceAdded>1){
$updateNotif = $notificationsRepository->findOneBy(['user'=>$user],[]);
$updateNotif->setAbsenceLastConnectionCount($data->getTotalItemCount());
$entityManager->flush();
return new JsonResponse(
$serializer->serialize(['title'=>'Absence(s)',"message" => $absenceAdded." Absences ont été ajoutée(s)" ],'json'),
Response::HTTP_OK,['accept'=>'application/json'],
true
);
}
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
}
/**
* Absence index
* @OA\Tag(name="Absence")
*/
#[Route("/v1/api/parent/absence/{from}",name: 'api_absence', methods: ['GET'])]
public function index(Request $request,
PaginatorInterface $paginator,
StudentYearRepository $studentYearRepository,
SerializerInterface $serializer,
SchoolYearRepository $schoolYearRepository,
StudentRepository $studentRepository,
AbsenceRepository $absenceRepository,
NotificationsRepository $notificationsRepository,
EntityManagerInterface $entityManager
):JsonResponse
{
if (!$this->getUser()){
return new JsonResponse(
$serializer->serialize(['message'=>'you must be logged'],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
$year = $schoolYearRepository->findOneBy(["active"=>true]);
$user = $this->getUser();
//$students = $studentYearRepository->findBy(['year'=>$year]);
$school = $user->getSchool();
$_student = $studentYearRepository->findBy(['year'=>$year, 'school' => $school],['id'=>'DESc']);
$parentStudents = $studentRepository->findByParent($user->getId(), $school->getId());
$absence = $absenceRepository->findBy(['year' => $year, 'school' => $school], ["id"=>'DESC']);
$absenceContent = [];
foreach ($absence as $value){
if (in_array($value->getStudent(), $parentStudents, true)){
if ($value->getId() > $from) {
$absenceContent[] = $value;
}
}
}
$data = $paginator->paginate($absenceContent,
$request->query->getInt('page', 1),20);
$userLateDetails = [];
foreach ($parentStudents as $value){
$studentAbsence = $absenceRepository->findBy(['student' => $value,'year' => $year]);
$totalHrs = 0;
$totalJust = 0;
$totalInjust = 0;
foreach ($studentAbsence as $val){
$totalHrs += $val->getDuration();
$totalInjust += $val->getDuration() - $val->getJustified();
$totalJust += $val->getJustified();
}
$absenceTotale = [
'student' => $value,
'totalHrs' =>$totalHrs,
'totalInjust' => $totalInjust,
'totalJust' => $totalJust
];
$userLateDetails[] = $absenceTotale;
}
$getData = [
'current_page_number'=>$data->getCurrentPageNumber(),
'number_per_page'=>$data->getItemNumberPerPage(),
'total_count'=>$data->getTotalItemCount(),
'total_absence_hrs'=>$userLateDetails,
'data'=>$data->getItems(),
];
$notificationUpdate = $notificationsRepository->findOneBy(['user'=>$user]);
if ($notificationUpdate === null){
$notification = new Notifications();
$notification->setUser($user);
$notification->setAbsenceLastConnectionCount($data->getTotalItemCount());
$entityManager->persist($notification);
$entityManager->flush();
}else{
$notificationUpdate->setAbsenceLastConnectionCount($data->getTotalItemCount());
$entityManager->flush();
}
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonAbsence = $serializer->serialize($getData,'json',$context);
return new JsonResponse($jsonAbsence,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* Absence notifications
* @OA\Tag(name="Absence")
*/
#[Route("/v3/api/porter/absence/index/students/list",name: 'api_porter_absence_student_list', methods: ['GET'])]
public function getStudentListForAbsence(SchoolYearRepository $schoolYearRepository,
StudentYearRepository $studentYearRepository,
SerializerInterface $serializer
):JsonResponse
{
$user = $this->getUser();
$school = $this->getUser()->getSchool();
$year = $schoolYearRepository->findOneBy(['active'=>true]);
$students = $studentYearRepository->findBy(['school' => $school,'year' => $year]);
$context = SerializationContext::create()->setGroups(["getStudents"]);
$jsonStudents = $serializer->serialize($students,'json',$context);
return new JsonResponse($jsonStudents,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* Absence parents index
* @OA\Tag(name="Absence")
*/
#[Route("/v3/api/parent/students/absences/from/{from}/list",name: 'api_parent_absence_student_list_', methods: ['GET'])]
public function parentsGetAbsence( $from,
SchoolYearRepository $schoolYearRepository,
StudentYearRepository $studentYearRepository,
AbsenceRepository $absenceRepository,
SerializerInterface $serializer
):JsonResponse
{
$user = $this->getUser();
$year = $schoolYearRepository->findOneBy(['active'=>true],[]);
$parentStudent = $studentYearRepository->findParentStudents($user);
$studentsIds = [];
foreach ($parentStudent as $value){
$studentsIds[] = $value->getStudent();
}
$parentAbsenceStudents = $absenceRepository->findAbsenceStudents($from,$studentsIds);
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonPost = $serializer->serialize($parentAbsenceStudents,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
/**
* Add new Absence
* @OA\Tag(name="Absence")
*/
#[Route('/v3/api/prof/absence/new/user/{student}/', name: 'api_absence_add')]
public function addAbsence(
$student,
SubjectRepository $subjectRepository,
StudentRepository $studentRepository,
Request $request,
EntityManagerInterface $entityManager,
SchoolYearRepository $schoolYearRepository
):Response
{
$absence = new Absence();
$year = $schoolYearRepository->findOneBy(["active"=>true], []);
$_student = $studentRepository->find($student);
$data = $request->request->all();
$subject = $subjectRepository->find($data["subject"]);
$absence->setYear($year);
$absence->setStudent($_student);
$absence->setDuration($data["duration"]);
$absence->setSubject($subject);
$absence->setAbsenceDate($data["lateDate"]);
$absence->setDuration((float)$data['duration']);
$absence->setStartTime($data['normalTms']);
$absence->setEndTime($data['arriveTms']);
$absence->setSchool($this->getUser()->getSchool());
$absence->setAuthor($this->getUser());
$this->getUser()->addAbsence($absence);
$entityManager->persist($absence);
$entityManager->persist($this->getUser());
$entityManager->flush();
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonPost = $serializer->serialize($absence,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
}
#[Route('/api/admin/absence/{id}/remove', name:"api_absence_remove")]
public function remove(
Absence $absence,
EntityManagerInterface $entityManager,
Request $request
):Response
{
$entityManager->remove($absence);
$entityManager->flush();
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
}
/**
* Add new Absence
* @OA\Tag(name="Absence")
*/
#[Route('/v3/api/prof/absence/justify/user/', name: 'api_absence_justify')]
public function justifyAbsence(
SubjectRepository $subjectRepository,
StudentRepository $studentRepository,
Request $request,
EntityManagerInterface $entityManager,
SchoolYearRepository $schoolYearRepository
):Response
{
$data = $request->request->all();
$school = $this->getUser()->getSchool();
$absence = $absenceRepository->findOneBy(['id' => $data['absence'], 'school' => $school]);
$year = $schoolYearRepository->findOneBy(["active"=>true], []);
$_student = $studentRepository->findOneBy(['id' => $data['student'], 'school' => $school]);
$numberToJustify = $data['justify'];
$restToJustify = $absence->getDuration() - $absence->getJustified();
if ($numberToJustify <= $restToJustify) {
$absence->setJustified($absence->getJustified() + $numberToJustify);
$entityManager->persist($absence);
$entityManager->flush();
$context = SerializationContext::create()->setGroups(["getAbsence"]);
$jsonPost = $serializer->serialize($absence,'json',$context);
return new JsonResponse($jsonPost,Response::HTTP_OK,['accept'=>'application/json'],true);
} else {
return new JsonResponse(
$serializer->serialize(['message'=>'le nombre total d\'absence a déjà été justifier'],'json'),
Response::HTTP_UNAUTHORIZED,['accept'=>'application/json'],
true
);
}
}
/*
* Absence parents mercure hub subscribe
* @OA\Tag(name="Absence")
*/
#[Route(path: '/v3/api/parent/{parent}/subscribe/absence/mercure/hub', name: 'api_parent_subscribe_mercure_hub', methods: ['GET'])]
public function getParentSubscribeMercureHub(
SerializerInterface $serializer,
Environment $twig,
$parent,
UserRepository $userRepository
):JsonResponse
{
$_parent = $userRepository->find($parent);
$parentId = $_parent->getId();
$mercureHubSubscribeUrl = 'https://armsyschool.com/absence/page/hub/' . $parentId;
$result = $twig->render('mercure/client_hub_url.html.twig',[
'url'=>$mercureHubSubscribeUrl
]);
return new JsonResponse($serializer->serialize([ 'mercure_client_hub_url'=>$result], 'json'),Response::HTTP_OK,['accept'=>'application/json'],true);
}
}