<?php 
 
namespace App\Controller; 
 
use App\Entity\PaidCourseList; 
use App\Entity\Session; 
use App\Entity\UserPlacementTest; 
use App\Form\CourseTrackEditType; 
use App\Notification\EmailNotification; 
use App\Repository\AbsenceLogRepository; 
use App\Repository\PaidCourseListRepository; 
use App\Subscription\SubscriptionHelper; 
use DateTimeImmutable; 
use DateTimeZone; 
use Doctrine\ORM\EntityManagerInterface; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\Routing\Annotation\Route; 
 
/** 
 * @Route("admin") 
 * @Security("is_granted('ROLE_SECRETARIAT')") 
 */ 
class AdminDashboardController extends AbstractController 
{ 
    /** 
     * @Route("/", name="admin_dashboard", defaults={"teacher"=1}) 
     */ 
    public function index(PaidCourseListRepository $paidCourseListRepository, Request $request) 
    { 
 
        $date = new \DateTimeImmutable('now', new DateTimeZone('Africa/Cairo')); 
 
        if ($request->query->get('q')){ 
            $q = $request->query->get('q'); 
            $dateChoosen = new \DateTimeImmutable($q, new DateTimeZone('Africa/Cairo')); 
        }else{ 
            $dateChoosen = $date; 
        } 
 
        $courseOfTheDay = $paidCourseListRepository->getAllCoursesOfTheCurrentDay($dateChoosen); 
 
        return $this->render('admin/dashboard/index.html.twig', [ 
            'coursesOfTheDay' => $courseOfTheDay, 
            'currentDay' => $date, 
        ]); 
    } 
 
