src/Controller/CaseController.php line 1880

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://dev2-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['hiTypes'] = 'Prescription';
  525.                         $data['reqId'] = $abha->GUID();
  526.                         $caseRepo->saveContextDetails($data);
  527.                     }
  528.                 }
  529.                 $case->setMrdId($mrdNo);
  530.                 $entityManager->persist($case);
  531.                 $entityManager->flush();
  532.                 $entityManager->commit();
  533.                 $this->addFlash(
  534.                     'success',
  535.                     'New case added successfully!'
  536.                 );
  537.                 return $this->redirectToRoute('case_index');
  538.             } catch (\Exception) {
  539.                 $entityManager->rollback();
  540.                 $entityManager->clear();
  541.                 $this->addFlash(
  542.                     'danger',
  543.                     'Something went wrong! Case data could not be saved. Please try again.'
  544.                 );
  545.                 return $this->renderForm($template, [
  546.                     'case' => $case,
  547.                     'form' => $form,
  548.                     'rad_tests' => '',
  549.                     'case_medicines' => '',
  550.                     'case_ward_medicines' => '',
  551.                     'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  552.                     'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  553.                 ]);
  554.             }
  555.         }
  556.         return $this->renderForm($template, [
  557.             'case' => $case,
  558.             'form' => $form,
  559.             'general_reports' => $role == 'doc' $caseRepo->getGeneralReports() : [],
  560.             'essential_drugs' => $role == 'doc' $caseRepo->getEssentialDrugs($hospital->getType()) : []
  561.         ]);
  562.     }
  563.     #[Route(path'/re-open/{id}'name'case_reopen'methods: ['GET'])]
  564.     #[ParamDecryptor(["id"])]
  565.     public function reOpen(Cases $caseEntityManagerInterface $entityManager): Response
  566.     {
  567.         if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) {
  568.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  569.         }
  570.         if (!$case->getIsClosed()) {
  571.             $this->addFlash(
  572.                 'danger',
  573.                 'Case is not closed yet!'
  574.             );
  575.             return $this->redirectToRoute('case_index');
  576.         }
  577.         $reOpened = new Cases();
  578.         $reOpened
  579.             ->setHospital($case->getHospital())
  580.             ->setDoctor($case->getDoctor())
  581.             ->setPatient($case->getPatient())
  582.             ->setPatientCategory($case->getPatientCategory())
  583.             ->setFamilyHistory($case->getFamilyHistory() ?: '')
  584.             ->setMedicalHistory($case->getMedicalHistory() ?: '')
  585.             ->setMedicineHistory($case->getMedicalHistory() ?: '')
  586.             ->setCurrentDiseaseHistory($case->getCurrentDiseaseHistory() ?: '')
  587.             ->setDiseaseCategory($case->getDiseaseCategory())
  588.             ->setPrevCase($case);
  589.         $entityManager->persist($reOpened);
  590.         $entityManager->flush();
  591.         $reOpened->setMrdId('MRD-' $case->getHospital()->getType() . '-' date('Y') . '-' sprintf('%010d'$reOpened->getId()));
  592.         $entityManager->persist($reOpened);
  593.         $entityManager->flush();
  594.         $case->setIsReopened(true);
  595.         $entityManager->persist($case);
  596.         $entityManager->flush();
  597.         $this->addFlash(
  598.             'success',
  599.             'Case re-opened successfully!'
  600.         );
  601.         return $this->redirectToRoute('case_index');
  602.     }
  603.     #[Route(path'/view/{id}'name'case_show'methods: ['GET'])]
  604.     #[ParamDecryptor(["id"])]
  605.     public function show(Request $requestCases $caseCaseRepository $caseRepo): Response
  606.     {
  607.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId() && $case->getIsopinion() !== true) {
  608.             $symptoms $caseRepo->getCaseSymptoms($case->getId());
  609.             $ncds $caseRepo->getCaseNcds($case->getId());
  610.             $provisionalExaminations $caseRepo->getCaseProvisionalExaminations($case->getId());
  611.             $provisionalDiagnosis $caseRepo->getCaseProvisionalDiagnosis($case->getId());
  612.             $clinicalPatterns $caseRepo->getCaseClinicalPatterns($case->getId());
  613.             return $this->render('cases/show.html.twig', [
  614.                 'case' => $case,
  615.                 'case_tests' => $caseRepo->getCaseTests($case->getId()),
  616.                 'case_medicines' => $caseRepo->getCaseMedicines($case->getId()),
  617.                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  618.                 'referrals' => $caseRepo->getCaseReferrals($case->getId()),
  619.                 'symptoms' => $symptoms implode(', '$symptoms) : '&mdash;',
  620.                 'ncds' => $ncds implode(', '$ncds) : '&mdash;',
  621.                 'provisional_diagnosis' => $provisionalDiagnosis implode(', '$provisionalDiagnosis) : '&mdash;',
  622.                 'provisional_examinations' => $provisionalExaminations implode(', '$provisionalExaminations) : '&mdash;',
  623.                 'clinical_patterns' => $clinicalPatterns implode(', '$clinicalPatterns) : '&mdash;',
  624.                 'case_ward_medicines' => $caseRepo->getCaseWardMedicines($case->getId()),
  625.                 'ward_type' => $caseRepo->getWardType($case->getId()),
  626.                 'ward_bed_num' => $caseRepo->getWardBedNum($case->getId()),
  627.                 'discharge_note' => $caseRepo->getDischargeNote($case->getId()),
  628.                 'history' => $caseRepo->getCaseHistory($case->getId())
  629.             ]);
  630.         } else {
  631.             return $this->redirectToRoute('case_index');
  632.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  633.         }
  634.     }
  635.     #[Route(path'/diagnose/{id}'name'case_edit'methods: ['GET''POST'])]
  636.     #[ParamDecryptor(["id"])]
  637.     #[Security("is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_AYUSH') or is_granted('ROLE_DENT')")]
  638.     public function diagnose(Request $requestCases $caseCaseRepository $caseRepoEntityManagerInterface $entityManagerTBRegisterRepository $tbRegRepoHivRegisterRepository $hivRegRepo): Response
  639.     {
  640.         if ($request->isMethod('GET') || $request->isMethod('POST') && $this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  641.             $caseTests $caseRepo->getCaseTests($case->getId());
  642.             $radTests $caseRepo->getCaseRadTests($case->getId());
  643.             $caseMedicines $caseRepo->getCaseMedicines($case->getId());
  644.             $caseWardMedicines $caseRepo->getCaseWardMedicines($case->getId());
  645.             $form $this->createForm(CaseType::class, $case, ['allow_extra_fields' => true'role' => 'doc''hospital' => $case->getHospital()]);
  646.             $form->handleRequest($request);
  647.             if ($case->getIsWard() && $request->isMethod('POST')) {
  648.                 $getTotalBed $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
  649.                 if (!empty($getTotalBed)) {
  650.                     $getOccupiedBedBedData $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']);
  651.                     if (!empty($getOccupiedBedBedData)) {
  652.                         $totalMaleBed $getTotalBed[0]['total_male_bed'];
  653.                         $totalFemaleBed $getTotalBed[0]['total_female_bed']; //1
  654.                         $availableMaleBad $totalMaleBed - (int) $getOccupiedBedBedData[0]['male_occupied'];
  655.                         $availableFemaleBad $totalFemaleBed - (int) $getOccupiedBedBedData[0]['female_occupied']; //0
  656.                         if ($case->getPatient()->getGender() == "Male" && (empty($totalMaleBed) || empty($availableMaleBad))) {
  657.                             $this->addFlash(
  658.                                 'danger',
  659.                                 'Male bed is not available.'
  660.                             );
  661.                             return $this->renderForm('cases/edit.html.twig', [
  662.                                 'case' => $case,
  663.                                 'form' => $form,
  664.                                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  665.                                 'general_reports' => $caseRepo->getGeneralReports(),
  666.                                 'rad_tests' => $radTests,
  667.                                 'case_tests' => $caseTests,
  668.                                 'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  669.                                 'case_medicines' => $caseMedicines,
  670.                                 'case_ward_medicines' => $caseWardMedicines,
  671.                                 'history' => $caseRepo->getCaseHistory($case->getId())
  672.                             ]);
  673.                         }
  674.                         if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) {
  675.                             $this->addFlash(
  676.                                 'danger',
  677.                                 'Female bed is not available.'
  678.                             );
  679.                             return $this->renderForm('cases/edit.html.twig', [
  680.                                 'case' => $case,
  681.                                 'form' => $form,
  682.                                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  683.                                 'general_reports' => $caseRepo->getGeneralReports(),
  684.                                 'rad_tests' => $radTests,
  685.                                 'case_tests' => $caseTests,
  686.                                 'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  687.                                 'case_medicines' => $caseMedicines,
  688.                                 'case_ward_medicines' => $caseWardMedicines,
  689.                                 'history' => $caseRepo->getCaseHistory($case->getId())
  690.                             ]);
  691.                         }
  692.                     }
  693.                 } else {
  694.                     $this->addFlash(
  695.                         'danger',
  696.                         'Bed not available.'
  697.                     );
  698.                     return $this->renderForm('cases/edit.html.twig', [
  699.                         'case' => $case,
  700.                         'form' => $form,
  701.                         'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  702.                         'general_reports' => $caseRepo->getGeneralReports(),
  703.                         'rad_tests' => $radTests,
  704.                         'case_tests' => $caseTests,
  705.                         'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  706.                         'case_medicines' => $caseMedicines,
  707.                         'case_ward_medicines' => $caseWardMedicines,
  708.                         'history' => $caseRepo->getCaseHistory($case->getId())
  709.                     ]);
  710.                 }
  711.             }
  712.             if ($form->isSubmitted() && $form->isValid()) {
  713.                 $formData $request->request->get('case');
  714.                 if ($caseTests || $radTests) {
  715.                     $case->setIsLab(true);
  716.                 }
  717.                 if ($caseMedicines) {
  718.                     $case->setIsMedicine(true);
  719.                 }
  720.                 if ($caseWardMedicines) {
  721.                     $case->setIsWard(true);
  722.                 }
  723.                 $entityManager->getConnection()->setAutoCommit(false);
  724.                 $entityManager->beginTransaction();
  725.                 try {
  726.                     $entityManager->flush();
  727.                     $history = new CaseHistory();
  728.                     $history
  729.                         ->setCase($case)
  730.                         ->setDoctor($case->getDoctor())
  731.                         ->setDiseaseCategory($case->getDiseaseCategory())
  732.                         ->setLocalExamination($case->getLocalExamination());
  733.                     if ($case->getIcd10CauseGroup()) {
  734.                         $history->setIcd10Group($case->getIcd10CauseGroup()->getName());
  735.                     }
  736.                     if ($case->getIcd10CauseSubGroup()) {
  737.                         $history->setIcd10Subgroup($case->getIcd10CauseSubGroup()->getName());
  738.                     }
  739.                     if ($case->getIcd10Disease()) {
  740.                         $history->setIcd10Diagnosis($case->getIcd10Disease()->getName());
  741.                     }
  742.                     $caseRepo->deleteExistingSymptoms($case);
  743.                     $caseRepo->deleteExistingProvisionalExaminations($case);
  744.                     $caseRepo->deleteExistingProvisionalDiagnosis($case);
  745.                     if (isset($formData['clinical_patterns']) && !empty($formData['clinical_patterns'])) {
  746.                         $caseRepo->deleteExistingClinicalPatterns($case);
  747.                         $caseRepo->saveClinicalPatterns((array)$formData['clinical_patterns'], $case$history);
  748.                     }
  749.                     if (isset($formData['ncds']) && !empty($formData['ncds'])) {
  750.                         $caseRepo->deleteExistingNcds($case);
  751.                         $caseRepo->saveNcds((array)$formData['ncds'], $case$history);
  752.                     }
  753.                     $caseRepo->saveSymptoms((array)$formData['symptoms'], $case$history);
  754.                     $caseRepo->saveProvisionalExaminations((array)$formData['provisional_examinations'], $case$history);
  755.                     $caseRepo->saveProvisionalDiagnosis((array)$formData['provisional_diagnosis'], $case$history);
  756.                     if ($case->getIsLab()) {
  757.                         $hospitalId $case->getHospital()->getId();
  758.                         $labTests = [];
  759.                         if (isset($formData['suggestedReports']) && count((array)$formData['suggestedReports']) > 0) {
  760.                             $labTests array_merge($labTests$formData['suggestedReports']);
  761.                         }
  762.                         if (isset($formData['lab_tests']) && count((array)$formData['lab_tests']) > 0) {
  763.                             $labTests array_merge($labTests$formData['lab_tests']);
  764.                         }
  765.                         $testIdsForHistory $labTestIds array_unique($labTests);
  766.                         if (count($labTestIds) > 0) {
  767.                             $caseRepo->saveLabTests($case->getId(), $hospitalId$this->getUser()->getId(), $labTestIds);
  768.                             $case->setLabTestStatus('Pending');
  769.                         }
  770.                         $radTests $formData['generalReports'] ?? [];
  771.                         if (count($radTests) > 0) {
  772.                             $radTestData = [];
  773.                             foreach ($radTests['id'] as $radTestId) {
  774.                                 $radTestData[] = [
  775.                                     'case_id' => $case->getId(),
  776.                                     'lab_test_id' => $radTestId,
  777.                                     'instruct' => $radTests['instruct'][$radTestId],
  778.                                     'hospital_id' => $hospitalId,
  779.                                     'created_by' => $this->getUser()->getId()
  780.                                 ];
  781.                             }
  782.                             $caseRepo->saveCaseRadTests($radTestData);
  783.                             $case->setLabTestStatus('Pending');
  784.                             $testIdsForHistory array_merge($testIdsForHistory$radTests['id']);
  785.                         }
  786.                         $testsForHistory $caseRepo->getLabTestNames($testIdsForHistory);
  787.                         $history->setLabTests(implode(', '$testsForHistory));
  788.                     }
  789.                     if ($case->getIsMedicine()) {
  790.                         if (isset($formData['medicines']) && count((array)$formData['medicines']) == 6) {
  791.                             $medicines $formData['medicines'];
  792.                             $medicineData = [];
  793.                             foreach ((array)$medicines['id'] as $medicineId) {
  794.                                 $medicineData[] = [
  795.                                     'case_id' => $case->getId(),
  796.                                     'medicine_id' => $medicineId,
  797.                                     'medicine_type' => $medicines['type'][$medicineId],
  798.                                     'dose' => $medicines['dose'][$medicineId],
  799.                                     'frequency' => $medicines['frequency'][$medicineId],
  800.                                     'num_days' => $medicines['num_days'][$medicineId],
  801.                                     'notes' => $medicines['patient_notes'][$medicineId],
  802.                                     'is_referral' => 0,
  803.                                     'is_opinion' => 0,
  804.                                     'is_rejected' => 0,
  805.                                     'created_by' => $this->getUser()->getId()
  806.                                 ];
  807.                             }
  808.                             $caseRepo->saveCaseMedicines($medicineData);
  809.                             $case->setCaseMedicineStatus('Pending');
  810.                             $medsForHistory $caseRepo->getMedicineNames($medicines['id']);
  811.                             $history->setMedicines(implode(', '$medsForHistory));
  812.                         }
  813.                     }
  814.                     if (($case->getIsReferral() || $case->getIsOpinion()) && $form->get('ref_doctor')->getData()) {
  815.                         $isOther $form->get('ref_type')->getData() ?: 0;
  816.                         $isOpinion $case->getIsOpinion();
  817.                         $refDoc $form->get('ref_doctor')->getData();
  818.                         $refEmail $form->get('ref_email')->getData();
  819.                         $refNote $form->get('ref_note')->getData();
  820.                         $caseRef = new CaseReferral();
  821.                         $caseRef
  822.                             ->setCase($case)
  823.                             ->setIsOther($isOther)
  824.                             ->setIsOpinion($isOpinion)
  825.                             ->setDoctor($refDoc)
  826.                             ->setEmail($refEmail)
  827.                             ->setNotes($refNote);
  828.                         if ($isOther == 1) {
  829.                             $caseRef->setHospital($form->get('ref_center')->getData());
  830.                         } else {
  831.                             $caseRef->setHospital($case->getHospital());
  832.                         }
  833.                         $entityManager->persist($caseRef);
  834.                     }
  835.                     if ($case->getIsWard()) {
  836.                         $ward $form->get('ward')->getData();
  837.                         $wardBed $case->getWardBed();
  838.                         if (!$wardBed) {
  839.                             if ($ward) {
  840.                                 $wardBed = new WardBed();
  841.                                 $wardBed
  842.                                     ->setCase($case)
  843.                                     ->setWard($ward)
  844.                                     ->setStatus('Admitted');
  845.                                 $entityManager->persist($wardBed);
  846.                             }
  847.                         } else {
  848.                             if ($wardBed && $ward) {
  849.                                 $wardBed->setWard($ward);
  850.                                 $entityManager->persist($wardBed);
  851.                             }
  852.                         }
  853.                         if (isset($formData['ward_medicines']) && count((array)$formData['ward_medicines']) == 6) {
  854.                             $wardMedicines $formData['ward_medicines'];
  855.                             $wardMedicineData = [];
  856.                             foreach ((array)$wardMedicines['id'] as $medicineId) {
  857.                                 $wardMedicineData[] = [
  858.                                     'case_id' => $case->getId(),
  859.                                     'medicine_id' => $medicineId,
  860.                                     'medicine_type' => $wardMedicines['type'][$medicineId],
  861.                                     'dose' => $wardMedicines['dose'][$medicineId],
  862.                                     'frequency' => $wardMedicines['frequency'][$medicineId],
  863.                                     'num_days' => $wardMedicines['num_days'][$medicineId],
  864.                                     'notes' => $wardMedicines['staff_notes'][$medicineId],
  865.                                     'is_emergency' => 0,
  866.                                     'has_stock' => 0,
  867.                                     'created_by' => $this->getUser()->getId()
  868.                                 ];
  869.                             }
  870.                             $case->setWardMedicineStatus("Pending");
  871.                             $caseRepo->saveCaseWardMedicines($wardMedicineData);
  872.                             $wardMedsForHistory $caseRepo->getMedicineNames($wardMedicines['id']);
  873.                             $history->setWardMedicines(implode(', '$wardMedsForHistory));
  874.                         }
  875.                     } else {
  876.                         $ward $form->get('ward')->getData();
  877.                         $wardBed $case->getWardBed();
  878.                         if ($wardBed) {
  879.                             if ($ward) {
  880.                                 $caseRepo->UpdateStatus($case->getId(), $ward->getId());
  881.                             }
  882.                         }
  883.                     }
  884.                     if ($case->getIsClosed() && $case->getClosureReason() == 'Death of patient') {
  885.                         $patient $case->getPatient();
  886.                         $patient
  887.                             ->setIsAlive(false)
  888.                             ->setExpiredAt(new \DateTime());
  889.                         $entityManager->persist($patient);
  890.                     }
  891.                     $entityManager->persist($history);
  892.                     $entityManager->flush();
  893.                     if ($caseRepo->hasTB($case->getId())) {
  894.                         $tbReg $tbRegRepo->findOneBy(['hospital' => $case->getHospital(), 'patient' => $case->getPatient()]);
  895.                         if (!$tbReg) {
  896.                             $tbReg = new TBRegister();
  897.                             $tbTest $caseRepo->getTBTestDetails($case->getId());
  898.                             $pds $case->getProvisionalDiagnosis()->filter(fn ($pd) => in_array($pd->getName(), ['PTB''RE''NTM']));
  899.                             $tbReg
  900.                                 ->setPatient($case->getPatient())
  901.                                 ->setLabSerialNum($tbTest['number'] ?? '-')
  902.                                 ->setDateCollected(isset($tbTest['date_collected']) ? new \DateTime($tbTest['date_collected']) : new \DateTime())
  903.                                 ->setRefFacility($case->getHospital()->getName())
  904.                                 ->setPresumptive(isset($pds[0]) ? $pds[0]->getName() : '-')
  905.                                 ->setPredominant($case->getCurrentDiseaseHistory())
  906.                                 ->setSpecimenType($tbTest['type'] ?? '-')
  907.                                 ->setTestMethod($tbTest['method'] ?? '-')
  908.                                 ->setResultA($tbTest['result'] ?? '-')
  909.                                 ->setResultB('-')
  910.                                 ->setResultADate(isset($tbTest['result_date']) ? new \DateTime($tbTest['result_date']) : new \DateTime())
  911.                                 ->setHospital($case->getHospital())
  912.                                 ->setIsDiabeties($caseRepo->hasDM($case->getId()));
  913.                             $entityManager->persist($tbReg);
  914.                             $entityManager->flush();
  915.                         }
  916.                     }
  917.                     if ($caseRepo->hasHIV($case->getId())) {
  918.                         $hivReg $hivRegRepo->findOneBy(['case' => $case]);
  919.                         if (!$hivReg) {
  920.                             $hivReg = new HivRegister();
  921.                             $hivReg->setCase($case);
  922.                             $entityManager->persist($hivReg);
  923.                             $entityManager->flush();
  924.                         }
  925.                     }
  926.                     $entityManager->commit();
  927.                     $this->addFlash(
  928.                         'success',
  929.                         'Case updated successfully!'
  930.                     );
  931.                     return $this->redirectToRoute('case_index');
  932.                 } catch (\Exception) {
  933.                     $entityManager->rollback();
  934.                     $entityManager->clear();
  935.                     $this->addFlash(
  936.                         'danger',
  937.                         'Something went wrong! Case data could not be saved. Please try again.'
  938.                     );
  939.                     return $this->redirectToRoute('case_edit', ['id' => $this->encryptor->encrypt($case->getId())]);
  940.                 }
  941.             }
  942.             return $this->renderForm('cases/edit.html.twig', [
  943.                 'case' => $case,
  944.                 'form' => $form,
  945.                 'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()),
  946.                 'general_reports' => $caseRepo->getGeneralReports(),
  947.                 'rad_tests' => $radTests,
  948.                 'case_tests' => $caseTests,
  949.                 'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()),
  950.                 'case_medicines' => $caseMedicines,
  951.                 'case_ward_medicines' => $caseWardMedicines,
  952.                 'history' => $caseRepo->getCaseHistory($case->getId())
  953.             ]);
  954.         } else {
  955.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  956.         }
  957.     }
  958.     #[Route(path'/delete/{id}'name'case_delete'methods: ['GET']), IsGranted(data'ROLE_HOSP_ADMIN')]
  959.     #[ParamDecryptor(["id"])]
  960.     public function delete(Cases $caseEntityManagerInterface $entityManager): Response
  961.     {
  962.         if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) {
  963.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  964.         }
  965.         try {
  966.             $entityManager->remove($case);
  967.             $entityManager->flush();
  968.             $this->addFlash(
  969.                 'success',
  970.                 'Case deleted successfully!'
  971.             );
  972.         } catch (\Exception) {
  973.             $this->addFlash(
  974.                 'danger',
  975.                 'Something went wrong! The case could not be deleted!'
  976.             );
  977.         }
  978.         return $this->redirectToRoute('case_index');
  979.     }
  980.     #[Route(path'/symptoms'name'case_symptom_json'methods: ['GET'])]
  981.     public function symptoms(Request $requestCaseRepository $caseRepo): JsonResponse
  982.     {
  983.         $categoryId $request->query->get('category_id');
  984.         $symptoms $caseRepo->getSymptoms($categoryId);
  985.         return $this->json($symptoms);
  986.     }
  987.     #[Route(path'/diagnosis-data'name'case_diagnosis_data_json'methods: ['GET'])]
  988.     public function clinicalPatterns(Request $requestCaseRepository $caseRepo): JsonResponse
  989.     {
  990.         $symptomIds $request->query->get('symptom_ids');
  991.         $data = [
  992.             'clinicalPatterns' => null,
  993.             'provisionalExaminations' => null,
  994.             'provisionalDiagnosis' => null
  995.         ];
  996.         if (is_array($symptomIds)) {
  997.             $data['clinicalPatterns'] = $caseRepo->getClinicalPatternsBySymptomId($symptomIds);
  998.             $data['provisionalExaminations'] = $caseRepo->getProvisionalExaminationsBySymptomId($symptomIds);
  999.             $data['provisionalDiagnosis'] = $caseRepo->getProvisionalDiagnosisBySymptomId($symptomIds);
  1000.         }
  1001.         return $this->json($data);
  1002.     }
  1003.     #[Route(path'/suggested-tests'name'case_suggested_tests_json'methods: ['GET'])]
  1004.     public function suggestedTests(Request $requestCaseRepository $caseRepo): JsonResponse
  1005.     {
  1006.         $icd10SubGroupId $request->query->get('icd10_sub_group_id');
  1007.         $tests $caseRepo->getSuggestedTests($icd10SubGroupId);
  1008.         return $this->json($tests);
  1009.     }
  1010.     #[Route(path'/suggested-advice-treatment'name'case_suggested_advice_treatment_json'methods: ['GET'])]
  1011.     public function suggestedAdviceTreatment(Request $requestCaseRepository $caseRepo): JsonResponse
  1012.     {
  1013.         $icd10DiseaseId $request->query->get('icd10_disease_id');
  1014.         $adviceTreatment $caseRepo->getSuggestedAdviceTreatment($icd10DiseaseId);
  1015.         return $this->json($adviceTreatment);
  1016.     }
  1017.     #[Route(path'/delete-case-medicine'name'case_delete_case_medicine_json'methods: ['GET'])]
  1018.     public function removeCaseMedicine(Request $requestCaseRepository $caseRepo): JsonResponse
  1019.     {
  1020.         $caseMedicineId $request->query->get('case_medicine_id');
  1021.         $caseRepo->deleteCaseMedicine($caseMedicineId);
  1022.         return $this->json(true);
  1023.     }
  1024.     #[Route(path'/reject-case-medicine/{id}'name'case_reject_case_medicine'methods: ['GET'])]
  1025.     #[ParamDecryptor(["id"])]
  1026.     public function rejectCaseMedicine(CaseMedicine $caseMedicineEntityManagerInterface $entityManager): Response
  1027.     {
  1028.         if ($this->getUser()->getHospital()->getId() != $caseMedicine->getHospital()->getId()) {
  1029.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1030.         }
  1031.         $caseMedicine->setIsRejected(true);
  1032.         $entityManager->persist($caseMedicine);
  1033.         $entityManager->flush();
  1034.         $this->addFlash(
  1035.             'success',
  1036.             'Medicine rejected successfully!'
  1037.         );
  1038.         return $this->redirectToRoute('case_index');
  1039.     }
  1040.     #[Route(path'/delete-case-ward-medicine/{id}'name'case_delete_case_ward_medicine_json'methods: ['GET'])]
  1041.     #[ParamDecryptor(["id"])]
  1042.     public function removeCaseWardMedicine(int $idCaseRepository $caseRepo): JsonResponse
  1043.     {
  1044.         $caseRepo->deleteCaseWardMedicine($id);
  1045.         return $this->json(true);
  1046.     }
  1047.     #[Route(path'/print-history/{id}'name'case_history_print'methods: ['GET'])]
  1048.     #[ParamDecryptor(["id"])]
  1049.     public function printHistory(Cases $caseCaseRepository $caseRepo)
  1050.     {
  1051.         return $this->render('cases/history_print.html.twig', [
  1052.             'case' => $case,
  1053.             'history' => $caseRepo->getCaseHistory($case->getId())
  1054.         ]);
  1055.     }
  1056.     #[Route(path'/mlc-info-letter/{id}'name'case_mlc_info_letter'methods: ['GET'])]
  1057.     #[ParamDecryptor(["id"])]
  1058.     public function mlcInfoLetter(Cases $case)
  1059.     {
  1060.         return $this->render('cases/mlc_info_letter.html.twig', [
  1061.             'case' => $case
  1062.         ]);
  1063.     }
  1064.     /*Start :: abha verify and add context */
  1065.     /**
  1066.      * LINK AND ADD CONTEXT (M1)
  1067.      */
  1068.     #[Route('/abha-link-case/{id}'name'abha_link_case'methods: ['GET''POST'])]
  1069.     #[ParamDecryptor(["id"])]
  1070.     public function abhaLink(Cases $caseRequest $request): Response
  1071.     {
  1072.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId())
  1073.         {
  1074.             $session $request->getSession();
  1075.             $patientId $case->getPatient()->getId();
  1076.             $caseId $case->getMrdId();
  1077.             $uhId $case->getPatient()->getUhId();
  1078.             $type $request->request->get('type');
  1079.             $session->set('patient_id'$patientId);
  1080.             $session->set('uh_id'$uhId);
  1081.             $session->set('case_number'$caseId);
  1082.             $abhaDetail $request->request->get('abha_details') ? $request->request->get('abha_details') : '';
  1083.             /* $abhaDetail = $request->request->get('abha_detail');
  1084.             if (!$abhaDetail || !ctype_digit($abhaDetail) || strlen($abhaDetail) != 6) {
  1085.                 $this->addFlash(
  1086.                     'danger',
  1087.                     'Please enter valid abha number/abha address.'
  1088.                 );
  1089.             } */
  1090.             $readOnly '';
  1091.             if ($abhaDetail != '') {
  1092.                 $readOnly "readonly";
  1093.             }
  1094.             return $this->render('cases/link_step1.html.twig', [
  1095.                 'type' => $type,
  1096.                 'case' => $case,
  1097.                 'readOnly' => $readOnly,
  1098.                 'abhaDetail' => $abhaDetail,
  1099.             ]);
  1100.         } else {
  1101.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1102.         }
  1103.     }
  1104.     /**
  1105.      * LINK AND ADD CONTEXT (M1)
  1106.      */
  1107.     #[Route('/post-abha-link'name'post_abha_link_case'methods: ['GET''POST'])]
  1108.     public function postAbhaLink(Request $requestPatientRepository $patientRepo): Response
  1109.     {
  1110.         $session $request->getSession();
  1111.         if ($request->isMethod('POST')) {
  1112.             $healthAddress $request->request->get('abha_details');
  1113.             if (!$healthAddress) {
  1114.                 return $this->redirectToRoute('case_index');
  1115.             }
  1116.             //TODO :: health address store in session
  1117.             $session->set('health_address'$healthAddress);
  1118.             //define hip code and get code from hospital table
  1119.             $hipCode $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1120.             //try {
  1121.             $payload = [
  1122.                 'id' => $healthAddress,
  1123.                 'hip_id' => $hipCode
  1124.             ];
  1125.             $url 'https://dev2-abdm.7mantra.in/data-link/fetch-modes';
  1126.             $patientRepo->insertPayload($payload$url);
  1127.             $client HttpClient::create();
  1128.             $response $client->request('POST'$url, [
  1129.                 'headers' => [
  1130.                     'Content-Type' => 'application/json',
  1131.                 ],
  1132.                 'json' => $payload
  1133.             ]);
  1134.             $statusCode $response->getStatusCode();
  1135.             $content json_decode($response->getContent(), true);
  1136.             if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
  1137.                 $message $content['message'];
  1138.                 if ($statusCode == '422') {
  1139.                     $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1140.                 }
  1141.                 $this->addFlash(
  1142.                     'danger',
  1143.                     $message
  1144.                 );
  1145.                 return $this->redirectToRoute('fetch_mode');
  1146.             } elseif ($statusCode == '202') {
  1147.                 if (isset($content['message'])) {
  1148.                     $this->addFlash(
  1149.                         'danger',
  1150.                         $content['message']
  1151.                     );
  1152.                     return $this->redirectToRoute('fetch_mode');
  1153.                 }
  1154.                 return $this->render('cases/fetch-modes.html.twig', [
  1155.                     'type' => 'case_diagnose',
  1156.                     'modesArr' => $content,
  1157.                     'health_address' => $healthAddress
  1158.                 ]);
  1159.             } else {
  1160.                 return $this->redirectToRoute('case_index'); // redirect to search abha
  1161.             }
  1162.         }
  1163.     }
  1164.     /**
  1165.      * LINK HEALTH RECORD FETCH MODE (M2)
  1166.      */
  1167.     #[Route(path'/post-fetch-modes'name'post_fetch_modes_case'methods: ['GET''POST'])]
  1168.     public function postFetchModes(Request $requestPatientRepository $patientRepo): Response
  1169.     {
  1170.         $fetchMode $request->request->get('fetch_mode');
  1171.         $healthAddress $request->request->get('health_address');
  1172.         $type $request->request->get('type');
  1173.         if (!$fetchMode || !$healthAddress || !$type) {
  1174.             $this->addFlash(
  1175.                 'danger',
  1176.                 'please enter valid details'
  1177.             );
  1178.             return $this->render('cases/fetch-modes.html.twig', [
  1179.                 'modes' => $fetchMode,
  1180.                 'modesArr' => $type,
  1181.                 'health_address' => $healthAddress,
  1182.             ]);
  1183.         }
  1184.         $session $request->getSession();
  1185.         $patientId $session->get('patient_id');
  1186.         $patientDetail $patientRepo->getPatientById($patientId);
  1187.         $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'] : '';
  1188.         $patientArr['gender'] = isset($patientDetail[0]) && $patientDetail[0]['gender'] ? $patientDetail[0]['gender'] : '';
  1189.         $patientArr['dob'] = isset($patientDetail[0]) && $patientDetail[0]['dob'] ? $patientDetail[0]['dob'] : '';
  1190.         $patientArr['mobile'] = isset($patientDetail[0]) && $patientDetail[0]['mobile'] ? $patientDetail[0]['mobile'] : '';
  1191.         //try {
  1192.         //define hip code and get code from hospital table
  1193.         $hipCode $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1194.         $payload = [
  1195.             'id' => $healthAddress,
  1196.             'hip_id' => $hipCode,
  1197.             'auth_mode' => $fetchMode,
  1198.         ];
  1199.         $url 'https://dev2-abdm.7mantra.in/data-link/init';
  1200.         $patientRepo->insertPayload($payload$url);
  1201.         $client HttpClient::create();
  1202.         $header = [
  1203.             'Content-Type' => 'application/json',
  1204.         ];
  1205.         $response $client->request('POST'$url, [
  1206.             'headers' => $header,
  1207.             'json' => $payload
  1208.         ]);
  1209.         $statusCode $response->getStatusCode();
  1210.         $content json_decode($response->getContent(), true);
  1211.         if ($statusCode == '202') { //if api success, get tnx id
  1212.             if (isset($content['message'])) {
  1213.                 $this->addFlash(
  1214.                     'danger',
  1215.                     $content['message']
  1216.                 );
  1217.                 return $this->render('cases/fetch-modes.html.twig', [
  1218.                     'modes' => $fetchMode,
  1219.                     'modesArr' => $type,
  1220.                     'health_address' => $healthAddress,
  1221.                 ]);
  1222.             }
  1223.             $txnId = isset($content['txn_id']) ? $content['txn_id'] : '';
  1224.             return $this->render('cases/verify_data_link.html.twig', [
  1225.                 'modes' => $fetchMode,
  1226.                 'type' => $type,
  1227.                 'txn_id' => $txnId,
  1228.                 'health_address' => $healthAddress,
  1229.                 'patientArr' => $patientArr
  1230.             ]);
  1231.         } elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') {
  1232.             //if api get error
  1233.             $message $content['message'];
  1234.             if ($statusCode == '422') {
  1235.                 $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1236.             }
  1237.             $this->addFlash(
  1238.                 'danger',
  1239.                 $message
  1240.             );
  1241.             return $this->render('cases/fetch-modes.html.twig', [
  1242.                 'modes' => $fetchMode,
  1243.                 'modesArr' => $type,
  1244.                 'health_address' => $healthAddress,
  1245.             ]);
  1246.             //return $this->redirectToRoute('patient_search_with_abha'
  1247.         } else {
  1248.             return $this->redirectToRoute('case_index');
  1249.         }
  1250.         /* } catch (\Throwable $th) {
  1251.             $this->addFlash(
  1252.                 'danger',
  1253.                 'Something went wrong please try again.'
  1254.             );
  1255.             return $this->redirectToRoute('case_index');
  1256.         } */
  1257.     }
  1258.     /**
  1259.      * LINK HEALTH RECORD VERIFY DETAILS (M2)
  1260.      */
  1261.     #[Route(path'/link-verify-details'name'link_verify_details'methods: ['GET''POST'])]
  1262.     public function linkVerifyDetails(Request $requestPatientRepository $patientRepo): Response
  1263.     {
  1264.         $session $request->getSession();
  1265.         $modes $request->request->get('modes');
  1266.         $healthAddress $request->request->get('health_address');
  1267.         $name $request->request->get('name');
  1268.         $gender $request->request->get('gender');
  1269.         $dob $request->request->get('dob');
  1270.         $mobile $request->request->get('mobile');
  1271.         $type $request->request->get('type');
  1272.         $txnId $request->request->get('txn_id');
  1273.         $auth_code $request->request->get('otp');
  1274.         if (!$healthAddress || !$type || !$txnId || !$modes) {
  1275.             $this->addFlash(
  1276.                 'danger',
  1277.                 'please enter valid details'
  1278.             );
  1279.             return $this->redirectToRoute('case_index');
  1280.         } else if (($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') && !$auth_code && strlen($auth_code) != 6) {
  1281.             $this->addFlash(
  1282.                 'danger',
  1283.                 'please enter valid details'
  1284.             );
  1285.             return $this->redirectToRoute('case_index');
  1286.         } else if ($modes == 'DEMOGRAPHICS' && (!$name || !$gender || !$dob)) {
  1287.             $this->addFlash(
  1288.                 'danger',
  1289.                 'please enter valid details'
  1290.             );
  1291.             return $this->redirectToRoute('case_index');
  1292.         }
  1293.         if ($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') {
  1294.             $payload = [
  1295.                 'transaction_id' => $txnId,
  1296.                 'modes' => $modes,
  1297.                 'auth_code' => $auth_code
  1298.             ];
  1299.         } else {
  1300.             $payload = [
  1301.                 'transaction_id' => $txnId,
  1302.                 'modes' => $modes,
  1303.                 'name' => $name,
  1304.                 'gender' => $gender,
  1305.                 'dob' => $dob,
  1306.                 'mobile' => $mobile,
  1307.             ];
  1308.         }
  1309.         //dump(json_encode($payload));
  1310.         //try {
  1311.         $header = [
  1312.             'Content-Type' => 'application/json',
  1313.         ];
  1314.         $url 'https://dev2-abdm.7mantra.in/data-link/confirm';
  1315.         $patientRepo->insertPayload($payload$url);
  1316.         $client HttpClient::create();
  1317.         $response $client->request('POST'$url, [
  1318.             'headers' => $header,
  1319.             'json' => $payload
  1320.         ]);
  1321.         $statusCode $response->getStatusCode();
  1322.         $content json_decode($response->getContent(), true);
  1323.         if ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') {
  1324.             $message $content['message'];
  1325.             if ($statusCode == '422') {
  1326.                 $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1327.             }
  1328.             $this->addFlash(
  1329.                 'danger',
  1330.                 $message
  1331.             );
  1332.             return $this->redirectToRoute('case_index');
  1333.         } else if ($statusCode == '202') {
  1334.             if (isset($content['message']) && empty($content)) { // changes ||
  1335.                 $this->addFlash(
  1336.                     'danger',
  1337.                     $content['message']
  1338.                 );
  1339.                 return $this->redirectToRoute('case_index');
  1340.             }
  1341.             $contentArr['token'] = $content['token'];
  1342.             $contentArr['firstName'] = $content['first_name'];
  1343.             $contentArr['middleName'] = $content['middle_name'];
  1344.             $contentArr['lastName'] = $content['last_name'];
  1345.             //$contentArr['yearOfBirth'] = date('Y-m-d', strtotime($content['dob']));
  1346.             $contentArr['dob'] = date('Y-m-d'strtotime($content['dob']));
  1347.             $contentArr['gender'] = $content['gender'];
  1348.             $contentArr['mobile'] = isset($content['identifiers']['mobile']) ? $content['identifiers']['mobile'] : '';
  1349.             $contentArr['healthIdNumber'] = isset($content['identifiers']['health_number']) ? $content['identifiers']['health_number'] : '';
  1350.             $contentArr['healthIdAddress'] = $content['id'];
  1351.             if ($type == 'case_diagnose') {
  1352.                 $patientId $session->get('patient_id'); // get patient id in session
  1353.                 //force fully update details and redirect to relative patient
  1354.                 $contextStatus '';
  1355.                 if (isset($content['token']) && !empty($content['token'])) {
  1356.                     if (empty($contentArr['healthIdNumber']) || empty($contentArr['healthIdAddress'])) {
  1357.                         $getTokenData = (array) json_decode(base64_decode(str_replace('_''/'str_replace('-''+'explode('.'$content['token'])[1]))));
  1358.                         $contentArr['healthIdNumber'] = isset($getTokenData['healthIdNumber']) ? $content['healthIdNumber'] : '';
  1359.                         $contentArr['healthIdAddress'] = isset($getTokenData['healthId']) ? $content['healthId'] : '';
  1360.                     }
  1361.                     $patientRepo->updateAbhaDetails($contentArr$patientId);
  1362.                     //TODO :: All value set dynamic, case and patient table
  1363.                     $patientReference $session->get('uh_id');
  1364.                     $caseNumber $session->get('case_number');
  1365.                     // TODO : set payload dynamic {type= case,id=caseId,token=token}
  1366.                     $careContext[] = ['referenceNumber' => $caseNumber'display' => 'Case Care Context'];
  1367.                     // $type = 'OPConsultation';
  1368.                     $type 'Prescription';
  1369.                     $patientDisplay 'patient display';
  1370.                     //define hip code and get code from hospital table
  1371.                     $hipId $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1372.                     $addContextPayload = [
  1373.                         'accessToken' => $content['token'],
  1374.                         'patientReference' => $patientReference,
  1375.                         'display' => $patientDisplay,
  1376.                         'careContexts' => $careContext,
  1377.                         'healthAddress' => $healthAddress,
  1378.                         'type' => $type,
  1379.                         'hip_id' => $hipId
  1380.                     ];
  1381.                       
  1382.                     $url 'https://dev2-abdm.7mantra.in/m2/add-context';
  1383.                     $patientRepo->insertPayload($addContextPayload$url);
  1384.                     $client HttpClient::create();
  1385.                     $contextResponse $client->request('POST'$url, [
  1386.                         'headers' => $header,
  1387.                         'json' => $addContextPayload
  1388.                     ]);
  1389.                     //dump($contextResponse);
  1390.                     $contextStatus $contextResponse->getStatusCode();
  1391.                 }
  1392.                 if ($contextStatus ==  '202') {
  1393.                     $this->addFlash(
  1394.                         'success',
  1395.                         'Health data link successfully.'
  1396.                     );
  1397.                 } else if ($contextStatus ==  '400') {
  1398.                     $this->addFlash(
  1399.                         'danger',
  1400.                         'Bad request.'
  1401.                     );
  1402.                 } else if ($contextStatus ==  '422') {
  1403.                     $this->addFlash(
  1404.                         'danger',
  1405.                         'Some of the Care Contexts are already linked, please remove the linked Care Contexts.'
  1406.                     );
  1407.                 } else {
  1408.                     $this->addFlash(
  1409.                         'danger',
  1410.                         'Something went wrong! Please try again 1!'
  1411.                     );
  1412.                 }
  1413.                 $session->remove('patient_id');
  1414.                 $session->remove('health_address');
  1415.                 $session->remove('uh_id');
  1416.                 $session->remove('case_number');
  1417.                 return $this->redirectToRoute('case_index');
  1418.             }
  1419.         } else {
  1420.             $this->addFlash(
  1421.                 'danger',
  1422.                 'Something went wrong. Please try again. 2'
  1423.             );
  1424.             return $this->redirectToRoute('case_index');
  1425.         }
  1426.         /* } catch (\Throwable $th) {
  1427.             $this->addFlash(
  1428.                 'danger',
  1429.                 'Something went wrong please try again.'
  1430.             );
  1431.             return $this->redirectToRoute('case_index');
  1432.         } */
  1433.     }
  1434.     /*END :: abha verify and add context */
  1435.     /**
  1436.      * LINK HEALTH RECORD (M2)
  1437.      */
  1438.     #[Route(path'/data-link-fetch/{id}'name'data_link_fetch'methods: ['GET'])]
  1439.     #[ParamDecryptor(["id"])]
  1440.     public function dataLinkFetch(Cases $caseRequest $requestPatientRepository $patientRepo): Response
  1441.     {
  1442.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1443.             //TODO :: {{base url}}/v0.5/users/auth/init call this api
  1444.             //TODO :: get health address from patient table
  1445.             //$case->getPatient()->getMobile();
  1446.             $healthAddress $case->getPatient()->getHealthAddress();
  1447.             if (!$healthAddress) {
  1448.                 $this->addFlash(
  1449.                     'danger',
  1450.                     'Invalid request.'
  1451.                 );
  1452.                 return $this->redirectToRoute('case_index');
  1453.             }
  1454.             $patientId $case->getPatient()->getId();
  1455.             $caseId $case->getMrdId();
  1456.             $session $request->getSession();
  1457.             $uhId $case->getPatient()->getUhId();
  1458.             $session->set('patient_id'$patientId);
  1459.             $session->set('uh_id'$uhId);
  1460.             // get Case id in store session
  1461.             $session->set('case_number'$caseId);
  1462.             //TODO :: health address store in session
  1463.             $session->set('health_address'$healthAddress);
  1464.             //define hip code and get code from hospital table
  1465.             $hipCode $this->getUser()->getProfile()->getHospital()->getHIPCode();
  1466.             //try {
  1467.             $payload = [
  1468.                 'id' => $healthAddress,
  1469.                 'hip_id' => $hipCode
  1470.             ];
  1471.             //dump(json_encode($payload));
  1472.             //  dump($payload);
  1473.             $url 'https://dev2-abdm.7mantra.in/data-link/fetch-modes';
  1474.             $patientRepo->insertPayload($payload$url);
  1475.             $client HttpClient::create();
  1476.             $response $client->request('POST'$url, [
  1477.                 'headers' => [
  1478.                     'Content-Type' => 'application/json',
  1479.                 ],
  1480.                 'json' => $payload
  1481.             ]);
  1482.             
  1483.             $statusCode $response->getStatusCode();
  1484.             // dump($statusCode);
  1485.             $content json_decode($response->getContent(), true);
  1486.             if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') {
  1487.                 $message $content['message'];
  1488.                 if ($statusCode == '422') {
  1489.                     $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered';
  1490.                 }
  1491.                 $this->addFlash(
  1492.                     'danger',
  1493.                     $message
  1494.                 );
  1495.                 return $this->redirectToRoute('fetch_mode');
  1496.             } elseif ($statusCode == '202') {
  1497.                 if (isset($content['message'])) {
  1498.                     $this->addFlash(
  1499.                         'danger',
  1500.                         $content['message']
  1501.                     );
  1502.                     return $this->redirectToRoute('fetch_mode');
  1503.                 }
  1504.                 if (empty($content)) {
  1505.                     return $this->redirectToRoute('case_index');
  1506.                 }
  1507.                 return $this->render('cases/fetch-modes.html.twig', [
  1508.                     'type' => 'case_diagnose',
  1509.                     'modesArr' => $content,
  1510.                     'health_address' => $healthAddress
  1511.                 ]);
  1512.             } else {
  1513.                 return $this->redirectToRoute('case_index'); // redirect to search abha
  1514.             }
  1515.         } else {
  1516.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1517.         }
  1518.     }
  1519.     /**
  1520.      * M2 SMS NOTIFY
  1521.      */
  1522.     #[Route(path'/patient-notify/{id}'name'patient_notify'methods: ['GET'])]
  1523.     #[ParamDecryptor(["id"])]
  1524.     public function patientNotify(Cases $casePatientRepository $patientRepo): Response
  1525.     {
  1526.         if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1527.             //TODO :: get mobile number related patient
  1528.             //TODO :: {{base url}}/v0.5/users/auth/init call this api
  1529.             //TODO :: add try catch
  1530.             $patientMobileNumber $case->getPatient()->getMobile();
  1531.             if (!$patientMobileNumber) {
  1532.                 $this->addFlash(
  1533.                     'danger',
  1534.                     'Invalid request.'
  1535.                 );
  1536.                 return $this->redirectToRoute('case_index');
  1537.             }
  1538.             $payload = [
  1539.                 'mobile_number' => $patientMobileNumber,
  1540.                 'hip_id' => $this->getUser()->getProfile()->getHospital()->getHIPCode(),
  1541.                 'hip_name' => $this->getUser()->getProfile()->getHospital()->getHIPName()
  1542.             ];
  1543.           //  dump($payload);
  1544.             $url 'https://dev2-abdm.7mantra.in/m2/sms-notify2';
  1545.             $patientRepo->insertPayload($payload$url);
  1546.              
  1547.             $client HttpClient::create();
  1548.             $response $client->request('POST'$url, [
  1549.                 'headers' => [
  1550.                     'Content-Type' => 'application/json'
  1551.                 ],
  1552.                 'json' => $payload
  1553.             ]);
  1554.             $status $response->getStatusCode();
  1555.             if ($status ==  '202') {
  1556.                 $this->addFlash(
  1557.                     'success',
  1558.                     'Message sent successfully.'
  1559.                 );
  1560.             } else if ($status ==  '400') {
  1561.                 $this->addFlash(
  1562.                     'danger',
  1563.                     'Mobile number required.'
  1564.                 );
  1565.             } else {
  1566.                 $this->addFlash(
  1567.                     'danger',
  1568.                     'Something went wrong! Please try again!'
  1569.                 );
  1570.             }
  1571.             return $this->redirectToRoute('case_index');
  1572.         } else {
  1573.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1574.         }
  1575.     }
  1576.     /**
  1577.      * CONSENT LIST (M3)
  1578.      */
  1579.     #[Route(path'/consent/{id}'name'consent'methods: ['GET'])]
  1580.     #[ParamDecryptor(["id"])]
  1581.     public function consent(Request $requestAbha $abha): Response
  1582.     {
  1583.         // cross site script
  1584.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  1585.         $arrData $abha->getConsentList();
  1586.         //dd($arrData);
  1587.         $uri $this->generateUrl('consent_req_form', ['id' => $id]);
  1588.         return $this->render('abha/consent.html.twig', [
  1589.             'consents' => $arrData,
  1590.             'form_url' => $uri,
  1591.             'data_request' => 'data_request',
  1592.             'view_data' => 'view_data'
  1593.         ]);
  1594.     }
  1595.     /**
  1596.      * CONSENT REQUEST FORM (M3)
  1597.      */
  1598.     #[Route(path'/consent-request/{id}'name'consent_req_form'methods: ['GET'])]
  1599.     #[ParamDecryptor(["id"])]
  1600.     public function consentForm(Request $requestAbha $abha): Response
  1601.     {
  1602.         //cross site script
  1603.         return $this->render('abha/consent_form.html.twig', [
  1604.             'post_form_url' => 'request_init',
  1605.             'patient_find_url' => 'patient_find',
  1606.             'id' => $this->encryptor->encrypt($request->attributes->get('id'))
  1607.         ]);
  1608.     }
  1609.     /**
  1610.      * M3 SUBMIT CONSENT FORM
  1611.      */
  1612.     #[Route(path'/consent-request-init'name'request_init'methods: ['GET''POST'])]
  1613.     public function requestInit(Request $requestAbha $abha): Response
  1614.     {
  1615.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1616.         } else {
  1617.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1618.         } */
  1619.         // $id = $this->encryptor->encrypt($request->attributes->get('id'));
  1620.         // $uri = $this->generateUrl('consent', ['id' => $id]);
  1621.         $reqData $request->request->all();
  1622.         $reqData['hiuParName'] = $this->getUser()->getProfile()->getFirstName() . ' ' $this->getUser()->getProfile()->getLastName(); // practitioner name
  1623.         $reqData['hiuId'] = $this->getUser()->getProfile()->getHospital()->getHIUCode();
  1624.         $request $abha->requestInt($reqData);
  1625.         if ($request) {
  1626.             // return $this->redirectToRoute('consent', ['id' => $reqData['health_id'].'abdm']);
  1627.             return $this->redirectToRoute('consent', ['id' => ($reqData['id'])]);
  1628.         } else {
  1629.             return $this->render('abha/consent_form.html.twig', [
  1630.                 'post_form_url' => 'request_init',
  1631.                 'patient_find_url' => 'patient_find'
  1632.             ]);
  1633.         }
  1634.     }
  1635.     /**
  1636.      * M3 REQUEST FOR DATA FROM HIP
  1637.      */
  1638.     #[Route(path'/data-request/{id}'name'data_request'methods: ['GET''POST'])]
  1639.     #[ParamDecryptor(["id"])]
  1640.     public function dataRequest(Request $requestAbha $abha): Response
  1641.     {
  1642.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1643.         } else {
  1644.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1645.         } */
  1646.         $id $request->attributes->get('id');
  1647.         $response $abha->getDataRequest($id);
  1648.         // dump($id);
  1649.         // dd($response);
  1650.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  1651.         return $this->redirectToRoute('consent', ['id' => $id]);
  1652.     }
  1653.     /**
  1654.      * M3 VIEW CONSENT DATA
  1655.      */
  1656.     #[Route(path'/view-data/{id}'name'view_data'methods: ['GET''POST'])]
  1657.     #[ParamDecryptor(["id"])]
  1658.     public function viewRequest(Request $requestAbha $abha): Response
  1659.     {
  1660.         /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) {
  1661.         } else {
  1662.             return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig');
  1663.         } */
  1664.         
  1665.         $id $request->attributes->get('id');
  1666.         // dd($id);
  1667.         $response $abha->getViewData($id);
  1668.             // dd($response[1]);
  1669.             //  dd($response[1]['htmlFinalArr']);
  1670.             //  dd(base64_encode($response[1]['pdf']));
  1671.         $id $this->encryptor->encrypt($request->attributes->get('id'));
  1672.         if ($response[1]) {
  1673.             $uri $this->generateUrl('consent', ['id' => $id]);
  1674.             // dd($uri);
  1675.             return $this->render('abha/view_consent.html.twig', [
  1676.                 'data' => $response[1],
  1677.                 'back_url' => $uri,
  1678.          'htmlFinalArr' => $response[1]['htmlFinalArr'] ?? [],
  1679.         'pdfBase64' => base64_encode($response[1]['pdf'] ?? ''),
  1680.             ]);
  1681.         } else {
  1682.             return $this->redirectToRoute('consent', ['id' => $id]);
  1683.         }
  1684.     }
  1685.     /**
  1686.      * M3 PATIENT FIND IN CONSENT REQUEST
  1687.      */
  1688.     #[Route('/patient-find'name'patient_find'methods: ['GET''POST'])]
  1689.     public function patientFind(Request $requestAbha $abha): Response
  1690.     {
  1691.         $healthId $request->request->get('health_id');
  1692.         if (!$healthId && strlen($healthId) <= 6) {
  1693.             return $this->json('invalid');
  1694.         }
  1695.         $name $abha->patientFind($healthId);
  1696.         return $this->json($name);
  1697.     }
  1698.     public function getAccessToken()
  1699.     {
  1700.         $client HttpClient::create();
  1701.         $response $client->request('POST''https://apis.abdm.gov.in/hiecm/gateway/v0.5/sessions', [
  1702.             'headers' => [
  1703.                 'Content-Type' => 'application/json'
  1704.             ],
  1705.             'json' => [
  1706.                 'clientId' => $_ENV['CLIENT_ID'],
  1707.                 'clientSecret' => $_ENV['CLIENT_SECRET']
  1708.             ]
  1709.         ]);
  1710.         $decodedPayload $response->toArray();
  1711.         return 'Bearer ' $decodedPayload['accessToken'];
  1712.     }
  1713.     function GUID()
  1714.     {
  1715.         if (function_exists('com_create_guid') === true) {
  1716.             return trim(com_create_guid(), '{}');
  1717.         }
  1718.         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));
  1719.     }
  1720. }