diff --git a/.env-prod b/.env-prod index b4b02d4..651847e 100644 --- a/.env-prod +++ b/.env-prod @@ -14,4 +14,7 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 #Leave this alone unless MAILER_DSN=smtp://jv-com.mail.protection.outlook.com:25 #Anonymous Complaints Email Settings COMPLAINT_RECIPIENT_ADDRESS=chris@jv.com -COMPLAINT_RECIPIENT_NAME="Chris Weiser" \ No newline at end of file +COMPLAINT_RECIPIENT_NAME="Chris Weiser" +#Safety Quiz Result Recipients +#Enter full email addresses, separated by commas +RESULT_INBOXES="" \ No newline at end of file diff --git a/src/Controller/SafetyController.php b/src/Controller/SafetyController.php index df1f79b..861adb8 100644 --- a/src/Controller/SafetyController.php +++ b/src/Controller/SafetyController.php @@ -2,6 +2,8 @@ namespace App\Controller; use App\Form\SafetyQuizType; +use Egulias\EmailValidator\Warning\Warning; +use Error; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -9,6 +11,12 @@ use Symfony\Component\Yaml\Yaml; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Psr\Log\LoggerInterface; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Mime\Address; +use Symfony\Bridge\Twig\Mime\TemplatedEmail; +use Symfony\Component\DependencyInjection\Exception\EnvParameterException; +use Symfony\Component\Mailer\Exception\TransportExceptionInterface; +use Symfony\Component\Mailer\MailerInterface; use function PHPUnit\Framework\containsIdentical; @@ -21,7 +29,7 @@ class SafetyController extends AbstractController return $this->render('Training/Safety/safetyHome.html.twig',['content' => $contentFile]); } #[Route('/training/safety/quiz')] - public function Quiz(Request $request, LoggerInterface $log) + public function Quiz(Request $request, LoggerInterface $log, MailerInterface $mailer) { $form = $this->createForm(SafetyQuizType::class); $form->handleRequest($request); @@ -40,6 +48,7 @@ class SafetyController extends AbstractController } } $log->Debug($testerName . ' quiz answers correct: ' . $correctAnswers); + $this->sendQuizResults($correctAnswers, count($data), $form, $mailer, $log); return $this->render('Training/Safety/quizResults.html.twig', ['testerName'=>$testerName, 'correctAnswers'=>$correctAnswers, 'totalAnswers'=>count($data)]); } @@ -104,4 +113,72 @@ class SafetyController extends AbstractController return new Response($header . $navButtons . $contents); } + //Send an email with the quiz results + public function sendQuizResults(int $answersCorrect, int $totalQuestions, FormInterface $submittedQuiz, MailerInterface $mailer, LoggerInterface $log) + { + //Fetch array of mail inboxes to send messages to. + //If env var doesn't exist then fail gracefully + $recipients = []; //X: keep in method's scope + try + { + $recipients = explode(",", $_SERVER['RESULT_INBOXES']); + } + catch (EnvParameterException $e) + { + $log->warning("safety Quiz Submission: Environment Variable RESULT_INBOXES not configured. Quiz results will not be emailed."); + return; + } + + //If no inboxes configured, cancel + if(count($recipients) <= 0) + { + $log->warning("Safety Quiz Submission: No email recipients configured"); + return; + } + + //Prepare payload data + $submittedData = $submittedQuiz->getData(); + $submission = []; + $quiz = Yaml::parseFile('../config/SafetyQuiz.yaml', 2, 2, Yaml::PARSE_OBJECT_FOR_MAP)['Questions']; + $questionKeys = array_keys($quiz); + foreach($questionKeys as $key) + { + $questionData = []; + $questionData += ['key'=>$key, 'text'=>$quiz[$key]['Text']]; + $answer = null; + foreach($quiz[$key]['Choices'] as $choice) + { + if($choice['Value']) + { + $answer = $choice; + } + } + $questionData += ['answer'=>$answer, 'submittedAnswer'=>$submittedData[$key]]; + $submission += $questionData; + $quiz[$key] += ['submittedAnswer'=>$submittedData[$key], 'answer'=>$answer]; + } + //var_dump($submission); + //Build & send the email + $email = (new TemplatedEmail()) + ->from(new Address('noreply@jv.com', 'Internal')) + ->to(new Address("ajensen@jv.com")) + ->subject('Safety Quiz Submission') + ->htmlTemplate('Emails/safetyQuizResults.html.twig') + ->context([ + 'submission' => $quiz, + 'answersCorrect' => $answersCorrect, + 'totalQuestions' => $totalQuestions, + 'submitterName' => $submittedData['Name']]) + ; + try + { + $log->info("Sending Quiz Results..."); + $mailer->send($email); + } + catch (TransportExceptionInterface $e) + { + $log->error("Failed to email quiz results"); + $log->error($e); + } + } } diff --git a/templates/Emails/safetyQuizResults.html.twig b/templates/Emails/safetyQuizResults.html.twig index 8f3fd80..2a16af1 100644 --- a/templates/Emails/safetyQuizResults.html.twig +++ b/templates/Emails/safetyQuizResults.html.twig @@ -10,7 +10,7 @@ }
| # | @@ -18,16 +18,16 @@Submitted Answer | Correct Answer | - {% for question in submission %} + {% for key,question in submission %}|||||
| {{question}} | -{{question.Text}} | -- {% if submittedAnswer != null %} + | {{key}} | +{{question["Text"]}} | + {% if question['submittedAnswer'] != null %} +{{question['submittedAnswer']}} - {% endif %} | -{{quesiton['answer']}} | + {% endif %} +{{question['answer']['Value']}} |