src/Controller/CaseController.php line 1221

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