src/Controller/CaseLaboratoryController.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\{CasesLabTestMethodSampleTestMethod};
  4. use App\Form\SampleType;
  5. use App\Repository\{CaseLaboratoryRepositoryHospitalRepositoryLabTestRepositorySampleRepositoryTestMethodRepository};
  6. use App\Service\{PaginationAbha};
  7. use App\Util\CodeGenerator;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\{IsGrantedParamConverterSecurity};
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\{JsonResponseRequestResponse};
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Nzo\UrlEncryptorBundle\Annotations\ParamDecryptor;
  14. use Nzo\UrlEncryptorBundle\Encryptor\Encryptor;
  15. use Doctrine\Persistence\ManagerRegistry;
  16. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  17. #[Route(path'/lab-tests'), IsGranted(data'ROLE_LAB_TECH')]
  18. class CaseLaboratoryController extends AbstractController
  19. {
  20.     private $encryptor;
  21.     private $abha;
  22.     public function __construct(Encryptor $encryptor, private ManagerRegistry $doctrineAbha $abha)
  23.     {
  24.         $this->encryptor $encryptor;
  25.         $this->abha $abha;
  26.     }
  27.     #[Route(path'/{status}'name'case_lab_test'methods: ['GET'])]
  28.     public function index(Request $requestPagination $paginationCaseLaboratoryRepository $caseLabRepostring $status 'all'): Response
  29.     {
  30.         $query $caseLabRepo->getCaseLaboratoryList($this->getUser()->getHospital(), $status);
  31.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  32.         return $this->render('case_laboratory/index.html.twig', [
  33.             'cases' => $cases,
  34.             'last_page' => $pagination->lastPage($cases)
  35.         ]);
  36.     }
  37.     #[Route(path'/add-sample/{id}'name'case_lab_add_sample'methods: ['GET''POST'])]
  38.     #[ParamConverter(data'case'options: ['mapping' => ['id' => 'id']])]
  39.     #[ParamDecryptor(["id"])]
  40.     public function addSample(Request $requestCases $caseEntityManagerInterface $entityManagerCaseLaboratoryRepository $caseLabRepoLabTestRepository $labTestRepo): Response
  41.     {
  42.         if ($case->getLabTestStatus() != "Pending") {
  43.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  44.         }
  45.         $caseId $this->encryptor->encrypt($case->getId());
  46.         $hospitalId $case->getHospital()->getId();
  47.         $sample = new Sample();
  48.         if ($request->isMethod('GET') || $request->isMethod('POST') && $case->getHospital()->getId() == $this->getUser()->getProfile()->getHospital()->getId() && $case->getPatient()->getId() == $request->attributes->get('case')->getPatient()->getId()) {
  49.             $form $this->createForm(SampleType::class, $sample);
  50.             $form->handleRequest($request);
  51.             if ($form->isSubmitted() && $form->isValid()) {
  52.                 $sample->setCase($case);
  53.                 $sample->setNumber((new CodeGenerator())->generateSampleNumber($case->getId()));
  54.                 $entityManager->persist($sample);
  55.                 $entityManager->flush();
  56.                 $this->addFlash(
  57.                     'success',
  58.                     'Sample added successfully!'
  59.                 );
  60.                 return $this->redirectToRoute('case_lab_add_sample', ['id' => $caseId]);
  61.             }
  62.             $tests $caseLabRepo->getCaseTestsForReport($case->getId());
  63.             $samples $caseLabRepo->getCaseSamples($case->getId());
  64.             $hospitals $labTestRepo->getOtherHospitals($hospitalId);
  65.             return $this->renderForm('case_laboratory/add_sample.html.twig', [
  66.                 'patient_id' => $case->getPatient()->getId(),
  67.                 'tests' => $tests,
  68.                 'form' => $form,
  69.                 'samples' => $samples,
  70.                 'case_id' => $caseId,
  71.                 'hospitals' => $hospitals
  72.             ]);
  73.         } else {
  74.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  75.         }
  76.     }
  77.     #[Route(path'/delete-sample/{id}'name'case_lab_sample_delete'methods: ['GET'])]
  78.     #[ParamDecryptor(["id"])]
  79.     public function deleteSample(Sample $sampleEntityManagerInterface $entityManagerRequest $request): Response
  80.     {
  81.         $case $sample->getCase();
  82.         if ($sample->getCase()->getLabTestStatus() == "Pending" && $case->getHospital()->getId() == $this->getUser()->getProfile()->getHospital()->getId() && $case->getPatient()->getId() == $sample->getCase()->getPatient()->getId()) {
  83.             try {
  84.                 $entityManager->remove($sample);
  85.                 $entityManager->flush();
  86.                 $this->addFlash(
  87.                     'success',
  88.                     'Sample deleted successfully!'
  89.                 );
  90.             } catch (\Exception) {
  91.                 $this->addFlash(
  92.                     'danger',
  93.                     'Sample could not be deleted! There may be related tests.'
  94.                 );
  95.             }
  96.             return $this->redirectToRoute('case_lab_add_sample', ['id' => $this->encryptor->encrypt($case->getId())]);
  97.         } else {
  98.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  99.         }
  100.     }
  101.     #[Route(path'/assign-sample-to-test/{case_id}'name'case_lab_add_test_sample'methods: ['GET''POST'])]
  102.     #[ParamDecryptor(["case_id"])]
  103.     public function assignSampleToTest(Request $requestEntityManagerInterface $entityManagerCaseLaboratoryRepository $caseLabRepoSampleRepository $sampleRepoHospitalRepository $hospitalRepo): Response
  104.     {
  105.         $caseId $this->encryptor->encrypt($request->attributes->get('case_id'));
  106.         if ($request->request->has('confirm_samples')) {
  107.             $confirmedSamples = (array)$request->request->get('confirm_samples');
  108.             $samples $request->request->get('samples');
  109.             $hospitals $request->request->get('hospitals');
  110.             $tests = (array)$request->request->get('tests');
  111.             $isAllDone = [];
  112.             foreach ($confirmedSamples as $subKey) {
  113.                 $caseLab $caseLabRepo->find($tests[$subKey]);
  114.                 $sample $sampleRepo->find($samples[$subKey]);
  115.                 if ($sample) {
  116.                     $caseLab->setSample($sample);
  117.                     if ($hospitals[$subKey]) {
  118.                         $hospital $hospitalRepo->find($hospitals[$subKey]);
  119.                         if ($hospital) {
  120.                             $caseLab->setHospital($hospital);
  121.                         }
  122.                     }
  123.                     $entityManager->persist($caseLab);
  124.                     $isAllDone[] = $tests[$subKey];
  125.                 } else {
  126.                     $this->addFlash(
  127.                         'danger',
  128.                         'Invalid data submitted'
  129.                     );
  130.                     return $this->redirectToRoute('case_lab_add_sample', ['id' => $caseId]);
  131.                 }
  132.             }
  133.             $entityManager->flush();
  134.             if (!empty($isAllDone) && !empty($tests) && count($isAllDone) == count($tests)) {
  135.                 $entityManager->getConnection()->update('cases', ['lab_test_status' => 'Sample taken'], ['id' => $request->attributes->get('case_id')]);
  136.                 $this->addFlash(
  137.                     'success',
  138.                     'Samples added to all tests successfully!'
  139.                 );
  140.                 return $this->redirectToRoute('case_lab_test');
  141.             }
  142.             $this->addFlash(
  143.                 'success',
  144.                 'Sample added to tests successfully!'
  145.             );
  146.         } else {
  147.             $this->addFlash(
  148.                 'danger',
  149.                 'Please select at least one report to submit.'
  150.             );
  151.         }
  152.         return $this->redirectToRoute('case_lab_add_sample', ['id' => $caseId]);
  153.     }
  154.     #[Route(path'/results/add-result/{id}'name'case_lab_add_result'methods: ['GET''POST'])]
  155.     #[ParamConverter(data'case'options: ['mapping' => ['id' => 'id']])]
  156.     #[ParamDecryptor(["id"])]
  157.     public function addResult(Request $requestCases $caseEntityManagerInterface $entityManagerCaseLaboratoryRepository $caseLabRepoTestMethodRepository $testMethodRepoLabTestRepository $labTestRepo): Response
  158.     {
  159.         $caseId $case->getId();
  160.         $hospitalId $this->encryptor->encrypt($case->getHospital()->getId());
  161.         if ($request->isMethod('GET') || $request->isMethod('POST') && $case->getHospital()->getId() == $this->getUser()->getProfile()->getHospital()->getId() && $case->getPatient()->getId() == $request->attributes->get('case')->getPatient()->getId()) {
  162.             if ($request->getMethod() == 'POST') {
  163.                 if ($request->request->has('confirm_results')) {
  164.                     $confirmedResults = (array)$request->request->get('confirm_results');
  165.                     $methods $request->request->get('methods');
  166.                     $results $request->request->get('results');
  167.                     $tests = (array)$request->request->get('tests');
  168.                     $otherMethods $request->request->get('other_methods');
  169.                     $newMethods = [];
  170.                     if ($request->request->has('new_methods')) {
  171.                         $newMethods $request->request->get('new_methods');
  172.                     }
  173.                     $isAllDone = [];
  174.                     foreach ($confirmedResults as $subKey) {
  175.                         $caseLab $caseLabRepo->find($tests[$subKey]);
  176.                         if (isset($otherMethods[$subKey]) && $otherMethods[$subKey] != '') {
  177.                             $methodData explode('~~'$otherMethods[$subKey]);
  178.                             foreach ($methodData as $method) {
  179.                                 $testMethod = new TestMethod();
  180.                                 $testMethod->setName($method);
  181.                                 $entityManager->persist($testMethod);
  182.                                 if (isset($newMethods[$subKey]) && $newMethods[$subKey] == $method) {
  183.                                     $caseLab->setMethod($testMethod);
  184.                                 }
  185.                                 $labTestMethod = new LabTestMethod();
  186.                                 $labTestMethod->setTest($caseLab->getLabTest());
  187.                                 $labTestMethod->setMethod($testMethod);
  188.                                 $entityManager->persist($labTestMethod);
  189.                             }
  190.                             $entityManager->flush();
  191.                         }
  192.                         if (isset($methods[$subKey]) && !empty($methods[$subKey])) {
  193.                             $method $testMethodRepo->find($methods[$subKey]);
  194.                             if ($method) {
  195.                                 $caseLab->setMethod($method);
  196.                             } else {
  197.                                 $this->addFlash(
  198.                                     'danger',
  199.                                     'Invalid data submitted'
  200.                                 );
  201.                                 return $this->redirectToRoute('case_lab_add_result', ['id' => $this->encryptor->encrypt($case->getId())]);
  202.                             }
  203.                         }
  204.                         if (isset($results[$subKey]) && $results[$subKey] != '') {
  205.                             $caseLab->setResult($results[$subKey]);
  206.                             $entityManager->persist($caseLab);
  207.                             $isAllDone[] = $tests[$subKey];
  208.                         } else {
  209.                             $this->addFlash(
  210.                                 'danger',
  211.                                 'Result is mandatory'
  212.                             );
  213.                             return $this->redirectToRoute('case_lab_add_result', ['id' => $this->encryptor->encrypt($case->getId())]);
  214.                         }
  215.                     }
  216.                     $entityManager->flush();
  217.                     if (!empty($isAllDone) && !empty($tests) && count($isAllDone) == count($tests)) {
  218.                         $entityManager->getConnection()->update('cases', ['lab_test_status' => 'Completed'], ['id' => $caseId]);
  219.                     }
  220.                     $this->addFlash(
  221.                         'success',
  222.                         'Result to tests added successfully!'
  223.                     );
  224.                     return $this->redirectToRoute('case_lab_test');
  225.                 } else {
  226.                     $this->addFlash(
  227.                         'danger',
  228.                         'Please provide at least one result.'
  229.                     );
  230.                     return $this->redirectToRoute('case_lab_add_result', ['id' => $this->encryptor->encrypt($case->getId())]);
  231.                 }
  232.             }
  233.             $caseTests $caseLabRepo->getTestForResults($caseId);
  234.             $hospitals $labTestRepo->getOtherHospitals($hospitalId);
  235.             return $this->render('case_laboratory/add_result.html.twig', [
  236.                 'tests' => $caseTests,
  237.                 'patient' => $case->getPatient(),
  238.                 'hospitals' => $hospitals
  239.             ]);
  240.         } else {
  241.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  242.         }
  243.     }
  244.     #[Route(path'/search-tests'name'search_tests'methods: ['GET''POST'])]
  245.     public function searchTests(Request $requestLabTestRepository $labTestRepo): JsonResponse
  246.     {
  247.         $q $request->query->get('q');
  248.         $labTests $labTestRepo->getSearchResults($q);
  249.         $searchResults = [
  250.             'total_count' => is_countable($labTests) ? count($labTests) : 0,
  251.             'incomplete_results' => true,
  252.             'items' => $labTests
  253.         ];
  254.         return $this->json($searchResults);
  255.     }
  256.     #[Route(path'/print/{id}'name'case_lab_print'methods: ['GET'])]
  257.     #[ParamDecryptor(["id"])]
  258.     #[Security("is_granted('ROLE_DOC') or is_granted('ROLE_LAB_TECH')")]
  259.     public function print(Request $requestCases $caseCaseLaboratoryRepository $caseLabRepo): Response
  260.     {
  261.         if ($case->getHospital()->getId() == $this->getUser()->getProfile()->getHospital()->getId() && $case->getPatient()->getId() == $request->attributes->get('case')->getPatient()->getId()) {
  262.             return $this->render('case_laboratory/print.html.twig', [
  263.                 'case' => $case,
  264.                 'tests' => $caseLabRepo->getCaseTests($case->getId())
  265.             ]);
  266.         } else {
  267.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  268.         }
  269.     }
  270.     #[Route(path'/consent/{id}'name'lab_consent'methods: ['GET'])]
  271.     #[ParamDecryptor(["id"])]
  272.     public function consent(Request $requestAbha $abha): Response
  273.     {
  274.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  275.         $arrData $abha->getConsentList();
  276.         $uri $this->generateUrl('lab_consent_req_form', ['id' => $id]);
  277.         return $this->render('abha/consent.html.twig', [
  278.             'consents' => $arrData,
  279.             'form_url' => $uri,
  280.             'data_request' => 'lab_data_request',
  281.             'view_data' => 'lab_view_data'
  282.         ]);
  283.     }
  284.     /**
  285.      * M3 Start
  286.      */
  287.     #[Route(path'/consent-request/{id}'name'lab_consent_req_form'methods: ['GET'])]
  288.     #[ParamDecryptor(["id"])]
  289.     public function consentForm(Request $requestAbha $abha): Response
  290.     {
  291.         //cross site script
  292.         return $this->render('abha/consent_form.html.twig', [
  293.             'post_form_url' => 'lab_request_init',
  294.             'patient_find_url' => 'lab_patient_find',
  295.             'id' => $this->encryptor->encrypt($request->attributes->get('id'))
  296.         ]);
  297.     }
  298.     #[Route(path'/consent-request-init'name'lab_request_init'methods: ['GET''POST'])]
  299.     public function requestInit(Request $requestAbha $abha): Response
  300.     {
  301.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  302.         } else {
  303.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  304.         } */
  305.         //TODO :: get health address from patient table
  306.         $reqData $request->request->all();
  307.         $reqData['hiuParName'] = $this->getUser()->getProfile()->getFirstName() . ' ' $this->getUser()->getProfile()->getLastName(); // practitioner name
  308.         $reqData['hiuId'] = $this->getUser()->getProfile()->getHospital()->getHIUCode();
  309.         $request $abha->requestInt($reqData);
  310.         if ($request) {
  311.             return $this->redirectToRoute('lab_case_consent', ['id' => $reqData['id']]);
  312.         } else {
  313.             return $this->render('abha/consent_form.html.twig', [
  314.                 'post_form_url' => 'lab_request_init',
  315.                 'patient_find_url' => 'lab_patient_find'
  316.             ]);
  317.         }
  318.     }
  319.     #[Route(path'/data-request/{id}'name'lab_data_request'methods: ['GET''POST'])]
  320.     #[ParamDecryptor(["id"])]
  321.     public function dataRequest(Request $requestAbha $abha): Response
  322.     {
  323.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  324.         } else {
  325.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  326.         } */
  327.         $id $request->attributes->get('id');
  328.         $response $abha->getDataRequest($id);
  329.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  330.         return $this->redirectToRoute('lab_consent', ['id' => $id]);
  331.     }
  332.     #[Route(path'/view-data/{id}'name'lab_view_data'methods: ['GET''POST'])]
  333.     #[ParamDecryptor(["id"])]
  334.     public function viewRequest(Request $requestAbha $abha): Response
  335.     {
  336.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  337.         } else {
  338.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  339.         } */
  340.         $id $request->attributes->get('id');
  341.         $response $abha->getViewData($id);
  342.         $id $this->encryptor->encrypt($id);
  343.         if ($response[0]) {
  344.             $uri $this->generateUrl('lab_consent', ['id' => $id]);
  345.             return $this->render('abha/view_consent.html.twig', [
  346.                 'data' => $response[1],
  347.                 'back_url' => $uri
  348.             ]);
  349.         } else {
  350.             return $this->redirectToRoute('lab_consent', ['id' => $id]);
  351.         }
  352.     }
  353.     #[Route('/patient-find'name'lab_patient_find'methods: ['GET''POST'])]
  354.     public function patientFind(Request $requestAbha $abha): Response
  355.     {
  356.         $healthId $request->request->get('health_id');
  357.         if (!$healthId && strlen($healthId) <= 6) {
  358.             return $this->json('invalid');
  359.         }
  360.         $name $abha->patientFind($healthId);
  361.         return $this->json($name);
  362.     }
  363.     /**
  364.      * M3 End
  365.      */
  366. }