src/Controller/ScenarioControllerFrontend.php line 122
<?php
namespace App\Controller;
use App\Entity\Link;
use App\Entity\Mcq;
use App\Entity\Node;
use App\Entity\PlayerSessionhist;
use App\Entity\ScenarioTimeTrack;
use App\Entity\Scenario;
use App\Entity\Media;
use App\Manager\RestrictedAccessManager;
use App\Manager\StatManager;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\Persistence\ManagerRegistry;
use Exception;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use BeSimple\I18nRoutingBundle\Routing\Annotation\I18nRoute;
use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Service\PdfService;
class ScenarioControllerFrontend extends AbstractController
{
public TranslatorInterface $translator;
private PdfService $pdfService;
private UrlGeneratorInterface $router;
public function __construct(PdfService $pdfService, UrlGeneratorInterface $router, TranslatorInterface $translator, private ManagerRegistry $managerRegistry)
{
$this->pdfService = $pdfService;
$this->router = $router;
$this->translator = $translator;
}
/**
* Methods enable translation of error|notice flash messages.
*
* @param $key
* @param array $params
* @param null $domain
* @return mixed
*/
public function trans($key, array $params = [], $domain = null)
{
return $this->translator->trans($key, $params, $domain);
}
public function addFlashMessage($type, $key, array $params = [], $domain = null)
{
$this->addFlash($type, $this->trans($key, $params, $domain));
}
public function addNotFoundException($type, $key, array $params = [], $domain = null)
{
$this->createNotFoundException($this->trans($key, $params, $domain));
}
// /**
// * @Route("/scenarios", name="scenarios")
// * @Method ({"GET"})
// * @param Request $request
// * @return void
// */
// public function indexAction(Request $request)
// {
//
// //$translated = $this->get('translator')->trans("Hello");
// //var_dump($translated);
//
// /* NEPOTREBUJEME
// $em = $this->getDoctrine()->getManager();
// $scenarios = $em->getRepository(Scenario::class)->findBy(
// array('isDeleted' => false,
// 'state' => 1)
// );
//
// return $this->render('frontend/index.html.twig', [
// 'h1' => "All scenarios",
// 'body_text' => "All scenarios",
// 'scenarios' => $scenarios,
// ]);*/
// }
/**
* @param Request $request
* @param Scenario $scenario
* @return Response
*/
#[Route(path: '/scenario/{scenario}', name: 'scenario-start', requirements: ['scenario' => '\d+'], methods: ['GET'])]
public function scenarioStart(Scenario $scenario): RedirectResponse
{
#TODO: doplnit funkcionalitu, ktora sa deje len pri starte scenara, premenovat route 'scenario' na 'scenario-play' alebo nieco podobne
return $this->redirectToRoute('scenario', ['scenario' => $scenario->getId()]);
}
/**
* @param Request $request
* @param RestrictedAccessManager $restrictedAccessManager
* @param StatManager $statManager
* @param int $scenario
* @param string|null $node
* @param UserInterface|null $user
* @return Response
* @throws Exception
*/
#[Route(path: '/scenario/{scenario}/node/{node}', name: 'scenario', defaults: ['node' => 0], requirements: ['scenario' => '\d+'], methods: ['GET', 'POST'])]
public function scenarioShow(Request $request, RestrictedAccessManager $restrictedAccessManager, StatManager $statManager,int $scenario, string $node = null, UserInterface $user = null)
{
$em = $this->managerRegistry->getManager();
$scenario = $em->getRepository(Scenario::class)->findOneBy(array('id' => $scenario));
if (!$scenario) {
$this->addFlashMessage('error', 'scenario_not_found', [], 'controller');
return $this->redirectToRoute('virtual-patients');
}
$decodedNodeId = null;
if ($node) {
$decodedNodeId = Node::staticDecode($node);
}
try {
$this->isScenarioAvailable($request, $restrictedAccessManager, $scenario);
} catch (NotFoundHttpException $exception) {
return $this->redirectToRoute('virtual-patients');
}
$session = $request->getSession();
if ($scenario->getState() == 2) {
if (!($user = $this->getUser()) || ($user->getRoles() == ['ROLE_USER'])) { // user bez prav na in progress
throw $this->createAccessDeniedException();
}
}
// all nodes, for navigation
$repository = $em->getRepository(Node::class);
$qb = $repository->createQueryBuilder('n');
$qb = $qb->where(
$qb->expr()->eq('n.scenarioId', ':scenarioId'),
$qb->expr()->eq('n.isDeleted', ':isDeleted'),
$qb->expr()->eq('n.active', ':active'))
->setParameter('scenarioId', $scenario->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->orderBy('n.nodeOrder', 'ASC');
$query = $qb->getQuery();
$nodes = $query->getResult();
if (empty($nodes)) {
return $this->render('frontend/scenario_zero_nodes.html.twig', array(
'scenario' => $scenario
));
}
$scenarioMcq = isset($session->get('mcq_nodes')[0]['scenario']) ? $session->get('mcq_nodes')[0]['scenario'] : 0;
$currentNode = $session->get('current_node');
if (!empty($scenarioMcq) && $currentNode < 2) {
$finished = $session->get('mcq_nodes');
$nodeId = $finished[0]['node'];
$node = $em->getRepository(Node::class)->findOneBy(array('id' => $nodeId));
} elseif (!$node) {
$session->set('total_score', 0); // init
$session->set('current_node', 1); // init
$session->set('player_sessionhist', null); //init
$session->set('node_score', []);
$session->set('mcq_nodes', []);
$session->set('mcq_score', 0);
$session->set('nodes_visited', []);
$session->set('node_time_durations', []);
$session->set('is_fatal', false);
$session->set('hAxis', "");
$session->set('vAxis', "");
$session->set('vAxisMax', 0);
$node = $nodes[0];
} else {
if (!is_numeric($decodedNodeId)) {
return $this->render('exceptions/error404.html.twig');
}
$node = $em->getRepository(Node::class)->findOneBy(array('id' => $decodedNodeId));
}
$stop = true;
$nodesAnswered = $session->get('node_score',[]);
foreach ($nodesAnswered as $answered) {
if ($answered['node']->getId() == $decodedNodeId) {
$stop = false;
break;
}
}
$nodesVisited = $session->get('nodes_visited', []);
foreach ($nodesVisited as $visited) {
if ($visited->getId() == $decodedNodeId) {
$stop = false;
break;
}
}
if ($session->get('stopwatch') && $stop) {
$event = $session->get('stopwatch')->stop('nodeTimeCounter');
$session->set('stopwatch', []);
$event = round($event->getDuration() * 0.001);
$convertedTime = gmdate('H:i:s', $event);
$currentDate = date("Y-m-d");
$join = $currentDate . ' ' . $convertedTime;
$dateTime = new \DateTime($join);
$nodeTime = new ScenarioTimeTrack();
$user = $this->getUser();
$nodeTime->setUsers($user);
$sessionId = $session->getId();
if($sessionId) {
$nodeTime->setSessionId($sessionId);
}
$nodesVisited = $session->get('nodes_visited', []);
$time = $session->get('node_time_durations');
$lastNode = $em->getRepository('App\Entity\Node')->findOneBy(array('id' => array_key_last($nodesVisited)));
$overall = date_parse($join);
$seconds = 0;
$seconds += $overall['hour'] * 3600 + $overall['minute'] * 60 + $overall['second'];
if ($lastNode) {
$nodeTime->setNode($lastNode);
$time[$lastNode->getId()] = [
'node' => $lastNode->getId(),
'scenario' => $scenario->getId(),
'time' => $convertedTime,
'seconds' => $seconds
];
} else {
$nodeTime->setNode($node);
$time[$node->getId()] = [
'node' => $node->getId(),
'scenario' => $scenario->getId(),
'time' => $convertedTime,
'seconds' => $seconds
];
}
$nodeTime->setScenario($scenario);
$nodeTime->setTime($dateTime);
$em->persist($nodeTime);
$em->flush();
$session->set('node_time_durations', $time);
}
$answeredNodes = $session->get('node_score',[]);
if (empty($answeredNodes)) {
$stopwatch = new Stopwatch();
$event = $stopwatch->start('nodeTimeCounter');
$session->set('stopwatch', $event);
} else {
foreach ($answeredNodes as $answered) {
if ($stop && $answered['node']->getId() != $decodedNodeId || $decodedNodeId == null) {
$stopwatch = new Stopwatch();
$event = $stopwatch->start('nodeTimeCounter');
$session->set('stopwatch', $event);
break;
}
}
}
$session = $request->getSession();
if ($session->get("total_score") === null) {
$session->set('total_score', 0);
}
if ($session->get("current_node") === null) {
$session->set('current_node', 1);
}
$firstScenarioNode = $nodes[0];
$answeredNodes = $session->get('node_score');
$unavailable = true;
$lastPlayedNode = null;
// stat processing
$user = $this->getUser();
$statId = $request->get('stat', 0);
$statDataByAttempt = [];
$statByNodeAttemptSum = [];
$linksInfo = [];
$nodesInfo = [];
$isStatAccess = false;
if ($statId && $user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_STAT', $user->getRoles()))) {
$data = $statManager->getStatData($statId, $scenario->getId());
$statByNodeAttemptSum = $data['statByNodeAttemptSum'];
$statDataByAttempt = $data['statByAttempts'];
$nodesInfo = $statManager->nodesInfo($scenario->getId());
if (count($nodesInfo)) {
$linksInfo = $statManager->linksInfo(array_keys($nodesInfo));
$statDataByAttempt = $statManager->sortLinksByOrder($statDataByAttempt, array_keys($linksInfo));
}
$isStatAccess = true;
$unavailable = false;
}
$nodesVisited = $session->get('nodes_visited', []);
if ($node === null) {
return $this->render('exceptions/error404.html.twig');
}
if ($decodedNodeId == null || $answeredNodes == null) {
} else {
foreach ($answeredNodes as $answered) {
if ($node->getId() == $answered['node']->getId() || (($node->getNodeOrder() - $answered['node']->getNodeOrder()) == 1)) {
$unavailable = false;
break;
}
}
if (count($answeredNodes)) {
$lastKey = array_key_last($answeredNodes);
$lastPlayedNode = $answeredNodes[$lastKey]['node']->encodeNodeId();
}
}
if ($firstScenarioNode->getId() == $decodedNodeId || $decodedNodeId == null) {
$unavailable = false;
}
if ($unavailable == true) {
$nodeId = $em->getRepository(Node::class)->findOneBy(array('id' => array_key_last($nodesVisited)));
$this->addFlashMessage('warning', 'scenario_not_available', array(), 'controller');
if ($lastPlayedNode != null) {
return $this->redirectToRoute('scenario', [
'scenario' => $scenario->getId(),
'node' => $nodeId->encodeNodeId(),
]);
} else {
return $this->redirectToRoute('scenario', [
'scenario' => $scenario->getId(),
]);
}
} else {
$nodesVisited[$node->getId()] = $node;
$session->set('nodes_visited', $nodesVisited);
$nodeId = $node->getId();
$progress_counter = $node->getNodeOrder();
$node_next = sizeof($nodes) - 1 < $progress_counter ? null : $nodes[$progress_counter];
$node_prev = $progress_counter < 2 ? null : $nodes[$progress_counter - 2];
$session->set('current_node', max($session->get("current_node"), $progress_counter));
/*
// if linksOrder == 1 ...order by preferredOrder, jinak RAND order
*/
$repository = $em->getRepository(Link::class);
$qb = $repository->createQueryBuilder('l');
$qb = $qb->where(
$qb->expr()->eq('l.nodeId', ':nodeId'),
$qb->expr()->eq('l.isDeleted', ':isDeleted'),
$qb->expr()->eq('l.active', ':active'))
->setParameter('nodeId', $nodeId)
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->orderBy('l.preferredOrder', 'ASC'); // v pripade $node->getLinksOrder == 1
$query = $qb->getQuery();
$links = $query->getResult();
if (!$isStatAccess && $node->getLinksOrder() != 1) {
shuffle($links);
}
$repository = $em->getRepository(Mcq::class);
$qb = $repository->createQueryBuilder('mcq');
$qb = $qb->where(
$qb->expr()->eq('mcq.nodeId', ':nodeId'),
$qb->expr()->eq('mcq.isDeleted', ':isDeleted'),
$qb->expr()->eq('mcq.active', ':active'))
->setParameter('nodeId', $nodeId)
->setParameter('isDeleted', 0)
->setParameter('active', 1);
$query = $qb->getQuery();
$mcqs = $query->getResult();
$mcq = null;
$media_mcq = null;
$mcq_options = array(); // json_decode($mcq->getOptions(), true);
if (sizeof($mcqs) > 1) {// nasledujici
$this->createNotFoundException($this->trans('node_mcq', [], 'controller'));
} elseif (sizeof($mcqs) == 1) {
$mcq = $mcqs[0];
$mcq_options = $mcq->getOptions(); // json_decode($mcq->getOptions(), true);
$response_order = 0;
foreach ($mcq_options as $mcq_option) {
$mcq_options[$response_order]["order"] = $response_order;
$response_order++;
}
// media - vsechny aktivni pre mcq
$repository = $em->getRepository(Media::class);
$qb = $repository->createQueryBuilder('m');
$qb = $qb->where(
$qb->expr()->eq('m.mcqId', ':mcqId'),
$qb->expr()->isNotNull('m.filename'),
$qb->expr()->eq('m.isDeleted', ':isDeleted'),
$qb->expr()->eq('m.active', ':active'))
->setParameter('mcqId', $mcq->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->orderBy('m.mediaOrder', 'ASC');
$query = $qb->getQuery();
$media_mcq = $query->getResult();
}
// media - vsechny aktivni pre node
$repository = $em->getRepository(Media::class);
$qb = $repository->createQueryBuilder('m', 'm.id');
$qb = $qb->where(
$qb->expr()->eq('m.nodeId', ':nodeId'),
$qb->expr()->isNotNull('m.filename'),
$qb->expr()->eq('m.isDeleted', ':isDeleted'),
$qb->expr()->eq('m.active', ':active'))
->setParameter('nodeId', $nodeId)
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->orderBy('m.mediaOrder', 'ASC');
$query = $qb->getQuery();
$media_node = $query->getResult();
/*
$player = new PlayerSessionhist();
// $player->setScenarioId(1);
$player->setScenario($scenario);
// $player->setSessionId($session->getId());
$player->setCreatedAt(new \DateTime());
$em->persist($player);
$em->flush();*/
if ($statId) {
$nodesVisitedNav = [];
foreach ($nodes as $nodeItem) {
$nodesVisitedNav[$nodeItem->getId()] = $nodeItem;
}
} else {
$nodesVisitedNav = $nodesVisited;
}
return $this->render('frontend/scenario.html.twig', [
'scenario' => $scenario,
// 'media_scenario' => $media_scenario,
'node' => $node,
'media_node' => $media_node, // media k node
'node_prev' => $node_prev, // v pripade 1. uzlu bude prazdna
'node_next' => $node_next, // v pripade koncoveho uzlu bude prazdna
'progress_counter' => $progress_counter, // poradie nodu ktory sa zobrazuje
'numb_of_nodes' => sizeof($nodes),
'current_node' => $session->get("current_node"), // maximalny dosiahnuty node
'total_score' => $session->get('total_score'), // nacteme ze session, TODO overit
'links' => $links,
//'media_links' => $media_links,
'mcq' => $mcq,
'mcq_options' => $mcq_options,
'media_mcq' => $media_mcq,
'isRestrictedScenario' => (int)$scenario->isRestricted(),
'finishedMcq' => $session->get('mcq_nodes'),
'isStat' => $isStatAccess,
'statId' => $statId,
'statData' => $statDataByAttempt,
'statByNodeAttemptSum' => $statByNodeAttemptSum,
'nodesInfo' => $nodesInfo,
'linksInfo' => $linksInfo,
'nodesVisitedNav' => $nodesVisitedNav,
]);
}
}
/**
* @param Request $request
* @param RestrictedAccessManager $restrictedAccessManager
* @param Scenario $scenario
* @return JsonResponse|Response
* @throws OptimisticLockException
*/
#[Route(path: '/scenario-progress/{scenario}', name: 'scenario-progress', requirements: ['scenario' => '\d+'], methods: ['GET', 'POST'])]
public function scenarioSaveProgress(Request $request, RestrictedAccessManager $restrictedAccessManager, Scenario $scenario)
{
$em = $this->managerRegistry->getManager();
try {
$this->isScenarioAvailable($request, $restrictedAccessManager, $scenario);
} catch (NotFoundHttpException $exception) {
return $this->redirectToRoute('virtual-patients');
}
$session = $request->getSession();
// dump($session->getId());
$statId = $request->get('stat', 0);
$isStatAccess = false;
$user = null;
if (!($user = $this->getUser()) || ($user->getRoles() == ['ROLE_USER'])) {
$user = null;
}
if ($statId && $user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_STAT', $user->getRoles()))) {
$isStatAccess = true;
}
$node = $em->getRepository(Node::class)->find($request->request->get('nodeId'));
$idNode = $node->getId();
$linkId = intval($request->request->get('linkId'));
$link = $em->getRepository(Link::class)->find($linkId);
$score = $link->getScore();
$current_node = $session->get('current_node');
$progress_counter = $node->getNodeOrder();
$total_score = $session->get('total_score'); // a take do session
if ($request->request->get('nextNodeId')) {
$nextNodeId = intval($request->request->get('nextNodeId'));
$nodeNext = $em->getRepository(Node::class)->find($nextNodeId);
} else {
$nodeNext = null;
}
$isHistory = ($current_node > $progress_counter);
$arrData = [];
$arrData['sid'] = $session->getId(); // just for test
if(!$isHistory) {
$player = new PlayerSessionhist();
//$scenario = $em->getRepository(Scenario::class)->find($scenarioId);
$player->setScenario($scenario);
//$arrData['user'] = $this->get('Users')->g;
$user = $this->getUser(); //TODO: skontrolovat ci sa rovnaju
$player->setUsers($user);
$player->setSessionId($session->getId()); //TODO: skontrolovat ci sa rovnaju
$player->setCreatedAt(new \DateTime());
$player->setNode($node);
$total_score = 0;
if ($playerOldId = $session->get('player_sessionhist')) {
$playerOld = $em->getRepository(PlayerSessionhist::class)->find($playerOldId);
if ((
(is_null($user) && is_null($playerOld->getUsers()))
||
($playerOld->getUsers()->getId() == $user->getId())
)
&&
($playerOld->getScenario()->getId() == $scenario->getId())
) {
$total_score = $playerOld->getScore();
}
}
$player->setLink($link);
$repository = $em->getRepository(Link::class);
$qb = $repository->createQueryBuilder('l');
$qb = $qb->where(
$qb->expr()->eq('l.nodeId', ':nodeId'),
$qb->expr()->eq('l.isDeleted', ':isDeleted'),
$qb->expr()->eq('l.active', ':active'),
$qb->expr()->eq('l.correct', ':correct'))
->setParameter('nodeId', $idNode)
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->setParameter('correct', 1);
$query = $qb->getQuery();
$links = $query->getResult();
$total_score += $link->getScore();
$player->setScore($total_score); // ulozim do db - SOUCET
$points = $session->get('node_score', []);
$nodePoints = isset($points[$node->getId()]) ? $points[$node->getId()] : 0;
if (!empty($nodePoints)) {
$points[$node->getId()] = [
'node' => $node,
'linkScore' => $link->getScore(),
'nodeScore' => $nodePoints['nodeScore'] + $link->getScore(),
'question_repetition' => 1
];
} else {
$points[$node->getId()] = [
'node' => $node,
'linkScore' => $link->getScore(),
'nodeScore' => $link->getScore(),
'question_repetition' => 0
];
}
$session->set('node_score', $points);
$session->set('total_score', $total_score); // a take do session
if ($link->getCorrect() == -2) {
$session->set('is_fatal', true);
}
if ($nodeNext) {
if ($link->getCorrect() == -2) {
$player->setIsEnded(-2);
$session->get('stopwatch');
$event = $session->get('stopwatch')->stop('nodeTimeCounter');
$session->set('stopwatch', []);
$event = round($event->getDuration() * 0.001);
$convertedTime = gmdate('H:i:s', $event);
$currentDate = date("Y-m-d");
$join = $currentDate . ' ' . $convertedTime;
$dateTime = new \DateTime($join);
$nodeTime = new ScenarioTimeTrack();
$user = $this->getUser();
$nodeTime->setUsers($user);
$sessionId = $session->getId();
if($sessionId) {
$nodeTime->setSessionId($sessionId);
}
$nodesVisited = $session->get('nodes_visited', []);
$time = $session->get('node_time_durations');
$lastNode = $em->getRepository('App\Entity\Node')->findOneBy(array('id' => array_key_last($nodesVisited)));
$overall = date_parse($join);
$seconds = 0;
$seconds += $overall['hour'] * 3600 + $overall['minute'] * 60 + $overall['second'];
if ($lastNode) {
$nodeTime->setNode($lastNode);
$time[$lastNode->getId()] = [
'node' => $lastNode->getId(),
'scenario' => $scenario->getId(),
'time' => $convertedTime,
'seconds' => $seconds
];
} else {
$nodeTime->setNode($node);
$time[$node->getId()] = [
'node' => $node->getId(),
'scenario' => $scenario->getId(),
'time' => $convertedTime,
'seconds' => $seconds
];
}
$nodeTime->setScenario($scenario);
$nodeTime->setTime($dateTime);
$em->persist($nodeTime);
$em->flush();
$session->set('node_time_durations', $time);
}
} else {
$player->setIsEnded($link->getCorrect());
}
$em->persist($player);
$em->flush();
$session->set('player_sessionhist', $player->getId()); // a take do session
}
$repository = $em->getRepository(Media::class);
$qb = $repository->createQueryBuilder('m');
$qb = $qb->where(
$qb->expr()->isNotNull('m.filename'),
$qb->expr()->eq('m.isDeleted', ':isDeleted'),
$qb->expr()->eq('m.active', ':active'),
$qb->expr()->eq('m.linkId', ':linkId'))
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->setParameter('linkId', $linkId)
->orderBy('m.mediaOrder', 'ASC');
$query = $qb->getQuery();
$media = $query->getResult();
$arrData['content'] = $this->render('frontend/link.html.twig', [
'scenario' => $scenario,
'link' => $link,
'media_links' => $media,
'progress_counter' => $current_node,
'current_node' => $node->getNodeOrder(),
'node_next' => $nodeNext,
'node' => $node,
'score' => $score,
'isStat' => $isStatAccess,
'statId' => $statId,
])->getContent();
if (!$isHistory && ($link->getCorrect() > 0)) {
$session->set('current_node', $current_node+1);
}
$arrData['code'] = 100; // vlastni code == success
$arrData['total_score'] = $total_score; // vlastni code == success
return new JsonResponse($arrData);
}
/**
* @param Request $request
* @param RestrictedAccessManager $restrictedAccessManager
* @param $scenarioId
* @return JsonResponse|Response
* @throws OptimisticLockException
*/
#[Route(path: '/scenario-progress-mcq/{scenarioId}', name: 'scenario-progress-mcq', requirements: ['scenarioId' => '\d+'], methods: ['GET', 'POST'])]
public function scenarioSaveProgressMcq(Request $request, RestrictedAccessManager $restrictedAccessManager, $scenarioId)
{
$em = $this->managerRegistry->getManager();
$scenario = $em->getRepository(Scenario::class)->find($scenarioId);
try {
$this->isScenarioAvailable($request, $restrictedAccessManager, $scenario);
} catch (NotFoundHttpException $exception) {
return $this->redirectToRoute('virtual-patients');
}
$mcqId = $request->get('mcqId', 0);
if (!$mcqId) { // zatim jako povinne
$this->createNotFoundException($this->trans('scenario_not_found', [], 'controller'));
}
$session = $request->getSession();
$arrData = [];
$scenario = $em->getRepository(Scenario::class)->find($scenarioId);
$mcq = $em->getRepository(Mcq::class)->find($mcqId);
$nodeId = $request->get('nodeId', 0);
if ($nodeId) {
$node = $em->getRepository(Node::class)->find($nodeId);
}
$player = new PlayerSessionhist();
$player->setMcq($mcq);
$mcq_score = 0;
$lastIndex = 0;
$requestScore = $request->get('score', []);
if ($requestScore) foreach ($requestScore as $idx => $score) {
$mcq_score += intval($score);
$lastIndex = $idx;
}
$player->setMcqScore( $mcq_score ); // SINGULARNI
$user = $this->getUser();
$player->setUsers($user);
$player->setScenario($scenario);
$player->setSessionId($session->getId());
$player->setCreatedAt(new \DateTime());
$requestTotalScore = $request->get('total_score', []);
if ($requestTotalScore[$lastIndex]) {
$total_score = intval( $requestTotalScore[$lastIndex] );
$player->setScore($total_score); // ulozim do db - SOUCET
$session->set('total_score', $total_score); // a take do session
}
$requestIsEnded = $request->get('isEnded', []);
if ($requestIsEnded[$lastIndex]) {
$isEnded = intval( $requestIsEnded[$lastIndex] );
if ($isEnded == -2) {
$player->setIsEnded(-2); // ukoncil jako fatal
}
elseif ($isEnded == 1) {
$player->setIsEnded(1); // ukoncil uspesne
}
}
$mcqNodes = $session->get('mcq_nodes', []);
array_push($mcqNodes, [
'node' => intval($nodeId),
'mcqScore' => $mcq_score,
'scenario' => $scenario->getId()
]);
$session->set('mcq_nodes', $mcqNodes);
$mcqScore = $session->get('mcq_score');
$requestMcqScore = $request->get('mcqScore', 0);
$updatedMcqScore = $mcqScore + intval($requestMcqScore);
$session->set('mcq_score', $updatedMcqScore);
if (!empty($node)) {
$player->setNode($node);
}
$em->persist($player);
$em->flush();
$session->set('player_sessionhist', $player->getId());
$arrData['code'] = 100; // vlastni code == success
return new JsonResponse($arrData);
}
/**
* @param Request $request
* @param RestrictedAccessManager $restrictedAccessManager
* @param StatManager $statManager
* @param $scenarioId
* @return Response
* @throws Exception
*/
#[Route(path: '/scenario-end/{scenarioId}', name: 'scenario-end', requirements: ['scenarioId' => '\d+'], methods: ['GET', 'POST'])]
public function scenarioEnd(Request $request, RestrictedAccessManager $restrictedAccessManager, StatManager $statManager, $scenarioId): Response
{
$em = $this->managerRegistry->getManager();
$scenario = $em->getRepository(Scenario::class)->find($scenarioId);
try {
$this->isScenarioAvailable($request, $restrictedAccessManager, $scenario);
} catch (NotFoundHttpException $exception) {
return $this->redirectToRoute('virtual-patients');
}
$repository = $em->getRepository(Node::class);
$qb = $repository->createQueryBuilder('n');
$qb = $qb->where(
$qb->expr()->eq('n.scenarioId', ':scenarioId'),
$qb->expr()->eq('n.isDeleted', ':isDeleted'),
$qb->expr()->eq('n.active', ':active'))
->setParameter('scenarioId', $scenario->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->orderBy('n.nodeOrder', 'ASC');
$query = $qb->getQuery();
$nodes = $query->getResult();
if (empty($nodes)) {
$this->createNotFoundException($this->trans('scenario_no_nodes', [], 'controller'));
}
$node_prev = $nodes[sizeof($nodes)-1];
$repository = $em->getRepository(Media::class);
$qb = $repository->createQueryBuilder('m');
$qb = $qb->where(
$qb->expr()->isNotNull('m.filename'),
$qb->expr()->eq('m.isDeleted', ':isDeleted'),
$qb->expr()->eq('m.active', ':active'),
$qb->expr()->eq('m.scenarioId', ':scenarioId'),
$qb->expr()->eq('m.mediaFlag', ':mediaFlag'))
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->setParameter('scenarioId', $scenarioId)
->setParameter('mediaFlag', Media::MEDIA_FLAG_SCENARIO_OUTRO)
->orderBy('m.mediaOrder', 'ASC');
$query = $qb->getQuery();
$media = $query->getResult();
$session = $request->getSession();
if ($session->get("total_score") === null) {
$session->set('total_score', 0);
}
if ($session->get("current_node") === null) {
$session->set('current_node', 1);
}
// stat processing
$user = $this->getUser();
$statId = $request->get('stat', 0);
$statDataByAttempt = [];
$statByNodeAttemptSum = [];
$linksInfo = [];
$nodesInfo = [];
$isStatAccess = false;
if ($statId && $user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_STAT', $user->getRoles()))) {
$data = $statManager->getStatData($statId, $scenario->getId());
$statByNodeAttemptSum = $data['statByNodeAttemptSum'];
$statDataByAttempt = $data['statByAttempts'];
$nodesInfo = $statManager->nodesInfo($scenario->getId());
if (count($nodesInfo)) {
$linksInfo = $statManager->linksInfo(array_keys($nodesInfo));
$statDataByAttempt = $statManager->sortLinksByOrder($statDataByAttempt, array_keys($linksInfo));
}
$isStatAccess = true;
}
if ($isStatAccess) {
$nodesVisited = [];
foreach ($nodes as $nodeItem) {
$nodesVisited[$nodeItem->getId()] = $nodeItem;
}
} else {
$nodesVisited = $session->get('nodes_visited', []);
}
if (empty($nodesVisited)) {
$nodeId = $em->getRepository(Node::class)->findOneBy(array('id' => $nodes['0']->getId()));
$this->addFlashMessage('warning', 'scenario_end_not_available', array(), 'controller');
return $this->redirectToRoute('scenario', [
'scenario' => $scenario->getId(),
'node' => $nodeId->encodeNodeId()
]);
} else {
$session = $request->getSession();
if (!$isStatAccess) {
$stopwatch = $session->get('stopwatch');
if (!empty($stopwatch)) {
$event = $stopwatch->stop('nodeTimeCounter');
$session->set('stopwatch', []);
$event = round($event->getDuration() * 0.001);
$convertedTime = gmdate('H:i:s', $event);
$currentDate = date("Y-m-d");
$join = $currentDate . ' ' . $convertedTime;
$dateTime = new \DateTime($join);
$nodeTime = new ScenarioTimeTrack();
$user = $this->getUser();
$nodeTime->setUsers($user);
$sessionId = $session->getId();
if ($sessionId) {
$nodeTime->setSessionId($sessionId);
}
$lastNode = $em->getRepository('App\Entity\Node')->findOneBy(array('id' => array_key_last($nodesVisited)));
$overall = date_parse($join);
$seconds = 0;
$seconds += $overall['hour'] * 3600 + $overall['minute'] * 60 + $overall['second'];
$nodeTime->setNode($lastNode);
$nodeTime->setScenario($scenario);
$nodeTime->setTime($dateTime);
$em->persist($nodeTime);
$em->flush();
$time = $session->get('node_time_durations');
$time[$lastNode->getId()] = [
'node' => $lastNode->getId(),
'scenario' => $scenario->getId(),
'time' => $convertedTime,
'seconds' => $seconds
];
$session->set('node_time_durations', $time);
}
}
$sumScenarioNodes = sizeof($nodesVisited);
$nodeId = $em->getRepository(Node::class)->findOneBy(array('id' => array_key_last($nodesVisited)));
if ($sumScenarioNodes == sizeof($nodes)) {
return $this->render('frontend/scenario_end.html.twig', [
'node' => null,
'scenario' => $scenario,
'node_prev' => $node_prev,
'media' => $media,
'progress_counter' => $session->get('current_node'),
'numb_of_nodes' => sizeof($nodes),
'total_score' => $session->get('total_score'),
'isRestrictedScenario' => (int)$scenario->isRestricted(),
'nodesVisitedNav' => $nodesVisited,
'isStat' => $isStatAccess,
'statId' => $statId,
'statData' => $statDataByAttempt,
'statByNodeAttemptSum' => $statByNodeAttemptSum,
'nodesInfo' => $nodesInfo,
'linksInfo' => $linksInfo,
]);
} else {
$this->addFlashMessage('warning', 'scenario_end_not_available', array(), 'controller');
return $this->redirectToRoute('scenario', [
'scenario' => $scenario->getId(),
'node' => $nodeId->encodeNodeId()
]);
}
}
}
/**
* @param Request $request
* @param RestrictedAccessManager $restrictedAccessManager
* @param $scenarioId
* @return Response
*/
#[Route(path: '/scenario-results/{scenarioId}', name: 'scenario-results', requirements: ['scenarioId' => '\d+'], methods: ['GET'])]
public function scenarioResults(Request $request, RestrictedAccessManager $restrictedAccessManager, $scenarioId): Response
{
$em = $this->managerRegistry->getManager();
$scenario = $em->getRepository(Scenario::class)->find($scenarioId);
try {
$this->isScenarioAvailable($request, $restrictedAccessManager, $scenario);
} catch (NotFoundHttpException $exception) {
return $this->redirectToRoute('virtual-patients');
}
$repository = $em->getRepository(Node::class);
$qb = $repository->createQueryBuilder('n');
$qb = $qb->where(
$qb->expr()->eq('n.scenarioId', ':scenarioId'),
$qb->expr()->eq('n.isDeleted', ':isDeleted'),
$qb->expr()->eq('n.active', ':active'))
->setParameter('scenarioId', $scenario->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->orderBy('n.nodeOrder', 'ASC');
$query = $qb->getQuery();
$nodes = $query->getResult();
if (empty($nodes)) {
$this->createNotFoundException($this->trans('scenario_no_nodes', [], 'controller'));
}
$session = $request->getSession();
$nodePoints = $session->get('node_score', []);
$mcqPoints = $session->get('mcq_nodes', []);
foreach ($nodePoints as $nodeAnswered) {
foreach ($mcqPoints as $mcq) {
if ($nodeAnswered['node']->getId() == $mcq['node']) {
$nodePoints[$nodeAnswered['node']->getId()] = [
'node' => $nodeAnswered['node'],
'nodeScore' => $nodeAnswered['nodeScore'] += $mcq['mcqScore'],
'question_repetition' => $nodeAnswered['question_repetition'],
'linkScore' => $nodeAnswered['linkScore']
];
}
}
}
$session->set('node_score', $nodePoints);
$maxScore = 0;
$scoreMcq = 0;
$maxPossibleMcqScore = 0;
$scoreLink = 0;
$maxPossibleLinkScore = 0;
foreach($nodes as $node) {
$repository = $em->getRepository(Link::class);
$qb = $repository->createQueryBuilder('l');
$qb = $qb->where(
$qb->expr()->eq('l.nodeId', ':nodeId'),
$qb->expr()->eq('l.isDeleted', ':isDeleted'),
$qb->expr()->eq('l.active', ':active'))
->setParameter('nodeId', $node->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1);
$query = $qb->getQuery();
$links = $query->getResult();
$repository = $em->getRepository(Mcq::class);
$qb = $repository->createQueryBuilder('mcq');
$qb = $qb->where(
$qb->expr()->eq('mcq.nodeId', ':nodeId'),
$qb->expr()->eq('mcq.isDeleted', ':isDeleted'),
$qb->expr()->eq('mcq.active', ':active'))
->setParameter('nodeId', $node->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1);
$query = $qb->getQuery();
$mcqs = $query->getResult();
if (!empty($mcqs)) {
$mcq = $mcqs[0];
$data = $mcq->getOptions();
foreach ($data as $maxMcqScore) {
if ($maxMcqScore['score'] >= 0) {
$scoreMcq += $maxMcqScore['score'];
}
}
$maxPossibleMcqScore += $scoreMcq;
$scoreMcq = 0;
}
if (!empty($links)) {
foreach ($links as $linkScore) {
if (sizeof($links) == 1 && $links[0]->getScore() == 0) {
$scoreLink = 0;
} else {
if ($linkScore->getScore() > $scoreLink) {
$scoreLink = $linkScore->getScore();
}
}
}
$maxPossibleLinkScore += $scoreLink;
$scoreLink = 0;
}
}
$maxScore += $maxPossibleMcqScore + $maxPossibleLinkScore;
$session = $request->getSession();
$session->set('max_possible_score', $maxScore);
if ($session->get("total_score") === null) {
$session->set('total_score', 0);
}
if ($session->get("current_node") === null) {
$session->set('current_node', 1);
}
$nodeScore = $session->get('node_score', []);
$nodesVisited = $session->get('nodes_visited', []);
if (empty($nodesVisited)) {
$nodeId = $em->getRepository(Node::class)->findOneBy(array('id' => $nodes['0']->getId()));
$this->addFlashMessage('warning', 'scenario_results_not_available', array(), 'controller');
return $this->redirectToRoute('scenario', [
'scenario' => $scenario->getId(),
'node' => $nodeId->encodeNodeId()
]);
} else {
$sumScenarioNodes = sizeof($nodesVisited);
$nodeId = $em->getRepository(Node::class)->findOneBy(array('id' => array_key_last($nodesVisited)));
$fatal = $session->get('is_fatal');
if ($sumScenarioNodes == sizeof($nodes) || $fatal) {
$time = $session->get('node_time_durations');
$mcqNodes = $session->get('mcq_nodes');
$total = 0;
foreach ($time as $times) {
$totalTime = $times['time'];
$overall = date_parse($totalTime);
$total += $overall['hour'] * 3600 + $overall['minute'] * 60 + $overall['second'];
}
$totalTime = gmdate('H:i:s', $total);
$session->set('total_time', $totalTime);
$editedNodes = $session->get('node_score');
foreach($editedNodes as $node) {
$repository = $em->getRepository(Mcq::class);
$qb = $repository->createQueryBuilder('mcq');
$qb = $qb->where(
$qb->expr()->eq('mcq.nodeId', ':nodeId'),
$qb->expr()->eq('mcq.isDeleted', ':isDeleted'),
$qb->expr()->eq('mcq.active', ':active'))
->setParameter('nodeId', $node['node']->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1);
$query = $qb->getQuery();
$mcqs = $query->getResult();
$repository = $em->getRepository(Link::class);
$qb = $repository->createQueryBuilder('l');
$qb = $qb->where(
$qb->expr()->eq('l.nodeId', ':nodeId'),
$qb->expr()->eq('l.isDeleted', ':isDeleted'),
$qb->expr()->eq('l.active', ':active'),
$qb->expr()->eq('l.correct', ':correct'))
->setParameter('nodeId', $node['node']->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->setParameter('correct', 1);
$query = $qb->getQuery();
$links = $query->getResult();
$maxPossibleNodeScore = 0;
if (!empty($links)) {
foreach ($links as $linkScore) {
if (sizeof($links) == 1 && $links[0]->getScore() == 0) {
$scoreLink = 0;
} else {
if ($linkScore->getScore() > $scoreLink) {
$scoreLink = $linkScore->getScore();
}
}
}
$maxPossibleNodeScore += $scoreLink;
$scoreLink = 0;
}
if (!empty($mcqs)) {
$mcq = $mcqs[0];
$data = $mcq->getOptions();
foreach ($data as $maxMcqScore) {
if ($maxMcqScore['score'] >= 0) {
$scoreMcq += $maxMcqScore['score'];
}
}
$maxPossibleNodeScore += $scoreMcq;
$scoreMcq = 0;
}
$bonus[$node['node']->getId()] = [
'node' => $node['node'],
'nodeScore' => $node['nodeScore'],
'question_repetition' => $node['question_repetition'],
'maxNodeScore' => $maxPossibleNodeScore,
'mcq' => $mcqs,
'linkScore' => $node['linkScore']
];
$session->set('node_score', $bonus);
}
$nodeScore = $session->get('node_score');
foreach ($nodeScore as $nodeScores) {
if (!empty($mcqNodes) && !empty($nodeScores['mcq'])) {
foreach ($mcqNodes as $mcqNode) {
if ($nodeScores['mcq'][0]->getNodeId() == $mcqNode['node'] ) {
$editedNodes[$nodeScores['node']->getId()] = [
'node' => $nodeScores['node'],
'nodeScore' => $nodeScores['nodeScore'],
'question_repetition' => $nodeScores['question_repetition'],
'mcq' => 1,
'maxNodeScore' => $nodeScores['maxNodeScore'],
'linkScore' => $nodeScores['linkScore']
];
} elseif ($nodeScores['mcq'][0]->getNodeId() != $mcqNode['node']) {
$editedNodes[$nodeScores['node']->getId()] = [
'node' => $nodeScores['node'],
'nodeScore' => $nodeScores['nodeScore'],
'question_repetition' => $nodeScores['question_repetition'],
'mcq' => 0,
'maxNodeScore' => $nodeScores['maxNodeScore'],
'linkScore' => $nodeScores['linkScore']
];
}
$session->set('node_score', $editedNodes);
}
} else {
if (empty($nodeScores['mcq'])) {
$editedNodes[$nodeScores['node']->getId()] = [
'node' => $nodeScores['node'],
'nodeScore' => $nodeScores['nodeScore'],
'question_repetition' => $nodeScores['question_repetition'],
'mcq' => 2,
'maxNodeScore' => $nodeScores['maxNodeScore'],
'linkScore' => $nodeScores['linkScore']
];
} else {
$editedNodes[$nodeScores['node']->getId()] = [
'node' => $nodeScores['node'],
'nodeScore' => $nodeScores['nodeScore'],
'question_repetition' => $nodeScores['question_repetition'],
'mcq' => 0,
'maxNodeScore' => $nodeScores['maxNodeScore'],
'linkScore' => $nodeScores['linkScore']
];
}
$session->set('node_score', $editedNodes);
}
}
$lengthHAxis = count($nodeScore);
$hAxis = "[0, ";
for ($i = 1; $i <= $lengthHAxis; $i++) {
if ($i >= $lengthHAxis) {
$hAxis .= "$i";
$i++;
$hAxis .= ", $i]";
} else {
$hAxis .= "$i, ";
}
}
$session->set('hAxis', $hAxis);
$sortedTimes = [];
foreach ($time as $nodeTime) {
array_push($sortedTimes, $nodeTime['seconds']);
}
$vAxisMax = max($sortedTimes) * 1.25; // gap mezi nejvyššà bublinou
$session->set('vAxisMax', $vAxisMax);
$lengthVAxis = count($sortedTimes);
$vAxis = "[";
$i = 0;
foreach ($sortedTimes as $value) {
$i++;
if ($i >= $lengthVAxis) {
$vAxis .= "$value";
$vAxis .= "]";
} else {
$vAxis .= "$value, ";
}
}
$session->set('vAxis', $vAxis);
return $this->render('frontend/scenario_results.html.twig', [
'scenario' => $scenario,
'total_score' => $session->get('total_score'),
'isRestrictedScenario' => (int)$scenario->isRestricted(),
'max_score' => $maxScore,
'node_score' => $session->get('node_score'),
'total_time' => $totalTime,
'time_durations' => $time,
'fatal' => $fatal,
'hAxis' => $hAxis,
'vAxis' => $vAxis,
'vAxisMax' => $vAxisMax
]);
} else {
$this->addFlashMessage('warning', 'scenario_results_not_available', array(), 'controller');
return $this->redirectToRoute('scenario', [
'scenario' => $scenario->getId(),
'node' => $nodeId->encodeNodeId()
]);
}
}
}
/**
* @param Request $request
* @param int $scenarioId
* @return Response
*/
#[Route(path: '/scenario-results/{scenarioId}/pdf', name: 'scenario-results-pdf', requirements: ['scenarioId' => '\d+'], methods: ['GET'])]
public function scenarioCertificate(Request $request, int $scenarioId): Response
{
$em = $this->managerRegistry->getManager();
$scenario = $em->getRepository(Scenario::class)->findOneBy(array('id' => $scenarioId));
$session = $request->getSession();
return $this->render('frontend/scenario_results_pdf.html.twig', array(
'scenario' => $scenario,
'total_score' => $session->get('total_score'),
'max_score' => $session->get('max_possible_score'),
'node_score' => $session->get('node_score'),
'total_time' => $session->get('total_time'),
'time_durations' => $session->get('node_time_durations'),
'firstName' => ($this->getUser() ? $this->getUser()->getFirstName() : ''),
'lastName' => ($this->getUser() ? $this->getUser()->getLastName() : ''),
'date' => new \DateTime('now'),
'hAxis' => $session->get('hAxis'),
'vAxis' => $session->get('vAxis'),
'vAxisMax' => $session->get('vAxisMax'),
));
}
/**
* @param Request $request
* @param Scenario $scenario
* @return Response
*/
#[Route(path: '/scenario/animation', name: 'scenario-animation', methods: ['GET'])]
public function scenarioAnimation(Request $request): Response
{
$animationId = $request->get('animation', 0);
$projectName = $request->get('project_name', '');
return $this->render('frontend/animation.html.twig', array(
'animation' => $animationId,
'projectName' => $projectName,
));
}
/**
* @param Request $request
* @param RestrictedAccessManager $restrictedAccessManager
* @param $scenarioId
* @return JsonResponse|Response
* @throws OptimisticLockException
*/
#[Route(path: '/scenario-stat-export/{stat}/{scenario}', name: 'scenario-stat-export', requirements: ['stat' => '\d+', 'scenario' => '\d+'], methods: ['GET', 'POST'])]
public function scenarioStatExport(StatManager $statManager, int $stat, int $scenario)
{
$em = $this->managerRegistry->getManager();
$scenario = $em->getRepository(Scenario::class)->findOneBy(array('id' => $scenario));
if (!$scenario) {
$this->addFlashMessage('error', 'scenario_not_found', [], 'controller');
return $this->redirectToRoute('virtual-patients');
}
$user = $this->getUser();
$statByNodeAttemptSum = [];
$statDataByAttempt = [];
$linksInfo = [];
$nodesInfo = [];
$isStatAccess = false;
if ($stat && $user && (in_array('ROLE_ADMIN', $user->getRoles()) || in_array('ROLE_STAT', $user->getRoles()))) {
$data = $statManager->getStatData($stat, $scenario->getId());
$statByNodeAttemptSum = $data['statByNodeAttemptSum'];
$statDataByAttempt = $data['statByAttempts'];
$nodesInfo = $statManager->nodesInfo($scenario->getId());
if (count($nodesInfo)) {
$linksInfo = $statManager->linksInfo(array_keys($nodesInfo));
$statDataByAttempt = $statManager->sortLinksByOrder($statDataByAttempt, array_keys($linksInfo));
}
$isStatAccess = true;
}
$repository = $em->getRepository(Node::class);
$qb = $repository->createQueryBuilder('n');
$qb = $qb->where(
$qb->expr()->eq('n.scenarioId', ':scenarioId'),
$qb->expr()->eq('n.isDeleted', ':isDeleted'),
$qb->expr()->eq('n.active', ':active'))
->setParameter('scenarioId', $scenario->getId())
->setParameter('isDeleted', 0)
->setParameter('active', 1)
->orderBy('n.nodeOrder', 'ASC');
$query = $qb->getQuery();
$nodes = $query->getResult();
return $this->render('frontend/scenario_stat.html.twig', array(
'scenario' => $scenario,
'statData' => $statDataByAttempt,
'statByNodeAttemptSum' => $statByNodeAttemptSum,
'linksInfo' => $linksInfo,
'nodesInfo' => $nodesInfo,
'isStat' => $isStatAccess,
'nodes' => $nodes,
'showStatAll' => true,
));
}
/**
* @param Request $request
* @param RestrictedAccessManager $restrictedAccessManager
* @param $scenarioId
* @return JsonResponse|Response
* @throws OptimisticLockException
*/
#[Route(path: '/scenario-stat-export-pdf/{stat}/{scenario}', name: 'scenario-stat-export-pdf', requirements: ['stat' => '\d+', 'scenario' => '\d+'], methods: ['GET', 'POST'])]
public function scenarioStatExportPdf(int $stat, int $scenario)
{
return $this->generateStatPdf($stat, $scenario);
}
public function generateStatPdf(int $stat, int $scenario)
{
return $this->pdfService->download(
$scenario, $this->pdfService->generatePdf(
$this->router->generate('scenario-stat-export-pdf', ['stat' => $stat, 'scenario' => $scenario], UrlGeneratorInterface::ABSOLUTE_URL)
)
);
}
protected function isScenarioAvailable($request, $restrictedAccessManager, $scenario)
{
if (!$scenario) {
$this->addFlashMessage('error', 'scenario_not_found', [], 'controller');
throw $this->createNotFoundException($this->trans('scenario_not_found', [], 'controller'));
}
elseif ($scenario->getIsDeleted() == 1) {
$this->addFlashMessage('error', 'scenario_delete', array('%scenarioId%' => $scenario->getId()), 'controller');
throw $this->createNotFoundException($this->trans('scenario_delete', [], 'controller'));
}
elseif ($scenario->getState() == 0) {
$this->addFlashMessage('error', 'scenario_deactivated', array('%scenarioId%' => $scenario->getId()), 'controller');
throw $this->createNotFoundException($this->trans('scenario_deactivated', [], 'controller'));
}
if (($user = $this->getUser()) && (($user->getRoles() == ['ROLE_ADMIN']))) {
// to admin show restricted
} else {
try {
$ip = $restrictedAccessManager->getIpAddress($request);
$isAllowedToRestricted = $restrictedAccessManager->allowedToRestrictedByIp($scenario, $ip);
if (!$isAllowedToRestricted) {
$this->addFlashMessage('error', 'access_error.not_allowed', [], 'controller');
throw new AccessDeniedHttpException('Restricted scenario.');
}
} catch (\Exception $e) {
$this->addFlashMessage('error', 'user_location_check_error', [], 'controller');
throw new AccessDeniedHttpException('Restricted scenario.');
}
}
}
}