HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/dvpis2026/dvpis.kaunokolegija.lt/src/Controller/Poll/SurveyController.php
<?php

namespace App\Controller\Poll;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use App\Entity\LecturerApprovedActivities;
use App\Entity\TmmvLecturer;
use App\Entity\MeovLecturer;
use App\Entity\KtvLecturer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use App\Entity\Poll\PollGroup;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Poll\AnswerRow;
use App\Entity\Poll\AnswerField;
use App\Entity\Poll\Answer;
use App\Entity\Poll\Poll;
use App\Entity\Poll\Summary;
use App\Entity\Lecturer;
use App\Service\ProcessDatesValidation;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Doctrine\ORM\EntityManagerInterface;
use App\Service\DbDataFilter;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

/**
* SurveyController controller.
*
* @Security("is_granted('ROLE_LECTURER')
   or is_granted('ROLE_DEPARTMENT_HEAD')
   or is_granted('ROLE_ACADEMIC_UNIT_PROHEAD')
  ")
*/
#[Route(path: 'poll')]
class SurveyController extends AbstractController
{
    public function __construct(
        private readonly ProcessDatesValidation $dateValidator,
        private readonly EntityManagerInterface $em,
        private readonly DbDataFilter $dbDataFilter,
        private readonly AuthorizationCheckerInterface $authorizationChecker,
    ) {
        if (!$this->dateValidator->isActiveLecturerPoll()) {
            throw new AccessDeniedHttpException("Jūs negalite pasiekti šio turinio");
        }

        if ($this->authorizationChecker->isGranted('ROLE_ACADEMIC_UNIT_PROHEAD')) {
            $this->dbDataFilter->enableOnlyAcademicUnitFilter();
            return;
        }

        if ($this->authorizationChecker->isGranted('ROLE_DEPARTMENT_HEAD')) {
            $this->dbDataFilter->enableOnlyDepartmentFilter();
            return;
        }

        if ($this->authorizationChecker->isGranted('ROLE_LECTURER')) {
            $this->dbDataFilter->enableOnlyLecturerFilter();
            return;
        }

        throw new AccessDeniedHttpException("Jūsų naudotojas negali pasiekti šio turinio");
    }

    /**
     * Lists all academicGroup entities.
     *
     * @Method("GET")
     */
    #[Route(path: '/', name: 'poll_lecturer_index')]
    public function indexAction()
    {


        $lecturerTmmv = $this->em->getRepository(TmmvLecturer::class)->getLecturerTmmvPlanHoursGroupByLecturer();
        $lecturerMeov = $this->em->getRepository(MeovLecturer::class)->getLecturerMeovPlanHoursGroupByLecturer();
        $lecturerKtv = $this->em->getRepository(KtvLecturer::class)->getLecturerKtvPlanHoursGroupByLecturer();

        $lectApprovals = $this->em->getRepository(LecturerApprovedActivities::class)->getListByLecturerId();

        return $this->render('poll/index.html.twig', [
            'lecturers' => $this->em->getRepository(Lecturer::class)->findAll(),
            'lecturerStatuses' => $this->em->getRepository(Summary::class)->findAllByLecturer(),
            'lecturerTmmv' => $lecturerTmmv,
            'lecturerMeov' => $lecturerMeov,
            'lecturerKtv' => $lecturerKtv,
            'lectApprovals' => $lectApprovals,
        ]);
    }

