<?php
namespace App\Controller;
use App\Entity\ParentNote;
use App\Form\ParentNoteType;
use App\Entity\Subject;
use App\Entity\TheClass;
use App\Entity\Exams;
use App\Repository\NoteRepository;
use App\Repository\SchoolYearRepository;
use App\Repository\ParentNoteRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Service\PushNotificationService;
use Symfony\Component\Translation\TranslatorInterface as TranslationTranslatorInterface;
#[Route('/prof/parent/note')]
class ParentNoteController extends AbstractController
{
public function __construct(private Security $security, private RequestStack $requestStack)
{}
#[Route('/{subject}/{class}/{exam}/', name: 'app_parent_note_index', methods: ['GET'])]
public function index(
ParentNoteRepository $parentNoteRepository,
Request $request,
EntityManagerInterface $entityManager,
Subject $subject,
TheClass $class,
SchoolYearRepository $yearRepo,
TranslatorInterface $translator,
NoteRepository $noteRepo,
Exams $exam
): Response
{
if (!($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('ROLE_EDITOR') || ($subject->getProf() == $this->getUser()))) {
$this->addFlash(
"danger",
$translator->trans('Accès non autorisé!'
));
return $this->redirect($this->requestStack->getCurrentRequest()->headers->get('referer'));
}
$year = $yearRepo->findOneBy(['active' => true]);
$parentNotes = $parentNoteRepository->findBy([
'school' => $this->getUser()->getSchool(),
'classe' => $class,
'exam' => $exam,
'subject' => $subject,
'year' => $year,
]);
$totalDividend = 0;
foreach ($parentNotes as $note) {
$totalDividend += $note->getDividend();
}
if ($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('ROLE_EDITOR') || $subject->getProf() == $this->getUser()) {
return $this->render('parent_note/index.html.twig', [
'parentNotes' => $parentNotes,
'exam' => $exam,
'class' => $class,
'subject' => $subject,
'totalDividend' => $totalDividend,
]);
} else {
$this->addFlash(
"danger",
$translator->trans('Accès non autorisé!'
));
return $this->redirect($this->requestStack->getCurrentRequest()->headers->get('referer'));
}
}
#[Route('/new/{subject}/{class}/{exam}', name: 'app_parent_note_new', methods: ['GET', 'POST'])]
public function new(
Request $request,
EntityManagerInterface $entityManager,
Subject $subject,
TheClass $class,
SchoolYearRepository $yearRepo,
Exams $exam,
ParentNoteRepository $parentNoteRepository,
TranslatorInterface $translator,
): Response
{
if (!($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('ROLE_EDITOR') || ($subject->getProf() == $this->getUser()))) {
$this->addFlash(
"danger",
$translator->trans('Accès non autorisé!'
));
return $this->redirect($this->requestStack->getCurrentRequest()->headers->get('referer'));
}
$year = $yearRepo->findOneBy(['active' => true]);
$parentNotes = $parentNoteRepository->findBy(['subject' => $subject, 'classe' => $class, 'exam' => $exam, 'year' => $year]);
if (!empty($parentNotes)) {
$this->addFlash("danger",$translator->trans('La totalité des dividendes doit être inférieure ou égale à 20'));
return $this->redirectToRoute('app_parent_note_new', [
'subject' => $subject->getId(),
'class' => $class->getId(),
'exam' => $exam->getId(),
],
Response::HTTP_SEE_OTHER
);
}
$parentNote = new ParentNote();
$parentNote->setSubject($subject);
$parentNote->setExam($exam);
$parentNote->setSchool($this->getUser()->getSchool());
$parentNote->setYear($yearRepo->findOneBy(['active' => true]));
$parentNote->setClasse($class);
$parentNote->setDividend(20);
$name = $request->getLocale() == 'fr' ? 'Notes Séquentielles' : 'Sequential Grades';
$parentNote->setName($name);
$entityManager->persist($parentNote);
$entityManager->flush();
return $this->redirectToRoute('app_note_add_class', [
'subject' => $subject->getId(),
'class' => $class->getId(),
'exams' => $exam->getId(),
'parentNote' => $parentNote->getId()
]);
$form = $this->createForm(ParentNoteType::class, $parentNote, ['parentNotes' => $parentNotes]);
$form->handleRequest($request);
/*if ($form->isSubmitted() && $form->isValid()) {
if (!empty($parentNotes)) {
$dividend = $parentNote->getDividend();
//on recupere l'ensemble des pourcentage
foreach ($parentNotes as $parent) {
$dividend += $form->get('dividend-'. $parent->getId())->getData();
}
if ($dividend > 20) {
$this->addFlash("danger",$translator->trans('La totalité des dividendes doit être inférieure ou égale à 20'));
return $this->redirectToRoute('app_parent_note_new', [
'subject' => $subject->getId(),
'class' => $class->getId(),
'exam' => $exam->getId(),
],
Response::HTTP_SEE_OTHER
);
}
foreach ($parentNotes as $parent) {
$parent->setDividend(($form->get('dividend-'. $parent->getId())->getData()));
$entityManager->persist($parent);
$entityManager->flush();
}
}
$parentNote->setSubject($subject);
$parentNote->setExam($exam);
$parentNote->setSchool($this->getUser()->getSchool());
$parentNote->setYear($yearRepo->findOneBy(['active' => true]));
$parentNote->setClasse($class);
$entityManager->persist($parentNote);
$entityManager->flush();
$this->addFlash("success",$translator->trans('Note créée avec success'));
return $this->redirectToRoute('app_parent_note_index', [
'subject' => $subject->getId(),
'class' => $class->getId(),
'exam' => $exam->getId()
], Response::HTTP_SEE_OTHER);
}*/
return $this->renderForm('parent_note/new.html.twig', [
'parentNotes' => $parentNotes,
'form' => $form,
'exam' => $exam,
'class' => $class,
'subject' => $subject
]);
}
#[Route('/{id}', name: 'app_parent_note_show', methods: ['GET'])]
public function show(ParentNote $parentNote): Response
{
return $this->render('parent_note/show.html.twig', [
'parent_note' => $parentNote,
]);
}
#[Route('/{parentNote}/edit/{subject}/{class}/{exam}', name: 'app_parent_note_edit', methods: ['GET', 'POST'])]
public function edit(
Request $request,
ParentNote $parentNote,
EntityManagerInterface $entityManager,
Subject $subject,
TheClass $class,
SchoolYearRepository $yearRepo,
Exams $exam,
ParentNoteRepository $parentNoteRepository,
TranslatorInterface $translator,
): Response
{
if (!($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('ROLE_EDITOR') || ($subject->getProf() == $this->getUser()))) {
$this->addFlash(
"danger",
$translator->trans('Accès non autorisé!'
));
return $this->redirect($this->requestStack->getCurrentRequest()->headers->get('referer'));
}
$year = $yearRepo->findOneBy(['active' => true]);
$parentNotes = $parentNoteRepository->findBy(['subject' => $subject, 'classe' => $class, 'exam' => $exam, 'year' => $year]);
foreach ($parentNotes as $key => $parentt) {
if ($parentt->getId() == $parentNote->getId()) {
unset($parentNotes[$key]);
}
}
$form = $this->createForm(ParentNoteType::class, $parentNote, ['parentNotes' => $parentNotes]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (!empty($parentNotes)) {
$dividend = $parentNote->getDividend();
//on recupere l'ensemble des pourcentage
foreach ($parentNotes as $parent) {
$dividend += $form->get('dividend-'. $parent->getId())->getData();
}
if ($dividend > 20) {
$this->addFlash("danger",$translator->trans('la totalité des dividendes doit être inférieure ou égale à 20'));
return $this->redirectToRoute('app_parent_note_edit', [
'parentNotes' => $parentNotes,
'parent' => $parentNote,
'form' => $form,
'subject' => $subject->getId(),
'class' => $class->getId(),
'exam' => $exam->getId(),
'parentNote' => $parentNote->getId()
],
Response::HTTP_SEE_OTHER
);
}
foreach ($parentNotes as $parent) {
$parent->setDividend($form->get('dividend-'. $parent->getId())->getData());
$entityManager->persist($parent);
$entityManager->flush();
}
}
$entityManager->flush();
$this->addFlash("success",$translator->trans('la note modifée avec success'));
return $this->redirectToRoute('app_parent_note_index', [
'subject' => $subject->getId(),
'class' => $class->getId(),
'exam' => $exam->getId(),
], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('parent_note/edit.html.twig', [
'parentNotes' => $parentNotes,
'parent' => $parentNote,
'form' => $form,
'subject' => $subject,
'class' => $class,
'exam' => $exam,
]);
}
#[Route('/delete/{parentNote}/{subject}/{class}/{exam}', name: 'app_parent_note_delete', methods: ['POST'])]
public function delete(
Request $request,
ParentNote $parentNote,
EntityManagerInterface $entityManager,
Subject $subject,
Exams $exam,
TranslatorInterface $translator,
TheClass $class,
PushNotificationService $notification
): Response
{
if (!($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('ROLE_EDITOR') || ($subject->getProf() == $this->getUser()))) {
$this->addFlash(
"danger",
$translator->trans('Accès non autorisé!'
));
return $this->redirect($this->requestStack->getCurrentRequest()->headers->get('referer'));
}
if ($this->isCsrfTokenValid('delete'.$parentNote->getId(), $request->request->get('_token'))) {
foreach ($parentNote->getNotes() as $value) {
/********* Notification *****************/
$parent = $value->getStudent()->getParent();
$lang = $parent->getLocalPhoneLang();
$token = $parent->getUserToken();
$userId = $parent->getId();
$route = 'drawer/Note';
$title = $lang == null ? 'Alerte ! Note supprimée' : 'Note Deleted Alert';
if ($lang == null) {
$message = ' La note de ' . $value->getNote(). '/' . $value->getDividend() . ' de l\'élève ' . $value->getStudent()->getFullName() .' en '. $value->getSubject()->getName() . ' pour le compte de '. $value->getExams()->getName() . ' a été supprimée';
} else {
$message = ' La note de controle de ' . $value->getNote(). '/' . $value->getDividend() . ' de l\'élève ' . $value->getStudent()->getFullName() .' en '. $value->getSubject()->getName() . ' pour le compte de '. $value->getExams()->getName() . ' a été supprimée';
}
//android
if ($token) {
$data = [
'userId' => $userId,
'type' => 'note'
];
$notification->sendNotification($token, $title, $message, $data);
}
}
$entityManager->remove($parentNote);
$entityManager->flush();
}
return $this->redirectToRoute('app_parent_note_index', [
'class' => $class->getId(), 'subject' => $subject->getId(), 'exam' => $exam->getId()
], Response::HTTP_SEE_OTHER);
}
}