    /** 
     * @Route("/course/tracking", name="admin_course_tracking", methods={"POST"}) 
     * @param Request $request 
     * @param EntityManagerInterface $em 
     * @param PaidCourseListRepository $paidCourseListRepository 
     * @param SubscriptionHelper $subscriptionHelper 
     * @param EmailNotification $emailNotification 
     * @param EmailNotification\TicketEmailNotification $ticketEmailNotification 
     * @return \Symfony\Component\HttpFoundation\RedirectResponse 
     */ 
    public function makeCourseAsDone(Request $request, EntityManagerInterface $em, PaidCourseListRepository $paidCourseListRepository, SubscriptionHelper $subscriptionHelper, EmailNotification $emailNotification, EmailNotification\TicketEmailNotification $ticketEmailNotification, EmailNotification\LevelTestEmailNotification $levelTestEmailNotification) 
    { 
        if ($request->isMethod('POST')) { 
 
            $appUser = $this->getUser(); 
 
            $coursesDone = $request->get('done'); 
            $coursesNotDone = $request->get('notDone'); 
            $coursesDoneStudentAbsent = $request->get('studentAbsent'); 
            $lostMinutes = $request->get('lostMinutes'); 
            $catchupMinutes = $request->get('catchupMinutes'); 
            $comments = $request->get('comment'); 
            $penalties = $request->get('penalty'); 
 
 
            if ($comments){ 
                foreach ($comments as $key => $comment){ 
                    $course = $paidCourseListRepository->findOneBy(['id'=> $key]); 
                    if($course){ 
                        if ($course->getComment()){ 
                            $course->setComment($course->getComment().' '.$comment); 
                        }else{ 
                            $course->setComment($comment); 
                        } 
 
                        if($comment != ''){ 
                            $course->setUpdateBy($appUser->getFullname())->setUpdateAt(new \DateTime()); 
                        } 
                        $em->persist($course); 
                    } 
                } 
            } 
 
            if ($lostMinutes){ 
                foreach ($lostMinutes as $key => $minute){ 
                    $course = $paidCourseListRepository->findOneBy(['id'=> $key]); 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $newTotal = $session->incrementTotalListMinutes((int)$minute); 
                        $session->setTotalLostMinutes($newTotal); 
                        $course->setLostMinutes((int)$minute) 
                        ; 
                        $em->persist($course); 
                        $em->persist($session); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
                        $newTotal = $subscription->incrementTotalListMinutes((int)$minute); 
                        $subscription->setTotalLostMinutes($newTotal); 
                        $course->setLostMinutes((int)$minute) 
                        ; 
                        $em->persist($course); 
                        $em->persist($subscription); 
                    } 
 
                    if($minute != ''){ 
                        $course->setUpdateBy($appUser->getFullname()) 
                            ->setUpdateAt(new \DateTime()); 
 
                        $em->persist($course); 
 
                    } 
                } 
            } 
 
            if ($catchupMinutes){ 
                foreach ($catchupMinutes as $key => $minute){ 
                    $course = $paidCourseListRepository->findOneBy(['id'=> $key]); 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $newTotal = $session->decrementTotalListMinutes((int)$minute); 
                        $session->setTotalLostMinutes($newTotal); 
                        $course->setCatchUpMinutes((int)$minute); 
                        $em->persist($course); 
                        $em->persist($session); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
                        $newTotal = $subscription->decrementTotalListMinutes((int)$minute); 
                        $subscription->setTotalLostMinutes($newTotal); 
                        $course->setCatchUpMinutes((int)$minute); 
                        $em->persist($course); 
                        $em->persist($subscription); 
                    } 
 
                    if($minute != ''){ 
                        $course->setUpdateBy($appUser->getFullname()) 
                            ->setUpdateAt(new \DateTime()); 
 
                        $em->persist($course); 
 
                    } 
                } 
            } 
 
 
 
 
            //Pour les cours fait 
            if ($coursesDone) { 
                foreach ($coursesDone as $courseId) { 
                    $course = $paidCourseListRepository->findOneBy(['id'=> $courseId]); 
 
                    if ($course->getIsCatchUpDate() == true){ 
                        $catchup = $course->getAbsenceLogRelated(); 
                        $catchup->setWasCaughtUp(true); 
                        $catchup->setCatchUpSchedule(null); 
                        $em->persist($catchup); 
                    } 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $coursePrice = $this->calculatePriceCourseForGroup($session); 
                        $course->setPrice($coursePrice); 
                        $em->persist($course); 
                    } 
 
                    $course->setIsDone(true) 
                        ->setUpdateAt(new \DateTime()) 
                        ->setUpdateBy($appUser->getFullname()) 
                        ->setIsCanceled(false) 
                        ->setIsCanceledByUs(false) 
                    ; 
                    $em->persist($course); 
                } 
 