    /**
     * Lists all academicGroup entities.
     *
     * @Method("GET")
     */
    #[Route(path: '/poll/{lecturer}/{page}', name: 'poll_index')]
    public function indexPollAction(Lecturer $lecturer, $page = 1)
    {
        $isCompleted = false;
        $isCompletedReview = false;

        $pollGroups = $this->em->getRepository(PollGroup::class)->findByPage($page);

        $maxPage = $this->em->getRepository(PollGroup::class)->findMaxPage();
        $maxPage++;
        $pers = round(($page - 1) * 100 / ($maxPage));
//        if ($this->em->getFilters()->isEnabled('lecturer_filter')) {
////            $this->em->getFilters()->disable('lecturer_filter');
//        }
        $answerRowsByPoll = $this->em->getRepository(Poll::class)->findByLecturerPage($lecturer->getId(), $page);
        $suggestionsTmmvByPoll = $this->em->getRepository(Poll::class)->findTmmvByLecturerPage($lecturer->getId(), $page);
        $suggestionsMeovByPoll = $this->em->getRepository(Poll::class)->findMeovByLecturerPage($lecturer->getId(), $page);
        $suggestionsKtvByPoll = $this->em->getRepository(Poll::class)->findKtvByLecturerPage($lecturer->getId(), $page);
        $answersByRows = $this->em->getRepository(Answer::class)->findByLecturerPage($lecturer->getId(), $page);


//        dump($suggestionsMeovByPoll);
//dump($pollGroups); die;

        //can fill only user lecturer
        $userEmail = $this->getUser()->getEmail();
        if ($lecturer->getEmail() != $userEmail) {
            $isCompleted = true;
        }

        $summary = $this->em->getRepository(Summary::class)->findOneByLecturer($lecturer);

        if ($summary) {
            $dateCompleted = $summary->getDateCompleted();
            if ($dateCompleted) {
                $pers = 100;
                $isCompleted = true;
            }
            $dateCompletedReview = $summary->getDateCompletedReview();
            if ($dateCompletedReview) {
                $pers = 100;
                $isCompletedReview = true;
            }
        }

        return $this->render('poll/poll.html.twig', [
                    'page' => $page,
                    'maxPage' => $maxPage,
                    'proc' => $pers,
                    'pollGroups' => $pollGroups,
                    'lecturer' => $lecturer,
                    'answerRows' => $answerRowsByPoll,
                    'answersByRows' => json_encode($answersByRows),
                    'suggestionsTmmvByPoll' => $suggestionsTmmvByPoll,
                    'suggestionsMeovByPoll' => $suggestionsMeovByPoll,
                    'suggestionsKtvByPoll' => $suggestionsKtvByPoll,
                    'isCompleted' => false, // @todo change this
                    'isCompletedReview' => $isCompletedReview,
        ]);
    }

    /**
     * Creates entity.
     *
     * @Method({"POST"})
     */
    #[Route(path: '/save', name: 'poll_save')]
    public function savePollAnswerAction(Request $request)
    {

        $page = $request->request->get('page');
        $lecturerId = $request->request->get('lecturer_id');
        $pollId = $request->request->get('poll_id');
        $answerRowId = $request->request->get('answer_row_id_' . $pollId);
        $fieldValues = $request->request->all()['field'];
        $appendRowId = $request->request->get('append_row_id_' . $pollId);
        $appendType = $request->request->get('append_type_' . $pollId);



        $lecturer = $this->em->getRepository(Lecturer::class)->find($lecturerId);

        if ($request->request->has('delete')) {
            $answerRow = $this->em->getRepository(AnswerRow::class)->find($answerRowId);
            $answers = $this->em->getRepository(Answer::class)->findByAnswerRow($answerRow);
            foreach ($answers as $answer) {
                $this->em->remove($answer);
            }

            $this->em->remove($answerRow);
            $this->em->flush();
            return $this->redirectToRoute('poll_index', ['lecturer' => $lecturer->getId(), 'page' => $page]);
        }

        if (!empty($appendRowId) && !empty($appendType)) {
            if ($appendType === 'tmmv') {
                $appendObject = $this->em->getRepository(TmmvLecturer::class)->find($appendRowId);
            }
            if ($appendType === 'meov') {
                $appendObject = $this->em->getRepository(MeovLecturer::class)->find($appendRowId);
            }
            if ($appendType === 'ktv') {
                $appendObject = $this->em->getRepository(KtvLecturer::class)->find($appendRowId);
            }
        }

        $poll = $this->em->getRepository(Poll::class)->find($pollId);

        if (empty($answerRowId)) {
            $answerRow = new AnswerRow();
            $answerRow->setPoll($poll);
            $answerRow->setLecturer($lecturer);
            $this->em->persist($answerRow);

            foreach ($fieldValues as $answerFieldId => $answerValue) {
                $answer = new Answer();
                $answer->setAnswerRow($answerRow);

                $answerField = $this->em->getRepository(AnswerField::class)->find($answerFieldId);
                $answer->setAnswerField($answerField);
                $answer->setName($answerValue);

                $this->em->persist($answer);
            }
            if (!empty($appendObject)) {
                $appendObject->setPoll($pollId);
                $this->em->persist($appendObject);
            }
        } else {
            $answerRow = $this->em->getRepository(AnswerRow::class)->find($answerRowId);

            foreach ($fieldValues as $answerFieldId => $answerValue) {
                $answerField = $this->em->getRepository(AnswerField::class)->find($answerFieldId);
                $answer = $this->em->getRepository(Answer::class)->findOneBy(['answerField' => $answerField, 'answerRow' => $answerRow]);
                $answer->setName($answerValue);

                $this->em->persist($answer);
            }
        }

        $this->em->flush();

        return $this->redirectToRoute('poll_index', ['lecturer' => $lecturer->getId(), 'page' => $page]);
    }
}