src/Controller/CaseController.php line 727

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