                $em->flush(); 
            } 
 
 
            //Pour les cours non fait 
            if($coursesNotDone) { 
                foreach ($coursesNotDone as $courseId) { 
                    $course = $paidCourseListRepository->findOneBy(['id'=> $courseId]); 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $course->setIsCanceled(true) 
                            ->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()) 
                        ; 
                        $lastTwoCourses = $paidCourseListRepository->findLastCourseForGroup($session->getId()); 
                        $lastBeforeCourseDate =  DateTimeImmutable::createFromMutable($lastTwoCourses[1]->getCourseDate()); 
                        $lastBeforeCourseSchedule = $lastTwoCourses[1]->getTeacherSchedule(); 
                        $newEndDate = $lastBeforeCourseDate->modify('+1 week'); 
                        $session->setEndDate($newEndDate); 
                        $paidCourse = new PaidCourseList(); 
                        $paidCourse->setTeacherSchedule($lastBeforeCourseSchedule) 
                            ->setCourseDate($newEndDate) 
                            ->setIsDone(false) 
                            ->setIsCanceled(false) 
                            ->setIsCatchUpDate(false) 
                            ->setIsForGroup(true) 
                            ->setIsCatchable(false) 
                            ->setIsWaiting(false) 
                            ->setSessionGroup($session) 
                            ->setIsAbandoned(false) 
                            ->setIsCanceledForHoliday(false) 
                            ->setIsTest(false) 
                            ->setIsCanceledByStudent(false) 
                            ->setIsCanceledByUs(false) 
                        ; 
                        $em->persist($session); 
                        $em->persist($course); 
                        $em->persist($paidCourse); 
                        $emailNotification->notifyStudentGroupNewEndDate($session, $course, $newEndDate); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
 
                        $course->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()); 
 
                        $em->persist($course); 
 
                        if ($course->getIsCatchUpDate() == true){ 
                            $catchup =  $course->getAbsenceLogRelated(); 
                            $catchup->setCatchUpSchedule(null); 
                            $catchup->setIsCanceled(true); 
                            $em->persist($catchup); 
                        } 
 
                        $subscriptionHelper->cancelPaidCourse($course); 
                        $subscriptionHelper->addNewAbsenceToCatchUp($course, $subscription); 
 
                        $emailNotification->notifyStudentAddReportForCanceledCourse($course, $subscription); 
                    }elseif ($course->getVideoRegistration() != null){ 
                        $videoCourseRegistration = $course->getVideoRegistration(); 
 
                        $videoCourseRegistration->setNbLesson($videoCourseRegistration->getNbLesson() + 1); 
 
                        $course->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()) 
                            ->setIsCanceled(true) 
                            ->setIsCanceledByUs(true) 
                        ; 
 
                        $em->persist($videoCourseRegistration); 
 
                        $emailNotification->notifyStudentVideoCourseCanceled($videoCourseRegistration, $course); 
 
                    }elseif ($course->getTicketOrder() != null){ 
                        $ticketOrder = $course->getTicketOrder(); 
 
                        $ticketOrder->setClassLeft($ticketOrder->getClassLeft() + 1); 
 
                        $course->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()) 
                            ->setIsCanceled(true) 
                            ->setIsCanceledByUs(true) 
                        ; 
 
                        $em->persist($ticketOrder); 
 
                        $ticketEmailNotification->cancelTicketLessonEmailNotification($course); 
 
                    }elseif ($course->getUserTestLevel() != null){ 
                        $course->setIsCanceledByUs(true) 
                            ->setIsCanceled(true) 
                            ->setIsDone(false) 
                            ->setUpdateBy($appUser->getFullname()) 
                        ; 
 
                        $levelTest = $course->getUserTestLevel(); 
                        $levelTest->setIsCanceledbyUs(true); 
                        $em->persist($levelTest); 
 
                        $levelTestEmailNotification->notifyStudentTestCanceled($course); 
                    } 
                } 
 
                $em->flush(); 
            } 
 
            //Pour les cours où l'élève était absent et le prof à attendu 
            if($coursesDoneStudentAbsent) { 
                foreach ($coursesDoneStudentAbsent as $courseId) { 
                    $course = $paidCourseListRepository->findOneBy(['id'=> $courseId]); 
 
                    if ($course->getIsCatchUpDate() == true){ 
                        $catchup = $course->getAbsenceLogRelated(); 
                        $catchup->setCatchUpSchedule(null); 
                        $catchup->setWasCaughtUp(true); 
                        $em->persist($catchup); 
                    } 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $coursePrice = $this->calculatePriceCourseForGroup($session); 
                        $course->setPrice($coursePrice) 
                            ->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()) 
                        ; 
                        $em->persist($course); 
                    } 
 
                    if ($course->getUserTestLevel() != null){ 
 
                        $userLevelTest = $course->getUserTestLevel(); 
                        $userLevelTest->setIsStudentAbsent(true) 
                        ; 
                        $em->persist($userLevelTest); 
 
                    } 
 
                    $course->setIsDone(true) 
                        ->setIsWaiting(true) 
                        ->setUpdateAt(new \DateTime()) 
                        ->setUpdateBy($appUser->getFullname()) 
                    ; 
                    $em->persist($course); 
                } 
                $em->flush(); 
            } 
 
 
 
            if($penalties){ 
                foreach ($penalties as $key => $penalty){ 
                    $course = $paidCourseListRepository->findOneBy(['id'=> $key]); 
                    $course->setPenalty((float)$penalty); 
                    $em->persist($course); 
                    $em->flush(); 
                } 
 
            } 
 
 
            $em->flush(); 
 
            $this->addFlash('success', 'Tracking sent with success'); 
 
            return $this->redirectToRoute('admin_dashboard'); 
 
        } 
 
 
    } 
 
    /** 
     * @Route("/course/tracking/{id}/edit", name="admin_course_tracking_edit", methods={"GET", "POST"}) 
     */ 
    public function courseTrackingEdit($id, PaidCourseListRepository $paidCourseListRepository, Request $request, EntityManagerInterface $em, EmailNotification $emailNotification, SubscriptionHelper $subscriptionHelper, AbsenceLogRepository $absenceLogRepository, EmailNotification\LevelTestEmailNotification $levelTestEmailNotification) 
    { 
        $courseToEdit = $paidCourseListRepository->findOneBy(['id' => $id]); 
 
        $oldLostMinutes = $courseToEdit->getLostMinutes(); 
 
        $oldCatchUpMinutes = $courseToEdit->getCatchUpMinutes(); 
 
        $oldCourseIsDone = $courseToEdit->getIsDone(); 
 
        $oldCourseIsCanceled = $courseToEdit->getIsCanceled(); 
 
        $oldCourseIsWaiting = $courseToEdit->getIsWaiting(); 
 
        $form = $this->createForm(CourseTrackEditType::class, $courseToEdit); 
        $form->handleRequest($request); 
 
        if ($form->isSubmitted() && $form->isValid()) { 
 
            $course = $form->getData(); 
 
            $appUser = $this->getUser(); 
 
 
            if ($oldLostMinutes != $course->getLostMinutes()){ 
                if ($oldLostMinutes == 0){ 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $newTotal = $session->incrementTotalListMinutes((int)$course->getLostMinutes()); 
                        $session->setTotalLostMinutes($newTotal); 
                        $em->persist($session); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
                        $newTotal = $subscription->incrementTotalListMinutes((int)$course->getLostMinutes()); 
                        $subscription->setTotalLostMinutes($newTotal); 
                        $em->persist($subscription); 
                    } 
                }else{ 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $newTotal1 = $session->decrementTotalListMinutes((int)$oldLostMinutes); 
                        $session->setTotalLostMinutes($newTotal1); 
                        $em->persist($session); 
                        $em->flush(); 
                        $newTotal2 = $session->incrementTotalListMinutes((int)$course->getLostMinutes()); 
                        $session->setTotalLostMinutes($newTotal2); 
                        $em->persist($session); 
                        $em->flush(); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
                        $newTotal1 = $subscription->decrementTotalListMinutes((int)$oldLostMinutes); 
                        $subscription->setTotalLostMinutes($newTotal1); 
                        $em->persist($subscription); 
                        $em->flush(); 
                        $newTotal2 = $subscription->incrementTotalListMinutes((int)$course->getLostMinutes()); 
                        $subscription->setTotalLostMinutes($newTotal2); 
                        $em->persist($subscription); 
                        $em->flush(); 
                    } 
 
                } 
            } 
 
 
            if ($oldCatchUpMinutes != $course->getCatchUpMinutes()){ 
 
                if($oldCatchUpMinutes == 0){ 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $newTotal = $session->decrementTotalListMinutes((int)$course->getCatchUpMinutes()); 
                        $session->setTotalLostMinutes($newTotal); 
                        $em->persist($session); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
                        $newTotal = $subscription->decrementTotalListMinutes((int)$course->getCatchUpMinutes()); 
                        $subscription->setTotalLostMinutes($newTotal); 
                        $em->persist($subscription); 
                    } 
                }else{ 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $newTotal1 = $session->incrementTotalListMinutes((int)$oldCatchUpMinutes); 
                        $session->setTotalLostMinutes($newTotal1); 
                        $em->persist($session); 
                        $em->flush(); 
                        $newTotal2 = $session->decrementTotalListMinutes((int)$course->getCatchUpMinutes()); 
                        $session->setTotalLostMinutes($newTotal2); 
                        $em->persist($session); 
                        $em->flush(); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
                        $newTotal1 = $subscription->incrementTotalListMinutes((int)$oldCatchUpMinutes); 
                        $subscription->setTotalLostMinutes($newTotal1); 
                        $em->persist($subscription); 
                        $em->flush(); 
                        $newTotal2 = $subscription->decrementTotalListMinutes((int)$course->getCatchUpMinutes()); 
                        $subscription->setTotalLostMinutes($newTotal2); 
                        $em->persist($subscription); 
                        $em->flush(); 
                    } 
                } 
            } 
 
 
            //Pour les cours fait 
            if ($course->getIsDone() != $oldCourseIsDone){ 
                if ($course->getIsDone() == true) { 
 
                    if ($course->getIsCatchUpDate() == true){ 
                        $catchup = $course->getAbsenceLogRelated(); 
                        $catchup->setWasCaughtUp(true); 
                        $catchup->setCatchUpSchedule(null); 
                        $em->persist($catchup); 
                    } 
 
                    if($course->getAbsenceLog() != null){ 
                        $absenceToRemove = $absenceLogRepository->findOneBy([ 
                            'id' => $course->getAbsenceLog()->getId() 
                        ]); 
                        $absenceToRemove->setIsAbandoned(true); 
                        //TODO Voir pourquoi erreur quand on efface 
                        //$em->remove($absenceToRemove); 
                        $em->flush(); 
                    } 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $coursePrice = $this->calculatePriceCourseForGroup($session); 
                        $course->setPrice($coursePrice); 
 
                        $lastTwoCourses = $paidCourseListRepository->findLastCourseForGroup($session->getId()); 
 
                        $lastBeforeCourseDate =  DateTimeImmutable::createFromMutable($lastTwoCourses[1]->getCourseDate()); 
                        $lastCourseDate =  $lastTwoCourses[0]; 
                        $session->setEndDate($lastBeforeCourseDate); 
                        $em->remove($lastCourseDate); 
                        $em->persist($session); 
                        $em->persist($course); 
                        $em->flush(); 
                    } 
 
                    if ($course->getVideoRegistration() != null){ 
                        if ($course->getIsCanceledByUs() == true){ 
                            $videoCourseRegistration = $course->getVideoRegistration(); 
 
                            $videoCourseRegistration->setNbLesson($videoCourseRegistration->getNbLesson() - 1); 
 
                            $em->persist($videoCourseRegistration); 
 
                        } 
                    } 
 
 
                    if ($course->getUserTestLevel() != null){ 
 
                        /** @var UserPlacementTest $levelTest */ 
                        $levelTest = $course->getUserTestLevel(); 
 
                        $levelTest->setIsCanceledbyUs(false) 
                            ->setIsStudentAbsent(false) 
                            ; 
 
                    } 
 
                    $course->setIsDone(true) 
                            ->setIsCanceled(false) 
                            ->setIsWaiting(false) 
                            ->setIsCatchable(false) 
                            ->setIsCanceledByUs(false) 
                            ->setIsCanceledByStudent(false) 
                            ->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()) 
                    ; 
                    $em->persist($course); 
 
                } 
            } 
 
 
            //Pour les cours non fait 
            if ($course->getIsCanceled() != $oldCourseIsCanceled){ 
                if($course->getIsCanceled() == true) { 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $course->setIsCanceled(true) 
                                ->setPrice(0) 
                                ->setUpdateAt(new \DateTime()) 
                                ->setUpdateBy($appUser->getFullname()) 
                        ; 
                        $lastTwoCourses = $paidCourseListRepository->findLastCourseForGroup($session->getId()); 
                        $lastBeforeCourseDate =  DateTimeImmutable::createFromMutable($lastTwoCourses[1]->getCourseDate()); 
                        $lastBeforeCourseSchedule = $lastTwoCourses[1]->getTeacherSchedule(); 
                        $newEndDate = $lastBeforeCourseDate->modify('+1 week'); 
                        $session->setEndDate($newEndDate); 
                        $paidCourse = new PaidCourseList(); 
                        $paidCourse->setTeacherSchedule($lastBeforeCourseSchedule) 
                            ->setCourseDate($newEndDate) 
                            ->setIsDone(false) 
                            ->setIsCanceled(false) 
                            ->setIsCatchUpDate(false) 
                            ->setIsForGroup(true) 
                            ->setIsCatchable(false) 
                            ->setIsWaiting(false) 
                            ->setSessionGroup($session) 
                            ->setIsAbandoned(false) 
                            ->setIsCanceledForHoliday(false) 
                        ; 
                        $em->persist($session); 
                        $em->persist($course); 
                        $em->persist($paidCourse); 
                        $emailNotification->notifyStudentGroupNewEndDate($session, $course, $newEndDate); 
                    }elseif ($course->getSubscriptionOrder() != null){ 
                        $subscription = $course->getSubscriptionOrder(); 
 
                        if ($course->getIsCatchUpDate() == true){ 
                            $catchup =  $course->getAbsenceLogRelated(); 
                            $catchup->setCatchUpSchedule(null); 
                            $catchup->setIsCanceled(true); 
                            $em->persist($catchup); 
                        } 
 
                        $subscriptionHelper->cancelPaidCourse($course); 
                        $subscriptionHelper->addNewAbsenceToCatchUp($course, $subscription); 
 
                        $emailNotification->notifyStudentAddReportForCanceledCourse($course, $subscription); 
                    }elseif ($course->getVideoRegistration() != null){ 
                        $videoCourseRegistration = $course->getVideoRegistration(); 
 
                        $videoCourseRegistration->setNbLesson($videoCourseRegistration->getNbLesson() + 1); 
 
                        $em->persist($videoCourseRegistration); 
 
                    }if ($course->getUserTestLevel() != null){ 
 
                        /** @var UserPlacementTest $levelTest */ 
                        $levelTest = $course->getUserTestLevel(); 
 
                        $levelTest->setIsCanceledbyUs(true) 
                            ->setIsStudentAbsent(false) 
                        ; 
 
                        $levelTestEmailNotification->notifyStudentTestCanceled($course); 
                    } 
 
                    $course->setIsDone(false) 
                            ->setIsWaiting(false) 
                            ->setIsCanceledByUs(true) 
                            ->setIsCanceledByStudent(false) 
                            ->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()) 
                    ; 
                    $em->flush(); 
 
                    if ($course->getVideoRegistration() != null){ 
                        $emailNotification->notifyStudentVideoCourseCanceled($videoCourseRegistration, $course); 
                    } 
 
                } 
            } 
 
 
            //Pour les cours où l'élève était absent et le prof à attendu 
            if ($course->getIsWaiting() != $oldCourseIsWaiting){ 
                if($course->getIsWaiting() == true) { 
 
                    if ($course->getIsCatchUpDate() == true){ 
                        $catchup = $course->getAbsenceLog(); 
                        //$catchup->setCourseToCatchUp(null); 
                        $catchup->setIsCanceled(true); 
                        $em->persist($catchup); 
                        $em->remove($catchup); 
                    } 
 
                    if($course->getIsForGroup() == true){ 
                        $session = $course->getSessionGroup(); 
                        $coursePrice = $this->calculatePriceCourseForGroup($session); 
                        $course->setPrice($coursePrice) 
                            ->setUpdateAt(new \DateTime()) 
                            ->setUpdateBy($appUser->getFullname()) 
                        ; 
                        $em->persist($course); 
                    } 
 
                    if ($course->getVideoRegistration() != null){ 
                        if ($course->getIsCanceledByUs() == true){ 
                            $videoCourseRegistration = $course->getVideoRegistration(); 
 
                            $videoCourseRegistration->setNbLesson($videoCourseRegistration->getNbLesson() - 1); 
 
                            $em->persist($videoCourseRegistration); 
 
                        } 
                    } 
 
                    if ($course->getUserTestLevel() != null){ 
 
                        /** @var UserPlacementTest $levelTest */ 
                        $levelTest = $course->getUserTestLevel(); 
 
                        $levelTest->setIsCanceledbyUs(false) 
                            ->setIsStudentAbsent(true) 
                        ; 
 
                    } 
 
                    $course->setIsDone(true) 
                        ->setIsWaiting(true) 
                        ->setIsCanceled(false) 
                        ->setIsCanceledByUs(false) 
                        ->setIsCanceledByStudent(false) 
                        ->setUpdateAt(new \DateTime()) 
                        ->setUpdateBy($appUser->getFullname()) 
                    ; 
 
                    $em->persist($course); 
 
                    $em->flush(); 
                } 
            } 
 
 
            $courseToEdit->setUpdateAt(new \DateTime()) 
                ->setUpdateBy($appUser->getFullname()); 
 
            $em->persist($courseToEdit); 
            $em->flush(); 
 
            $this->addFlash('success', 'تم تغيير التقرير بالنجاح'); 
 
            return $this->redirectToRoute('admin_dashboard'); 
        } 
 
        return $this->render('admin/dashboard/edit-course-tracking.html.twig', [ 
            'form' => $form->createView(), 
            'course' =>$courseToEdit 
        ]); 
 
    } 
 
    public function calculatePriceCourseForGroup(Session $session) 
    { 
        $total = 0; 
 
        $orders = $session->getSessionOrder(); 
 
        $nbCourses = 26; 
 
        if ($session->getLevel()->getSubject()->getTagName() == "alKunuz"){ 
            $nbCourses = 26; 
        }else{ 
            $nbCourses = 22; 
        } 
 
        foreach ($orders as $order){ 
            $paidAmount = $order->getAmountPaid(); 
            $coursePrice = $paidAmount/$nbCourses; 
            $fees = ($coursePrice *2.9) /100; 
            $finalCoursePrice = $coursePrice - $fees; 
            $total += $finalCoursePrice; 
        } 
 
        return number_format($total,2); 
 
    } 
 
    /* 
    /** 
     * @Route("/course/clickup/{id}", name="admin_course_alert_clickup", methods={"GET", "POST"}) 
     */ 
    /* 
    public function alertOnClickup(PaidCourseList $paidCourseList) 
    { 
        if ($paidCourseList->getIsForGroup()) 
        { 
            $sessionId = $paidCourseList->getSessionGroup()->getId(); 
            $url = $this->container->get('router')->generate('admin_session_list', [ 
                'id' => $sessionId 
            ]); 
 
        }elseif ($paidCourseList->getSubscriptionOrder() != null) 
        { 
 
            $subscriptionId = $paidCourseList->getSubscriptionOrder()->getId(); 
            $url = $this->container->get('router')->generate('admin_subscription_show', [ 
                'id' => $subscriptionId 
            ]); 
        }else{ 
            $this->addFlash('error', 'هذا الفروم لطلاب لديهم اشتراك أو مجموعة. اخبر الإدارة'); 
            $url = '#'; 
            return $this->redirectToRoute('admin_dashboard'); 
        } 
 
        return $this->render('admin/dashboard/edit-course-tracking.html.twig', [ 
            'url' => $url, 
        ]); 
 
    }*/ 
 
 
}