src/Controller/CaseController.php line 1190

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\{CaseHistoryCaseMedicineCaseReferralCasesHivRegisterTBRegisterWardBed};
  4. use App\Form\{CaseReferralTypeCaseType};
  5. use App\Repository\{CaseRepositoryHivRegisterRepositoryPatientRepositoryTBRegisterRepository};
  6. use App\Service\{PaginationAbha};
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Dompdf\Dompdf;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\{IsGrantedSecurity};
  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 Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. use Symfony\Component\HttpClient\HttpClient;
  17. use Doctrine\Persistence\ManagerRegistry;
  18. #[Route(path'/cases'), IsGranted(data'IS_AUTHENTICATED_REMEMBERED')]
  19. class CaseController extends AbstractController
  20. {
  21.     private $encryptor;
  22.     public function __construct(Encryptor $encryptor, private ManagerRegistry $doctrine)
  23.     {
  24.         $this->encryptor $encryptor;
  25.     }
  26.     #[Route(path'/'name'case_index'methods: ['GET'])]
  27.     public function index(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  28.     {
  29.         if ($this->isGranted('ROLE_DOC')) {
  30.             $qb $caseRepo->getForDoctors($this->getUser());
  31.         } else {
  32.             $qb $caseRepo->getForOthers($this->getUser()->getHospital());
  33.         }
  34.         if ($request->get('range')) {
  35.             [$from$to] = explode(' / '$request->get('range'));
  36.             if ($from && $to) {
  37.                 $qb
  38.                     ->andWhere('c.createdAt BETWEEN :from AND :to')
  39.                     ->setParameter('from'$from)
  40.                     ->setParameter('to'$to);
  41.             }
  42.         }
  43.         $cases $pagination->paginate($qb->getQuery(), $request$this->getParameter('items_per_page'));
  44.         return $this->render('cases/index.html.twig', [
  45.             'cases' => $cases,
  46.             'last_page' => $pagination->lastPage($cases),
  47.             'title' => 'Cases'
  48.         ]);
  49.     }
  50.     #[Route(path'/laboratory'name'case_lab'methods: ['GET'])]
  51.     public function labCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  52.     {
  53.         $query $caseRepo->getWithLabTests($this->getUser()->getHospital());
  54.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  55.         return $this->render('cases/index.html.twig', [
  56.             'cases' => $cases,
  57.             'last_page' => $pagination->lastPage($cases),
  58.             'title' => 'Laboratory Summary'
  59.         ]);
  60.     }
  61.     #[Route(path'/pharma'name'case_pharma'methods: ['GET'])]
  62.     public function pharmaCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  63.     {
  64.         $query $caseRepo->getPharmaCases($this->getUser()->getHospital());
  65.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  66.         return $this->render('cases/index.html.twig', [
  67.             'cases' => $cases,
  68.             'last_page' => $pagination->lastPage($cases),
  69.             'title' => 'Pharmacy Cases'
  70.         ]);
  71.     }
  72.     #[Route(path'/labor'name'case_labor'methods: ['GET'])]
  73.     public function laborCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  74.     {
  75.         $query $caseRepo->getLaborCases($this->getUser()->getHospital());
  76.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  77.         return $this->render('cases/index.html.twig', [
  78.             'cases' => $cases,
  79.             'last_page' => $pagination->lastPage($cases),
  80.             'title' => 'Labor room Summary'
  81.         ]);
  82.     }
  83.     #[Route(path'/ward'name'case_ward'methods: ['GET'])]
  84.     public function wardCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  85.     {
  86.         $query $caseRepo->getWardCases($this->getUser()->getHospital());
  87.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  88.         return $this->render('cases/index.html.twig', [
  89.             'cases' => $cases,
  90.             'last_page' => $pagination->lastPage($cases),
  91.             'title' => 'Ward Cases'
  92.         ]);
  93.     }
  94.     #[Route(path'/discharged'name'case_discharged'methods: ['GET'])]
  95.     public function dischargedCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  96.     {
  97.         $query $caseRepo->getDischargedCases($this->getUser()->getHospital());
  98.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  99.         return $this->render('cases/index.html.twig', [
  100.             'cases' => $cases,
  101.             'last_page' => $pagination->lastPage($cases),
  102.             'title' => 'Discharge Summary'
  103.         ]);
  104.     }
  105.     #[Route(path'/emergency'name'case_emergency'methods: ['GET'])]
  106.     public function emergencyCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  107.     {
  108.         $query $caseRepo->getEmergencyCases($this->getUser()->getHospital());
  109.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  110.         return $this->render('cases/index.html.twig', [
  111.             'cases' => $cases,
  112.             'last_page' => $pagination->lastPage($cases),
  113.             'title' => 'Emergency Cases'
  114.         ]);
  115.     }
  116.     #[Route(path'/medicolegal'name'case_medicolegal'methods: ['GET'])]
  117.     public function medicolegalCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  118.     {
  119.         $query $caseRepo->getMedicolegalCases($this->getUser()->getHospital());
  120.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  121.         return $this->render('cases/index.html.twig', [
  122.             'cases' => $cases,
  123.             'last_page' => $pagination->lastPage($cases),
  124.             'title' => 'Medicolegal Cases'
  125.         ]);
  126.     }
  127.     #[Route(path'/mortality'name'case_mortality'methods: ['GET'])]
  128.     public function mortalityCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  129.     {
  130.         $query $caseRepo->getMortalityCases($this->getUser()->getHospital());
  131.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  132.         return $this->render('cases/index.html.twig', [
  133.             'cases' => $cases,
  134.             'last_page' => $pagination->lastPage($cases),
  135.             'title' => 'Mortality Cases'
  136.         ]);
  137.     }
  138.     #[Route(path'/expert-opinions'name'case_exprt_opinion'methods: ['GET']), IsGranted(data'ROLE_DOC')]
  139.     public function expertOpinionCases(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  140.     {
  141.         $query $caseRepo->getExpertOpinionCases($this->getUser());
  142.         $cases $pagination->paginate($query$request$this->getParameter('items_per_page'));
  143.         return $this->render('cases/expert_opinions.html.twig', [
  144.             'cases' => $cases,
  145.             'last_page' => $pagination->lastPage($cases)
  146.         ]);
  147.     }
  148.     #[Route(path'/add-expert-opinion/{id}'name'case_add_exprt_opinion'methods: ['GET''POST']), IsGranted(data'ROLE_DOC')]
  149.     #[ParamDecryptor(["id"])]
  150.     public function addOpinion(Request $requestCaseReferral $caseRefCaseRepository $caseRepoEntityManagerInterface $entityManager): Response
  151.     {
  152.         $form $this->createForm(CaseReferralType::class, $caseRef);
  153.         $form->handleRequest($request);
  154.         if ($form->isSubmitted() && $form->isValid()) {
  155.             $entityManager->flush();
  156.             $this->addFlash(
  157.                 'success',
  158.                 'Expert Opinion added successfully!'
  159.             );
  160.             return $this->redirectToRoute('case_exprt_opinion');
  161.         }
  162.         $case $caseRef->getCase();
  163.         $symptoms $caseRepo->getCaseSymptoms($case->getId());
  164.         $provisionalExaminations $caseRepo->getCaseProvisionalExaminations($case->getId());
  165.         $provisionalDiagnosis $caseRepo->getCaseProvisionalDiagnosis($case->getId());
  166.         $clinicalPatterns $caseRepo->getCaseClinicalPatterns($case->getId());
  167.         return $this->renderForm('cases/add_opinion.html.twig', [
  168.             'form' => $form,
  169.             'case' => $case,
  170.             'case_tests' => $caseRepo->getCaseTests($case->getId()),
  171.             'case_medicines' => $caseRepo->getCaseMedicines($case->getId()),
  172.             'symptoms' => $symptoms implode(', '$symptoms) : '&mdash;',
  173.             'provisional_diagnosis' => $provisionalDiagnosis implode(', '$provisionalDiagnosis) : '&mdash;',
  174.             'provisional_examinations' => $provisionalExaminations implode(', '$provisionalExaminations) : '&mdash;',
  175.             'clinical_patterns' => $clinicalPatterns implode(', '$clinicalPatterns) : '&mdash;'
  176.         ]);
  177.     }
  178.     #[Route(path'/print-ref-letter/{id}'name'case_print_ref_letter'methods: ['GET']), IsGranted(data'ROLE_DOC')]
  179.     #[ParamDecryptor(["id"])]
  180.     public function printRefLetter(CaseReferral $caseRefCaseRepository $caseRepo)
  181.     {
  182.         $caseId $caseRef->getCase()->getId();
  183.         return $this->render('cases/print_ref_letter.html.twig', [
  184.             'case_ref' => $caseRef,
  185.             'action_type' => 'print',
  186.             'prov_diags' => implode(', '$caseRepo->getCaseProvisionalDiagnosis($caseId)),
  187.             'prov_exam' => implode(', '$caseRepo->getCaseProvisionalExaminations($caseId)),
  188.             'treatment_given' => implode('<br>'array_merge(
  189.                 array_column($caseRepo->getCaseMedicines($caseId), 'name'),
  190.                 array_column($caseRepo->getCaseWardMedicines($caseId), 'name')
  191.             ))
  192.         ]);
  193.     }
  194.     #[Route(path'/download-ref-letter/{id}'name'case_pdf_ref_letter'methods: ['GET']), IsGranted(data'ROLE_DOC')]
  195.     #[ParamDecryptor(["id"])]
  196.     public function downloadRefLetter(CaseReferral $caseRefCaseRepository $caseRepo)
  197.     {
  198.         $caseId $caseRef->getCase()->getId();
  199.         $html $this->renderView('cases/print_ref_letter.html.twig', [
  200.             'case_ref' => $caseRef,
  201.             'action_type' => 'pdf',
  202.             'prov_diags' => implode(', '$caseRepo->getCaseProvisionalDiagnosis($caseId)),
  203.             'prov_exam' => implode(', '$caseRepo->getCaseProvisionalExaminations($caseId)),
  204.             'treatment_given' => implode('<br>'array_merge(
  205.                 array_column($caseRepo->getCaseMedicines($caseId), 'name'),
  206.                 array_column($caseRepo->getCaseWardMedicines($caseId), 'name')
  207.             ))
  208.         ]);
  209.         $dompdf = new Dompdf();
  210.         $dompdf->loadHtml($html);
  211.         $dompdf->setPaper('A4''portrait');
  212.         $dompdf->render();
  213.         $dompdf->stream('referral-letter.pdf', [
  214.             'Attachment' => true
  215.         ]);
  216.     }
  217.     #[Route(path'/patient-summary'name'case_summary'methods: ['GET'])]
  218.     public function casesSummary(Request $requestPagination $paginationCaseRepository $caseRepo): Response
  219.     {
  220.         $qb $caseRepo->getAllCases($this->getUser()->getHospital());
  221.         if ($request->get('range')) {
  222.             [$from$to] = explode(' / '$request->get('range'));
  223.             if ($from && $to) {
  224.                 $qb
  225.                     ->andWhere('c.createdAt BETWEEN :from AND :to')
  226.                     ->setParameter('from'$from)
  227.                     ->setParameter('to'$to);
  228.             }
  229.         }
  230.         $cases $pagination->paginate($qb->getQuery(), $request$this->getParameter('items_per_page'));
  231.         return $this->render('cases/index.html.twig', [
  232.             'cases' => $cases,
  233.             'last_page' => $pagination->lastPage($cases),
  234.             'title' => 'Patients Summary'
  235.         ]);
  236.     }
  237.     #[Route(path'/new'name'case_new'methods: ['GET''POST'])]
  238.     #[Security("is_granted('ROLE_RECEP') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_AYUSH') or is_granted('ROLE_DENT')")]
  239.     public function new(Request $requestCaseRepository $caseRepoAbha $abhaPatientRepository $patientRepoEntityManagerInterface $entityManager): Response
  240.     {
  241.         $case = new Cases();
  242.         $role 'recep';
  243.         $template 'cases/recep_new.html.twig';
  244.         if ($request->getMethod() == 'GET' && $request->query->has('patient_id')) {
  245.             $patient $patientRepo->find($this->encryptor->decrypt($request->query->get('patient_id')));
  246.             if ($patient) {
  247.                 $case->setPatient($patient);
  248.             }
  249.         }
  250.         $hospital $this->getUser()->getHospital();
  251.         if ($this->isGranted('ROLE_DOC') || $this->isGranted('ROLE_AYUSH') || $this->isGranted('ROLE_CHO') || $this->isGranted('ROLE_DENT')) {
  252.             $case->setDoctor($this->getUser());
  253.             $role 'doc';
  254.             $template 'cases/new.html.twig';
  255.         }
  256.         $case->setFollowUpDate(new \DateTime());
  257.         $form $this->createForm(CaseType::class, $case, ['allow_extra_fields' => true'role' => $role'hospital' => $hospital]);
  258.         $form->handleRequest($request);
  259.         if ($case->getIsWard() && $request->isMethod('POST')) {
  260.             $getTotalBed $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
  261.             if (!empty($getTotalBed)) {
  262.                 $getOccupiedBedBedData $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
  263.                 if (!empty($getOccupiedBedBedData)) {
  264.                     $totalMaleBed $getTotalBed[0]['total_male_bed'];
  265.                     $totalFemaleBed $getTotalBed[0]['total_female_bed']; //1
  266.                     $availableMaleBad $totalMaleBed - (int) $getOccupiedBedBedData[0]['male_occupied'];
  267.                     $availableFemaleBad $totalFemaleBed - (int) $getOccupiedBedBedData[0]['female_occupied']; //0
  268.                     if ($case->getPatient()->getGender() == "Male" && (empty($totalMaleBed) || empty($availableMaleBad))) {
  269.                         $this->addFlash(
  270.                             'danger',
  271.                             'Male bed is not available.'
  272.                         );
  273.                         return $this->renderForm($template, [
  274.                             'case' => $case,
  275.                             'form' => $form,
  276.                             'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  277.                             'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  278.                         ]);
  279.                     }
  280.                     if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) {
  281.                         $this->addFlash(
  282.                             'danger',
  283.                             'Female bed is not available.'
  284.                         );
  285.                         return $this->renderForm($template, [
  286.                             'case' => $case,
  287.                             'form' => $form,
  288.                             'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  289.                             'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  290.                         ]);
  291.                     }
  292.                 }
  293.             } else {
  294.                 $this->addFlash(
  295.                     'danger',
  296.                     'Bed not available.'
  297.                 );
  298.                 return $this->renderForm($template, [
  299.                     'case' => $case,
  300.                     'form' => $form,
  301.                     'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  302.                     'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  303.                 ]);
  304.             }
  305.         }
  306.         if ($form->isSubmitted() && $form->isValid()) {
  307.             $formData $request->get('case');
  308.             $case->setHospital($hospital);
  309.             $entityManager->getConnection()->setAutoCommit(false);
  310.             $entityManager->beginTransaction();
  311.             try {
  312.                 $entityManager->persist($case);
  313.                 $entityManager->flush();
  314.                 $hospitalId $hospital->getId();
  315.                 if (isset($formData['symptoms']) && !empty($formData['symptoms'])) {
  316.                     $caseRepo->saveSymptoms($formData['symptoms'], $case);
  317.                 }
  318.                 if (isset($formData['ncds']) && !empty($formData['ncds'])) {
  319.                     $caseRepo->saveNcds($formData['ncds'], $case);
  320.                 }
  321.                 $mrdNo 'MRD-' $hospital->getType() . '-' date('Y') . '-' sprintf('%04d'$hospital->getId()) . '-' sprintf('%010d'$case->getId());
  322.                 if ($role == 'doc') {
  323.                     if (isset($formData['clinical_patterns']) && !empty($formData['clinical_patterns'])) {
  324.                         $caseRepo->saveClinicalPatterns($formData['clinical_patterns'], $case);
  325.                     }
  326.                     $caseRepo->saveProvisionalExaminations($formData['provisional_examinations'], $case);
  327.                     $caseRepo->saveProvisionalDiagnosis($formData['provisional_diagnosis'], $case);
  328.                     if ($case->getIsLab()) {
  329.                         $labTests = [];
  330.                         if (isset($formData['suggestedReports']) && (is_countable($formData['suggestedReports']) ? count($formData['suggestedReports']) : 0) > 0) {
  331.                             $labTests array_merge($labTests$formData['suggestedReports']);
  332.                         }
  333.                         if (isset($formData['lab_tests']) && (is_countable($formData['lab_tests']) ? count($formData['lab_tests']) : 0) > 0) {
  334.                             $labTests array_merge($labTests$formData['lab_tests']);
  335.                         }
  336.                         $labTestIds array_unique($labTests);
  337.                         $radTests $formData['generalReports'] ?? [];
  338.                         if (count($labTestIds) == && (is_countable($radTests) ? count($radTests) : 0) == 0) {
  339.                             $entityManager->rollback();
  340.                             $entityManager->clear();
  341.                             $this->addFlash(
  342.                                 'danger',
  343.                                 'Please select at least one Test report and try again.'
  344.                             );
  345.                             return $this->renderForm($template, [
  346.                                 'case' => $case,
  347.                                 'form' => $form,
  348.                                 'rad_tests' => '',
  349.                                 'case_medicines' => '',
  350.                                 'case_ward_medicines' => '',
  351.                                 'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  352.                                 'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  353.                             ]);
  354.                         }
  355.                         if (count($labTestIds) > 0) {
  356.                             $caseRepo->saveLabTests($case->getId(), $hospitalId$this->getUser()->getId(), $labTestIds);
  357.                         }
  358.                         if ((is_countable($radTests) ? count($radTests) : 0) > 0) {
  359.                             $radTestData = [];
  360.                             foreach ($radTests['id'] as $radTestId) {
  361.                                 $radTestData[] = [
  362.                                     'case_id' => $case->getId(),
  363.                                     'lab_test_id' => $radTestId,
  364.                                     'instruct' => $radTests['instruct'][$radTestId],
  365.                                     'hospital_id' => $hospitalId,
  366.                                     'created_by' => $this->getUser()->getId()
  367.                                 ];
  368.                             }
  369.                             $caseRepo->saveCaseRadTests($radTestData);
  370.                         }
  371.                         $case->setLabTestStatus('Pending');
  372.                     }
  373.                     if ($case->getIsMedicine()) {
  374.                         if (!isset($formData['medicines']) || (is_countable($formData['medicines']) ? count($formData['medicines']) : 0) != 6) {
  375.                             $entityManager->rollback();
  376.                             $entityManager->clear();
  377.                             $this->addFlash(
  378.                                 'danger',
  379.                                 'Please select at least one medicine and try again.'
  380.                             );
  381.                             return $this->renderForm($template, [
  382.                                 'case' => $case,
  383.                                 'form' => $form,
  384.                                 'rad_tests' => '',
  385.                                 'case_medicines' => '',
  386.                                 'case_ward_medicines' => '',
  387.                                 'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  388.                                 'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  389.                             ]);
  390.                         }
  391.                         $medicines $formData['medicines'];
  392.                         $medicineData = [];
  393.                         foreach ($medicines['id'] as $medicineId) {
  394.                             $medicineData[] = [
  395.                                 'case_id' => $case->getId(),
  396.                                 'medicine_id' => $medicineId,
  397.                                 'medicine_type' => $medicines['type'][$medicineId],
  398.                                 'dose' => $medicines['dose'][$medicineId],
  399.                                 'frequency' => $medicines['frequency'][$medicineId],
  400.                                 'num_days' => $medicines['num_days'][$medicineId],
  401.                                 'notes' => $medicines['patient_notes'][$medicineId],
  402.                                 'is_referral' => 0,
  403.                                 'is_opinion' => 0,
  404.                                 'is_rejected' => 0,
  405.                                 'created_by' => $this->getUser()->getId()
  406.                             ];
  407.                         }
  408.                         $caseRepo->saveCaseMedicines($medicineData);
  409.                         $case->setCaseMedicineStatus('Pending');
  410.                     }
  411.                     if ($case->getIsReferral()) {
  412.                         $isOther $form->get('ref_type')->getData() ?: 0;
  413.                         $isOpinion $form->get('ref_is_opinion')->getData();
  414.                         $refDoc $form->get('ref_doctor')->getData();
  415.                         $refEmail $form->get('ref_email')->getData();
  416.                         $refNote $form->get('ref_note')->getData();
  417.                         $caseRef = new CaseReferral();
  418.                         $caseRef
  419.                             ->setCase($case)
  420.                             ->setIsOther($isOther)
  421.                             ->setIsOpinion($isOpinion)
  422.                             ->setDoctor($refDoc)
  423.                             ->setEmail($refEmail)
  424.                             ->setNotes($refNote);
  425.                         if ($isOther == 1) {
  426.                             $caseRef->setHospital($form->get('ref_center')->getData());
  427.                         } else {
  428.                             $caseRef->setHospital($hospital);
  429.                         }
  430.                         $entityManager->persist($caseRef);
  431.                     }
  432.                     if ($case->getIsWard()) {
  433.                         $ward $form->get('ward')->getData();
  434.                         if (!isset($formData['ward_medicines']) || (is_countable($formData['ward_medicines']) ? count($formData['ward_medicines']) : 0) != || !$ward) {
  435.                             $entityManager->rollback();
  436.                             $entityManager->clear();
  437.                             $this->addFlash(
  438.                                 'danger',
  439.                                 'Please select at least one medicine and try again.'
  440.                             );
  441.                             return $this->renderForm($template, [
  442.                                 'case' => $case,
  443.                                 'form' => $form,
  444.                                 'rad_tests' => '',
  445.                                 'case_medicines' => '',
  446.                                 'case_ward_medicines' => '',
  447.                                 'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  448.                                 'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  449.                             ]);
  450.                         }
  451.                         if (!$ward) {
  452.                             $entityManager->rollback();
  453.                             $entityManager->clear();
  454.                             $this->addFlash(
  455.                                 'danger',
  456.                                 'Selected Ward is not available. Please select other Ward and try again.'
  457.                             );
  458.                             return $this->renderForm($template, [
  459.                                 'case' => $case,
  460.                                 'form' => $form,
  461.                                 'rad_tests' => '',
  462.                                 'case_medicines' => '',
  463.                                 'case_ward_medicines' => '',
  464.                                 'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  465.                                 'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  466.                             ]);
  467.                         }
  468.                         $wardBed = new WardBed();
  469.                         $wardBed
  470.                             ->setCase($case)
  471.                             ->setWard($ward)
  472.                             ->setStatus('Admitted');
  473.                         $entityManager->persist($wardBed);
  474.                         $wardMedicines $formData['ward_medicines'];
  475.                         $wardMedicineData = [];
  476.                         foreach ($wardMedicines['id'] as $medicineId) {
  477.                             $wardMedicineData[] = [
  478.                                 'case_id' => $case->getId(),
  479.                                 'medicine_id' => $medicineId,
  480.                                 'medicine_type' => $wardMedicines['type'][$medicineId],
  481.                                 'dose' => $wardMedicines['dose'][$medicineId],
  482.                                 'frequency' => $wardMedicines['frequency'][$medicineId],
  483.                                 'num_days' => $wardMedicines['num_days'][$medicineId],
  484.                                 'notes' => $wardMedicines['staff_notes'][$medicineId],
  485.                                 'is_emergency' => 0,
  486.                                 'has_stock' => 0,
  487.                                 'created_by' => $this->getUser()->getId()
  488.                             ];
  489.                         }
  490.                         //TODO when isWard is true then ward medicine status is pending so pharmacy can give medicine to patient
  491.                         $case->setWardMedicineStatus('Pending');
  492.                         $caseRepo->saveCaseWardMedicines($wardMedicineData);
  493.                     }
  494.                     if ($case->getPatient()->getMobile()) {
  495.                         try {
  496.                             $client HttpClient::create();
  497.                             $client->request('POST''https://staging-abdm.7mantra.in/m2/sms-notify2', [
  498.                                 'headers' => [
  499.                                     'Content-Type' => 'application/json'
  500.                                 ],
  501.                                 'json' => [
  502.                                     'mobile_number' => $case->getPatient()->getMobile(),
  503.                                     'hip_id' => $this->getUser()->getProfile()->getHospital()->getHIPCode(),
  504.                                     'hip_name' => $this->getUser()->getProfile()->getHospital()->getHIPName()
  505.                                 ]
  506.                             ]);
  507.                         } catch (\Exception) {
  508.                             $this->addFlash(
  509.                                 'danger',
  510.                                 'Sms not sent.'
  511.                             );
  512.                         }
  513.                     }
  514.                     if ($case->getPatient()->getHealthAddress()) {
  515.                         $data['abhaAddress'] = $case->getPatient()->getHealthAddress();
  516.                         $data['patientRefNo'] = $case->getPatient()->getUhId();
  517.                         $data['hipId'] = $case->getPatient()->getHospital()->getHIPCode();
  518.                         $data['contextRef'] = $mrdNo;
  519.                         $data['contextDisplay'] = 'Case Care Context';
  520.                         $data['hiTypes'] = 'OPConsultation';
  521.                         $data['reqId'] = $abha->GUID();
  522.                         $caseRepo->saveContextDetails($data);
  523.                     }
  524.                 }
  525.                 $case->setMrdId($mrdNo);
  526.                 $entityManager->persist($case);
  527.                 $entityManager->flush();
  528.                 $entityManager->commit();
  529.                 $this->addFlash(
  530.                     'success',
  531.                     'New case added successfully!'
  532.                 );
  533.                 return $this->redirectToRoute('case_index');
  534.             } catch (\Exception) {
  535.                 $entityManager->rollback();
  536.                 $entityManager->clear();
  537.                 $this->addFlash(
  538.                     'danger',
  539.                     'Something went wrong! Case data could not be saved. Please try again.'
  540.                 );
  541.                 return $this->renderForm($template, [
  542.                     'case' => $case,
  543.                     'form' => $form,
  544.                     'rad_tests' => '',
  545.                     'case_medicines' => '',
  546.                     'case_ward_medicines' => '',
  547.                     'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  548.                     'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  549.                 ]);
  550.             }
  551.         }
  552.         return $this->renderForm($template, [
  553.             'case' => $case,
  554.             'form' => $form,
  555.             'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  556.             'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  557.         ]);
  558.     }
  559.     #[Route(path'/re-open/{id}'name'case_reopen'methods: ['GET'])]
  560.     #[ParamDecryptor(["id"])]
  561.     public function reOpen(Cases $caseEntityManagerInterface $entityManager): Response
  562.     {
  563.         if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) {
  564.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  565.         }
  566.         if (!$case->getIsClosed()) {
  567.             $this->addFlash(
  568.                 'danger',
  569.                 'Case is not closed yet!'
  570.             );
  571.             return $this->redirectToRoute('case_index');
  572.         }
  573.         $reOpened = new Cases();
  574.         $reOpened
  575.             ->setHospital($case->getHospital())
  576.             ->setDoctor($case->getDoctor())
  577.             ->setPatient($case->getPatient())
  578.             ->setPatientCategory($case->getPatientCategory())
  579.             ->setFamilyHistory($case->getFamilyHistory() ?: '')
  580.             ->setMedicalHistory($case->getMedicalHistory() ?: '')
  581.             ->setMedicineHistory($case->getMedicalHistory() ?: '')
  582.             ->setCurrentDiseaseHistory($case->getCurrentDiseaseHistory() ?: '')
  583.             ->setDiseaseCategory($case->getDiseaseCategory())
  584.             ->setPrevCase($case);
  585.         $entityManager->persist($reOpened);
  586.         $entityManager->flush();
  587.         $reOpened->setMrdId('MRD-' $case->getHospital()->getType() . '-' date('Y') . '-' sprintf('%010d'$reOpened->getId()));
  588.         $entityManager->persist($reOpened);
  589.         $entityManager->flush();
  590.         $case->setIsReopened(true);
  591.         $entityManager->persist($case);
  592.         $entityManager->flush();
  593.         $this->addFlash(
  594.             'success',
  595.             'Case re-opened successfully!'
  596.         );
  597.         return $this->redirectToRoute('case_index');
  598.     }
  599.     #[Route(path'/view/{id}'name'case_show'methods: ['GET'])]
  600.     #[ParamDecryptor(["id"])]
  601.     public function show(Request $requestCases $caseCaseRepository $caseRepo): Response
  602.     {
  603.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId() && $case->getIsopinion() !== true) {
  604.             $symptoms $caseRepo->getCaseSymptoms($case->getId());
  605.             $ncds $caseRepo->getCaseNcds($case->getId());
  606.             $provisionalExaminations $caseRepo->getCaseProvisionalExaminations($case->getId());
  607.             $provisionalDiagnosis $caseRepo->getCaseProvisionalDiagnosis($case->getId());
  608.             $clinicalPatterns $caseRepo->getCaseClinicalPatterns($case->getId());
  609.             return $this->render('cases/show.html.twig', [
  610.                 'case' => $case,
  611.                 'case_tests' => $caseRepo->getCaseTests($case->getId()),
  612.                 'case_medicines' => $caseRepo->getCaseMedicines($case->getId()),
  613.                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  614.                 'referrals' => $caseRepo->getCaseReferrals($case->getId()),
  615.                 'symptoms' => $symptoms implode(', '$symptoms) : '&mdash;',
  616.                 'ncds' => $ncds implode(', '$ncds) : '&mdash;',
  617.                 'provisional_diagnosis' => $provisionalDiagnosis implode(', '$provisionalDiagnosis) : '&mdash;',
  618.                 'provisional_examinations' => $provisionalExaminations implode(', '$provisionalExaminations) : '&mdash;',
  619.                 'clinical_patterns' => $clinicalPatterns implode(', '$clinicalPatterns) : '&mdash;',
  620.                 'case_ward_medicines' => $caseRepo->getCaseWardMedicines($case->getId()),
  621.                 'ward_type' => $caseRepo->getWardType($case->getId()),
  622.                 'ward_bed_num' => $caseRepo->getWardBedNum($case->getId()),
  623.                 'discharge_note' => $caseRepo->getDischargeNote($case->getId()),
  624.                 'history' => $caseRepo->getCaseHistory($case->getId())
  625.             ]);
  626.         } else {
  627.             return $this->redirectToRoute('case_index');
  628.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  629.         }
  630.     }
  631.     #[Route(path'/diagnose/{id}'name'case_edit'methods: ['GET''POST'])]
  632.     #[ParamDecryptor(["id"])]
  633.     #[Security("is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_AYUSH') or is_granted('ROLE_DENT')")]
  634.     public function diagnose(Request $requestCases $caseCaseRepository $caseRepoEntityManagerInterface $entityManagerTBRegisterRepository $tbRegRepoHivRegisterRepository $hivRegRepo): Response
  635.     {
  636.         if ($request->isMethod('GET') || $request->isMethod('POST') && $this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  637.             $caseTests $caseRepo->getCaseTests($case->getId());
  638.             $radTests $caseRepo->getCaseRadTests($case->getId());
  639.             $caseMedicines $caseRepo->getCaseMedicines($case->getId());
  640.             $caseWardMedicines $caseRepo->getCaseWardMedicines($case->getId());
  641.             $form $this->createForm(CaseType::class, $case, ['allow_extra_fields' => true'role' => 'doc''hospital' => $case->getHospital()]);
  642.             $form->handleRequest($request);
  643.             if ($case->getIsWard() && $request->isMethod('POST')) {
  644.                 $getTotalBed $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
  645.                 if (!empty($getTotalBed)) {
  646.                     $getOccupiedBedBedData $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
  647.                     if (!empty($getOccupiedBedBedData)) {
  648.                         $totalMaleBed $getTotalBed[0]['total_male_bed'];
  649.                         $totalFemaleBed $getTotalBed[0]['total_female_bed']; //1
  650.                         $availableMaleBad $totalMaleBed - (int) $getOccupiedBedBedData[0]['male_occupied'];
  651.                         $availableFemaleBad $totalFemaleBed - (int) $getOccupiedBedBedData[0]['female_occupied']; //0
  652.                         if ($case->getPatient()->getGender() == "Male" && (empty($totalMaleBed) || empty($availableMaleBad))) {
  653.                             $this->addFlash(
  654.                                 'danger',
  655.                                 'Male bed is not available.'
  656.                             );
  657.                             return $this->renderForm('cases/edit.html.twig', [
  658.                                 'case' => $case,
  659.                                 'form' => $form,
  660.                                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  661.                                 'general_reports' => $caseRepo->getGeneralReports(),
  662.                                 'rad_tests' => $radTests,
  663.                                 'case_tests' => $caseTests,
  664.                                 'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  665.                                 'case_medicines' => $caseMedicines,
  666.                                 'case_ward_medicines' => $caseWardMedicines,
  667.                                 'history' => $caseRepo->getCaseHistory($case->getId())
  668.                             ]);
  669.                         }
  670.                         if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) {
  671.                             $this->addFlash(
  672.                                 'danger',
  673.                                 'Female bed is not available.'
  674.                             );
  675.                             return $this->renderForm('cases/edit.html.twig', [
  676.                                 'case' => $case,
  677.                                 'form' => $form,
  678.                                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  679.                                 'general_reports' => $caseRepo->getGeneralReports(),
  680.                                 'rad_tests' => $radTests,
  681.                                 'case_tests' => $caseTests,
  682.                                 'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  683.                                 'case_medicines' => $caseMedicines,
  684.                                 'case_ward_medicines' => $caseWardMedicines,
  685.                                 'history' => $caseRepo->getCaseHistory($case->getId())
  686.                             ]);
  687.                         }
  688.                     }
  689.                 } else {
  690.                     $this->addFlash(
  691.                         'danger',
  692.                         'Bed not available.'
  693.                     );
  694.                     return $this->renderForm('cases/edit.html.twig', [
  695.                         'case' => $case,
  696.                         'form' => $form,
  697.                         'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  698.                         'general_reports' => $caseRepo->getGeneralReports(),
  699.                         'rad_tests' => $radTests,
  700.                         'case_tests' => $caseTests,
  701.                         'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  702.                         'case_medicines' => $caseMedicines,
  703.                         'case_ward_medicines' => $caseWardMedicines,
  704.                         'history' => $caseRepo->getCaseHistory($case->getId())
  705.                     ]);
  706.                 }
  707.             }
  708.             if ($form->isSubmitted() && $form->isValid()) {
  709.                 $formData $request->request->get('case');
  710.                 if ($caseTests || $radTests) {
  711.                     $case->setIsLab(true);
  712.                 }
  713.                 if ($caseMedicines) {
  714.                     $case->setIsMedicine(true);
  715.                 }
  716.                 if ($caseWardMedicines) {
  717.                     $case->setIsWard(true);
  718.                 }
  719.                 $entityManager->getConnection()->setAutoCommit(false);
  720.                 $entityManager->beginTransaction();
  721.                 try {
  722.                     $entityManager->flush();
  723.                     $history = new CaseHistory();
  724.                     $history
  725.                         ->setCase($case)
  726.                         ->setDoctor($case->getDoctor())
  727.                         ->setDiseaseCategory($case->getDiseaseCategory())
  728.                         ->setLocalExamination($case->getLocalExamination());
  729.                     if ($case->getIcd10CauseGroup()) {
  730.                         $history->setIcd10Group($case->getIcd10CauseGroup()->getName());
  731.                     }
  732.                     if ($case->getIcd10CauseSubGroup()) {
  733.                         $history->setIcd10Subgroup($case->getIcd10CauseSubGroup()->getName());
  734.                     }
  735.                     if ($case->getIcd10Disease()) {
  736.                         $history->setIcd10Diagnosis($case->getIcd10Disease()->getName());
  737.                     }
  738.                     $caseRepo->deleteExistingSymptoms($case);
  739.                     $caseRepo->deleteExistingProvisionalExaminations($case);
  740.                     $caseRepo->deleteExistingProvisionalDiagnosis($case);
  741.                     if (isset($formData['clinical_patterns']) && !empty($formData['clinical_patterns'])) {
  742.                         $caseRepo->deleteExistingClinicalPatterns($case);
  743.                         $caseRepo->saveClinicalPatterns((array)$formData['clinical_patterns'], $case$history);
  744.                     }
  745.                     if (isset($formData['ncds']) && !empty($formData['ncds'])) {
  746.                         $caseRepo->deleteExistingNcds($case);
  747.                         $caseRepo->saveNcds((array)$formData['ncds'], $case$history);
  748.                     }
  749.                     $caseRepo->saveSymptoms((array)$formData['symptoms'], $case$history);
  750.                     $caseRepo->saveProvisionalExaminations((array)$formData['provisional_examinations'], $case$history);
  751.                     $caseRepo->saveProvisionalDiagnosis((array)$formData['provisional_diagnosis'], $case$history);
  752.                     if ($case->getIsLab()) {
  753.                         $hospitalId $case->getHospital()->getId();
  754.                         $labTests = [];
  755.                         if (isset($formData['suggestedReports']) && count((array)$formData['suggestedReports']) > 0) {
  756.                             $labTests array_merge($labTests$formData['suggestedReports']);
  757.                         }
  758.                         if (isset($formData['lab_tests']) && count((array)$formData['lab_tests']) > 0) {
  759.                             $labTests array_merge($labTests$formData['lab_tests']);
  760.                         }
  761.                         $testIdsForHistory $labTestIds array_unique($labTests);
  762.                         if (count($labTestIds) > 0) {
  763.                             $caseRepo->saveLabTests($case->getId(), $hospitalId$this->getUser()->getId(), $labTestIds);
  764.                             $case->setLabTestStatus('Pending');
  765.                         }
  766.                         $radTests $formData['generalReports'] ?? [];
  767.                         if (count($radTests) > 0) {
  768.                             $radTestData = [];
  769.                             foreach ($radTests['id'] as $radTestId) {
  770.                                 $radTestData[] = [
  771.                                     'case_id' => $case->getId(),
  772.                                     'lab_test_id' => $radTestId,
  773.                                     'instruct' => $radTests['instruct'][$radTestId],
  774.                                     'hospital_id' => $hospitalId,
  775.                                     'created_by' => $this->getUser()->getId()
  776.                                 ];
  777.                             }
  778.                             $caseRepo->saveCaseRadTests($radTestData);
  779.                             $case->setLabTestStatus('Pending');
  780.                             $testIdsForHistory array_merge($testIdsForHistory$radTests['id']);
  781.                         }
  782.                         $testsForHistory $caseRepo->getLabTestNames($testIdsForHistory);
  783.                         $history->setLabTests(implode(', '$testsForHistory));
  784.                     }
  785.                     if ($case->getIsMedicine()) {
  786.                         if (isset($formData['medicines']) && count((array)$formData['medicines']) == 6) {
  787.                             $medicines $formData['medicines'];
  788.                             $medicineData = [];
  789.                             foreach ((array)$medicines['id'] as $medicineId) {
  790.                                 $medicineData[] = [
  791.                                     'case_id' => $case->getId(),
  792.                                     'medicine_id' => $medicineId,
  793.                                     'medicine_type' => $medicines['type'][$medicineId],
  794.                                     'dose' => $medicines['dose'][$medicineId],
  795.                                     'frequency' => $medicines['frequency'][$medicineId],
  796.                                     'num_days' => $medicines['num_days'][$medicineId],
  797.                                     'notes' => $medicines['patient_notes'][$medicineId],
  798.                                     'is_referral' => 0,
  799.                                     'is_opinion' => 0,
  800.                                     'is_rejected' => 0,
  801.                                     'created_by' => $this->getUser()->getId()
  802.                                 ];
  803.                             }
  804.                             $caseRepo->saveCaseMedicines($medicineData);
  805.                             $case->setCaseMedicineStatus('Pending');
  806.                             $medsForHistory $caseRepo->getMedicineNames($medicines['id']);
  807.                             $history->setMedicines(implode(', '$medsForHistory));
  808.                         }
  809.                     }
  810.                     if (($case->getIsReferral() || $case->getIsOpinion()) && $form->get('ref_doctor')->getData()) {
  811.                         $isOther $form->get('ref_type')->getData() ?: 0;
  812.                         $isOpinion $case->getIsOpinion();
  813.                         $refDoc $form->get('ref_doctor')->getData();
  814.                         $refEmail $form->get('ref_email')->getData();
  815.                         $refNote $form->get('ref_note')->getData();
  816.                         $caseRef = new CaseReferral();
  817.                         $caseRef
  818.                             ->setCase($case)
  819.                             ->setIsOther($isOther)
  820.                             ->setIsOpinion($isOpinion)
  821.                             ->setDoctor($refDoc)
  822.                             ->setEmail($refEmail)
  823.                             ->setNotes($refNote);
  824.                         if ($isOther == 1) {
  825.                             $caseRef->setHospital($form->get('ref_center')->getData());
  826.                         } else {
  827.                             $caseRef->setHospital($case->getHospital());
  828.                         }
  829.                         $entityManager->persist($caseRef);
  830.                     }
  831.                     if ($case->getIsWard()) {
  832.                         $ward $form->get('ward')->getData();
  833.                         $wardBed $case->getWardBed();
  834.                         if (!$wardBed) {
  835.                             if ($ward) {
  836.                                 $wardBed = new WardBed();
  837.                                 $wardBed
  838.                                     ->setCase($case)
  839.                                     ->setWard($ward)
  840.                                     ->setStatus('Admitted');
  841.                                 $entityManager->persist($wardBed);
  842.                             }
  843.                         } else {
  844.                             if ($wardBed && $ward) {
  845.                                 $wardBed->setWard($ward);
  846.                                 $entityManager->persist($wardBed);
  847.                             }
  848.                         }
  849.                         if (isset($formData['ward_medicines']) && count((array)$formData['ward_medicines']) == 6) {
  850.                             $wardMedicines $formData['ward_medicines'];
  851.                             $wardMedicineData = [];
  852.                             foreach ((array)$wardMedicines['id'] as $medicineId) {
  853.                                 $wardMedicineData[] = [
  854.                                     'case_id' => $case->getId(),
  855.                                     'medicine_id' => $medicineId,
  856.                                     'medicine_type' => $wardMedicines['type'][$medicineId],
  857.                                     'dose' => $wardMedicines['dose'][$medicineId],
  858.                                     'frequency' => $wardMedicines['frequency'][$medicineId],
  859.                                     'num_days' => $wardMedicines['num_days'][$medicineId],
  860.                                     'notes' => $wardMedicines['staff_notes'][$medicineId],
  861.                                     'is_emergency' => 0,
  862.                                     'has_stock' => 0,
  863.                                     'created_by' => $this->getUser()->getId()
  864.                                 ];
  865.                             }
  866.                             $case->setWardMedicineStatus("Pending");
  867.                             $caseRepo->saveCaseWardMedicines($wardMedicineData);
  868.                             $wardMedsForHistory $caseRepo->getMedicineNames($wardMedicines['id']);
  869.                             $history->setWardMedicines(implode(', '$wardMedsForHistory));
  870.                         }
  871.                     } else {
  872.                         $ward $form->get('ward')->getData();
  873.                         $wardBed $case->getWardBed();
  874.                         if ($wardBed) {
  875.                             if ($ward) {
  876.                                 $caseRepo->UpdateStatus($case->getId(), $ward->getId());
  877.                             }
  878.                         }
  879.                     }
  880.                     if ($case->getIsClosed() && $case->getClosureReason() == 'Death of patient') {
  881.                         $patient $case->getPatient();
  882.                         $patient
  883.                             ->setIsAlive(false)
  884.                             ->setExpiredAt(new \DateTime());
  885.                         $entityManager->persist($patient);
  886.                     }
  887.                     $entityManager->persist($history);
  888.                     $entityManager->flush();
  889.                     if ($caseRepo->hasTB($case->getId())) {
  890.                         $tbReg $tbRegRepo->findOneBy(['hospital' => $case->getHospital(), 'patient' => $case->getPatient()]);
  891.                         if (!$tbReg) {
  892.                             $tbReg = new TBRegister();
  893.                             $tbTest $caseRepo->getTBTestDetails($case->getId());
  894.                             $pds $case->getProvisionalDiagnosis()->filter(fn ($pd) => in_array($pd->getName(), ['PTB''RE''NTM']));
  895.                             $tbReg
  896.                                 ->setPatient($case->getPatient())
  897.                                 ->setLabSerialNum($tbTest['number'] ?? '-')
  898.                                 ->setDateCollected(isset($tbTest['date_collected']) ? new \DateTime($tbTest['date_collected']) : new \DateTime())
  899.                                 ->setRefFacility($case->getHospital()->getName())
  900.                                 ->setPresumptive(isset($pds[0]) ? $pds[0]->getName() : '-')
  901.                                 ->setPredominant($case->getCurrentDiseaseHistory())
  902.                                 ->setSpecimenType($tbTest['type'] ?? '-')
  903.                                 ->setTestMethod($tbTest['method'] ?? '-')
  904.                                 ->setResultA($tbTest['result'] ?? '-')
  905.                                 ->setResultB('-')
  906.                                 ->setResultADate(isset($tbTest['result_date']) ? new \DateTime($tbTest['result_date']) : new \DateTime())
  907.                                 ->setHospital($case->getHospital())
  908.                                 ->setIsDiabeties($caseRepo->hasDM($case->getId()));
  909.                             $entityManager->persist($tbReg);
  910.                             $entityManager->flush();
  911.                         }
  912.                     }
  913.                     if ($caseRepo->hasHIV($case->getId())) {
  914.                         $hivReg $hivRegRepo->findOneBy(['case' => $case]);
  915.                         if (!$hivReg) {
  916.                             $hivReg = new HivRegister();
  917.                             $hivReg->setCase($case);
  918.                             $entityManager->persist($hivReg);
  919.                             $entityManager->flush();
  920.                         }
  921.                     }
  922.                     $entityManager->commit();
  923.                     $this->addFlash(
  924.                         'success',
  925.                         'Case updated successfully!'
  926.                     );
  927.                     return $this->redirectToRoute('case_index');
  928.                 } catch (\Exception) {
  929.                     $entityManager->rollback();
  930.                     $entityManager->clear();
  931.                     $this->addFlash(
  932.                         'danger',
  933.                         'Something went wrong! Case data could not be saved. Please try again.'
  934.                     );
  935.                     return $this->redirectToRoute('case_edit', ['id' => $this->encryptor->encrypt($case->getId())]);
  936.                 }
  937.             }
  938.             return $this->renderForm('cases/edit.html.twig', [
  939.                 'case' => $case,
  940.                 'form' => $form,
  941.                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  942.                 'general_reports' => $caseRepo->getGeneralReports(),
  943.                 'rad_tests' => $radTests,
  944.                 'case_tests' => $caseTests,
  945.                 'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  946.                 'case_medicines' => $caseMedicines,
  947.                 'case_ward_medicines' => $caseWardMedicines,
  948.                 'history' => $caseRepo->getCaseHistory($case->getId())
  949.             ]);
  950.         } else {
  951.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  952.         }
  953.     }
  954.     #[Route(path'/delete/{id}'name'case_delete'methods: ['GET']), IsGranted(data'ROLE_HOSP_ADMIN')]
  955.     #[ParamDecryptor(["id"])]
  956.     public function delete(Cases $caseEntityManagerInterface $entityManager): Response
  957.     {
  958.         if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) {
  959.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  960.         }
  961.         try {
  962.             $entityManager->remove($case);
  963.             $entityManager->flush();
  964.             $this->addFlash(
  965.                 'success',
  966.                 'Case deleted successfully!'
  967.             );
  968.         } catch (\Exception) {
  969.             $this->addFlash(
  970.                 'danger',
  971.                 'Something went wrong! The case could not be deleted!'
  972.             );
  973.         }
  974.         return $this->redirectToRoute('case_index');
  975.     }
  976.     #[Route(path'/symptoms'name'case_symptom_json'methods: ['GET'])]
  977.     public function symptoms(Request $requestCaseRepository $caseRepo): JsonResponse
  978.     {
  979.         $categoryId $request->query->get('category_id');
  980.         $symptoms $caseRepo->getSymptoms($categoryId);
  981.         return $this->json($symptoms);
  982.     }
  983.     #[Route(path'/diagnosis-data'name'case_diagnosis_data_json'methods: ['GET'])]
  984.     public function clinicalPatterns(Request $requestCaseRepository $caseRepo): JsonResponse
  985.     {
  986.         $symptomIds $request->query->get('symptom_ids');
  987.         $data = [
  988.             'clinicalPatterns' => null,
  989.             'provisionalExaminations' => null,
  990.             'provisionalDiagnosis' => null
  991.         ];
  992.         if (is_array($symptomIds)) {
  993.             $data['clinicalPatterns'] = $caseRepo->getClinicalPatternsBySymptomId($symptomIds);
  994.             $data['provisionalExaminations'] = $caseRepo->getProvisionalExaminationsBySymptomId($symptomIds);
  995.             $data['provisionalDiagnosis'] = $caseRepo->getProvisionalDiagnosisBySymptomId($symptomIds);
  996.         }
  997.         return $this->json($data);
  998.     }
  999.     #[Route(path'/suggested-tests'name'case_suggested_tests_json'methods: ['GET'])]
  1000.     public function suggestedTests(Request $requestCaseRepository $caseRepo): JsonResponse
  1001.     {
  1002.         $icd10SubGroupId $request->query->get('icd10_sub_group_id');
  1003.         $tests $caseRepo->getSuggestedTests($icd10SubGroupId);
  1004.         return $this->json($tests);
  1005.     }
  1006.     #[Route(path'/suggested-advice-treatment'name'case_suggested_advice_treatment_json'methods: ['GET'])]
  1007.     public function suggestedAdviceTreatment(Request $requestCaseRepository $caseRepo): JsonResponse
  1008.     {
  1009.         $icd10DiseaseId $request->query->get('icd10_disease_id');
  1010.         $adviceTreatment $caseRepo->getSuggestedAdviceTreatment($icd10DiseaseId);
  1011.         return $this->json($adviceTreatment);
  1012.     }
  1013.     #[Route(path'/delete-case-medicine'name'case_delete_case_medicine_json'methods: ['GET'])]
  1014.     public function removeCaseMedicine(Request $requestCaseRepository $caseRepo): JsonResponse
  1015.     {
  1016.         $caseMedicineId $request->query->get('case_medicine_id');
  1017.         $caseRepo->deleteCaseMedicine($caseMedicineId);
  1018.         return $this->json(true);
  1019.     }
  1020.     #[Route(path'/reject-case-medicine/{id}'name'case_reject_case_medicine'methods: ['GET'])]
  1021.     #[ParamDecryptor(["id"])]
  1022.     public function rejectCaseMedicine(CaseMedicine $caseMedicineEntityManagerInterface $entityManager): Response
  1023.     {
  1024.         if ($this->getUser()->getHospital()->getId() != $caseMedicine->getHospital()->getId()) {
  1025.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1026.         }
  1027.         $caseMedicine->setIsRejected(true);
  1028.         $entityManager->persist($caseMedicine);
  1029.         $entityManager->flush();
  1030.         $this->addFlash(
  1031.             'success',
  1032.             'Medicine rejected successfully!'
  1033.         );
  1034.         return $this->redirectToRoute('case_index');
  1035.     }
  1036.     #[Route(path'/delete-case-ward-medicine/{id}'name'case_delete_case_ward_medicine_json'methods: ['GET'])]
  1037.     #[ParamDecryptor(["id"])]
  1038.     public function removeCaseWardMedicine(int $idCaseRepository $caseRepo): JsonResponse
  1039.     {
  1040.         $caseRepo->deleteCaseWardMedicine($id);
  1041.         return $this->json(true);
  1042.     }
  1043.     #[Route(path'/print-history/{id}'name'case_history_print'methods: ['GET'])]
  1044.     #[ParamDecryptor(["id"])]
  1045.     public function printHistory(Cases $caseCaseRepository $caseRepo)
  1046.     {
  1047.         return $this->render('cases/history_print.html.twig', [
  1048.             'case' => $case,
  1049.             'history' => $caseRepo->getCaseHistory($case->getId())
  1050.         ]);
  1051.     }
  1052.     #[Route(path'/mlc-info-letter/{id}'name'case_mlc_info_letter'methods: ['GET'])]
  1053.     #[ParamDecryptor(["id"])]
  1054.     public function mlcInfoLetter(Cases $case)
  1055.     {
  1056.         return $this->render('cases/mlc_info_letter.html.twig', [
  1057.             'case' => $case
  1058.         ]);
  1059.     }
  1060.     /*Start :: abha verify and add context */
  1061.     /**
  1062.      * LINK AND ADD CONTEXT (M1)
  1063.      */
  1064.     #[Route('/abha-link-case/{id}'name'abha_link_case'methods: ['GET''POST'])]
  1065.     #[ParamDecryptor(["id"])]
  1066.     public function abhaLink(Cases $caseRequest $request): Response
  1067.     {
  1068.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId())
  1069.         {
  1070.             $session $request->getSession();
  1071.             $patientId $case->getPatient()->getId();
  1072.             $caseId $case->getMrdId();
  1073.             $uhId $case->getPatient()->getUhId();
  1074.             $type $request->request->get('type');
  1075.             $session->set('patient_id'$patientId);
  1076.             $session->set('uh_id'$uhId);
  1077.             $session->set('case_number'$caseId);
  1078.             $abhaDetail $request->request->get('abha_details') ? $request->request->get('abha_details') : '';
  1079.             /* $abhaDetail = $request->request->get('abha_detail');
  1080.             if (!$abhaDetail || !ctype_digit($abhaDetail) || strlen($abhaDetail) != 6) {
  1081.                 $this->addFlash(
  1082.                     'danger',
  1083.                     'Please enter valid abha number/abha address.'
  1084.                 );
  1085.             } */
  1086.             $readOnly '';
  1087.             if ($abhaDetail != '') {
  1088.                 $readOnly "readonly";
  1089.             }
  1090.             return $this->render('cases/link_step1.html.twig', [
  1091.                 'type' => $type,
  1092.                 'case' => $case,
  1093.                 'readOnly' => $readOnly,
  1094.                 'abhaDetail' => $abhaDetail,
  1095.             ]);
  1096.         } else {
  1097.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1098.         }
  1099.     }
  1100.     /**
  1101.      * LINK AND ADD CONTEXT (M1)
  1102.      */
  1103.     #[Route('/post-abha-link'name'post_abha_link_case'methods: ['GET''POST'])]
  1104.     public function postAbhaLink(Request $requestPatientRepository $patientRepo): Response
  1105.     {
  1106.         $session $request->getSession();
  1107.         if ($request->isMethod('POST')) {
  1108.             $healthAddress $request->request->get('abha_details');
  1109.             if (!$healthAddress) {
  1110.                 return $this->redirectToRoute('case_index');
  1111.             }
  1112.             //TODO :: health address store in session
  1113.             $session->set('health_address'$healthAddress);
  1114.             //define hip code and get code from hospital table
  1115.             $hipCode $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1116.             //try {
  1117.             $payload = [
  1118.                 'id' => $healthAddress,
  1119.                 'hip_id' => $hipCode
  1120.             ];
  1121.             $url 'https://staging-abdm.7mantra.in/data-link/fetch-modes';
  1122.             $patientRepo->insertPayload($payload$url);
  1123.             $client HttpClient::create();
  1124.             $response $client->request('POST'$url, [
  1125.                 'headers' => [
  1126.                     'Content-Type' => 'application/json',
  1127.                 ],
  1128.                 'json' => $payload
  1129.             ]);
  1130.             $statusCode $response->getStatusCode();
  1131.             $content json_decode($response->getContent(), true);
  1132.             if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
  1133.                 $message $content['message'];
  1134.                 if ($statusCode == '422') {
  1135.                     $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1136.                 }
  1137.                 $this->addFlash(
  1138.                     'danger',
  1139.                     $message
  1140.                 );
  1141.                 return $this->redirectToRoute('fetch_mode');
  1142.             } elseif ($statusCode == '202') {
  1143.                 if (isset($content['message'])) {
  1144.                     $this->addFlash(
  1145.                         'danger',
  1146.                         $content['message']
  1147.                     );
  1148.                     return $this->redirectToRoute('fetch_mode');
  1149.                 }
  1150.                 return $this->render('cases/fetch-modes.html.twig', [
  1151.                     'type' => 'case_diagnose',
  1152.                     'modesArr' => $content,
  1153.                     'health_address' => $healthAddress
  1154.                 ]);
  1155.             } else {
  1156.                 return $this->redirectToRoute('case_index'); // redirect to search abha
  1157.             }
  1158.         }
  1159.     }
  1160.     /**
  1161.      * LINK HEALTH RECORD FETCH MODE (M2)
  1162.      */
  1163.     #[Route(path'/post-fetch-modes'name'post_fetch_modes_case'methods: ['GET''POST'])]
  1164.     public function postFetchModes(Request $requestPatientRepository $patientRepo): Response
  1165.     {
  1166.         $fetchMode $request->request->get('fetch_mode');
  1167.         $healthAddress $request->request->get('health_address');
  1168.         $type $request->request->get('type');
  1169.         if (!$fetchMode || !$healthAddress || !$type) {
  1170.             $this->addFlash(
  1171.                 'danger',
  1172.                 'please enter valid details'
  1173.             );
  1174.             return $this->render('cases/fetch-modes.html.twig', [
  1175.                 'modes' => $fetchMode,
  1176.                 'modesArr' => $type,
  1177.                 'health_address' => $healthAddress,
  1178.             ]);
  1179.         }
  1180.         $session $request->getSession();
  1181.         $patientId $session->get('patient_id');
  1182.         $patientDetail $patientRepo->getPatientById($patientId);
  1183.         $patientArr['name'] = isset($patientDetail[0]) && $patientDetail[0]['first_name'] . ' ' $patientDetail[0]['middle_name'] . ' ' $patientDetail[0]['last_name'] ? $patientDetail[0]['first_name'] . ' ' $patientDetail[0]['middle_name'] . ' ' $patientDetail[0]['last_name'] : '';
  1184.         $patientArr['gender'] = isset($patientDetail[0]) && $patientDetail[0]['gender'] ? $patientDetail[0]['gender'] : '';
  1185.         $patientArr['dob'] = isset($patientDetail[0]) && $patientDetail[0]['dob'] ? $patientDetail[0]['dob'] : '';
  1186.         $patientArr['mobile'] = isset($patientDetail[0]) && $patientDetail[0]['mobile'] ? $patientDetail[0]['mobile'] : '';
  1187.         //try {
  1188.         //define hip code and get code from hospital table
  1189.         $hipCode $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1190.         $payload = [
  1191.             'id' => $healthAddress,
  1192.             'hip_id' => $hipCode,
  1193.             'auth_mode' => $fetchMode,
  1194.         ];
  1195.         $url 'https://sttaging-abdm.7mantra.in/data-link/init';
  1196.         $patientRepo->insertPayload($payload$url);
  1197.         $client HttpClient::create();
  1198.         $header = [
  1199.             'Content-Type' => 'application/json',
  1200.         ];
  1201.         $response $client->request('POST'$url, [
  1202.             'headers' => $header,
  1203.             'json' => $payload
  1204.         ]);
  1205.         $statusCode $response->getStatusCode();
  1206.         $content json_decode($response->getContent(), true);
  1207.         if ($statusCode == '202') { //if api success, get tnx id
  1208.             if (isset($content['message'])) {
  1209.                 $this->addFlash(
  1210.                     'danger',
  1211.                     $content['message']
  1212.                 );
  1213.                 return $this->render('cases/fetch-modes.html.twig', [
  1214.                     'modes' => $fetchMode,
  1215.                     'modesArr' => $type,
  1216.                     'health_address' => $healthAddress,
  1217.                 ]);
  1218.             }
  1219.             $txnId = isset($content['txn_id']) ? $content['txn_id'] : '';
  1220.             return $this->render('cases/verify_data_link.html.twig', [
  1221.                 'modes' => $fetchMode,
  1222.                 'type' => $type,
  1223.                 'txn_id' => $txnId,
  1224.                 'health_address' => $healthAddress,
  1225.                 'patientArr' => $patientArr
  1226.             ]);
  1227.         } elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') {
  1228.             //if api get error
  1229.             $message $content['message'];
  1230.             if ($statusCode == '422') {
  1231.                 $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1232.             }
  1233.             $this->addFlash(
  1234.                 'danger',
  1235.                 $message
  1236.             );
  1237.             return $this->render('cases/fetch-modes.html.twig', [
  1238.                 'modes' => $fetchMode,
  1239.                 'modesArr' => $type,
  1240.                 'health_address' => $healthAddress,
  1241.             ]);
  1242.             //return $this->redirectToRoute('patient_search_with_abha'
  1243.         } else {
  1244.             return $this->redirectToRoute('case_index');
  1245.         }
  1246.         /* } catch (\Throwable $th) {
  1247.             $this->addFlash(
  1248.                 'danger',
  1249.                 'Something went wrong please try again.'
  1250.             );
  1251.             return $this->redirectToRoute('case_index');
  1252.         } */
  1253.     }
  1254.     /**
  1255.      * LINK HEALTH RECORD VERIFY DETAILS (M2)
  1256.      */
  1257.     #[Route(path'/link-verify-details'name'link_verify_details'methods: ['GET''POST'])]
  1258.     public function linkVerifyDetails(Request $requestPatientRepository $patientRepo): Response
  1259.     {
  1260.         $session $request->getSession();
  1261.         $modes $request->request->get('modes');
  1262.         $healthAddress $request->request->get('health_address');
  1263.         $name $request->request->get('name');
  1264.         $gender $request->request->get('gender');
  1265.         $dob $request->request->get('dob');
  1266.         $mobile $request->request->get('mobile');
  1267.         $type $request->request->get('type');
  1268.         $txnId $request->request->get('txn_id');
  1269.         $auth_code $request->request->get('otp');
  1270.         if (!$healthAddress || !$type || !$txnId || !$modes) {
  1271.             $this->addFlash(
  1272.                 'danger',
  1273.                 'please enter valid details'
  1274.             );
  1275.             return $this->redirectToRoute('case_index');
  1276.         } else if (($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') && !$auth_code && strlen($auth_code) != 6) {
  1277.             $this->addFlash(
  1278.                 'danger',
  1279.                 'please enter valid details'
  1280.             );
  1281.             return $this->redirectToRoute('case_index');
  1282.         } else if ($modes == 'DEMOGRAPHICS' && (!$name || !$gender || !$dob)) {
  1283.             $this->addFlash(
  1284.                 'danger',
  1285.                 'please enter valid details'
  1286.             );
  1287.             return $this->redirectToRoute('case_index');
  1288.         }
  1289.         if ($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') {
  1290.             $payload = [
  1291.                 'transaction_id' => $txnId,
  1292.                 'modes' => $modes,
  1293.                 'auth_code' => $auth_code
  1294.             ];
  1295.         } else {
  1296.             $payload = [
  1297.                 'transaction_id' => $txnId,
  1298.                 'modes' => $modes,
  1299.                 'name' => $name,
  1300.                 'gender' => $gender,
  1301.                 'dob' => $dob,
  1302.                 'mobile' => $mobile,
  1303.             ];
  1304.         }
  1305.         //try {
  1306.         $header = [
  1307.             'Content-Type' => 'application/json',
  1308.         ];
  1309.         $url 'https://staging-abdm.7mantra.in/data-link/confirm';
  1310.         $patientRepo->insertPayload($payload$url);
  1311.         $client HttpClient::create();
  1312.         $response $client->request('POST'$url, [
  1313.             'headers' => $header,
  1314.             'json' => $payload
  1315.         ]);
  1316.         $statusCode $response->getStatusCode();
  1317.         $content json_decode($response->getContent(), true);
  1318.         if ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') {
  1319.             $message $content['message'];
  1320.             if ($statusCode == '422') {
  1321.                 $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1322.             }
  1323.             $this->addFlash(
  1324.                 'danger',
  1325.                 $message
  1326.             );
  1327.             return $this->redirectToRoute('case_index');
  1328.         } else if ($statusCode == '202') {
  1329.             if (isset($content['message']) && empty($content)) { // changes ||
  1330.                 $this->addFlash(
  1331.                     'danger',
  1332.                     $content['message']
  1333.                 );
  1334.                 return $this->redirectToRoute('case_index');
  1335.             }
  1336.             $contentArr['token'] = $content['token'];
  1337.             $contentArr['firstName'] = $content['first_name'];
  1338.             $contentArr['middleName'] = $content['middle_name'];
  1339.             $contentArr['lastName'] = $content['last_name'];
  1340.             //$contentArr['yearOfBirth'] = date('Y-m-d', strtotime($content['dob']));
  1341.             $contentArr['dob'] = date('Y-m-d'strtotime($content['dob']));
  1342.             $contentArr['gender'] = $content['gender'];
  1343.             $contentArr['mobile'] = isset($content['identifiers']['mobile']) ? $content['identifiers']['mobile'] : '';
  1344.             $contentArr['healthIdNumber'] = isset($content['identifiers']['health_number']) ? $content['identifiers']['health_number'] : '';
  1345.             $contentArr['healthIdAddress'] = $content['id'];
  1346.             if ($type == 'case_diagnose') {
  1347.                 $patientId $session->get('patient_id'); // get patient id in session
  1348.                 //force fully update details and redirect to relative patient
  1349.                 $contextStatus '';
  1350.                 if (isset($content['token']) && !empty($content['token'])) {
  1351.                     if (empty($contentArr['healthIdNumber']) || empty($contentArr['healthIdAddress'])) {
  1352.                         $getTokenData = (array) json_decode(base64_decode(str_replace('_''/'str_replace('-''+'explode('.'$content['token'])[1]))));
  1353.                         $contentArr['healthIdNumber'] = isset($getTokenData['healthIdNumber']) ? $content['healthIdNumber'] : '';
  1354.                         $contentArr['healthIdAddress'] = isset($getTokenData['healthId']) ? $content['healthId'] : '';
  1355.                     }
  1356.                     $patientRepo->updateAbhaDetails($contentArr$patientId);
  1357.                     //TODO :: All value set dynamic, case and patient table
  1358.                     $patientReference $session->get('uh_id');
  1359.                     $caseNumber $session->get('case_number');
  1360.                     // TODO : set payload dynamic {type= case,id=caseId,token=token}
  1361.                     $careContext[] = ['referenceNumber' => $caseNumber'display' => 'Case Care Context'];
  1362.                     $type 'OPConsultation';
  1363.                     $patientDisplay 'patient display';
  1364.                     //define hip code and get code from hospital table
  1365.                     $hipId $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1366.                     $addContextPayload = [
  1367.                         'accessToken' => $content['token'],
  1368.                         'patientReference' => $patientReference,
  1369.                         'display' => $patientDisplay,
  1370.                         'careContexts' => $careContext,
  1371.                         'healthAddress' => $healthAddress,
  1372.                         'type' => $type,
  1373.                         'hip_id' => $hipId
  1374.                     ];
  1375.                     $url 'https://staging-abdm.7mantra.in/m2/add-context';
  1376.                     $patientRepo->insertPayload($addContextPayload$url);
  1377.                     $client HttpClient::create();
  1378.                     $contextResponse $client->request('POST'$url, [
  1379.                         'headers' => $header,
  1380.                         'json' => $addContextPayload
  1381.                     ]);
  1382.                     $contextStatus $contextResponse->getStatusCode();
  1383.                 }
  1384.                 if ($contextStatus ==  '202') {
  1385.                     $this->addFlash(
  1386.                         'success',
  1387.                         'Health data link successfully.'
  1388.                     );
  1389.                 } else if ($contextStatus ==  '400') {
  1390.                     $this->addFlash(
  1391.                         'danger',
  1392.                         'Bad request.'
  1393.                     );
  1394.                 } else if ($contextStatus ==  '422') {
  1395.                     $this->addFlash(
  1396.                         'danger',
  1397.                         'Some of the Care Contexts are already linked, please remove the linked Care Contexts.'
  1398.                     );
  1399.                 } else {
  1400.                     $this->addFlash(
  1401.                         'danger',
  1402.                         'Something went wrong! Please try again!'
  1403.                     );
  1404.                 }
  1405.                 $session->remove('patient_id');
  1406.                 $session->remove('health_address');
  1407.                 $session->remove('uh_id');
  1408.                 $session->remove('case_number');
  1409.                 return $this->redirectToRoute('case_index');
  1410.             }
  1411.         } else {
  1412.             $this->addFlash(
  1413.                 'danger',
  1414.                 'Something went wrong. Please try again.'
  1415.             );
  1416.             return $this->redirectToRoute('case_index');
  1417.         }
  1418.         /* } catch (\Throwable $th) {
  1419.             $this->addFlash(
  1420.                 'danger',
  1421.                 'Something went wrong please try again.'
  1422.             );
  1423.             return $this->redirectToRoute('case_index');
  1424.         } */
  1425.     }
  1426.     /*END :: abha verify and add context */
  1427.     /**
  1428.      * LINK HEALTH RECORD (M2)
  1429.      */
  1430.     #[Route(path'/data-link-fetch/{id}'name'data_link_fetch'methods: ['GET'])]
  1431.     #[ParamDecryptor(["id"])]
  1432.     public function dataLinkFetch(Cases $caseRequest $requestPatientRepository $patientRepo): Response
  1433.     {
  1434.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1435.             //TODO :: {{base url}}/v0.5/users/auth/init call this api
  1436.             //TODO :: get health address from patient table
  1437.             //$case->getPatient()->getMobile();
  1438.             $healthAddress $case->getPatient()->getHealthAddress();
  1439.             if (!$healthAddress) {
  1440.                 $this->addFlash(
  1441.                     'danger',
  1442.                     'Invalid request.'
  1443.                 );
  1444.                 return $this->redirectToRoute('case_index');
  1445.             }
  1446.             $patientId $case->getPatient()->getId();
  1447.             $caseId $case->getMrdId();
  1448.             $session $request->getSession();
  1449.             $uhId $case->getPatient()->getUhId();
  1450.             $session->set('patient_id'$patientId);
  1451.             $session->set('uh_id'$uhId);
  1452.             // get Case id in store session
  1453.             $session->set('case_number'$caseId);
  1454.             //TODO :: health address store in session
  1455.             $session->set('health_address'$healthAddress);
  1456.             //define hip code and get code from hospital table
  1457.             $hipCode $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1458.             //try {
  1459.             $payload = [
  1460.                 'id' => $healthAddress,
  1461.                 'hip_id' => $hipCode
  1462.             ];
  1463.             $url 'https://staging-abdm.7mantra.in/data-link/fetch-modes';
  1464.             $patientRepo->insertPayload($payload$url);
  1465.             $client HttpClient::create();
  1466.             $response $client->request('POST'$url, [
  1467.                 'headers' => [
  1468.                     'Content-Type' => 'application/json',
  1469.                 ],
  1470.                 'json' => $payload
  1471.             ]);
  1472.             $statusCode $response->getStatusCode();
  1473.             $content json_decode($response->getContent(), true);
  1474.             if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
  1475.                 $message $content['message'];
  1476.                 if ($statusCode == '422') {
  1477.                     $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1478.                 }
  1479.                 $this->addFlash(
  1480.                     'danger',
  1481.                     $message
  1482.                 );
  1483.                 return $this->redirectToRoute('fetch_mode');
  1484.             } elseif ($statusCode == '202') {
  1485.                 if (isset($content['message'])) {
  1486.                     $this->addFlash(
  1487.                         'danger',
  1488.                         $content['message']
  1489.                     );
  1490.                     return $this->redirectToRoute('fetch_mode');
  1491.                 }
  1492.                 if (empty($content)) {
  1493.                     return $this->redirectToRoute('case_index');
  1494.                 }
  1495.                 return $this->render('cases/fetch-modes.html.twig', [
  1496.                     'type' => 'case_diagnose',
  1497.                     'modesArr' => $content,
  1498.                     'health_address' => $healthAddress
  1499.                 ]);
  1500.             } else {
  1501.                 return $this->redirectToRoute('case_index'); // redirect to search abha
  1502.             }
  1503.         } else {
  1504.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1505.         }
  1506.     }
  1507.     /**
  1508.      * M2 SMS NOTIFY
  1509.      */
  1510.     #[Route(path'/patient-notify/{id}'name'patient_notify'methods: ['GET'])]
  1511.     #[ParamDecryptor(["id"])]
  1512.     public function patientNotify(Cases $casePatientRepository $patientRepo): Response
  1513.     {
  1514.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1515.             //TODO :: get mobile number related patient
  1516.             //TODO :: {{base url}}/v0.5/users/auth/init call this api
  1517.             //TODO :: add try catch
  1518.             $patientMobileNumber $case->getPatient()->getMobile();
  1519.             if (!$patientMobileNumber) {
  1520.                 $this->addFlash(
  1521.                     'danger',
  1522.                     'Invalid request.'
  1523.                 );
  1524.                 return $this->redirectToRoute('case_index');
  1525.             }
  1526.             $payload = [
  1527.                 'mobile_number' => $patientMobileNumber,
  1528.                 'hip_id' => $this->getUser()->getProfile()->getHospital()->getHIPCode(),
  1529.                 'hip_name' => $this->getUser()->getProfile()->getHospital()->getHIPName()
  1530.             ];
  1531.             $url 'https://staging-abdm.7mantra.in/m2/sms-notify2';
  1532.             $patientRepo->insertPayload($payload$url);
  1533.             $client HttpClient::create();
  1534.             $response $client->request('POST'$url, [
  1535.                 'headers' => [
  1536.                     'Content-Type' => 'application/json'
  1537.                 ],
  1538.                 'json' => $payload
  1539.             ]);
  1540.             $status $response->getStatusCode();
  1541.             if ($status ==  '202') {
  1542.                 $this->addFlash(
  1543.                     'success',
  1544.                     'Message sent successfully.'
  1545.                 );
  1546.             } else if ($status ==  '400') {
  1547.                 $this->addFlash(
  1548.                     'danger',
  1549.                     'Mobile number required.'
  1550.                 );
  1551.             } else {
  1552.                 $this->addFlash(
  1553.                     'danger',
  1554.                     'Something went wrong! Please try again!'
  1555.                 );
  1556.             }
  1557.             return $this->redirectToRoute('case_index');
  1558.         } else {
  1559.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1560.         }
  1561.     }
  1562.     /**
  1563.      * CONSENT LIST (M3)
  1564.      */
  1565.     #[Route(path'/consent/{id}'name'consent'methods: ['GET'])]
  1566.     #[ParamDecryptor(["id"])]
  1567.     public function consent(Request $requestAbha $abha): Response
  1568.     {
  1569.         // cross site script
  1570.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  1571.         $arrData $abha->getConsentList();
  1572.         $uri $this->generateUrl('consent_req_form', ['id' => $id]);
  1573.         // dd($arrData,$uri);
  1574.         return $this->render('abha/consent.html.twig', [
  1575.             'consents' => $arrData,
  1576.             'form_url' => $uri,
  1577.             'data_request' => 'data_request',
  1578.             'view_data' => 'view_data'
  1579.         ]);
  1580.     }
  1581.     /**
  1582.      * CONSENT REQUEST FORM (M3)
  1583.      */
  1584.     #[Route(path'/consent-request/{id}'name'consent_req_form'methods: ['GET'])]
  1585.     #[ParamDecryptor(["id"])]
  1586.     public function consentForm(Request $requestAbha $abha): Response
  1587.     {
  1588.         //cross site script
  1589.         return $this->render('abha/consent_form.html.twig', [
  1590.             'post_form_url' => 'request_init',
  1591.             'patient_find_url' => 'patient_find',
  1592.             'id' => $this->encryptor->encrypt($request->attributes->get('id'))
  1593.         ]);
  1594.     }
  1595.     /**
  1596.      * M3 SUBMIT CONSENT FORM
  1597.      */
  1598.     #[Route(path'/consent-request-init'name'request_init'methods: ['GET''POST'])]
  1599.     public function requestInit(Request $requestAbha $abha): Response
  1600.     {
  1601.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1602.         } else {
  1603.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1604.         } */
  1605.         //$id = $this->encryptor->encrypt($request->attributes->get('id'));
  1606.         //$uri = $this->generateUrl('consent', ['id' => $id]);
  1607.         $reqData $request->request->all();
  1608.         $reqData['hiuParName'] = $this->getUser()->getProfile()->getFirstName() . ' ' $this->getUser()->getProfile()->getLastName(); // practitioner name
  1609.         $reqData['hiuId'] = $this->getUser()->getProfile()->getHospital()->getHIUCode();
  1610.         $request $abha->requestInt($reqData);
  1611.         if ($request) {
  1612.             return $this->redirectToRoute('consent', ['id' => $reqData['id']]);
  1613.         } else {
  1614.             return $this->render('abha/consent_form.html.twig', [
  1615.                 'post_form_url' => 'request_init',
  1616.                 'patient_find_url' => 'patient_find'
  1617.             ]);
  1618.         }
  1619.     }
  1620.     /**
  1621.      * M3 REQUEST FOR DATA FROM HIP
  1622.      */
  1623.     #[Route(path'/data-request/{id}'name'data_request'methods: ['GET''POST'])]
  1624.     #[ParamDecryptor(["id"])]
  1625.     public function dataRequest(Request $requestAbha $abha): Response
  1626.     {
  1627.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1628.         } else {
  1629.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1630.         } */
  1631.         $id $request->attributes->get('id');
  1632.         $response $abha->getDataRequest($id);
  1633.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  1634.         return $this->redirectToRoute('consent', ['id' => $id]);
  1635.     }
  1636.     /**
  1637.      * M3 VIEW CONSENT DATA
  1638.      */
  1639.     #[Route(path'/view-data/{id}'name'view_data'methods: ['GET''POST'])]
  1640.     #[ParamDecryptor(["id"])]
  1641.     public function viewRequest(Request $requestAbha $abha): Response
  1642.     {
  1643.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1644.         } else {
  1645.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1646.         } */
  1647.         $id $request->attributes->get('id');
  1648.         $response $abha->getViewData($id);
  1649.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  1650.         if ($response[0]) {
  1651.             $uri $this->generateUrl('consent', ['id' => $id]);
  1652.             return $this->render('abha/view_consent.html.twig', [
  1653.                 'data' => $response[1],
  1654.                 'back_url' => $uri
  1655.             ]);
  1656.         } else {
  1657.             return $this->redirectToRoute('consent', ['id' => $id]);
  1658.         }
  1659.     }
  1660.     /**
  1661.      * M3 PATIENT FIND IN CONSENT REQUEST
  1662.      */
  1663.     #[Route('/patient-find'name'patient_find'methods: ['GET''POST'])]
  1664.     public function patientFind(Request $requestAbha $abha): Response
  1665.     {
  1666.         $healthId $request->request->get('health_id');
  1667.         if (!$healthId && strlen($healthId) <= 6) {
  1668.             return $this->json('invalid');
  1669.         }
  1670.         $name $abha->patientFind($healthId);
  1671.         return $this->json($name);
  1672.     }
  1673.  public function getAccessToken()
  1674.     {
  1675.         $now = new \DateTime('now', new \DateTimeZone('UTC'));
  1676.         $isoTimestamp $now->format('Y-m-d\TH:i:s.v\Z');
  1677.         $reqId self::GUID();
  1678.         try {
  1679.             $client = new Client(['headers' => ['Content-Type' => 'application/json''X-CM-ID' => 'sbx''REQUEST-ID' => $reqId'TIMESTAMP' => $isoTimestamp]]);
  1680.             // $sessionUrl = env('ABDM_URL') . '/v0.5/sessions';
  1681.             $sessionUrl 'https://dev.abdm.gov.in/api/hiecm/gateway/v3/sessions';
  1682.             $tokenReq $client->post($sessionUrl, [
  1683.                 'json' => [
  1684.                     'clientId' => 'SBX_002132',
  1685.                     'clientSecret' => 'dd468fe5-74f5-44f1-9fb5-47542de0f60b',
  1686.                     'grantType' => 'client_credentials'
  1687.                 ]
  1688.             ]);
  1689.             // Log::debug($tokenReq->getBody());
  1690.             $res json_decode($tokenReq->getBody(), true);
  1691.             return 'Bearer ' $res['accessToken'];
  1692.         } catch (\Exception $ex) {
  1693.             info('Error in fetching access token');
  1694.             info($ex->getMessage());
  1695.         }
  1696.     }
  1697.     
  1698.     function GUID()
  1699.     {
  1700.         if (function_exists('com_create_guid') === true) {
  1701.             return trim(com_create_guid(), '{}');
  1702.         }
  1703.         return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x'mt_rand(065535), mt_rand(065535), mt_rand(065535), mt_rand(1638420479), mt_rand(3276849151), mt_rand(065535), mt_rand(065535), mt_rand(065535));
  1704.     }
  1705. }